package edu.sc.seis.sod.subsetter.station;
import java.util.List;
import org.w3c.dom.Element;
import edu.iris.Fissures.IfNetwork.NetworkAccess;
import edu.iris.Fissures.IfNetwork.NetworkNotFound;
import edu.iris.Fissures.model.MicroSecondDate;
import edu.iris.Fissures.model.TimeInterval;
import edu.iris.Fissures.network.NetworkAttrImpl;
import edu.iris.Fissures.network.StationIdUtil;
import edu.iris.Fissures.network.StationImpl;
import edu.sc.seis.fissuresUtil.cache.CacheNetworkAccess;
import edu.sc.seis.fissuresUtil.chooser.ClockUtil;
import edu.sc.seis.sod.ConfigurationException;
import edu.sc.seis.sod.SodUtil;
import edu.sc.seis.sod.Start;
import edu.sc.seis.sod.UserConfigurationException;
import edu.sc.seis.sod.source.SodSourceException;
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 BelongsToVirtual implements StationSubsetter {
private static NetworkAccess getVirtual(NetworkSource networkSource, String name)
throws ConfigurationException {
try {
List<? extends CacheNetworkAccess> nets = networkSource.getNetworkByName(name);
if(nets.size() > 1) {
throw new ConfigurationException("There are several nets with the name "
+ name);
}
return nets.get(0);
} catch(NetworkNotFound nnf) {
throw new UserConfigurationException("No network by the name of "
+ name + " found");
}
}
public BelongsToVirtual(Element el) throws ConfigurationException {
this(SodUtil.getNestedText(el), null);
}
public BelongsToVirtual(String virtualNetName,
TimeInterval refreshInterval) {
this.name = virtualNetName;
this.refreshInterval = refreshInterval;
}
public StringTree accept(StationImpl station, NetworkSource network) throws ConfigurationException, SodSourceException {
refreshStations(network);
for (StationImpl sta : stations) {
if(StationIdUtil.areEqual(station, sta)) {
return new Pass(this);
}
}
return new Fail(this);
}
private void refreshStations(NetworkSource network) throws ConfigurationException, SodSourceException {
if(ClockUtil.now().subtract(getRefreshInterval()).after(lastQuery)) {
lastQuery = ClockUtil.now();
NetworkAccess virtual = getVirtual(network, name);
stations = network.getStations((NetworkAttrImpl)virtual.get_attributes());
}
}
public TimeInterval getRefreshInterval() {
if (refreshInterval == null) {
refreshInterval = Start.getNetworkArm().getRefreshInterval();
}
return refreshInterval;
}
private String name;
private List<? extends StationImpl> stations;
private TimeInterval refreshInterval;
private MicroSecondDate lastQuery = new MicroSecondDate(0);
}