package edu.sc.seis.sod.subsetter.channel;
import java.util.HashMap;
import org.w3c.dom.Element;
import edu.iris.Fissures.IfNetwork.ChannelId;
import edu.iris.Fissures.IfSeismogramDC.RequestFilter;
import edu.iris.Fissures.model.MicroSecondDate;
import edu.iris.Fissures.model.TimeInterval;
import edu.iris.Fissures.model.UnitImpl;
import edu.iris.Fissures.network.ChannelIdUtil;
import edu.iris.Fissures.network.ChannelImpl;
import edu.sc.seis.fissuresUtil.chooser.ClockUtil;
import edu.sc.seis.fissuresUtil.display.configuration.DOMHelper;
import edu.sc.seis.sod.source.network.NetworkSource;
import edu.sc.seis.sod.source.seismogram.FixedDataCenter;
import edu.sc.seis.sod.status.StringTree;
import edu.sc.seis.sod.status.StringTreeLeaf;
/**
* @author groves Created on May 6, 2005
*/
public class HadDataLastWeek implements ChannelSubsetter {
public HadDataLastWeek(Element el) throws Exception {
fixDC = new FixedDataCenter(DOMHelper.getElement(el, "fixedDataCenter"));
}
public StringTree accept(ChannelImpl channel, NetworkSource network)
throws Exception {
MicroSecondDate now = ClockUtil.now();
ChannelEffectiveTimeOverlap overlap = new ChannelEffectiveTimeOverlap(now.subtract(makeDayInterval(7)), now);
if ( ! overlap.accept(channel, network).isSuccess()) {
// fail expired channels quickly
return new StringTreeLeaf(this, false, "Channel Ended");
}
String key = ChannelIdUtil.toStringNoDates(channel);
if (recentRequests.containsKey(key)) {
RecentRequest r = recentRequests.get(key);
if (r.when.add(MAX_CACHE).after(ClockUtil.now())) {
return new StringTreeLeaf(this, r.hadData);
} else {
recentRequests.remove(r);
}
}
// Make 7 requests for a day as the BUD likes it that way
RequestFilter[] reqs = new RequestFilter[7];
for(int i = 0; i < reqs.length; i++) {
reqs[i] = new RequestFilter(channel.get_id(),
now.subtract(makeDayInterval(i + 1))
.getFissuresTime(),
now.subtract(makeDayInterval(i))
.getFissuresTime());
}
if(fixDC.getDataCenter().available_data(reqs).length > 0) {
logger.debug(ChannelIdUtil.toStringNoDates(channel) + " had data");
recentRequests.put(key, new RecentRequest(channel.get_id(), ClockUtil.now(), true));
return new StringTreeLeaf(this, true);
}
logger.debug(ChannelIdUtil.toStringNoDates(channel)
+ " didn't have data");
recentRequests.put(key, new RecentRequest(channel.get_id(), ClockUtil.now(), false));
return new StringTreeLeaf(this, false);
}
private TimeInterval makeDayInterval(int days) {
return new TimeInterval(days, UnitImpl.DAY);
}
private HashMap<String, RecentRequest> recentRequests = new HashMap<String, RecentRequest>();
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(HadDataLastWeek.class);
private FixedDataCenter fixDC;
private TimeInterval MAX_CACHE = new TimeInterval(1, UnitImpl.HOUR);
}
class RecentRequest {
ChannelId chanId;
MicroSecondDate when;
boolean hadData;
RecentRequest(ChannelId chanId, MicroSecondDate when, boolean hadData) {
this.chanId = chanId;
this.when = when;
this.hadData = hadData;
}
}