private static final Log LOG = LogFactory.getLog(CrawlerImpl.class);
- private static final int MAX_DELAY = 5000;
-
private HttpClient _client;
private Configuration _config;
--- /dev/null
+/*
+ * Copyright 2005 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.wamblee.crawler.kiss;
+
+/**
+ * Represents an action to execute for an interesting program.
+ */
+public class InterestingProgramAction implements ProgramAction {
+
+ /**
+ * Category under which the interesting program is listed.
+ */
+ private String _category;
+
+ /**
+ * Constructs the action.
+ *
+ * @param aCategory
+ * Category of the program. Useful for structuring the output.
+ */
+ public InterestingProgramAction(String aCategory) {
+ _category = aCategory;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.wamblee.crawler.kiss.ProgramAction#execute(org.wamblee.crawler.kiss.Program,
+ * org.wamblee.crawler.kiss.Report)
+ */
+ public void execute(Program aProgram, ProgramActionExecutor aReport) {
+ aReport.interestingProgram(_category, aProgram);
+ }
+}
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Date;
-import java.util.EnumMap;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.wamblee.crawler.PageException;
import org.wamblee.crawler.impl.ConfigurationParser;
import org.wamblee.crawler.impl.CrawlerImpl;
-import org.wamblee.crawler.kiss.Program.RecordingResult;
/**
* The KiSS crawler for automatic recording of interesting TV shows.
TVGuide guide = createGuide(page);
PrintVisitor printer = new PrintVisitor(System.out);
guide.accept(printer);
-
-
- recordInterestingShows(programFilters, guide);
+ processResults(programFilters, guide);
} finally {
os.flush();
os.close();
* @throws MessagingException
* In case of problems sending a summary mail.
*/
- private void recordInterestingShows(List<ProgramFilter> aProgramCondition,
+ private void processResults(List<ProgramFilter> aProgramCondition,
TVGuide aGuide) throws MessagingException {
-
- Set<Program> showsToRecord = new TreeSet<Program>(new Program.TimeSorter());
- Set<Program> interestingShows = new TreeSet<Program>(new Program.TimeSorter());
-
+ ProgramActionExecutor executor = new ProgramActionExecutor();
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() + "'");
- }
+ List<Program> programs = filter.apply(aGuide);
+ ProgramAction action = filter.getAction();
+ for (Program program: programs) {
+ action.execute(program, executor);
}
}
-
- 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\n";
- }
- }
- }
-
- 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";
- }
-
+ executor.commit();
+ String msg = executor.getReport();
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.
*
--- /dev/null
+/*
+ * Copyright 2005 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.wamblee.crawler.kiss;
+
+/**
+ * Represents an action configured for a program.
+ */
+public interface ProgramAction {
+
+ /**
+ * Executes the action.
+ * @param aProgram Program to execute the action for.
+ * @param aReport Report to use.
+ */
+ void execute(Program aProgram, ProgramActionExecutor aReport);
+}
--- /dev/null
+/*
+ * Copyright 2005 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.wamblee.crawler.kiss;
+
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import org.wamblee.crawler.kiss.Program.RecordingResult;
+
+/**
+ * Provides execution of actions for programs. Actions use
+ * this class to tell the executor what to do. The executor then decide
+ * on exactly what to do and in what order and makes decisions in case
+ * of conflicts.
+ */
+public class ProgramActionExecutor {
+
+ /**
+ * A map of category name to a set of program. Useful for displaying the output of
+ * possibly interesting programs on a per category basis.
+ */
+ private Map<String, Set<Program>> _interestingShows;
+
+ /**
+ * Set of programs to record.
+ */
+ private Set<Program> _showsToRecord;
+
+ /**
+ * Map or recording result to a set of programs.
+ */
+ private EnumMap<RecordingResult, Set<Program>> _recordings;
+
+ /**
+ * Constructs the program action executor.
+ *
+ */
+ public ProgramActionExecutor() {
+ _interestingShows = new TreeMap<String,Set<Program>>();
+ _showsToRecord = new TreeSet<Program>(new Program.TimeSorter());
+ _recordings = new EnumMap<RecordingResult, Set<Program>>(
+ RecordingResult.class);
+ for (RecordingResult result : RecordingResult.values()) {
+ _recordings.put(result, new TreeSet<Program>(new Program.TimeSorter()));
+ }
+ }
+
+ /**
+ * Called by an action to indicate the desire to record a program.
+ * @param aPriority Priority of the program. Used to resolve conflicts.
+ * @param aProgram Program to record.
+ */
+ public void recordProgram(int aPriority, Program aProgram) {
+ _showsToRecord.add(aProgram);
+ }
+
+ /**
+ * Called by an action to indicate that a program is interesting.
+ * @param aCategory Category of the program.
+ * @param aProgram Program.
+ */
+ public void interestingProgram(String aCategory, Program aProgram) {
+ Set<Program> programs = _interestingShows.get(aCategory);
+ if ( programs == null ) {
+ programs = new TreeSet<Program>(new Program.TimeSorter());
+ _interestingShows.put(aCategory, programs);
+ }
+ programs.add(aProgram);
+ }
+
+ /**
+ * Makes sure that the actions are performed.
+ *
+ */
+ public void commit() {
+ for (Program program: _showsToRecord) {
+ RecordingResult result = program.record();
+ _recordings.get(result).add(program);
+ }
+ }
+
+ /**
+ * Gets the report describing what was done.
+ * @return Report.
+ */
+ public String getReport() {
+ StringBuffer msg = new StringBuffer("Summary of KiSS crawler: \n\n\n");
+
+ boolean printed = false;
+
+ for (RecordingResult result : RecordingResult.values()) {
+ if (_recordings.get(result).size() > 0) {
+ msg.append(result.getDescription() + "\n\n");
+ for (Program program : _recordings.get(result)) {
+ msg.append(program + "\n\n");
+ printed = true;
+ }
+ }
+ }
+
+ if ( _interestingShows.size() > 0 ) {
+ msg.append("Possibly interesting shows:\n\n");
+ for (String category: _interestingShows.keySet()) {
+ if ( category.length() > 0 ) {
+ msg.append("Category: " + category + "\n\n");
+ }
+ for (Program program: _interestingShows.get(category)) {
+ msg.append(program + "\n\n");
+ printed = true;
+ }
+ }
+
+ }
+ if (!printed) {
+ msg.append("No suitable programs found");
+ }
+
+ return msg.toString();
+ }
+}
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.
Element program = (Element) i.next();
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("");
}
}
List<Condition<Program>> regexConditions =
*/
public class ProgramFilter {
- public enum ProgramAction { RECORD, NOTIFY };
-
private Condition<Program> _condition;
private ProgramAction _action;
+++ /dev/null
-/*
- * Copyright 2005 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.wamblee.crawler.kiss;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.wamblee.conditions.Condition;
-
-/**
- * Match programs based on a regular expression for the name in lower case.
- */
-public class ProgramNameMatcher implements Condition<Program> {
-
- /**
- * Pattern which describes interesting programs.
- */
- private Pattern _pattern;
-
- /**
- * Constructs the matcher.
- * @param aPattern Pattern that describes interesting programs.
- */
- public ProgramNameMatcher(String aPattern) {
- _pattern = Pattern.compile(aPattern);
- }
-
- /**
- * Determines if the program name matches.
- * @param aProgram Program.
- * @return True iff the program name matches.
- */
- public boolean matches(Program aProgram) {
- Matcher matcher = _pattern.matcher(aProgram.getName().toLowerCase());
- return matcher.matches();
- }
-}
--- /dev/null
+/*
+ * Copyright 2005 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.wamblee.crawler.kiss;
+
+import org.wamblee.crawler.kiss.Program.RecordingResult;
+
+/**
+ * Represents an action to record a program.
+ */
+public class RecordProgramAction implements ProgramAction {
+
+ private int _priority;
+
+ /**
+ * Constructs the action.
+ *
+ */
+ public void ReportProgramAction(int aPriority) {
+ _priority = aPriority;
+ }
+
+ /* (non-Javadoc)
+ * @see org.wamblee.crawler.kiss.ProgramAction#execute(org.wamblee.crawler.kiss.Program, org.wamblee.crawler.kiss.Report)
+ */
+ public void execute(Program aProgram, ProgramActionExecutor aReport) {
+ aReport.recordProgram(_priority, aProgram);
+ }
+
+}