/* * 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.EnumMap; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import org.dom4j.DocumentFactory; import org.dom4j.Element; 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> _interestingShows; /** * Set of programs to record. */ private Set _showsToRecord; /** * Map or recording result to a set of programs. */ private EnumMap> _recordings; /** * Constructs the program action executor. * */ public ProgramActionExecutor() { _interestingShows = new TreeMap>(); _showsToRecord = new TreeSet(new Program.TimeSorter()); _recordings = new EnumMap>( RecordingResult.class); for (RecordingResult result : RecordingResult.values()) { _recordings.put(result, new TreeSet(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 programs = _interestingShows.get(aCategory); if ( programs == null ) { programs = new TreeSet(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(); } /** * Get report as XML. * @return XML report */ public Element getXmlReport() { DocumentFactory factory = DocumentFactory.getInstance(); Element report = factory.createElement("report"); for (RecordingResult result : RecordingResult.values()) { if (_recordings.get(result).size() > 0) { Element recordingResult = report.addElement("recorded").addAttribute("result", result.toString()); for (Program program : _recordings.get(result)) { recordingResult.add(program.asXml()); } } } if ( _interestingShows.size() > 0 ) { Element interesting = report.addElement("interesting"); for (String category: _interestingShows.keySet()) { Element categoryElem = interesting; if ( category.length() > 0 ) { categoryElem = interesting.addElement("category"); categoryElem.addAttribute("name", category); } for (Program program: _interestingShows.get(category)) { categoryElem.add(program.asXml()); } } } return report; } }