(no commit message)
[utils] / crawler / kiss / src / org / wamblee / crawler / kiss / KissCrawler.java
index e8687d9d09a5d01f15090592bce528bae1091c65..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,44 +160,81 @@ 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) {
-            try {
-                Program.RecordingResult result = program.record();
-                messages.get(result).add(program);
-            } catch (PageException e) {
-                LOG.info("Attempt to record " + program + " failed.");
-                messages.get(RecordingResult.ERROR).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() + "'"); 
+            }
             }
         }
-        String msg = "Summary of KiSS crawler: \n\n\n";
+
+        EnumMap<RecordingResult, List<Program>> messages = recordShows(showsToRecord);
         
-       
-        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";
+        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\n";
                 }
             }
         }
-        if ( programs.size() == 0 ) { 
-            msg += "No suitable programs found"; 
-        }
         
+        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";
+        }
+
         System.out.println(msg);
         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.
      * 
@@ -257,8 +295,8 @@ public class KissCrawler {
                 Channel channel = createChannel(action.getName(), action
                         .execute().getAction("right-now").execute());
                 channels.add(channel);
-                if ( SystemProperties.isDebugMode() ) { 
-                    break; // Only one channel is crawled. 
+                if (SystemProperties.isDebugMode()) {
+                    break; // Only one channel is crawled.
                 }
             } catch (PageException e) {
                 LOG.error("Could not create channel information for '"