package edu.sc.seis.sod.source.seismogram; import java.util.ArrayList; import java.util.List; import edu.iris.Fissures.FissuresException; import edu.iris.Fissures.IfSeismogramDC.LocalSeismogram; import edu.iris.Fissures.IfSeismogramDC.RequestFilter; import edu.iris.Fissures.network.ChannelIdUtil; import edu.iris.Fissures.seismogramDC.LocalSeismogramImpl; import edu.sc.seis.fissuresUtil.cache.NSSeismogramDC; import edu.sc.seis.fissuresUtil.cache.ProxySeismogramDC; public class DataCenterSource implements SeismogramSource { public DataCenterSource(ProxySeismogramDC seisDC) { this.seisDC = seisDC; } @Override public List<RequestFilter> availableData(List<RequestFilter> request) { return toList(seisDC.available_data(toArray(request))); } @Override public List<LocalSeismogramImpl> retrieveData(List<RequestFilter> request) throws SeismogramSourceException { try { RequestFilter[] infilters = toArray(request); LocalSeismogram[] localSeismograms = new LocalSeismogram[0]; logger.debug("before retrieve_seismograms"); NSSeismogramDC nsDC = (NSSeismogramDC)seisDC.getWrappedDC(NSSeismogramDC.class); if (nsDC.getServerDNS().equals("edu/iris/dmc") && nsDC.getServerName().equals("IRIS_ArchiveDataCenter")) { // Archive doesn't support retrieve_seismograms // so try using the queue set of retrieve calls String id = seisDC.queue_seismograms(infilters); logger.info("request id: " + id); String status = seisDC.request_status(id); int i = 0; while (status.equals(RETRIEVING_DATA) && i < 60) { logger.info("Waiting for data to be returned from the archive. We've been waiting for " + i++ + " minutes"); try { Thread.sleep(60 * 1000); } catch(InterruptedException ex) {} status = seisDC.request_status(id); } if (status.equals(DATA_RETRIEVED)) { localSeismograms = seisDC.retrieve_queue(id); } else if (status.equals(RETRIEVING_DATA)) { seisDC.cancel_request(id); throw new SeismogramSourceException("Looks like the archive lost request ID " + id + ". No data was returned after " + i + " minutes. "); } } else { localSeismograms = seisDC.retrieve_seismograms(infilters); } logger.debug("after successful retrieve_seismograms"); if (localSeismograms.length > 0 && !ChannelIdUtil.areEqual(localSeismograms[0].channel_id, infilters[0].channel_id)) { // must be server error logger.warn("X Channel id in returned seismogram doesn not match channelid in request. req=" + ChannelIdUtil.toString(infilters[0].channel_id) + " seis=" + ChannelIdUtil.toString(localSeismograms[0].channel_id)); } List<LocalSeismogramImpl> out = new ArrayList<LocalSeismogramImpl>(); LocalSeismogram[] fromServer = seisDC.retrieve_seismograms(request.toArray(new RequestFilter[0])); for (int i = 0; i < fromServer.length; i++) { out.add((LocalSeismogramImpl)fromServer[i]); } return out; } catch(FissuresException e) { throw new SeismogramSourceException(e); } } public ProxySeismogramDC getDataCenter() { return seisDC; } public static List<RequestFilter> toList(RequestFilter[] in) { List<RequestFilter> out = new ArrayList<RequestFilter>(); for (int i = 0; i < in.length; i++) { out.add(in[i]); } return out; } public static RequestFilter[] toArray(List<RequestFilter> in) { return in.toArray(new RequestFilter[0]); } public static LocalSeismogramImpl[] toSeisArray(List<LocalSeismogramImpl> data) { return data.toArray(new LocalSeismogramImpl[0]); } ProxySeismogramDC seisDC; public static final String RETRIEVING_DATA = "Processing"; public static final String DATA_RETRIEVED = "Finished"; public static final String NO_DATA = "no_data"; private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DataCenterSource.class); }