ExternalPreferredListener.java

  1. package gov.usgs.earthquake.indexer;

  2. import java.util.HashMap;
  3. import java.util.Map;

  4. import gov.usgs.earthquake.product.Product;

  5. /**
  6.  * (Experimental) Notify external processes when preferred product change within events.
  7.  *
  8.  * @author jmfee
  9.  *
  10.  */
  11. public class ExternalPreferredListener extends ExternalIndexerListener {

  12.     /** Argument for Preferred action */
  13.     public static final String PREFERRED_ACTION_ARGUMENT = "--preferred-action=";

  14.     /**
  15.      * Types of preferred product actions.
  16.      */
  17.     public static enum PreferredAction {
  18.         /** Preferred added product enum */
  19.         PREFERRED_ADDED,
  20.         /** Preferred changed product enum */
  21.         PREFERRED_CHANGED,
  22.         /** Preferred removed product enum */
  23.         PREFERRED_REMOVED
  24.     };

  25.     /**
  26.      * Skip parent class processing, except autoArchiving.
  27.      */
  28.     @Override
  29.     public boolean accept(final IndexerEvent event) {
  30.         return false;
  31.     }

  32.     /**
  33.      * Handle indexer events.
  34.      */
  35.     @Override
  36.     public void onIndexerEvent(final IndexerEvent event) throws Exception {
  37.         for (IndexerChange change : event.getIndexerChanges()) {
  38.             if (!accept(event, change)) {
  39.                 // ignoreArchive, processOnlyWhenEventChanged checks
  40.                 continue;
  41.             }

  42.             Map<ProductSummary, PreferredAction> changes = getIndexerChangePreferredActions(change);
  43.             for (ProductSummary changedProduct : changes.keySet()) {
  44.                 if (!accept(changedProduct.getId())) {
  45.                     continue;
  46.                 }

  47.                 Event changedEvent = change.getNewEvent();
  48.                 if (changedEvent == null) {
  49.                     // event archived...
  50.                     changedEvent = change.getOriginalEvent();
  51.                 }

  52.                 String command = getProductSummaryCommand(changedEvent, changedProduct);

  53.                 // indexer action
  54.                 command = command + " " +
  55.                         ExternalIndexerListener.EVENT_ACTION_ARGUMENT +
  56.                         change.getType().toString();

  57.                 // preferred product action
  58.                 command = command + " " +
  59.                         PREFERRED_ACTION_ARGUMENT +
  60.                         changes.get(changedProduct).toString();

  61.                 // pass product content as input to command
  62.                 Product product = null;
  63.                 try {
  64.                     // this product is not necessarily the product that triggered the change.
  65.                     product = storeProduct(event.getIndexer().getProductStorage().getProduct(changedProduct.getId()));
  66.                 } catch (Exception e) {
  67.                     // ignore, just leave null
  68.                 }

  69.                 runProductCommand(command, product);
  70.             }
  71.         }

  72.         super.onIndexerEvent(event);
  73.     }

  74.     /**
  75.      * Compare preferred products before/after IndexerChange was applied.
  76.      *
  77.      * @param change indexer change to evaluate.
  78.      * @return map of preferred products that were changed.
  79.      */
  80.     public static Map<ProductSummary, PreferredAction> getIndexerChangePreferredActions(final IndexerChange change) {
  81.         Map<ProductSummary, PreferredAction> changes = new HashMap<ProductSummary, PreferredAction>();

  82.         // only event types
  83.         IndexerChange.IndexerChangeType changeType = change.getType();
  84.         if (changeType != IndexerChange.EVENT_ADDED &&
  85.                 changeType != IndexerChange.EVENT_DELETED &&
  86.                 changeType != IndexerChange.EVENT_MERGED &&
  87.                 changeType != IndexerChange.EVENT_SPLIT &&
  88.                 changeType != IndexerChange.EVENT_UPDATED) {
  89.             return changes;
  90.         }

  91.         Map<String, ProductSummary> newProducts = getPreferredProducts(change.getNewEvent());
  92.         Map<String, ProductSummary> originalProducts = getPreferredProducts(change.getOriginalEvent());

  93.         // check all currently preferred products
  94.         for (String type : newProducts.keySet()) {
  95.             ProductSummary newProduct = newProducts.get(type);
  96.             ProductSummary originalProduct = originalProducts.get(type);

  97.             if (originalProduct == null) {
  98.                 // no product of this type previously existed
  99.                 changes.put(newProduct,
  100.                         PreferredAction.PREFERRED_ADDED);
  101.             } else if (!newProduct.getId().equals(originalProduct.getId())) {
  102.                 // different from previous preferred product of same type
  103.                 changes.put(newProduct,
  104.                         PreferredAction.PREFERRED_CHANGED);
  105.             }
  106.         }

  107.         for (String type : originalProducts.keySet()) {
  108.             if (newProducts.get(type) == null) {
  109.                 // no product of this type exists anymore
  110.                 changes.put(originalProducts.get(type),
  111.                         PreferredAction.PREFERRED_REMOVED);
  112.             }
  113.         }

  114.         return changes;
  115.     }

  116.     /**
  117.      * Get a map of preferred products from an event.
  118.      *
  119.      * @param event the event.
  120.      * @return preferred products, or empty hashmap if event is null.
  121.      */
  122.     public static Map<String, ProductSummary> getPreferredProducts(final Event event) {
  123.         if (event == null) {
  124.             return new HashMap<String, ProductSummary>();
  125.         }
  126.         return event.getPreferredProducts();
  127.     }

  128. }