ExternalPreferredListener.java
- package gov.usgs.earthquake.indexer;
- import java.util.HashMap;
- import java.util.Map;
- import gov.usgs.earthquake.product.Product;
- /**
- * (Experimental) Notify external processes when preferred product change within events.
- *
- * @author jmfee
- *
- */
- public class ExternalPreferredListener extends ExternalIndexerListener {
- /** Argument for Preferred action */
- public static final String PREFERRED_ACTION_ARGUMENT = "--preferred-action=";
- /**
- * Types of preferred product actions.
- */
- public static enum PreferredAction {
- /** Preferred added product enum */
- PREFERRED_ADDED,
- /** Preferred changed product enum */
- PREFERRED_CHANGED,
- /** Preferred removed product enum */
- PREFERRED_REMOVED
- };
- /**
- * Skip parent class processing, except autoArchiving.
- */
- @Override
- public boolean accept(final IndexerEvent event) {
- return false;
- }
- /**
- * Handle indexer events.
- */
- @Override
- public void onIndexerEvent(final IndexerEvent event) throws Exception {
- for (IndexerChange change : event.getIndexerChanges()) {
- if (!accept(event, change)) {
- // ignoreArchive, processOnlyWhenEventChanged checks
- continue;
- }
- Map<ProductSummary, PreferredAction> changes = getIndexerChangePreferredActions(change);
- for (ProductSummary changedProduct : changes.keySet()) {
- if (!accept(changedProduct.getId())) {
- continue;
- }
- Event changedEvent = change.getNewEvent();
- if (changedEvent == null) {
- // event archived...
- changedEvent = change.getOriginalEvent();
- }
- String command = getProductSummaryCommand(changedEvent, changedProduct);
- // indexer action
- command = command + " " +
- ExternalIndexerListener.EVENT_ACTION_ARGUMENT +
- change.getType().toString();
- // preferred product action
- command = command + " " +
- PREFERRED_ACTION_ARGUMENT +
- changes.get(changedProduct).toString();
- // pass product content as input to command
- Product product = null;
- try {
- // this product is not necessarily the product that triggered the change.
- product = storeProduct(event.getIndexer().getProductStorage().getProduct(changedProduct.getId()));
- } catch (Exception e) {
- // ignore, just leave null
- }
- runProductCommand(command, product);
- }
- }
- super.onIndexerEvent(event);
- }
- /**
- * Compare preferred products before/after IndexerChange was applied.
- *
- * @param change indexer change to evaluate.
- * @return map of preferred products that were changed.
- */
- public static Map<ProductSummary, PreferredAction> getIndexerChangePreferredActions(final IndexerChange change) {
- Map<ProductSummary, PreferredAction> changes = new HashMap<ProductSummary, PreferredAction>();
- // only event types
- IndexerChange.IndexerChangeType changeType = change.getType();
- if (changeType != IndexerChange.EVENT_ADDED &&
- changeType != IndexerChange.EVENT_DELETED &&
- changeType != IndexerChange.EVENT_MERGED &&
- changeType != IndexerChange.EVENT_SPLIT &&
- changeType != IndexerChange.EVENT_UPDATED) {
- return changes;
- }
- Map<String, ProductSummary> newProducts = getPreferredProducts(change.getNewEvent());
- Map<String, ProductSummary> originalProducts = getPreferredProducts(change.getOriginalEvent());
- // check all currently preferred products
- for (String type : newProducts.keySet()) {
- ProductSummary newProduct = newProducts.get(type);
- ProductSummary originalProduct = originalProducts.get(type);
- if (originalProduct == null) {
- // no product of this type previously existed
- changes.put(newProduct,
- PreferredAction.PREFERRED_ADDED);
- } else if (!newProduct.getId().equals(originalProduct.getId())) {
- // different from previous preferred product of same type
- changes.put(newProduct,
- PreferredAction.PREFERRED_CHANGED);
- }
- }
- for (String type : originalProducts.keySet()) {
- if (newProducts.get(type) == null) {
- // no product of this type exists anymore
- changes.put(originalProducts.get(type),
- PreferredAction.PREFERRED_REMOVED);
- }
- }
- return changes;
- }
- /**
- * Get a map of preferred products from an event.
- *
- * @param event the event.
- * @return preferred products, or empty hashmap if event is null.
- */
- public static Map<String, ProductSummary> getPreferredProducts(final Event event) {
- if (event == null) {
- return new HashMap<String, ProductSummary>();
- }
- return event.getPreferredProducts();
- }
- }