package edu.sc.seis.sod.subsetter.station;
import java.util.regex.Pattern;
import org.w3c.dom.Element;
import edu.iris.Fissures.network.StationImpl;
import edu.sc.seis.sod.ConfigurationException;
import edu.sc.seis.sod.SodUtil;
import edu.sc.seis.sod.source.network.NetworkSource;
import edu.sc.seis.sod.status.Fail;
import edu.sc.seis.sod.status.Pass;
import edu.sc.seis.sod.status.StringTree;
public class StationCode implements StationSubsetter {
public StationCode(Element config) throws ConfigurationException {
code = SodUtil.getNestedText(config);
Pattern simpleCode = Pattern.compile("[A-Z0-9]+");
if (simpleCode.matcher(code).matches() && code.trim().length() > 5) {
throw new ConfigurationException("Station codes are limited to 5 characters, not "+code.trim().length()+" as in '"+code.trim()+"'");
}
pattern = Pattern.compile(createRegexFromGlob(code));
}
public StringTree accept(StationImpl station, NetworkSource network) {
if(code.equalsIgnoreCase(station.get_code())) {
return new Pass(this);
} else if(pattern.matcher(station.get_code()).matches()) {
return new Pass(this);
} else {
return new Fail(this);
}
}
String code;
Pattern pattern;
public String getCode() {
return code;
}
/*
* from http://stackoverflow.com/questions/1247772/is-there-an-equivalent-of-java-util-regex-for-glob-type-patterns
*/
public static String createRegexFromGlob(String glob)
{
String out = "^";
for(int i = 0; i < glob.length(); ++i)
{
final char c = glob.charAt(i);
switch(c)
{
case '*': out += ".*"; break;
case '?': out += '.'; break;
case '.': out += "\\."; break;
case '\\': out += "\\\\"; break;
default: out += c;
}
}
out += '$';
return out;
}
}