EIDSOutputWedge.java

package gov.usgs.earthquake.eids;

import java.io.File;
import java.util.logging.Logger;
import gov.usgs.earthquake.distribution.DefaultNotificationListener;
import gov.usgs.earthquake.product.Product;
import gov.usgs.util.Config;
import gov.usgs.util.FileUtils;

/**
 * Output received products as files in a folder.
 */
public class EIDSOutputWedge extends DefaultNotificationListener {

	/** Logging object. */
	private static final Logger LOGGER = Logger
			.getLogger(EIDSOutputWedge.class.getName());

	/** String for output type of EQXML */
	public static final String OUTPUT_TYPE_EQXML = "eqxml.xml";
	/** String for output type of quakeml */
	public static final String OUTPUT_TYPE_QUAKEML = "quakeml.xml";
	/** String for output type of cube */
	public static final String OUTPUT_TYPE_CUBE = "cube.txt";

	/** Property for output directory */
	public static final String OUTPUT_DIRECTORY_PROPERTY = "directory";
	/** Property for temp directory */
	public static final String TEMP_DIRECTORY_PROPERTY = "tempDirectory";
	/** Property for file name */
	public static final String FILE_NAME_PROPERTY = "contentFile";
	/** Property for output format */
	public static final String OUTPUT_FORMAT_PROPERTY = "outputFormat";

	/** Default output directory */
	public static final File DEFAULT_DIRECTORY = new File("outputdir");
	/** Default temp directory */
	public static final File DEFAULT_TEMP_DIRECTORY = new File(
			System.getProperty("java.io.tmpdir"));
	/** Sets default output format to cube.txt */
	public static final String DEFAULT_OUTPUT_FORMAT = OUTPUT_TYPE_CUBE;

	// Local Variables
	private File directory = DEFAULT_DIRECTORY;
	private File tempDirectory = DEFAULT_TEMP_DIRECTORY;
	private String outputFormat = DEFAULT_OUTPUT_FORMAT;
	// converter object
	private LegacyConverter converter;

	/**
	 * Create a new EIDSOutputWedge.
	 *
	 * Sets up the includeTypes list to contain "origin". Override this if you
	 * want the behavior to extend past origin products.
	 */
	public EIDSOutputWedge() {
		this.getIncludeTypes().add("origin");
		converter = LegacyConverter.cubeConverter();
	}

	/**
	 * Receive a product from Product Distribution.
	 *
	 * @param product A product
	 */
	@Override
	public void onProduct(final Product product) throws Exception {
		byte[] data = converter.convert(product);

		if (data != null) {
			write(data);
		}
	}

	/**
	 * Configuration
	 */
	@Override
	public void configure(final Config config) throws Exception {
		super.configure(config);

		setDirectory(new File(config.getProperty(OUTPUT_DIRECTORY_PROPERTY,
				DEFAULT_DIRECTORY.getName())));

		setTempDirectory(new File(config.getProperty(TEMP_DIRECTORY_PROPERTY,
				DEFAULT_TEMP_DIRECTORY.getName())));

		setOutputFormat(config.getProperty(OUTPUT_FORMAT_PROPERTY,
				DEFAULT_OUTPUT_FORMAT));

	}

	/**
	 * Writes the content of the file you wish to extract to disk with a unique
	 * name and at the directory specified in configuration
	 *
	 * @param data
	 * @throws Exception
	 */
	private void write(byte[] data) throws Exception {
		String uniqueFileName = System.currentTimeMillis() + "_" + outputFormat;
		File destFile = new File(directory, uniqueFileName);

		// Handles case where filename is already in use
		// In practice this shouldn't trigger
		while (destFile.exists()) {
			uniqueFileName = System.currentTimeMillis() + "_"
					+ (int) (Math.random() * 10000) + "_" + outputFormat;
			destFile = new File(directory, uniqueFileName);

			LOGGER.info("Eqxml name not unique. Attempting to resolve as "
					+ uniqueFileName);
		}

		File srcFile = new File(tempDirectory, uniqueFileName);
		FileUtils.writeFileThenMove(srcFile, destFile, data);
	}

	/** @return directory */
	public File getDirectory() {
		return directory;
	}

	/** @return tempDirectory */
	public File getTempDirectory() {
		return tempDirectory;
	}

	/** @return outputFormat */
	public String getOutputFormat() {
		return outputFormat;
	}

	/** @return legacy converter */
	public LegacyConverter getConverter() {
		return converter;
	}

	/** @param directory file to set */
	public void setDirectory(File directory) {
		this.directory = directory;
	}

	/** @param tempDirectory file to set */
	public void setTempDirectory(File tempDirectory) {
		this.tempDirectory = tempDirectory;
	}

	/** @param outputFormat string to set */
	public void setOutputFormat(String outputFormat) {
		if (outputFormat.equals(OUTPUT_TYPE_EQXML)) {
			converter = LegacyConverter.eqxmlConverter();
		} else if (outputFormat.equals(OUTPUT_TYPE_QUAKEML)) {
			converter = LegacyConverter.quakemlConverter();
		} else if (outputFormat.equals(OUTPUT_TYPE_CUBE)) {
			converter = LegacyConverter.cubeConverter();
		} else {
			throw new IllegalArgumentException("Unknown outputFormat '"
					+ outputFormat + "'");
		}
		this.outputFormat = outputFormat;
	}

}