Ticket 685: Filter possibility needed in Google Maps route and in WRWP route jenkins-Beast-365
authorMats Vernersson <mats.vernersson@smhi.se>
Fri, 26 May 2017 09:58:24 +0000 (11:58 +0200)
committerMats Vernersson <mats.vernersson@smhi.se>
Fri, 26 May 2017 09:58:24 +0000 (11:58 +0200)
Filtering possibility added to WRWP rule.

16 files changed:
itest/eu/baltrad/beast/rules/acrr/AcrrRuleITest.java
itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest-context.xml
itest/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerITest.java
src/eu/baltrad/beast/db/filters/LowestAngleFilter.java [deleted file]
src/eu/baltrad/beast/rules/acrr/AcrrRule.java
src/eu/baltrad/beast/rules/composite/CompositingRule.java
src/eu/baltrad/beast/rules/dist/DistributionRule.java
src/eu/baltrad/beast/rules/gmap/GoogleMapRule.java
src/eu/baltrad/beast/rules/gra/GraRule.java
src/eu/baltrad/beast/rules/scansun/ScansunRule.java
src/eu/baltrad/beast/rules/site2d/Site2DRule.java
src/eu/baltrad/beast/rules/volume/VolumeRule.java
src/eu/baltrad/beast/rules/wrwp/WrwpRule.java
src/eu/baltrad/beast/rules/wrwp/WrwpRuleManager.java
test/eu/baltrad/beast/rules/wrwp/WrwpRuleManagerTest.java
test/eu/baltrad/beast/rules/wrwp/WrwpRuleTest.java

index b968f5f..5ac75b2 100644 (file)
@@ -19,27 +19,19 @@ along with the Beast library library.  If not, see <http://www.gnu.org/licenses/
 
 package eu.baltrad.beast.rules.acrr;
 
-import static org.junit.Assert.*;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.util.List;
 
-import junit.framework.TestCase;
-
-import org.junit.Test;
 import org.springframework.context.support.AbstractApplicationContext;
 
 import eu.baltrad.bdb.db.FileEntry;
 import eu.baltrad.bdb.util.DateTime;
 import eu.baltrad.beast.db.Catalog;
 import eu.baltrad.beast.db.CatalogEntry;
-import eu.baltrad.beast.db.filters.TimeIntervalFilter;
-import eu.baltrad.beast.db.filters.TimeSelectionFilter;
 import eu.baltrad.beast.itest.BeastDBTestHelper;
-import eu.baltrad.beast.rules.timer.TimeoutManager;
 import eu.baltrad.beast.rules.util.IRuleUtilities;
