package edu.sc.seis.sod.source.seismogram;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import edu.iris.Fissures.FissuresException;
import edu.iris.Fissures.IfSeismogramDC.RequestFilter;
import edu.iris.Fissures.network.ChannelImpl;
import edu.iris.Fissures.seismogramDC.LocalSeismogramImpl;
import edu.sc.seis.fissuresUtil.cache.CacheEvent;
import edu.sc.seis.sod.ConfigurationException;
import edu.sc.seis.sod.CookieJar;
import edu.sc.seis.sod.SodElement;
import edu.sc.seis.sod.SodUtil;
public class TryInOrder implements SeismogramSourceLocator {
public TryInOrder(Element config)
throws ConfigurationException {
NodeList childNodes = config.getChildNodes();
Node node;
for(int counter = 0; counter < childNodes.getLength(); counter++) {
node = childNodes.item(counter);
if(node instanceof Element) {
SodElement sodElement = (SodElement)SodUtil.load((Element)node,
new String[] {"seismogram"});
if(sodElement instanceof SeismogramSourceLocator) {
choices.add((SeismogramSourceLocator)sodElement);
}
} // end of else
}
}
public SeismogramSource getSeismogramSource(CacheEvent event,
ChannelImpl channel,
RequestFilter[] infilters,
CookieJar cookieJar)
throws Exception {
List<SeismogramSource> out = new ArrayList<SeismogramSource>();
Iterator<SeismogramSourceLocator> it = choices.iterator();
while(it.hasNext()) {
out.add(it.next().getSeismogramSource(event, channel, infilters, cookieJar));
}
return new TryInOrderSource(out);
}
private List<SeismogramSourceLocator> choices = new ArrayList<SeismogramSourceLocator>();
}
class TryInOrderSource implements SeismogramSource {
TryInOrderSource(List<SeismogramSource> sources) {
this.sources = sources;
}
SeismogramSource best;
List<SeismogramSource> sources;
void checkBestSet() {
if(best == null) {
throw new RuntimeException("Cannot call method until availableData is called to pick the best DC");
}
}
@Override
public List<RequestFilter> availableData(List<RequestFilter> request) throws SeismogramSourceException {
Iterator<SeismogramSource> it = sources.iterator();
while (it.hasNext()) {
try {
SeismogramSource seismogramSource = (SeismogramSource)it.next();
List<RequestFilter> out = seismogramSource.availableData(request);
if(out.size() > 0) {
best = seismogramSource;
return out;
}
} catch(org.omg.CORBA.SystemException e) {
// Go on to next datacenter
}
}
best = sources.get(sources.size()-1);
return new ArrayList<RequestFilter>();
}
@Override
public List<LocalSeismogramImpl> retrieveData(List<RequestFilter> request) throws SeismogramSourceException {
checkBestSet();
return best.retrieveData(request);
}
}