package com.emc.storageos.volumecontroller.impl.utils.labels;
import java.util.Collection;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static java.util.Arrays.asList;
/**
* Supports label formats with a "-X" suffix, where X is a number representing a
* count of something.
*
* For example, given a label "foo-0", calling #next would return "foo-1".
*
* @author Ian Bibby
*/
public class CountingSuffix implements LabelFormat {
private static final String HYPEN_AND_NUMBER_SUFFIX = "^(.*-)(\\d+)$";
private static final int MAIN_GROUP = 1;
private static final int COUNT_GROUP = 2;
private Pattern pattern;
private Collection<String> labels;
private String label;
private Integer lastCount;
public CountingSuffix() {
pattern = Pattern.compile(HYPEN_AND_NUMBER_SUFFIX);
}
@Override
public boolean matches(String label) {
return matches(asList(label));
}
@Override
public boolean matches(Collection<String> labels) {
for (String l : labels) {
if (!pattern.matcher(l).matches()) {
return false;
}
}
this.labels = labels;
return true;
}
@Override
public String next() {
if (lastCount == null) {
findNextCount();
}
return label + (++lastCount);
}
private void findNextCount() {
SortedSet<String> sortedLabels = sortLabels(labels);
String highestLabel = sortedLabels.last();
Matcher matcher = pattern.matcher(highestLabel);
matcher.matches();
label = matcher.group(MAIN_GROUP);
// Regex will ensure "count" is a number.
lastCount = Integer.valueOf(matcher.group(COUNT_GROUP));
}
private SortedSet<String> sortLabels(Collection<String> labels) {
return new TreeSet<>(labels);
}
}