(no commit message)
[utils] / crawler / kiss / src / main / java / org / wamblee / crawler / kiss / main / Report.java
1 /*
2  * 
3  * Copyright 2005 the original author or authors.
4  * 
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  * 
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  * 
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 package org.wamblee.crawler.kiss.main;
19
20 import java.util.ArrayList;
21 import java.util.EnumMap;
22 import java.util.HashSet;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Set;
26 import java.util.TreeMap;
27 import java.util.TreeSet;
28
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.dom4j.DocumentFactory;
32 import org.dom4j.Element;
33 import org.wamblee.crawler.kiss.guide.Program;
34 import org.wamblee.crawler.kiss.guide.Program.RecordingResult;
35
36 /**
37  * Represents a report on the actions of the crawler.
38  *
39  * @author Erik Brakkee
40  */
41 public class Report {
42
43     private static final Log LOG = LogFactory
44             .getLog(Report.class);
45
46     /**
47      * A map of category name to a set of program. Useful for displaying the
48      * output of possibly interesting programs on a per category basis.
49      */
50     private Map<String, Set<Program>> _interestingShows;
51
52     /**
53      * Map or recording result to a set of programs.
54      */
55     private EnumMap<RecordingResult, Set<Program>> _recordings;
56
57     /**
58      * Messages generated while doing all the work.
59      */
60     private List<String> _messages;
61
62     /**
63      * Constructs the report.
64      * 
65      */
66     public Report() {
67         _interestingShows = new TreeMap<String, Set<Program>>();
68         _recordings = new EnumMap<RecordingResult, Set<Program>>(
69                 RecordingResult.class);
70         for (RecordingResult result : RecordingResult.values()) {
71             _recordings.put(result, new TreeSet<Program>(
72                     new Program.TimeComparator()));
73         }
74         _messages = new ArrayList<String>();
75     }
76
77     /**
78      * Adds a message.
79      * 
80      * @param aMessage
81      *            Message to add.
82      */
83     public void addMessage(String aMessage) {
84         _messages.add(aMessage);
85     }
86     
87     /**
88      * Adds a message.
89      * 
90      * @param aMessage
91      *            Message to add.
92      * @param aException Exception that caused the problem.
93      */
94     public void addMessage(String aMessage, Exception aException) {
95         String msg = aMessage; 
96         for (Throwable e = aException; e != null; e = e.getCause()) {
97             msg += ": " + e.getMessage(); 
98         }
99         addMessage(msg);
100     }
101
102     /**
103      * Called to indicate that a program is interesting. 
104      * 
105      * @param aCategory
106      *            Category of the program.
107      * @param aProgram
108      *            Program.
109      */
110     public void interestingProgram(String aCategory, Program aProgram) {
111         LOG.info("category = '" + aCategory + "', program: " + aProgram);
112         Set<Program> programs = _interestingShows.get(aCategory);
113         if (programs == null) {
114             programs = new TreeSet<Program>(new Program.TimeComparator());
115             _interestingShows.put(aCategory, programs);
116         }
117         programs.add(aProgram);
118     }
119     
120     /**
121      * Called to specify the result of recording a program. 
122      * @param aResult Result. 
123      * @param aProgram Program. 
124      */
125     public void setRecordingResult(RecordingResult aResult, Program aProgram) { 
126         _recordings.get(aResult).add(aProgram);   
127     }
128
129   
130     /**
131      * Get report as XML.
132      * 
133      * @return XML report
134      */
135     public Element asXml() {
136         DocumentFactory factory = DocumentFactory.getInstance();
137         Element report = factory.createElement("report");
138
139         if (_messages.size() > 0) {
140             Element messages = report.addElement("messages");
141             for (String message : _messages) {
142                 messages.addElement("message").setText(message);
143             }
144         }
145
146         Set<Program> reportedPrograms = new HashSet<Program>();
147
148         for (RecordingResult result : RecordingResult.values()) {
149             if (_recordings.get(result).size() > 0) {
150                 Element recordingResult = report.addElement("recorded")
151                         .addAttribute("result", result.toString());
152
153                 for (Program program : _recordings.get(result)) {
154                     recordingResult.add(program.asXml());
155                     reportedPrograms.add(program);
156                 }
157             }
158         }
159
160         if (_interestingShows.size() > 0) {
161             Element interesting = report.addElement("interesting");
162             for (String category : _interestingShows.keySet()) {
163                 Element categoryElem = interesting;
164                 if (category.length() > 0) {
165                     categoryElem = interesting.addElement("category");
166                     categoryElem.addAttribute("name", category);
167                 }
168                 for (Program program : _interestingShows.get(category)) {
169                     if (!reportedPrograms.contains(program)) {
170                         categoryElem.add(program.asXml());
171                     } else {
172                         LOG.info("Category '" + category + "', program "
173                                 + program + " already reported");
174                     }
175                 }
176                 if (categoryElem.elements().size() == 0) {
177                     // Remove empty category element.
178                     LOG
179                             .info("Removing element for category '" + category
180                                     + "'");
181                     interesting.remove(categoryElem);
182                 }
183             }
184
185         }
186
187         return report;
188     }
189 }