package edu.sc.seis.sod.subsetter.channel;
import org.w3c.dom.Element;
import edu.iris.Fissures.network.ChannelImpl;
import edu.sc.seis.sod.SodUtil;
import edu.sc.seis.sod.UserConfigurationException;
import edu.sc.seis.sod.source.network.NetworkSource;
import edu.sc.seis.sod.status.StringTree;
import edu.sc.seis.sod.status.StringTreeLeaf;
public class ChannelCode implements ChannelSubsetter {
public ChannelCode(Element config) throws UserConfigurationException {
this(SodUtil.getNestedText(config));
}
public ChannelCode(String string) throws UserConfigurationException {
this.code = string;
acceptedCode = string.toUpperCase();
if(acceptedCode.length() == 0
|| (acceptedCode.length() == 1 && acceptedCode.charAt(0) == '*')) {
required = "***";
} else if(acceptedCode.length() == 2) {
if(acceptedCode.charAt(0) == '*') {
required = "**" + acceptedCode.charAt(1);
} else if(acceptedCode.charAt(1) == '*') {
required = acceptedCode.charAt(0) + "**";
} else {
throw new UserConfigurationException("A channelCode must be of length 3 if it doesn't contain any '*' characters. Yours was '"
+ string + "'");
}
} else if(acceptedCode.length() == 3) {
required = acceptedCode;
} else {
throw new UserConfigurationException("A channelCode can be at most of length 3. Yours was '"
+ string + "'");
}
required = required.replace('?', '*');
}
public StringTree accept(ChannelImpl channel, NetworkSource network) {
String code = channel.get_id().channel_code;
for(int i = 0; i < required.length(); i++) {
if(required.charAt(i) != '*'
&& code.charAt(i) != required.charAt(i)) {
return new StringTreeLeaf(this, false);
}
}
return new StringTreeLeaf(this, true);
}
String required;
private String code;
private String acceptedCode;
public String getCode() {
return code;
}
}