package ru.yandex.market.graphouse;
import java.util.regex.Pattern;
/**
* @author Dmitry Andreev <a href="mailto:AndreevDm@yandex-team.ru"/>
* @date 27/05/15
*/
public class MetricValidator {
private final Pattern metricPattern;
private final int minMetricLength;
private final int maxMetricLength;
private final int minDots;
private final int maxDots;
public MetricValidator(String metricRegexp, int minMetricLength, int maxMetricLength, int minDots, int maxDots) {
this.minMetricLength = minMetricLength;
this.maxMetricLength = maxMetricLength;
this.minDots = minDots;
this.maxDots = maxDots;
metricPattern = Pattern.compile(metricRegexp);
}
public boolean validate(String name, boolean allowDirs) {
boolean isDir = MetricUtil.isDir(name);
if ((!isDir && name.length() < minMetricLength) || name.length() > maxMetricLength) {
return false;
}
if (!validateDots(name, allowDirs, isDir)) {
return false;
}
return metricPattern.matcher(name).matches();
}
private boolean validateDots(String name, boolean allowDirs, boolean isDir) {
if (name.charAt(0) == '.') {
return false;
}
if (!allowDirs && isDir) {
return false;
}
int prevDotIndex = -1;
int dotIndex = -1;
int dotCount = 0;
while ((dotIndex = name.indexOf('.', prevDotIndex + 1)) > 0) {
if (prevDotIndex + 1 == dotIndex) {
return false; //Две точки подряд
}
prevDotIndex = dotIndex;
dotCount++;
}
if ((!isDir && dotCount < minDots) || dotCount > maxDots) {
return false;
}
return true;
}
}