GridXYZHandler.java
/**
* This class is currently not in use, but kept for posterity and the ability
* to add this support back in if it is deemed necessary.
*/
package gov.usgs.earthquake.shakemap;
import java.util.zip.ZipInputStream;
import gov.usgs.util.StreamUtils;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
/**
* Parser for ShakeMap grid.xyz metadata.
*
* id magnitude latitude longitude month day year hour:minute:second timezone
* lonMin latMin lonMax latMax (Process time: dow month day hour:minute:second
* year) eventDescription 2009232_290541 4.2 41.94 -114.09 AUG 20 2009 06:44:11
* GMT -115.327 41.0306 -112.844 42.8806 (Process time: Wed Aug 19 23:55:49
* 2009) 73.1 miles NE of WELLS-NV
*/
public class GridXYZHandler {
/** Format for event times */
public static final SimpleDateFormat EVENT_TIMESTAMP_FORMAT = new SimpleDateFormat(
"MMM dd yyyy HH:mm:ss zzz");
/** Format for process times */
public static final SimpleDateFormat PROCESS_TIMESTAMP_FORMAT = new SimpleDateFormat(
"'(Process time: 'EEE MMM dd HH:mm:ss yyyy')'");
private ShakeMap shakemap;
/**
* Constructor
* @param shakemap a shakemap
*/
public GridXYZHandler(ShakeMap shakemap) {
this.shakemap = shakemap;
}
/** @return shakemap */
public ShakeMap getShakemap() {
return shakemap;
}
/** @param shakemap to set */
public void setShakemap(ShakeMap shakemap) {
this.shakemap = shakemap;
}
/**
* Read first line of grid.xyz file and set properties on ShakeMap object.
*
* @param in the grid.xyz input stream.
* @throws Exception if error occurs
*/
public void parse(final InputStream in) throws Exception {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
new ZipInputStream(in)));
String firstLine = br.readLine();
br.close();
String parts[] = firstLine.split(" ");
// id
shakemap.setEventSourceCode(parts[0]);
// magnitude
shakemap.setMagnitude(new BigDecimal(parts[1]));
// latitude
shakemap.setLatitude(new BigDecimal(parts[2]));
// longitude
shakemap.setLongitude(new BigDecimal(parts[3]));
// month day year hour:minute:second timezone
String[] eventTimestampParts = new String[5];
System.arraycopy(parts, 4, eventTimestampParts, 0, 5);
shakemap.setEventTime(EVENT_TIMESTAMP_FORMAT.parse(join(" ",
eventTimestampParts)));
// lonMin
shakemap.setMinimumLongitude(new BigDecimal(parts[9]));
// latMin
shakemap.setMinimumLatitude(new BigDecimal(parts[10]));
// lonMax
shakemap.setMaximumLongitude(new BigDecimal(parts[11]));
// latMax
shakemap.setMaximumLatitude(new BigDecimal(parts[12]));
// (Process time: dow month day hour:minute:second year)
String[] processTimestampParts = new String[7];
System.arraycopy(parts, 13, processTimestampParts, 0, 7);
shakemap.setProcessTimestamp(PROCESS_TIMESTAMP_FORMAT.parse(join(" ",
processTimestampParts)));
String eventDescription = "";
for (int i = 20; i < parts.length; i++) {
eventDescription += parts[i] + " ";
}
shakemap.setEventDescription(eventDescription.trim());
} finally {
StreamUtils.closeStream(in);
}
}
/**
* Appends a string array of parts with a delimeter inbetween
* @param delimeter to add between parts
* @param parts string array to combine
* @return A string of delimited parts
*/
protected String join(final String delimeter, final String[] parts) {
StringBuffer buf = new StringBuffer();
if (parts == null) {
return "";
}
buf.append(parts[0]);
for (int i = 1; i < parts.length; i++) {
buf.append(delimeter);
buf.append(parts[i]);
}
return buf.toString();
}
}