(no commit message)
[utils] / crawler / kiss / src / org / wamblee / crawler / kiss / ProgramConfigurationParser.java
index b8d5c67863adcd9406c3bae2fc76d6f11f86b829..b75d3e058b765f4a470ed39675b9d8b416adeddc 100644 (file)
@@ -18,9 +18,14 @@ package org.wamblee.crawler.kiss;
 
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 
+import javax.mail.internet.InternetAddress;
+
+import org.apache.commons.mail.SimpleEmail;
 import org.dom4j.Attribute;
 import org.dom4j.Document;
 import org.dom4j.DocumentException;
@@ -29,7 +34,6 @@ import org.dom4j.io.SAXReader;
 import org.wamblee.conditions.AndCondition;
 import org.wamblee.conditions.Condition;
 import org.wamblee.conditions.PropertyRegexCondition;
-import org.wamblee.crawler.kiss.ProgramFilter.ProgramAction;
 
 /**
  * Parse the configuration of desired programs.
@@ -41,8 +45,19 @@ class ProgramConfigurationParser {
     private static final String ELEM_PATTERN = "match";
 
     private static final String ELEM_ACTION = "action";
+    
+    private static final String ELEM_CATEGORY = "category";
 
     private static final String ACTION_NOTIFY = "notify";
+    
+    private List<ProgramFilter> _filters; 
+    
+    private Notifier _notifier; 
+    
+    ProgramConfigurationParser() { 
+        _filters = null; 
+        _notifier = null; 
+    }
 
     /**
      * Parses the condition used to match the desired programs.
@@ -51,7 +66,7 @@ class ProgramConfigurationParser {
      *            Input stream to parse from.
      * @return Condition.
      */
-    List<ProgramFilter> parse(InputStream aStream) {
+    void parse(InputStream aStream) {
         List<ProgramFilter> filters = new ArrayList<ProgramFilter>();
         try {
             SAXReader reader = new SAXReader();
@@ -62,13 +77,20 @@ class ProgramConfigurationParser {
             for (Iterator i = root.elementIterator(ELEM_PROGRAM); i.hasNext();) {
                 Element program = (Element) i.next();
 
+                Element categoryElem = program.element(ELEM_CATEGORY);
+                String category = "";
+                if ( categoryElem != null ) { 
+                    category = categoryElem.getText().trim(); 
+                }
+                
                 Element actionElem = program.element(ELEM_ACTION);
-                ProgramAction action = ProgramAction.RECORD;
+                ProgramAction action = new RecordProgramAction();
                 if (actionElem != null) {
                     if (actionElem.getText().equals(ACTION_NOTIFY)) {
-                        action = ProgramAction.NOTIFY;
+                        action = new InterestingProgramAction(category);
                     }
                 }
+              
                 List<Condition<Program>> regexConditions = 
                     new ArrayList<Condition<Program>>();
                 for (Iterator j = program.elementIterator(ELEM_PATTERN); j.hasNext(); ) {
@@ -78,16 +100,73 @@ class ProgramConfigurationParser {
                     if ( fieldAttribute != null ) { 
                         fieldName = fieldAttribute.getText(); 
                     }
-                    String pattern = ".*" + patternElem.getText()
-                    + ".*";
+                    String pattern = ".*(" + patternElem.getText()
+                    + ").*";
                     regexConditions.add(new PropertyRegexCondition<Program>(fieldName, pattern, true));
                 }
                 Condition<Program> condition = new AndCondition<Program>(regexConditions);
                 filters.add(new ProgramFilter(condition, action));
             }
-            return filters;
+            _filters = filters;
+            
+            Element notifier = root.element("notification");
+            _notifier = parseNotifier(notifier);
+            
         } catch (DocumentException e) {
             throw new RuntimeException("Error parsing program configuraiton", e);
         }
     }
+    
+    /**
+     * Parses the notifier
+     * @return Notifier
+     */
+    private Notifier parseNotifier(Element aNotifier) { 
+        String from = aNotifier.elementTextTrim("from");
+        String to = aNotifier.elementTextTrim("to");
+        String subject = aNotifier.elementTextTrim("subject");
+        
+        Element smtp = aNotifier.element("smtp");
+        MailServer server = parseMailServer( smtp );
+        
+        Element format = aNotifier.element("format");
+        String htmlXslt = format.elementTextTrim("html");
+        String textXslt = format.elementTextTrim("text");
+        
+        return new MailNotifier(from, to, subject, htmlXslt, textXslt, server);
+    }
+
+    /**
+     * @param smtp
+     * @return
+     */
+    private MailServer parseMailServer( Element smtp ) {
+        String host = smtp.elementTextTrim("host");
+        Element portElem = smtp.element("port");
+        int port = 25; 
+        if ( portElem != null ) {
+            port = Integer.valueOf(portElem.getTextTrim());
+        }
+        String username = smtp.elementTextTrim("username");
+        String password = smtp.elementTextTrim("password");
+        
+        MailServer server = new MailServer(host, port, username, password);
+        return server;
+    }
+    
+    /**
+     * Returns the list of program filters.
+     * @return Filter list.
+     */
+    public List<ProgramFilter> getFilters() { 
+        return _filters;
+    }
+    
+    /**
+     * Returns the notifier to use. 
+     * @return Notifier.
+     */
+    public Notifier getNotifier() { 
+        return _notifier; 
+    }
 }