buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilterSet.java
changeset 628 7c4a911dc066
parent 588 c7c26511138f
--- a/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilterSet.java	Wed Jun 16 16:51:40 2010 +0300
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/MetaDataFilterSet.java	Fri Aug 13 14:59:05 2010 +0300
@@ -18,14 +18,19 @@
  
 package com.nokia.helium.metadata.ant.types;
 
-import java.io.*;
-import java.util.*;
-import org.apache.tools.ant.types.Reference;
-import org.apache.tools.ant.types.DataType;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.util.Collection;
+import java.util.Vector;
+
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
-import org.apache.log4j.Logger;
+import org.apache.tools.ant.types.DataType;
+
 import fmpp.models.CsvSequence;
+import fmpp.util.StringUtil.ParseException;
+import freemarker.template.TemplateModelException;
 import freemarker.template.TemplateSequenceModel;
 
 
@@ -37,8 +42,8 @@
  * 
  * Example 2:
  * <metadatafilterset id="common"/>
- *   <metadatafilter priority="error" regex="^make(?:\[\d+\])?:\s+.*\s+not\s+remade" description="make error" />
- *   <metadatafilter priority="error"regex="" description="" /> 
+ *   <metadatafilter severity="error" regex="^make(?:\[\d+\])?:\s+.*\s+not\s+remade" description="make error" />
+ *   <metadatafilter severity="error"regex="" description="" /> 
  * <metadatafilterset/>
  *
  * Example 3:
@@ -46,30 +51,24 @@
  * </pre>
  * @ant.task name="metadatafilterset" category="Metadata"
  */
