package edu.sc.seis.sod.status.waveformArm;
import java.sql.SQLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.SwingUtilities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bbn.openmap.event.CenterEvent;
import edu.iris.Fissures.IfEvent.EventAccessOperations;
import edu.iris.Fissures.IfEvent.Origin;
import edu.iris.Fissures.IfNetwork.Station;
import edu.iris.Fissures.network.StationImpl;
import edu.sc.seis.fissuresUtil.cache.CacheEvent;
import edu.sc.seis.fissuresUtil.cache.EventUtil;
import edu.sc.seis.fissuresUtil.cache.ProxyEventAccessOperations;
import edu.sc.seis.fissuresUtil.chooser.AvailableStationDataEvent;
import edu.sc.seis.fissuresUtil.chooser.StationDataEvent;
import edu.sc.seis.fissuresUtil.display.EQDataEvent;
import edu.sc.seis.fissuresUtil.display.EQSelectionEvent;
import edu.sc.seis.fissuresUtil.exceptionHandler.GlobalExceptionHandler;
import edu.sc.seis.fissuresUtil.map.OpenMap;
import edu.sc.seis.fissuresUtil.map.colorizer.event.DefaultEventColorizer;
import edu.sc.seis.fissuresUtil.map.layers.DistanceLayer;
import edu.sc.seis.fissuresUtil.map.layers.EventLayer;
import edu.sc.seis.fissuresUtil.map.layers.StationLayer;
import edu.sc.seis.sod.Stage;
import edu.sc.seis.sod.Standing;
import edu.sc.seis.sod.Status;
import edu.sc.seis.sod.hibernate.SodDB;
import edu.sc.seis.sod.status.MapPool;
import edu.sc.seis.sod.status.OutputScheduler;
public class MapWaveformStatus implements Runnable {
public MapWaveformStatus() throws SQLException {
this(MapPool.getDefaultPool());
}
public MapWaveformStatus(MapPool pool) throws SQLException {
this.pool = pool;
soddb = SodDB.getSingleton();
}
public void run() {
int numEventsWaiting = 0;
CacheEvent[] events = new CacheEvent[0];
String[] fileLocs = new String[0];
synchronized(eventsToBeRendered) {
numEventsWaiting = eventsToBeRendered.size();
if(eventsToBeRendered.size() > 0) {
events = new CacheEvent[eventsToBeRendered.size()];
fileLocs = new String[eventsToBeRendered.size()];
Iterator it = eventsToBeRendered.keySet().iterator();
while(it.hasNext()) {
CacheEvent cur = (CacheEvent)it.next();
events[--numEventsWaiting] = cur;
fileLocs[numEventsWaiting] = (String)eventsToBeRendered.get(cur);
}
eventsToBeRendered.clear();
}
}
final OpenMap map = pool.getMap(new DefaultEventColorizer());
try {
for(int i = 0; i < events.length; i++) {
StationLayer sl = map.getStationLayer();
sl.honorRepaint(false);
List up = soddb.getSuccessfulStationsForEvent(events[i]);
List down = soddb.getStationsForEvent(events[i]);
Iterator it = up.iterator();
while(it.hasNext()) {
down.remove(it.next());
}
addStations(sl, (StationImpl[])down.toArray(new StationImpl[0]), AvailableStationDataEvent.DOWN);
addStations(sl, (StationImpl[])up.toArray(new StationImpl[0]), AvailableStationDataEvent.UP);
sl.honorRepaint(true);
EventLayer el = map.getEventLayer();
DistanceLayer dl = map.getDistanceLayer();
EQDataEvent eqEvent = new EQDataEvent(new ProxyEventAccessOperations[] {events[i]});
el.eventDataChanged(eqEvent);
EQSelectionEvent selEvent = new EQSelectionEvent(this,
new ProxyEventAccessOperations[] {events[i]});
Origin orig = EventUtil.extractOrigin(events[i]);
map.getMapBean()
.center(new CenterEvent(this,
0.0f,
orig.getLocation().longitude));
dl.eqSelectionChanged(selEvent);
final String fileLoc = fileLocs[i];
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
try {
map.writeMapToPNG(fileLoc);
} catch(Throwable e) {
GlobalExceptionHandler.handle("problem writing map",
e);
}
}
});
sl.stationDataCleared();
el.eventDataCleared();
}
} catch(Throwable t) {
GlobalExceptionHandler.handle("Waveform map updater had a problem",
t);
}
pool.returnMap(map);
}
private static void addStations(StationLayer sl,
Station[] stations,
int status) {
sl.stationDataChanged(new StationDataEvent(stations));
for(int j = 0; j < stations.length; j++) {
sl.stationAvailabiltyChanged(new AvailableStationDataEvent(stations[j],
status));
}
}
public boolean add(EventAccessOperations ev, String outputLoc) {
synchronized(eventsToBeRendered) {
if(eventsToBeRendered.containsKey(ev)) { return false; }
eventsToBeRendered.put(ev, outputLoc);
OutputScheduler.getDefault().schedule(this);
return true;
}
}
private static final Status success = Status.get(Stage.PROCESSOR,
Standing.SUCCESS);
private Map eventsToBeRendered = Collections.synchronizedMap(new HashMap());
private MapPool pool;
private SodDB soddb;
private static Logger logger = LoggerFactory.getLogger(MapWaveformStatus.class);
}