-import eu.baltrad.beast.rules.volume.VolumeRule;
+import junit.framework.TestCase;
 
 /**
  * @author Anders Henja
index dc28acd..4a958e3 100644 (file)
@@ -54,6 +54,8 @@
 
   <bean id="ruleutil" class="eu.baltrad.beast.rules.util.RuleUtilities" autowire="byType"/>
   
+  <bean id="filterManager" class="eu.baltrad.beast.rules.RuleFilterManager" autowire="byType" />
+  
   <bean id="bltwrwpmgr" class="eu.baltrad.beast.rules.wrwp.WrwpRuleManager" autowire="byType" />
 </beans>
 
index 4c3495f..1a27451 100644 (file)
@@ -22,7 +22,6 @@ package eu.baltrad.beast.rules.wrwp;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -36,6 +35,7 @@ import org.springframework.jdbc.core.JdbcOperations;
 
 import eu.baltrad.beast.db.Catalog;
 import eu.baltrad.beast.itest.BeastDBTestHelper;
+import eu.baltrad.beast.rules.RuleFilterManager;
 import eu.baltrad.beast.rules.util.IRuleUtilities;
 
 /**
@@ -51,6 +51,7 @@ public class WrwpRuleManagerITest {
   private JdbcOperations template = null;
   private Catalog catalog = null;
   private IRuleUtilities utilities = null;
+  private RuleFilterManager filterManager = null;
 
   @Before
   public void setUp() throws Exception {
@@ -65,11 +66,13 @@ public class WrwpRuleManagerITest {
     context = BeastDBTestHelper.loadContext(this);
     catalog = (Catalog)context.getBean("catalog");
     utilities = (IRuleUtilities)context.getBean("ruleutil");
+    filterManager = (RuleFilterManager)context.getBean("filterManager");
 
     classUnderTest = new WrwpRuleManager();
     classUnderTest.setCatalog(catalog);
     classUnderTest.setRuleUtilities(utilities);
     classUnderTest.setJdbcTemplate(template);
+    classUnderTest.setFilterManager(filterManager);
   }
    
   @After
@@ -79,6 +82,7 @@ public class WrwpRuleManagerITest {
     template = null;
     catalog = null;
     utilities = null;
+    filterManager = null;
     context.close();
     dbcontext.close();
   }
@@ -157,8 +161,4 @@ public class WrwpRuleManagerITest {
     Assertion.assertEquals(expectedsrc, actualsrc);
   }
   
-  private String getFilePath(String resource) throws Exception {
-    File f = new File(this.getClass().getResource(resource).getFile());
-    return f.getAbsolutePath();
-  }
 }
diff --git a/src/eu/baltrad/beast/db/filters/LowestAngleFilter.java b/src/eu/baltrad/beast/db/filters/LowestAngleFilter.java
deleted file mode 100644 (file)
index 67cee99..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-/* --------------------------------------------------------------------
-Copyright (C) 2009-2010 Swedish Meteorological and Hydrological Institute, SMHI,
-
-This file is part of the Beast library.
-
-Beast library is free software: you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-Beast library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License
-along with the Beast library library.  If not, see <http://www.gnu.org/licenses/>.
-------------------------------------------------------------------------*/
-package eu.baltrad.beast.db.filters;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import eu.baltrad.bdb.db.FileQuery;
-import eu.baltrad.bdb.expr.Expression;
-import eu.baltrad.bdb.expr.ExpressionFactory;
-import eu.baltrad.bdb.util.DateTime;
-
-import eu.baltrad.beast.db.ICatalogFilter;
-
-/**
- * @author Anders Henja
- */
-public class LowestAngleFilter implements ICatalogFilter {
-  /**
-   * The start datetime we are interested in
-   */
-  private DateTime startDT = null;
-
-  /**
-   * The stop datetime we are interested in
-   */
-  private DateTime stopDT = null;
-
-  /**
-   * The source we are interested in.
-   */
-  private String source = null;
-  
-  /**
-   * The quantity we are interested in
-   */
-  private String quantity = null;
-  
-  /**
-   * If item located should be closed to the start date (ascending sort by date/time
-   */
-  private boolean closestToStartDate = false;
-  
-  /**
-   * @see eu.baltrad.beast.db.ICatalogFilter#apply(eu.baltrad.bdb.db.FileQuery)
-   */
-  @Override
-  public void apply(FileQuery query) {
-    ExpressionFactory xpr = new ExpressionFactory();
-    Expression dtAttr = xpr.combinedDateTime("what/date", "what/time");
-
-    if (source == null) {
-      throw new IllegalArgumentException("datetime and at source required");
-    }
-
-    List<Expression> filters = new ArrayList<Expression>();
-
-    filters.add(xpr.eq(xpr.attribute("what/object"), xpr.literal("SCAN")));
-    filters.add(xpr.eq(xpr.attribute("_bdb/source_name"), xpr.literal(source)));
-
-    if (quantity != null) {
-      filters.add(xpr.eq(xpr.attribute("what/quantity"), xpr.literal(quantity)));
-    }
-    
-    if (startDT != null) {
-      filters.add(xpr.ge(dtAttr, xpr.literal(this.startDT)));
-    }
-    
-    if (stopDT != null) {
-      filters.add(xpr.lt(dtAttr, xpr.literal(this.stopDT)));
-    }
-
-    query.setFilter(xpr.and(filters));
-    
-    query.appendOrderClause(xpr.asc(xpr.attribute("where/elangle")));
-    if (closestToStartDate) {
-      query.appendOrderClause(xpr.asc(dtAttr));
-    }
-    query.setLimit(1);
-  }
-
-  /**
-   * @param datetime the datetime to set
-   */
-  public void setStart(DateTime datetime) {
-    this.startDT = datetime;
-  }
-
-  /**
-   * @return the datetime
-   */
-  public DateTime getStart() {
-    return startDT;
-  }
-
-  /**
-   * @param datetime the datetime to set
-   */
-  public void setStop(DateTime datetime) {
-    this.stopDT = datetime;
-  }
-
-  /**
-   * @return the datetime
-   */
-  public DateTime getStop() {
-    return stopDT;
-  }
-  
-  /**
-   * @param source the source to set
-   */
-  public void setSource(String source) {
-    this.source = source;
-  }
-
-  /**
-   * @return the sources
-   */
-  public String getSource() {
-    return source;
-  }
-
-  /**
-   * @return the quantity
-   */
-  public String getQuantity() {
-    return quantity;
-  }
-
-  /**
-   * @param quantity the quantity to set
-   */
-  public void setQuantity(String quantity) {
-    this.quantity = quantity;
-  }
-
-  /**
-   * If ordering also should consider if closest to start time or not
-   */
-  public boolean isClosestToStartDate() {
-    return closestToStartDate;
-  }
-
-  /**
-   * If ordering also should consider if closest to start time or not
-   */
-  public void setClosestToStartDate(boolean closestToStartDate) {
-    this.closestToStartDate = closestToStartDate;
-  }
-}
index ad65860..0e0f4f4 100644 (file)
@@ -380,7 +380,7 @@ public class AcrrRule implements IRule, InitializingBean {
     logger.debug("ENTER: handle(IBltMessage)");
     try {
       if (message instanceof BltTriggerJobMessage) {
-        logger.info("ENTER: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
+        logger.info("ENTER: execute AcrrRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
         DateTime nowdt = ruleUtil.nowDT();
         if (((BltTriggerJobMessage)message).getScheduledFireTime() != null) {
           nowdt = ruleUtil.createDateTime(((BltTriggerJobMessage)message).getScheduledFireTime());
@@ -414,13 +414,13 @@ public class AcrrRule implements IRule, InitializingBean {
         logger.debug("AcrrRule createMessage - entries: " +
             StringUtils.collectionToDelimitedString(uuids, " "));
         
-        logger.info("EXIT: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
+        logger.info("EXIT: execute AcrrRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
         
         return result;
       }
     } 
     catch (Exception e) {
-      logger.error("FAIL: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName(), e);
+      logger.error("FAIL: execute AcrrRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName(), e);
     }
     finally {
       logger.debug("EXIT: handle(IBltMessage)");
index 19daebf..78d873d 100644 (file)
@@ -412,12 +412,12 @@ public class CompositingRule implements IRule, ITimeoutRule, InitializingBean {
         FileEntry file = ((BltDataMessage)message).getFileEntry();
         CompositingRuleFilter ruleFilter = createFilter(getNominalTimeFromFile(file));
         if (ruleFilter.fileMatches(file)) {
-          logger.info("ENTER: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
+          logger.info("ENTER: execute CompositingRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
               ", file: " + file.getUuid());
           
           generatedMessage = createComposite(message, ruleFilter);
           
-          logger.info("EXIT: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
+          logger.info("EXIT: execute CompositingRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
               ", file: " + file.getUuid()); 
         }
       }
index 08c040c..a243c30 100644 (file)
@@ -216,9 +216,9 @@ public class DistributionRule implements IRule, IRulePropertyAccess {
     if (message instanceof BltDataMessage) {
       FileEntry entry = ((BltDataMessage)message).getFileEntry();
       if (match(entry)) {
-        logger.info("ENTER: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
+        logger.info("ENTER: execute DistributionRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
         upload(entry);
-        logger.info("EXIT: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
+        logger.info("EXIT: execute DistributionRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
       }
     }
     logger.debug("EXIT: handle(IBltMessage)");
index 30bff39..33edf41 100644 (file)
@@ -109,7 +109,7 @@ public class GoogleMapRule implements IRule, InitializingBean {
          try {
            if (isValid() && message != null && message instanceof BltDataMessage) {
              FileEntry fe = ((BltDataMessage)message).getFileEntry();
-             logger.info("ENTER: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
+             logger.info("ENTER: execute GoogleMapRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
             ", file: " + fe.getUuid());
              String object = fe.getMetadata().getWhatObject();
              if (object != null && object.equals("COMP")) {
@@ -130,7 +130,7 @@ public class GoogleMapRule implements IRule, InitializingBean {
                  result.setArguments(args.toArray(new String[0]));
                }
              }
-             logger.info("EXIT: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
+             logger.info("EXIT: execute GoogleMapRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
             ", file: " + fe.getUuid());
            }
          } finally {
index 969148b..95faec9 100644 (file)
@@ -95,7 +95,7 @@ public class GraRule extends AcrrRule {
     logger.debug("ENTER: handle(IBltMessage)");
     try {
       if (message instanceof BltTriggerJobMessage) {
-        logger.info("ENTER: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
+        logger.info("ENTER: execute GraRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
         DateTime nowdt = getNowDT();
         if (((BltTriggerJobMessage)message).getScheduledFireTime() != null) {
           nowdt = getRuleUtilities().createDateTime(((BltTriggerJobMessage)message).getScheduledFireTime());
@@ -127,7 +127,7 @@ public class GraRule extends AcrrRule {
         logger.debug("GraRule createMessage - entries: " +
             StringUtils.collectionToDelimitedString(uuids, " "));
         
-        logger.info("EXIT: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
+        logger.info("EXIT: execute GraRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName());
         
         return result;
       }
index b0cabf7..04d2372 100644 (file)
@@ -66,7 +66,7 @@ public class ScansunRule implements IRule {
     try {
       if (message instanceof BltDataMessage) {
         FileEntry file = ((BltDataMessage)message).getFileEntry();
-        logger.info("ENTER: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
+        logger.info("ENTER: execute ScansunRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
             ", file: " + file.getUuid());
         String object = file.getMetadata().getWhatObject();
         String src = file.getSource().getName();
index a94b9a0..4b6aa21 100644 (file)
@@ -245,7 +245,7 @@ public class Site2DRule implements IRule, InitializingBean {
     BltGenerateMessage generatedMessage = null;
     if (message instanceof BltDataMessage) {
       FileEntry file = ((BltDataMessage)message).getFileEntry();
-      logger.info("ENTER: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
+      logger.info("ENTER: execute ScansunRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
           ", file: " + file.getUuid());
       
       if (fileMatchesRule(file)) {
@@ -254,7 +254,7 @@ public class Site2DRule implements IRule, InitializingBean {
         generatedMessage = createMessage(file.getUuid().toString(), date, time);
       }
       
-      logger.info("EXIT: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
+      logger.info("EXIT: execute ScansunRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
           ", file: " + file.getUuid());
       
     }
index 456aba9..1c76689 100644 (file)
@@ -365,7 +365,7 @@ public class VolumeRule implements IRule, ITimeoutRule, InitializingBean {
     if (data != null && !isHandled(data)) {
       // if data != null, message is an instance of BltDataMessage - therefore safe to cast
       FileEntry file = ((BltDataMessage)message).getFileEntry();
-      logger.info("ENTER: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
+      logger.info("ENTER: execute VolumeRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
           ", file: " + file.getUuid());
       List<CatalogEntry> entries = fetchAllCurrentEntries(data.getDateTime(), data.getSource());
       TimeoutTask tt = timeoutManager.getRegisteredTask(data);
@@ -382,7 +382,7 @@ public class VolumeRule implements IRule, ITimeoutRule, InitializingBean {
           }
         }
       }
-      logger.info("EXIT: execute ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
+      logger.info("EXIT: execute VolumeRule with ruleId: " + getRuleId() + ", thread: " + Thread.currentThread().getName() + 
           ", file: " + file.getUuid());
     }
     
index 33204a5..655986c 100644 (file)
@@ -28,7 +28,9 @@ import org.springframework.beans.factory.BeanInitializationException;
 import org.springframework.beans.factory.InitializingBean;
 
 import eu.baltrad.bdb.db.FileEntry;
+import eu.baltrad.bdb.oh5.MetadataMatcher;
 import eu.baltrad.beast.db.Catalog;
+import eu.baltrad.beast.db.IFilter;
 import eu.baltrad.beast.message.IBltMessage;
 import eu.baltrad.beast.message.mo.BltDataMessage;
 import eu.baltrad.beast.message.mo.BltGenerateMessage;
@@ -96,10 +98,24 @@ public class WrwpRule implements IRule, InitializingBean {
   private double velocitythreshold = 2.0;
   
   /**
+   * The filter used for matching files
+   */
+  private IFilter filter = null;
+
+  /**
+   * The matcher used for verifying the filter
+   */
+  private MetadataMatcher matcher;
+  
+  /**
    * The logger
    */
   private static Logger logger = LogManager.getLogger(WrwpRule.class);
   
+  public WrwpRule() {
+    matcher = new MetadataMatcher();
+  }
+  
   /**
    * @param ruleid the ruleid to set
    */
@@ -240,6 +256,22 @@ public class WrwpRule implements IRule, InitializingBean {
     return this.sources;
   }
   
+  public IFilter getFilter() {
+    return filter;
+  }
+
+  public void setFilter(IFilter filter) {
+    this.filter = filter;
+  }
+
+  public MetadataMatcher getMatcher() {
+    return matcher;
+  }
+
+  public void setMatcher(MetadataMatcher matcher) {
+    this.matcher = matcher;
+  }
+  
   /**
    * @see eu.baltrad.beast.rules.IRule#handle(eu.baltrad.beast.message.IBltMessage)
    */
@@ -249,7 +281,7 @@ public class WrwpRule implements IRule, InitializingBean {
     
     if (message instanceof BltDataMessage) {
       FileEntry file = ((BltDataMessage)message).getFileEntry();
-      if (file.getMetadata().getWhatObject().equals("PVOL")) {
+      if (handleFile(file)) {
         String s = file.getSource().getName();
         if (sources.size() > 0 && sources.contains(s)) {
           logger.debug("Creating a message to generate a wrwp product for '"+s+"'");
@@ -270,6 +302,17 @@ public class WrwpRule implements IRule, InitializingBean {
 
     return result;
   }
+  
+  private boolean handleFile(FileEntry file) {
+    boolean handleFile = false;
+    if (file.getMetadata().getWhatObject().equals("PVOL")) {
+      if (filter == null || matcher.match(file.getMetadata(), filter.getExpression())) {
+        handleFile = true;
+      }
+    }
+    
+    return handleFile;
+  }
 
   /**
    * @see eu.baltrad.beast.rules.IRule#getType()
index 8b682ca..6612659 100644 (file)
@@ -21,14 +21,18 @@ package eu.baltrad.beast.rules.wrwp;
 
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.springframework.jdbc.core.JdbcOperations;
 import org.springframework.jdbc.core.RowMapper;
 
 import eu.baltrad.beast.db.Catalog;
+import eu.baltrad.beast.db.IFilter;
 import eu.baltrad.beast.rules.IRule;
 import eu.baltrad.beast.rules.IRuleManager;
+import eu.baltrad.beast.rules.RuleFilterManager;
 import eu.baltrad.beast.rules.util.IRuleUtilities;
 
 /**
@@ -51,6 +55,11 @@ public class WrwpRuleManager implements IRuleManager {
   private IRuleUtilities ruleUtilities = null;
   
   /**
+   * filter manager
+   */
+  private RuleFilterManager filterManager;
+  
+  /**
    * @param template the jdbc template to set
    */
   public void setJdbcTemplate(JdbcOperations template) {
@@ -75,7 +84,7 @@ public class WrwpRuleManager implements IRuleManager {
    * @see eu.baltrad.beast.rules.IRuleManager#store(int, eu.baltrad.beast.rules.IRule)
    */
   @Override
-  public void store(int rule_id, IRule rule) {
+  public void store(int ruleId, IRule rule) {
     WrwpRule wrule = (WrwpRule)rule;
     int interval = wrule.getInterval();
     int maxheight = wrule.getMaxheight();
@@ -88,28 +97,32 @@ public class WrwpRuleManager implements IRuleManager {
         "INSERT INTO beast_wrwp_rules" +
         " (rule_id, interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh)" +
         " VALUES (?,?,?,?,?,?,?)", 
-        new Object[]{rule_id, interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh});
+        new Object[]{ruleId, interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh});
     
-    updateSources(rule_id, wrule.getSources());
+    updateSources(ruleId, wrule.getSources());
     
-    wrule.setRuleId(rule_id);
+    storeFilter(ruleId, wrule.getFilter());
+    
+    wrule.setRuleId(ruleId);
   }
 
   /**
    * @see eu.baltrad.beast.rules.IRuleManager#load(int)
    */
   @Override
-  public IRule load(int rule_id) {
-    return template.queryForObject("SELECT * FROM beast_wrwp_rules WHERE rule_id=?", 
+  public IRule load(int ruleId) {
+    WrwpRule rule = template.queryForObject("SELECT * FROM beast_wrwp_rules WHERE rule_id=?", 
         getWrwpRuleMapper(),
-        new Object[]{rule_id});
+        new Object[]{ruleId});
+    rule.setFilter(loadFilter(ruleId));
+    return rule;
   }
 
   /**
    * @see eu.baltrad.beast.rules.IRuleManager#update(int, eu.baltrad.beast.rules.IRule)
    */
   @Override
-  public void update(int rule_id, IRule rule) {
+  public void update(int ruleId, IRule rule) {
     WrwpRule wrule = (WrwpRule)rule;
     int interval = wrule.getInterval();
     int maxheight = wrule.getMaxheight();
@@ -121,20 +134,23 @@ public class WrwpRuleManager implements IRuleManager {
     template.update(
         "UPDATE beast_wrwp_rules SET interval=?, maxheight=?, mindistance=?," +
         " maxdistance=?, minelangle=?, minvelocitythresh=? WHERE rule_id=?",
-        new Object[]{interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh, rule_id});
+        new Object[]{interval, maxheight, mindistance, maxdistance, minelangle, minvelocitythresh, ruleId});
+    
+    updateSources(ruleId, wrule.getSources());
     
-    updateSources(rule_id, wrule.getSources());
+    storeFilter(ruleId, wrule.getFilter());
     
-    wrule.setRuleId(rule_id);
+    wrule.setRuleId(ruleId);
   }
 
   /**
    * @see eu.baltrad.beast.rules.IRuleManager#delete(int)
    */
   @Override
-  public void delete(int rule_id) {
-    updateSources(rule_id, null);
-    template.update("DELETE FROM beast_wrwp_rules WHERE rule_id=?", new Object[]{rule_id});
+  public void delete(int ruleId) {
+    updateSources(ruleId, null);
+    storeFilter(ruleId, null);
+    template.update("DELETE FROM beast_wrwp_rules WHERE rule_id=?", new Object[]{ruleId});
   }
 
   /**
@@ -152,25 +168,25 @@ public class WrwpRuleManager implements IRuleManager {
    * Updates the sources
    * @param sources the sources that should be added for the specific rule
    */
-  protected void updateSources(int rule_id, List<String> sources) {
-    template.update("DELETE FROM beast_wrwp_sources WHERE rule_id=?", new Object[]{rule_id});
+  protected void updateSources(int ruleId, List<String> sources) {
+    template.update("DELETE FROM beast_wrwp_sources WHERE rule_id=?", new Object[]{ruleId});
     if (sources != null) {
       for (String s : sources) {
         template.update("INSERT INTO beast_wrwp_sources (rule_id, source) VALUES (?,?)",
-            new Object[]{rule_id, s});
+            new Object[]{ruleId, s});
       }
     }
   }
   
   /**
    * Returns the sources associated with this rule
-   * @param rule_id the rule id
+   * @param ruleId the rule id
    * @return the list of sources
    */
-  protected List<String> getSources(int rule_id) {
+  protected List<String> getSources(int ruleId) {
     return template.query("SELECT source FROM beast_wrwp_sources WHERE rule_id=?", 
         getSourceMapper(), 
-        new Object[]{rule_id});
+        new Object[]{ruleId});
   }
   
   /**
@@ -206,4 +222,47 @@ public class WrwpRuleManager implements IRuleManager {
       }
     };
   }
+  
+  /**
+   * Stores the associated filter
+   * @param ruleId the ruleId
+   * @param filter the filter to store
+   */
+  protected void storeFilter(int ruleId, IFilter filter) {
+    if (filter != null) {
+      Map<String, IFilter> filters = new HashMap<String, IFilter>();
+      filters.put("match", filter);
+      filterManager.storeFilters(ruleId, filters);
+    } else {
+      filterManager.deleteFilters(ruleId);
+    }
+  }
+  
+  /**
+   * Loads the filter for the rule
+   * @param ruleId the rule
+   * @return the filter if any otherwise null
+   */
+  protected IFilter loadFilter(int ruleId) {
+    IFilter result = null;
+    Map<String, IFilter> filters = filterManager.loadFilters(ruleId);
+    if (filters.containsKey("match")) {
+      result = filters.get("match");
+    }
+    return result;
+  }
+  
+  /**
+   * @return the filter manager
+   */
+  public RuleFilterManager getFilterManager() {
+    return filterManager;
+  }
+
+  /**
+   * @param filterManager the filter manager
+   */
+  public void setFilterManager(RuleFilterManager filterManager) {
+    this.filterManager = filterManager;
+  }
 }
index ac3b174..86c0bf8 100644 (file)
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertSame;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
 import org.easymock.EasyMockSupport;
@@ -36,6 +37,8 @@ import org.springframework.jdbc.core.JdbcOperations;
 import org.springframework.jdbc.core.RowMapper;
 
 import eu.baltrad.beast.db.Catalog;
+import eu.baltrad.beast.db.IFilter;
+import eu.baltrad.beast.rules.RuleFilterManager;
 import eu.baltrad.beast.rules.util.IRuleUtilities;
 import eu.baltrad.beast.rules.util.RuleUtilities;
 
@@ -52,6 +55,7 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
   
   private JdbcOperations jdbc = null;
   private WrwpRuleManager classUnderTest = null;
+  private RuleFilterManager filterManager = null;
   private Methods methods = null;
   
   /**
@@ -60,6 +64,7 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
   @Before
   public void setUp() throws Exception {
     jdbc = createMock(JdbcOperations.class);
+    filterManager = createMock(RuleFilterManager.class);
     methods = createMock(Methods.class);
     
     classUnderTest = new WrwpRuleManager() {
@@ -77,6 +82,7 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
       }
     };    
     classUnderTest.setJdbcTemplate(jdbc);
+    classUnderTest.setFilterManager(filterManager);
   }
 
   /**
@@ -108,6 +114,8 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
         "VALUES (?,?,?,?,?,?,?)", 
         new Object[]{10, 300, 5000, 1000, 10000, 1.5, 10.0})).andReturn(1);
     
+    filterManager.deleteFilters(10);
+    
     methods.updateSources(10, sources);
     
     replayAll();
@@ -122,6 +130,10 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
   public void test_load() throws Exception {
     WrwpRule rule = new WrwpRule();
     
+    HashMap<String, IFilter> filters = new HashMap<String, IFilter>();
+    IFilter filter = createMock(IFilter.class);
+    filters.put("match", filter);
+    
     final RowMapper<WrwpRule> mapper = new RowMapper<WrwpRule>() {
       public WrwpRule mapRow(ResultSet arg0, int arg1) throws SQLException {
         return null;
@@ -135,10 +147,13 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
       }
     };
     classUnderTest.setJdbcTemplate(jdbc);
+    classUnderTest.setFilterManager(filterManager);
     
     expect(jdbc.queryForObject("SELECT * FROM beast_wrwp_rules WHERE rule_id=?",
         mapper, new Object[]{3})).andReturn(rule);
     
+    expect(filterManager.loadFilters(3)).andReturn(filters);
+    
     replayAll();
     
     WrwpRule result = (WrwpRule)classUnderTest.load(3);
@@ -167,6 +182,8 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
         new Object[]{300, 5000, 1000, 10000, 1.5, 10.0, 12})).andReturn(1);
     methods.updateSources(12, sources);
     
+    filterManager.deleteFilters(12);
+    
     replayAll();
     
     classUnderTest.update(12, rule);
@@ -181,6 +198,8 @@ public class WrwpRuleManagerTest extends EasyMockSupport {
     
     expect(jdbc.update("DELETE FROM beast_wrwp_rules WHERE rule_id=?",
       new Object[]{12})).andReturn(0);
+    
+    filterManager.deleteFilters(12);
       
     replayAll();
       
index 56343e0..cadd7cb 100644 (file)
@@ -21,6 +21,8 @@ package eu.baltrad.beast.rules.wrwp;
 
 import static org.easymock.EasyMock.expect;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
@@ -34,9 +36,12 @@ import org.junit.Test;
 import org.springframework.beans.factory.BeanInitializationException;
 
 import eu.baltrad.bdb.db.FileEntry;
+import eu.baltrad.bdb.expr.Expression;
 import eu.baltrad.bdb.oh5.Metadata;
+import eu.baltrad.bdb.oh5.MetadataMatcher;
 import eu.baltrad.bdb.oh5.Source;
 import eu.baltrad.beast.db.Catalog;
+import eu.baltrad.beast.db.IFilter;
 import eu.baltrad.beast.message.mo.BltAlertMessage;
 import eu.baltrad.beast.message.mo.BltDataMessage;
 import eu.baltrad.beast.message.mo.BltGenerateMessage;
@@ -50,14 +55,17 @@ public class WrwpRuleTest extends EasyMockSupport {
   private Catalog catalog = null;
   private IRuleUtilities ruleUtil = null;
   private WrwpRule classUnderTest = null;
+  private MetadataMatcher matcher = null;
   
   @Before
   public void setUp() throws Exception {
     catalog = createMock(Catalog.class);
     ruleUtil = createMock(IRuleUtilities.class);
+    matcher = createMock(MetadataMatcher.class);
     classUnderTest = new WrwpRule();
     classUnderTest.setCatalog(catalog);
     classUnderTest.setRuleUtilities(ruleUtil);
+    classUnderTest.setMatcher(matcher);
   }
   
   @After
@@ -234,4 +242,74 @@ public class WrwpRuleTest extends EasyMockSupport {
     }
   }
   
+  @Test
+  public void handle_filterNotMatching() throws Exception {
+
+    FileEntry fe = createMock(FileEntry.class);
+    Metadata m = createMock(Metadata.class);
+    IFilter filter = createMock(IFilter.class);
+    Expression xpr = createMock(Expression.class);
+    
+    List<String> sources = new ArrayList<String>();
+    sources.add("searl");
+    sources.add("seang");
+    classUnderTest.setSources(sources);
+    
+    BltDataMessage msg = new BltDataMessage();
+    msg.setFileEntry(fe);
+    
+    expect(fe.getMetadata()).andReturn(m).anyTimes();
+    expect(m.getWhatObject()).andReturn("PVOL");
+    expect(filter.getExpression()).andReturn(xpr);
+    expect(matcher.match(m, xpr)).andReturn(false);
+
+    classUnderTest.setFilter(filter);
+    classUnderTest.setMatcher(matcher);
+    
+    replayAll();
+    
+    BltGenerateMessage result = (BltGenerateMessage)classUnderTest.handle(msg);
+    
+    verifyAll();
+    assertNull(result);
+  }
+  
+  @Test
+  public void handle_filterMatching() throws Exception {
+
+    Source fileSource = new Source("searl");
+    FileEntry fe = createMock(FileEntry.class);
+    Metadata m = createMock(Metadata.class);
+    IFilter filter = createMock(IFilter.class);
+    Expression xpr = createMock(Expression.class);
+    
+    List<String> sources = new ArrayList<String>();
+    sources.add("searl");
+    sources.add("seang");
+    classUnderTest.setSources(sources);
+    
+    BltDataMessage msg = new BltDataMessage();
+    msg.setFileEntry(fe);
+    
+    expect(fe.getMetadata()).andReturn(m).anyTimes();
+    expect(fe.getUuid()).andReturn(new UUID(10, 99)).anyTimes();
+    expect(m.getWhatObject()).andReturn("PVOL");
+    expect(fe.getSource()).andReturn(fileSource);
+    expect(filter.getExpression()).andReturn(xpr);
+    expect(matcher.match(m, xpr)).andReturn(true);
+
+    classUnderTest.setFilter(filter);
+    classUnderTest.setMatcher(matcher);
+    
+    replayAll();
+    
+    BltGenerateMessage result = (BltGenerateMessage)classUnderTest.handle(msg);
+    
+    verifyAll();
+    assertNotNull(result);
+    assertEquals(result.getAlgorithm(), "eu.baltrad.beast.GenerateWrwp");
+    assertEquals(result.getFiles().length, 1);
+    assertEquals(result.getFiles()[0], "00000000-0000-000a-0000-000000000063"); // UUID(10, 99) should give this
+  } 
+  
 }