DirectoryProductHandler.java

/*
 * DirectoryProductHandler
 */
package gov.usgs.earthquake.product.io;

import gov.usgs.earthquake.product.Content;
import gov.usgs.earthquake.product.FileContent;
import gov.usgs.earthquake.product.ProductId;
import gov.usgs.earthquake.product.URLContent;
import gov.usgs.util.StreamUtils;

import java.io.File;
import java.io.OutputStream;

/**
 * Store a product to a Directory.
 * 
 * Product attributes are stored to a file named "product.xml". All
 * ProductOutput methods are passed to an ObjectProductOutput object, except
 * files with non-empty paths. Files are stored in the directory, and all other
 * product attributes are stored using the product xml format to a file name
 * "product.xml".
 */
public class DirectoryProductHandler extends ObjectProductHandler {

	/** The file where product attributes are stored. */
	public static final String PRODUCT_XML_FILENAME = "product.xml";

	/** Directory where product contents are stored. */
	private File directory;

	/**
	 * Construct a new DirectoryProductHandler object.
	 * 
	 * @param directory
	 *            where product contents will be stored.
	 */
	public DirectoryProductHandler(final File directory) {
		this.directory = directory;
	}

	/**
	 * Extract content when path isn't empty.
	 */
	public void onContent(ProductId id, String path, Content content)
			throws Exception {
		if ("".equals(path)) {
			super.onContent(id, path, content);
		} else {
			// FileContent copy constructor extracts content
			FileContent fc = new FileContent(content, new File(directory, path));
			super.onContent(id, path, new URLContent(fc));
			fc = null;
		}
	}

	/**
	 * Store all except product contents to product.xml.
	 */
	public void onEndProduct(ProductId id) throws Exception {
		super.onEndProduct(id);

		// save reference to stream, so it can be forced close.
		OutputStream out = null;
		ProductSource source = null;
		ProductHandler handler = null;
		try {
			out = StreamUtils.getOutputStream(new File(directory,
					PRODUCT_XML_FILENAME));

			// save product attributes as xml
			source = new ObjectProductSource(getProduct());
			handler = new XmlProductHandler(out);
			source.streamTo(handler);
		} finally {
			// close stream
			StreamUtils.closeStream(out);
			if (source != null) {
				source.close();
			}
			if (handler != null) {
				handler.close();
			}
		}
	}

}