package edu.sc.seis.sod.velocity.event; import java.io.StringWriter; import java.text.DecimalFormat; import java.text.ParseException; import java.util.List; import java.util.TimeZone; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import edu.iris.Fissures.FlinnEngdahlRegion; import edu.iris.Fissures.FlinnEngdahlType; import edu.iris.Fissures.IfEvent.EventAccessOperations; import edu.iris.Fissures.IfEvent.NoPreferredOrigin; import edu.iris.Fissures.IfEvent.Origin; import edu.iris.Fissures.event.OriginImpl; import edu.iris.Fissures.model.ISOTime; import edu.iris.Fissures.model.MicroSecondDate; import edu.iris.Fissures.model.QuantityImpl; import edu.iris.Fissures.model.UnitImpl; import edu.sc.seis.fissuresUtil.cache.CacheEvent; import edu.sc.seis.fissuresUtil.cache.ProxyEventAccessOperations; import edu.sc.seis.fissuresUtil.chooser.ThreadSafeDecimalFormat; import edu.sc.seis.fissuresUtil.chooser.ThreadSafeSimpleDateFormat; import edu.sc.seis.fissuresUtil.display.ParseRegions; import edu.sc.seis.fissuresUtil.xml.XMLEvent; import edu.sc.seis.fissuresUtil.xml.XMLUtil; import edu.sc.seis.sod.status.FissuresFormatter; import edu.sc.seis.sod.velocity.SimpleVelocitizer; import edu.sc.seis.sod.velocity.network.VelocityStation; /** * @author groves Created on Dec 14, 2004 */ public class VelocityEvent extends ProxyEventAccessOperations { public VelocityEvent(CacheEvent event) { if (event == null) {throw new NullPointerException("event cannot be null");} this.event = event; this.origin = getOrigin(); } public String getName() { if (get_attributes().name != null & get_attributes().name.length() > 0) { return get_attributes().name; } else if (hasRegion()) { return getRegion(); } else { return getTime(); } } public boolean hasRegion() { return get_attributes().region != null && get_attributes().region.number > 0; } public String getRegion() { return pr.getRegionName(get_attributes().region); } public String getRegionNumber(){ FlinnEngdahlRegion region = get_attributes().region; String type = region.type == FlinnEngdahlType.GEOGRAPHIC_REGION ? "Geographic" : "Seismic"; return type + " " + get_attributes().region.number; } public String getMagnitude() { if(origin.getMagnitudes().length == 0) { return "-"; } return FissuresFormatter.formatMagnitude(origin.getMagnitudes()[0]); } public String getAllMagnitudes() { return getAllMagnitudes(", "); } public String getAllMagnitudes(String seperator) { String s = ""; for(int i = 0; i < origin.getMagnitudes().length; i++) { s += FissuresFormatter.formatMagnitude(origin.getMagnitudes()[i]); if(i != origin.getMagnitudes().length - 1) { s += seperator; } } return s; } public String getMagnitudeValue() { if (origin.getMagnitudes().length != 0) { return "" + origin.getMagnitudes()[0].value; } else { return ""; } } public String getMagnitudeType() { if (origin.getMagnitudes().length != 0) { return origin.getMagnitudes()[0].type; } else { return ""; } } public String getMagnitudeContributor() { if (origin.getMagnitudes().length != 0) { return origin.getMagnitudes()[0].contributor; } else { return ""; } } public String getLatitude() { return df.format(origin.getLocation().latitude); } public String getLongitude() { return df.format(origin.getLocation().longitude); } public String getLatitude(String format) { return new DecimalFormat(format).format(origin.getLocation().latitude); } public String getLongitude(String format) { return new DecimalFormat(format).format(origin.getLocation().longitude); } public Float getFloatLatitude() { return new Float(origin.getLocation().latitude); } public Float getFloatLongitude() { return new Float(origin.getLocation().longitude); } public String getOrientedLatitude() { if(origin.getLocation().latitude < 0) { return df.format(-origin.getLocation().latitude) + " S"; } return df.format(origin.getLocation().latitude) + " N"; } public String getOrientedLongitude() { if(origin.getLocation().longitude < 0) { return df.format(-origin.getLocation().longitude) + " W"; } return df.format(origin.getLocation().longitude) + " E"; } public String getDepth() { return FissuresFormatter.formatDepth(FissuresFormatter.getDepth(origin)); } public String getDepthValue() { return getDepth("0.0"); } public String getDepth(String format) { double depthInKM = QuantityImpl.createQuantityImpl(origin.getLocation().depth) .convertTo(UnitImpl.KILOMETER).value; return new DecimalFormat(format).format(depthInKM); } public String getElevation() { return FissuresFormatter.formatDepth(QuantityImpl.createQuantityImpl(origin.getLocation().elevation)); } public String getElevation(String format) { double elevInMeters = QuantityImpl.createQuantityImpl(origin.getLocation().elevation) .convertTo(UnitImpl.METER).value; return new DecimalFormat(format).format(elevInMeters); } public String getTime() { return getTime("yyyy/MM/dd HH:mm:ss z"); } public String getTimePrecise() { return getTime("yyyy/MM/dd HH:mm:ss.SSS Z"); } public String getFilizedTime() { return getTime("yyyy_DDD_HH_mm_ss_ZZZ"); } public String getTime(String format) { return SimpleVelocitizer.format(new MicroSecondDate(origin.getOriginTime()), format); } public String getCatalog() { return origin.getCatalog(); } public String getContributor() { return origin.getContributor(); } public int getId() { return getDbid(); } /** just because I can never remember if it is i or I */ public int getDbId() { return getDbid(); } public int getDbid() { return ((CacheEvent)event).getDbid(); } public OriginImpl getPreferred() throws NoPreferredOrigin { return getCacheEvent().getPreferred(); } public Origin[] getOrigins() { return getCacheEvent().getOrigins(); } public String getParam(String name) { for(int i = 0; i < origin.getParmIds().length; i++) { if(origin.getParmIds()[i].a_id.equals(name)) { return origin.getParmIds()[i].creator; } } return null; } public String getDistanceDeg(VelocityStation sta) { return sta.getDistanceDeg(this); } public String getDistance(VelocityStation sta) { return sta.getDistance(this); } public String getAz(VelocityStation sta) { return sta.getAz(this); } public String getBaz(VelocityStation sta) { return sta.getBaz(this); } public void setPosition(int[] position) { this.position = position; } public int[] getPosition() { return position; } public String toXML() throws XMLStreamException { StringWriter writer = new StringWriter(); XMLStreamWriter xmlWriter = XMLUtil.getStaxOutputFactory().createXMLStreamWriter(writer); XMLEvent.insert(xmlWriter, this); return writer.toString(); } public String getURL() { return "earthquakes/" + makeDateIdentifier(this); } public CacheEvent getCacheEvent() { if(event instanceof CacheEvent) { return (CacheEvent)event; } return new CacheEvent(event); } private static ThreadSafeSimpleDateFormat fullDateIdentifier = new ThreadSafeSimpleDateFormat("yyyy/MM/dd/HH/mm/ss", ISOTime.UTC); public static String makeDateIdentifier(VelocityEvent event) { synchronized(fullDateIdentifier) { return fullDateIdentifier.format(new MicroSecondDate(event.getOrigin().getOriginTime())); } } public static MicroSecondDate parseDateIdentifier(String eqIdentifier) throws ParseException { synchronized(fullDateIdentifier) { return new MicroSecondDate(fullDateIdentifier.parse(eqIdentifier)); } } private Origin origin; private int[] position; private static ParseRegions pr = ParseRegions.getInstance(); private ThreadSafeDecimalFormat df = new ThreadSafeDecimalFormat("0.0"); public static VelocityEvent[] wrap(List evs) { VelocityEvent[] velEvs = new VelocityEvent[evs.size()]; for(int i = 0; i < velEvs.length; i++) { velEvs[i] = wrap((EventAccessOperations)evs.get(i)); } return velEvs; } public static VelocityEvent[] wrap(EventAccessOperations[] evs) { VelocityEvent[] velEvs = new VelocityEvent[evs.length]; for(int i = 0; i < velEvs.length; i++) { velEvs[i] = wrap(evs[i]); } return velEvs; } public static VelocityEvent wrap(EventAccessOperations event) { if(event instanceof VelocityEvent) { return (VelocityEvent)event; } else if(event instanceof CacheEvent) { return new VelocityEvent((CacheEvent)event); } else { return new VelocityEvent(new CacheEvent(event)); } } }