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

}