(no commit message)
[utils] / crawler / kiss / src / org / wamblee / crawler / kiss / KissCrawler.java
index 2f47c695a7a747b4ad00fa870d4b4923726f7a1a..8fbd232dcba2c685a4c981e75416b87d8512a3bf 100644 (file)
@@ -28,6 +28,8 @@ import java.util.Date;
 import java.util.EnumMap;
 import java.util.List;
 import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -41,7 +43,6 @@ import javax.mail.internet.MimeMessage;
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.wamblee.conditions.Condition;
 import org.wamblee.crawler.Action;
 import org.wamblee.crawler.Configuration;
 import org.wamblee.crawler.Crawler;
@@ -139,9 +140,9 @@ public class KissCrawler {
 
             InputStream programConfigFile = new FileInputStream(new File(
                     aProgramConfig));
-            Condition<Program> programCondition = new ProgramConfigurationParser()
+            List<ProgramFilter> programFilters = new ProgramConfigurationParser()
                     .parse(programConfigFile);
-            recordInterestingShows(programCondition, guide);
+            recordInterestingShows(programFilters, guide);
         } finally {
             os.flush();
             os.close();
@@ -159,31 +160,55 @@ public class KissCrawler {
      * @throws MessagingException
      *             In case of problems sending a summary mail.
      */
-    private void recordInterestingShows(Condition<Program> aProgramCondition,
+    private void recordInterestingShows(List<ProgramFilter> aProgramCondition,
             TVGuide aGuide) throws MessagingException {
-        MatchVisitor matcher = new MatchVisitor(aProgramCondition);
-        aGuide.accept(matcher);
-        List<Program> programs = matcher.getMatches();
-        EnumMap<RecordingResult, List<Program>> messages = new EnumMap<RecordingResult, List<Program>>(
-                RecordingResult.class);
-        for (RecordingResult result : RecordingResult.values()) {
-            messages.put(result, new ArrayList<Program>());
-        }
-        for (Program program : programs) {
-            Program.RecordingResult result = program.record();
-            messages.get(result).add(program);
+
+        Set<Program> showsToRecord = new TreeSet<Program>(new Program.TimeSorter());
+        Set<Program> interestingShows = new TreeSet<Program>(new Program.TimeSorter());
+       
+        for (ProgramFilter filter : aProgramCondition) {
+            List<Program> programs = filter.apply(aGuide); 
+            switch (filter.getAction()) {
+            case RECORD: {
+                for (Program program: programs) { 
+                    showsToRecord.add(program);
+                }
+                break; 
+            }
+            case NOTIFY: { 
+                for (Program program: programs) {
+                    if ( program.isRecordingPossible()) { 
+                        interestingShows.add(program);
+                    }
+                }
+                break;
+            }
+            default: { 
+                throw new RuntimeException("Unknown action '" + filter.getAction() + "'"); 
+            }
+            }
         }
+
+        EnumMap<RecordingResult, List<Program>> messages = recordShows(showsToRecord);
+        
         String msg = "Summary of KiSS crawler: \n\n\n";
 
         for (RecordingResult result : RecordingResult.values()) {
             if (messages.get(result).size() > 0) {
                 msg += result.getDescription() + "\n\n";
                 for (Program program : messages.get(result)) {
-                    msg += program + "\n";
+                    msg += program + "\n\n";
                 }
             }
         }
-        if (programs.size() == 0) {
+        
+        if ( interestingShows.size() > 0 ) { 
+            msg += "Possibly interesting shows:\n\n"; 
+            for (Program program: interestingShows) { 
+                msg += program + "\n\n";
+            }
+        }
+        if (showsToRecord.size()  + interestingShows.size() == 0) {
             msg += "No suitable programs found";
         }
 
@@ -191,6 +216,25 @@ public class KissCrawler {
         sendMail(msg);
     }
 
+    /**
+     * Records shows.
+     * @param showsToRecord Shows to record.
+     * @return Recording results. 
+     */
+    private EnumMap<RecordingResult, List<Program>> recordShows(Set<Program> showsToRecord) {
+        EnumMap<RecordingResult, List<Program>> messages = new EnumMap<RecordingResult, List<Program>>(
+                RecordingResult.class);
+        for (RecordingResult result : RecordingResult.values()) {
+            messages.put(result, new ArrayList<Program>());
+        }
+        
+        for (Program program : showsToRecord) {
+            Program.RecordingResult result = program.record();
+            messages.get(result).add(program);
+        }
+        return messages;
+    }
+
     /**
      * Creates the crawler.
      *