-public class MetaDataFilterSet extends DataType
-{
-    private Vector<MetaDataFilter> filters = new Vector<MetaDataFilter>();
+public class MetaDataFilterSet extends DataType implements MetaDataFilterCollection {
+    private Vector<MetaDataFilterCollection> filterCollections = new Vector<MetaDataFilterCollection>();
+    private File filterFile;
+    private boolean initialized;
     
-    private Vector<MetaDataFilterSet> filterSets = new Vector<MetaDataFilterSet>();
-    
-    private String filterFile;
-    
-    private Logger log = Logger.getLogger(MetaDataFilterSet.class);
-
     /**
      * Helper function called by ant to set the FilterFile
      * @param FilterFile the csv file used by the filterset
      */
-    public void setFilterFile(String file) throws Exception {
+    public void setFilterFile(File file) throws Exception {
         filterFile = file;
-        addCSVFromFile(file);
     }
 
     /**
      * Helper function called to get FilterFile.
      * @return filterfile used by this filterset
      */
-    public String getFilterFile() {
+    public File getFilterFile() {
         return filterFile;
     }
 
@@ -80,50 +79,57 @@
      * the precedence is maintained.
      * @return All filters
      */
-    public Vector<MetaDataFilter> getAllFilters() {
-        Vector<MetaDataFilter> allFilters = new Vector<MetaDataFilter>();
-        //First look for filters associated with this set.
-        if (filters.size() > 0) {
-            allFilters.addAll(filters);
+    public Collection<MetaDataFilter> getAllFilters() {
+        // Shall we treat current object as a reference?
+        if (this.isReference()) {
+            if (filterFile != null) {
+                throw new BuildException("You cannot use the 'filterFile' in reference object.");
+            }
+            if (!filterCollections.isEmpty()) {
+                throw new BuildException("You cannot have nested filters when using a reference object.");
+            }
+            Object filterSetObject = this.getRefid().getReferencedObject();
+            if (filterSetObject != null && filterSetObject instanceof MetaDataFilterCollection) {
+                Collection<MetaDataFilter> allFilters = ((MetaDataFilterCollection)filterSetObject).getAllFilters();
+                checkInvalidFilters(allFilters);
+                return allFilters;                
+            } else {
+                throw new BuildException("Filterset object is not instance of MetaDataFilterCollection");
+            }
+        } else {
+            if (!initialized) {
+                if (filterFile != null) {
+                    addDataFromCSVFile();
+                }
+                initialized = true;
+            }
+            Collection<MetaDataFilter> allFilters = new Vector<MetaDataFilter>();
+            // Add any nested filterCollection
+            for (MetaDataFilterCollection filterCollection : filterCollections) {
+                allFilters.addAll(filterCollection.getAllFilters());
+            }
+            checkInvalidFilters(allFilters);
             return allFilters;
         }
-        // Then filters as reference in filterset
-        Reference refId = getRefid();
-        Object filterSetObject = null;
-        if (refId != null) {
-            filterSetObject = refId.getReferencedObject();
-           if (filterSetObject != null && filterSetObject instanceof MetaDataFilterSet) {
-                allFilters.addAll(((MetaDataFilterSet)filterSetObject).getAllFilters());
-                return allFilters;
-            }
-            log.debug("Filterset object is not instance of MetaDataFilterSet");
-            throw new BuildException("Filterset object is not instance of MetaDataFilterSet");
-        }
-        // Add any nested filtersets
-        for (MetaDataFilterSet filterSet : filterSets) {
-            allFilters.addAll(filterSet.getAllFilters());
-        }
-        
-        return removeInvalidFilters(allFilters);
     }
 
     /**
      * Helper function called to remove any invalid filters
      * @return only the valid filters
      */
-    private Vector<MetaDataFilter> removeInvalidFilters(Vector<MetaDataFilter> filterList) {
-        ListIterator<MetaDataFilter> iter = filterList.listIterator();
-        while (iter.hasNext()) {
-            MetaDataFilter filter = iter.next();
-            String priority = filter.getPriority();
+    private void checkInvalidFilters(Collection<MetaDataFilter> filterList) {
+        int count = 0;
+        for (MetaDataFilter filter : filterList) {
+            SeverityEnum.Severity severity = filter.getSeverity();
             String regEx = filter.getRegex();
-            if (priority == null || regEx == null) {
-                log("Warning: some filter is invalid removing it", Project.MSG_WARN);
-                iter.remove();
+            if (severity == null || regEx == null) {                
+                log("Invalid filter found at " + filter.getLocation().toString(), Project.MSG_ERR);
+                count++;
             }
         }
-        return filterList;
-        
+        if (count > 0) {
+            throw new BuildException("Invalid filter have been found. Please check your configuration.");
+        }
     }
     
     /**
@@ -135,19 +141,6 @@
         return filter;
     }
 
-    /**
-     * Helper function to add the created filter
-     * @param filter to be added to the filterset
-     */
-    public void add(MetaDataFilter filter) {
-        MetaDataFilterSet filterSet = createMetaDataFilterSet();
-        filterSet.getFilterList().add(filter);
-    }
-
-     Vector<MetaDataFilter> getFilterList() {
-         return filters;
-     }
-
      /**
      * Helper function called by ant to create the new filter
      */
@@ -161,9 +154,9 @@
      * Helper function to add the created filter
      * @param filter to be added to the filterset
      */
-    public void add(MetaDataFilterSet filterSet) {
-        if (filterSet != null) {
-            filterSets.add(filterSet);
+    public void add(MetaDataFilterCollection filterCollection) {
+        if (filterCollection != null) {
+            filterCollections.add(filterCollection);
         }
     }
 
@@ -171,38 +164,35 @@
      * Helper function to add the filters from the csv files
      * @param csv file path from which the filters needs to be added.
      */
-    private void addCSVFromFile(String csvPath) throws Exception {
+    private void addDataFromCSVFile() {
         CsvSequence csvs = new CsvSequence();
         csvs.setSeparator(',');
-        log.debug("filter file: " + filterFile);
         try {
-            csvs.load(new FileReader(new File(filterFile)));
-        } catch (java.io.FileNotFoundException fex) {
-            log.debug("Metadata CSV file not found:", fex);
-            throw fex;
-        } catch (fmpp.util.StringUtil.ParseException pex) {
-            log.debug("FMPP not able parse the Metadata CSV file. ", pex);
-            throw pex;
+            csvs.load(new FileReader(filterFile));
+            int size = 0;
+            size = csvs.size();
+            for (int i = 0; i < size; i++) {
+                TemplateSequenceModel model = (TemplateSequenceModel)csvs.get(i);
+                int modelSize = model.size();
+                if (modelSize != 3 ) {
+                    throw new BuildException("Metadata CSV file filter file format is invalid. It model must have 3 column, it currently has " + size);
+                }
+                MetaDataFilter filter = new MetaDataFilter();
+                SeverityEnum severity = new SeverityEnum();
+                severity.setValue(model.get(0).toString());
+                filter.setSeverity(severity);
+                filter.setRegex(model.get(1).toString());
+                filter.setDescription(model.get(2).toString());
+                filterCollections.add(filter);
+            }
+        } catch (FileNotFoundException fex) {
+            throw new BuildException(fex.getMessage(), fex);
+        } catch (ParseException pex) {
+            throw new BuildException(pex.getMessage(), pex);
         } catch (java.io.IOException iex) {
-            log.debug("Metadata I/O Exception. " + iex.getMessage(), iex);
-            throw iex;
-        }
-        int size = 0;
-        log.debug("filter CSV record size: " + csvs.size());
-        size = csvs.size();
-        for (int i = 0; i < size; i++) {
-            TemplateSequenceModel model = (TemplateSequenceModel) csvs
-            .get(i);
-            int modelSize = model.size();
-            if (modelSize != 3 ) {
-                log.debug("Metadata CSV file filter file format is invalid. It has row size " + size);
-                throw new Exception("Metadata CSV file filter file format is invalid. It has row size " + size);
-            }
-            MetaDataFilter filter = new MetaDataFilter();
-            filter.setPriority(model.get(0).toString());
-            filter.setRegex(model.get(1).toString());
-            filter.setDescription(model.get(2).toString());
-            filters.add(filter);
+            throw new BuildException(iex.getMessage(), iex);
+        } catch (TemplateModelException e) {
+            throw new BuildException(e.getMessage(), e);
         }
     }
 }