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();
	}

}