ProductArchivePolicy.java

  1. package gov.usgs.earthquake.indexer;

  2. import java.util.Date;
  3. import java.util.logging.Logger;

  4. import gov.usgs.earthquake.distribution.ConfigurationException;
  5. import gov.usgs.util.Config;

  6. /**
  7.  * An archive policy for products, instead of events.
  8.  *
  9.  * Allows removal of superseded products, preserving latest versions. Also
  10.  * allows targeting unassociated products.
  11.  */
  12. public class ProductArchivePolicy extends ArchivePolicy {

  13.     private static final Logger LOGGER = Logger
  14.             .getLogger(ProductArchivePolicy.class.getName());

  15.     // --------------------------------------------------------------------
  16.     // Names of configurable parameters
  17.     // --------------------------------------------------------------------

  18.     /** Property for archive min product age */
  19.     public static final String ARCHIVE_MIN_PRODUCT_AGE_PROPERTY = "minProductAge";
  20.     /** Property for archive max product age */
  21.     public static final String ARCHIVE_MAX_PRODUCT_AGE_PROPERTY = "maxProductAge";

  22.     /** Property for archive min product time */
  23.     public static final String ARCHIVE_MIN_PRODUCT_TIME_PROPERTY = "minProductTime";
  24.     /** Property for archive max product time */
  25.     public static final String ARCHIVE_MAX_PRODUCT_TIME_PROPERTY = "maxProductTime";

  26.     /** Property for archive product type */
  27.     public static final String ARCHIVE_TYPE_PROPERTY = "productType";
  28.     /** Property for archive product source */
  29.     public static final String ARCHIVE_SOURCE_PROPERTY = "productSource";
  30.     /** Property for archive superseded */
  31.     public static final String ARCHIVE_SUPERSEDED_PROPERTY = "onlySuperseded";
  32.     /** Property for archive unassociated */
  33.     public static final String ARCHIVE_UNASSOCIATED_PROPERTY = "onlyUnassociated";
  34.     /** Property for archive product status */
  35.     public static final String ARCHIVE_STATUS_PROPERTY = "productStatus";

  36.     /** Default state for archive superseded */
  37.     public static final String DEFAULT_ARCHIVE_SUPERSEDED = "true";
  38.     /** Default state for archive unassociated */
  39.     public static final String DEFAULT_ARCHIVE_UNASSOCIATED = "false";
  40.     // --------------------------------------------------------------------
  41.     // Configured parameters.
  42.     // --------------------------------------------------------------------

  43.     /** Configured parameter for min product age  */
  44.     protected Long minProductAge = null;
  45.     /** Configured parameter for max product age */
  46.     protected Long maxProductAge = null;
  47.     /** Configured parameter for min product time */
  48.     protected Long minProductTime = null;
  49.     /** Configured parameter for max product time */
  50.     protected Long maxProductTime = null;

  51.     /** Configured parameter for product type */
  52.     protected String productType = null;
  53.     /** Configured parameter for product source */
  54.     protected String productSource = null;
  55.     /** Configured parameter for only superseded */
  56.     protected boolean onlySuperseded = true;
  57.     /** Configured parameter for only unassociated */
  58.     protected boolean onlyUnassociated = false;
  59.     /** Configured parameter for product status */
  60.     protected String productStatus = null;

  61.     @SuppressWarnings("deprecation")
  62.     @Override
  63.     public void configure(Config config) throws Exception {
  64.         super.configure(config);

  65.         minProductAge = parseLong(config, ARCHIVE_MIN_PRODUCT_AGE_PROPERTY);
  66.         maxProductAge = parseLong(config, ARCHIVE_MAX_PRODUCT_AGE_PROPERTY);

  67.         minProductTime = parseDateOrLong(config, ARCHIVE_MIN_PRODUCT_TIME_PROPERTY);
  68.         maxProductTime = parseDateOrLong(config, ARCHIVE_MAX_PRODUCT_TIME_PROPERTY);

  69.         if (minProductAge != null && maxProductTime != null) {
  70.             LOGGER.config("Both minProductAge and maxProductTime were specified. "
  71.                     +
  72.                     "Ignoring minProductAge. Only maxProductTime will be used.");
  73.         }
  74.         if (maxProductAge != null && minProductTime != null) {
  75.             LOGGER.config("Both maxProductAge and minProductTime were specified. "
  76.                     +
  77.                     "Ignoring maxProductAge. Only minProductTime will be used.");
  78.         }

  79.         if ((minAge != null || maxAge != null) &&
  80.                 (minProductAge != null || maxProductAge != null ||
  81.                  minProductTime != null || maxProductTime != null)) {
  82.             /*
  83.              * Do we need to log in addition to throwing the exception?
  84.              * LOGGER.severe("Configuration mismatch. Can not specify both " +
  85.              * "minAge/maxAge (legacy) properties as well as " +
  86.              * "minEventAge/maxEventAge.");
  87.              */
  88.             ConfigurationException ce = new ConfigurationException(
  89.                     "Configuration mismatch. Can not specify both " +
  90.                             "minAge/maxAge (legacy) properties as well as " +
  91.                             "minProductAge/maxProductAge.");
  92.             ce.fillInStackTrace();
  93.             throw ce;
  94.         }

  95.         if ((minProductAge != null && maxProductAge != null) &&
  96.                 (minProductAge  > maxProductAge)) {

  97.             ConfigurationException ce = new ConfigurationException(
  98.                     "Configuration mismatch. minProductAge " +
  99.                             "greater than maxProductAge.");
  100.             ce.fillInStackTrace();
  101.             throw ce;
  102.         }

  103.         if ((minProductTime != null && maxProductTime != null) &&
  104.                 (minProductTime  > maxProductTime)) {

  105.             ConfigurationException ce = new ConfigurationException(
  106.                     "Configuration mismatch. minProductTime " +
  107.                             "greater than maxProductTime.");
  108.             ce.fillInStackTrace();
  109.             throw ce;
  110.         }

  111.         productType = config.getProperty(ARCHIVE_TYPE_PROPERTY);
  112.         productSource = config.getProperty(ARCHIVE_SOURCE_PROPERTY);
  113.         onlySuperseded = Boolean.valueOf(config.getProperty(
  114.                 ARCHIVE_SUPERSEDED_PROPERTY, DEFAULT_ARCHIVE_SUPERSEDED));
  115.         onlyUnassociated = Boolean.valueOf(config.getProperty(
  116.                 ARCHIVE_UNASSOCIATED_PROPERTY, DEFAULT_ARCHIVE_UNASSOCIATED));

  117.         productStatus = config.getProperty(ARCHIVE_STATUS_PROPERTY);
  118.     }

  119.     @SuppressWarnings("deprecation")
  120.     @Override
  121.     public ProductIndexQuery getIndexQuery() {
  122.         ProductIndexQuery productIndexQuery = super.getIndexQuery();
  123.         Date now = new Date();

  124.         // Order of minAge, minProductAge, minProductTime is important here.
  125.         // Preference order is minProductTime > minProductAge > minAge
  126.         // Similar for max* properties.

  127.         if (minAge != null) {
  128.             // min age corresponds to minimum product created time
  129.             productIndexQuery.setMinProductUpdateTime(new Date(now.getTime()
  130.                     - minAge.longValue()));
  131.             productIndexQuery.setMinEventTime(null);
  132.         }
  133.         if (maxAge != null) {
  134.             // max age corresponds to maximum product created time
  135.             productIndexQuery.setMaxProductUpdateTime(new Date(now.getTime()
  136.                     - maxAge.longValue()));
  137.             productIndexQuery.setMaxEventTime(null);
  138.         }

  139.         // See ASCII art in ArchivePolicy.getIndexQuery if you are confused by
  140.         // maxAge --> minTime differences.

  141.         if (maxProductAge != null) {
  142.             productIndexQuery.setMinProductUpdateTime(new Date(now.getTime()
  143.                     - maxProductAge.longValue()));
  144.         }
  145.         if (minProductAge != null) {
  146.             productIndexQuery.setMaxProductUpdateTime(new Date(now.getTime()
  147.                     - minProductAge.longValue()));
  148.         }

  149.         if (minProductTime != null) {
  150.             productIndexQuery.setMinProductUpdateTime(new Date(minProductTime
  151.                     .longValue()));
  152.         }
  153.         if (maxProductTime != null) {
  154.             productIndexQuery.setMaxProductUpdateTime(new Date(maxProductTime
  155.                     .longValue()));
  156.         }

  157.         // search for products of a specific type
  158.         productIndexQuery.setProductType(productType);
  159.         // search for products from a specific source
  160.         productIndexQuery.setProductSource(productSource);

  161.         if (onlySuperseded) {
  162.             // remove only old versions of products (keep the latest)
  163.             productIndexQuery
  164.                     .setResultType(ProductIndexQuery.RESULT_TYPE_SUPERSEDED);
  165.         } else {
  166.             // otherwise include all products
  167.             productIndexQuery.setResultType(ProductIndexQuery.RESULT_TYPE_ALL);
  168.         }

  169.         productIndexQuery.setProductStatus(productStatus);

  170.         // this archive policy searches products, so this shouldn't matter, but
  171.         // just to be safe in case the default changes
  172.         productIndexQuery
  173.                 .setEventSearchType(ProductIndexQuery.SEARCH_EVENT_PRODUCTS);

  174.         return productIndexQuery;
  175.     }

  176.     @Override
  177.     public boolean isValidPolicy() {
  178.         boolean valid = super.isValidPolicy();
  179.         return valid || (minProductAge != null || maxProductAge != null
  180.                 || minProductTime != null || maxProductTime != null
  181.                 || productType != null || productSource != null
  182.                 || productStatus != null);
  183.     }

  184.     /** @return minProductAge */
  185.     public Long getMinProductAge() {
  186.         return minProductAge;
  187.     }

  188.     /** @param minProductAge to set */
  189.     public void setMinProductAge(Long minProductAge) {
  190.         this.minProductAge = minProductAge;
  191.     }

  192.     /** @return maxProductAge */
  193.     public Long getMaxProductAge() {
  194.         return maxProductAge;
  195.     }

  196.     /** @param maxProductAge to set */
  197.     public void setMaxProductAge(Long maxProductAge) {
  198.         this.maxProductAge = maxProductAge;
  199.     }

  200.     /** @return minProductTime */
  201.     public Long getMinProductTime() {
  202.         return minProductTime;
  203.     }

  204.     /** @param minProductTime to set */
  205.     public void setMinProductTime(Long minProductTime) {
  206.         this.minProductTime = minProductTime;
  207.     }

  208.     /** @return maxProductTime */
  209.     public Long getMaxProductTime() {
  210.         return maxProductTime;
  211.     }

  212.     /** @param maxProductTime to set */
  213.     public void setMaxProductTime(Long maxProductTime) {
  214.         this.maxProductTime = maxProductTime;
  215.     }

  216.     /** @return productType */
  217.     public String getProductType() {
  218.         return productType;
  219.     }

  220.     /** @param productType to set */
  221.     public void setProductType(String productType) {
  222.         this.productType = productType;
  223.     }

  224.     /** @return productSource */
  225.     public String getProductSource() {
  226.         return productSource;
  227.     }

  228.     /** @param productSource to set */
  229.     public void setProductSource(String productSource) {
  230.         this.productSource = productSource;
  231.     }

  232.     /** @return onlySuperseded */
  233.     public boolean isOnlySuperseded() {
  234.         return onlySuperseded;
  235.     }

  236.     /** @param onlySuperseded to set */
  237.     public void setOnlySuperseded(boolean onlySuperseded) {
  238.         this.onlySuperseded = onlySuperseded;
  239.     }

  240.     /** @return onlyUnassociated */
  241.     public boolean isOnlyUnassociated() {
  242.         return onlyUnassociated;
  243.     }

  244.     /** @param onlyUnassociated to set */
  245.     public void setOnlyUnassociated(boolean onlyUnassociated) {
  246.         this.onlyUnassociated = onlyUnassociated;
  247.     }

  248.     /** @return productStatus */
  249.     public String getProductStatus() {
  250.         return productStatus;
  251.     }

  252.     /** @param productStatus to set */
  253.     public void setProductStatus(String productStatus) {
  254.         this.productStatus = productStatus;
  255.     }
  256. }