(no commit message)
authorerik <erik@77661180-640e-0410-b3a8-9f9b13e6d0e0>
Sun, 30 Apr 2006 19:01:36 +0000 (19:01 +0000)
committererik <erik@77661180-640e-0410-b3a8-9f9b13e6d0e0>
Sun, 30 Apr 2006 19:01:36 +0000 (19:01 +0000)
19 files changed:
crawler/kiss/build.xml
crawler/kiss/conf/kiss/programs.xml
crawler/kiss/conf/kiss/run.sh
crawler/kiss/deps.xml
crawler/kiss/src/org/wamblee/crawler/kiss/main/KissCrawler.java
crawler/kiss/src/org/wamblee/crawler/kiss/main/ProgramActionExecutor.java
crawler/kiss/src/org/wamblee/crawler/kiss/main/ProgramConfigurationParser.java
crawler/kiss/src/org/wamblee/crawler/kiss/notification/MailNotifier.java
crawler/kiss/src/org/wamblee/crawler/kiss/notification/Notifier.java
crawler/kissweb/WebRoot/WEB-INF/overview.jsp
crawler/kissweb/src/beanRefContext.xml
crawler/kissweb/src/org.wamblee.crawler.kiss.xml
crawler/kissweb/src/org/wamblee/crawler/kiss/scheduling/CrawlerExecutor.java
crawler/kissweb/src/org/wamblee/crawler/kiss/scheduling/CrawlerExecutorImpl.java
crawler/kissweb/src/org/wamblee/crawler/kiss/scheduling/CrawlerScheduler.java
crawler/kissweb/src/org/wamblee/crawler/kiss/scheduling/CrawlerStatus.java [moved from crawler/kissweb/src/org/wamblee/crawler/kiss/scheduling/CrawlerSchedule.java with 82% similarity]
crawler/kissweb/src/org/wamblee/crawler/kiss/scheduling/quartz/CrawlerJob.java
crawler/kissweb/src/org/wamblee/crawler/kiss/servlet/Application.java
crawler/kissweb/src/org/wamblee/crawler/kiss/servlet/CrawlerServlet.java

index 2223c428ea498aa09ec64d819f7ff1effd987319..bae9b1e10be6bab8926ab7109f048166356cecde 100644 (file)
@@ -48,6 +48,7 @@
            <fileset dir="conf/kiss">
                  <include name="config.xml.example"/>
                  <include name="programs.xml"/>
+                 <include name="notification.xml"/>
                </fileset>
          </copy>
          
index d53254c06bca1fc18d86076ccdaff58b6c0e2fd0..ac87857b6d362393fe90da8caa26cc1104fd3d7f 100644 (file)
@@ -72,7 +72,7 @@
 
   <program>
     <priority>9</priority>
-    <match>dr.*who</match>
+    <match>((dr)|(doct.*)).*who</match>
   </program>   
 
   <program>
index 5278c563e2e00560fa443a43749550ef22e1a82c..f04c0742b9521b98ce3bbf19e6727b14334454a9 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/ksh
 
-cd $( dirname $0 )
+cd $( dirname $0 )/../conf
 
 CP=""
 for i in ../lib/*.jar
@@ -10,5 +10,5 @@ done
 
 set -x 
 java -classpath $CP org.wamblee.crawler.kiss.main.KissCrawler \
-  ../conf/config.xml ../conf/programs.xml
+  config.xml programs.xml
 
index 3c0e0cce9228cae9fcf2bbeeeb04afb711a21593..6e9095abe567bd3537ee86d652048875f4a13810 100644 (file)
@@ -1,7 +1,7 @@
 <!-- dependencies of the kiss crawler itself -->
 
 <target name="kisscrawler.src.d" 
-  depends="logging.d,mail.d,commons-email.d,commons-beanutils.d,commons-codec.d,dom4j.d,xerces.d,httpclient.d,jtidy.d,wamblee.support.d,wamblee.crawler.d">
+  depends="logging.d,mail.d,commons-email.d,commons-beanutils.d,commons-codec.d,dom4j.d,xerces.d,httpclient.d,jtidy.d,wamblee.support.d,wamblee.crawler.d,spring.d">
 </target>
 
 <target name="kisscrawler.test.d" depends="wamblee.support.test.d,wamblee.crawler.test.d">
index 969c5b23749e8e500f052308af0ed48a44f09308..b0be9ef6cede2918bbf842ae98617f6a0d87afc5 100644 (file)
@@ -46,6 +46,7 @@ import org.wamblee.crawler.kiss.guide.Time;
 import org.wamblee.crawler.kiss.guide.TimeInterval;
 import org.wamblee.crawler.kiss.notification.NotificationException;
 import org.wamblee.crawler.kiss.notification.Notifier;
+import org.wamblee.general.BeanFactory;
 import org.wamblee.xml.ClasspathUriResolver;
 import org.wamblee.xml.XslTransformer;
 
@@ -89,7 +90,10 @@ public class KissCrawler {
     public static void main(String[] aArgs) throws Exception {
         String crawlerConfig = new File(aArgs[0]).getCanonicalPath(); 
         String programConfig = new File(aArgs[1]).getCanonicalPath(); 
-        new KissCrawler(START_URL, SOCKET_TIMEOUT, crawlerConfig, programConfig);
+
+        BeanFactory factory = new StandaloneCrawlerBeanFactory();
+        Notifier notifier = factory.find(Notifier.class);
+        new KissCrawler(START_URL, SOCKET_TIMEOUT, crawlerConfig, programConfig, notifier, new Report());
     }
     
     /**
@@ -101,14 +105,16 @@ public class KissCrawler {
      *            Configuration file for the crawler.
      * @param aProgramConfig
      *            Configuration file describing interesting shows.
+     * @param aNotifier Object used to send notifications of the results.           
+     * @param aReport Report to use. 
      * @throws IOException
      *             In case of problems reading files.
-     * @throws MessagingException
-     *             In case of problems sending a mail notification.
+     * @throws NotificationException In case notification fails.
+     * @throws PageException In case of problems retrieving the TV guide. 
      */
     public KissCrawler(String aCrawlerConfig,
-            String aProgramConfig) throws IOException, NotificationException, PageException {
-        this(START_URL, SOCKET_TIMEOUT, aCrawlerConfig, aProgramConfig);
+            String aProgramConfig, Notifier aNotifier, Report aReport) throws IOException, NotificationException, PageException {
+        this(START_URL, SOCKET_TIMEOUT, aCrawlerConfig, aProgramConfig, aNotifier, aReport);
     }
 
 
@@ -124,13 +130,15 @@ public class KissCrawler {
      *            Configuration file for the crawler.
      * @param aProgramConfig
      *            Configuration file describing interesting shows.
+     * @param aNotifier Object used to send notifications of the results.           
+     * @param aReport Report to use. 
      * @throws IOException
      *             In case of problems reading files.
-     * @throws MessagingException
-     *             In case of problems sending a mail notification.
+     * @throws NotificationException In case notification fails.
+     * @throws PageException In case of problems retrieving the TV guide.   
      */
     public KissCrawler(String aStartUrl, int aSocketTimeout, String aCrawlerConfig,
-            String aProgramConfig) throws IOException, NotificationException, PageException {
+            String aProgramConfig, Notifier aNotifier, Report aReport) throws IOException, NotificationException, PageException {
 
         _pattern = Pattern.compile(TIME_REGEX);
 
@@ -150,21 +158,19 @@ public class KissCrawler {
             parser.parse(programConfigFile);
             List<ProgramFilter> programFilters = parser.getFilters();
 
-            Report report = new Report();
-
             try {
-                Page page = getStartPage(aStartUrl, crawler, report);
-                TVGuide guide = createGuide(page, report);
+                Page page = getStartPage(aStartUrl, crawler, aReport);
+                TVGuide guide = createGuide(page, aReport);
                 PrintVisitor printer = new PrintVisitor(System.out);
                 guide.accept(printer);
-                processResults(programFilters, guide, parser.getNotifier(),
-                        report);
+                processResults(programFilters, guide, aNotifier,
+                        aReport);
             } catch (PageException e) {
-                report.addMessage("Problem getting TV guide", e);
+                aReport.addMessage("Problem getting TV guide", e);
                 LOG.info("Problem getting TV guide", e);
                 throw e; 
             }
-            parser.getNotifier().send(report.asXml());
+            aNotifier.send(aReport.asXml());
         } finally {
             System.out.println("Crawler finished");
         }
index fae06bda35ea10189da41d60e9ce48f6c7691ed5..68a4c13dc78da97717f66b33f13241c3bd09b1cb 100644 (file)
@@ -50,7 +50,8 @@ public class ProgramActionExecutor {
 
     /**
      * Constructs the program action executor.
-     * 
+     *
+     * @param aReport Report to use. 
      */
     public ProgramActionExecutor(Report aReport) {
         _showsToRecord = new TreeMap<Integer, Set<Program>>();
index 2e22f351baca0ac126d5f5afbf288f54c956fa01..fc41cde40aae4340b1f338f523a875433fdcc875 100644 (file)
@@ -30,9 +30,6 @@ import org.wamblee.conditions.AndCondition;
 import org.wamblee.conditions.Condition;
 import org.wamblee.conditions.PropertyRegexCondition;
 import org.wamblee.crawler.kiss.guide.Program;
-import org.wamblee.crawler.kiss.notification.MailNotifier;
-import org.wamblee.crawler.kiss.notification.MailServer;
-import org.wamblee.crawler.kiss.notification.Notifier;
 import org.wamblee.xml.XslTransformer;
 
 /**
@@ -43,14 +40,6 @@ class ProgramConfigurationParser {
     
     private static final int DEFAULT_PRIORITY = 1; 
 
-    private static final String ELEM_PASSWORD = "password";
-
-    private static final String ELEM_USERNAME = "username";
-
-    private static final String ELEM_PORT = "port";
-
-    private static final String ELEM_HOST = "host";
-
     // Formatting configuration.
     private static final String ELEM_FORMAT = "format";
 
@@ -58,18 +47,6 @@ class ProgramConfigurationParser {
 
     private static final String ELEM_HTML = "html";
 
-    // Mail server configuration.
-
-    private static final String ELEM_NOTIFICATION = "notification";
-
-    private static final String ELEM_SMTP = "smtp";
-
-    private static final String ELEM_SUBJECT = "subject";
-
-    private static final String ELEM_TO = "to";
-
-    private static final String ELEM_FROM = "from";
-
     // Configuration of interesting programs.
 
     private static final String ELEM_PROGRAM = "program";
@@ -88,11 +65,8 @@ class ProgramConfigurationParser {
     
     private XslTransformer _transformer;
 
-    private Notifier _notifier;
-
     ProgramConfigurationParser(XslTransformer aTransformer) {
         _filters = null;
-        _notifier = null;
         _transformer = aTransformer;
     }
 
@@ -151,55 +125,11 @@ class ProgramConfigurationParser {
                 filters.add(new ProgramFilter(condition, action));
             }
             _filters = filters;
-
-            Element notifier = root.element(ELEM_NOTIFICATION);
-            _notifier = parseNotifier(notifier);
-
         } catch (DocumentException e) {
             throw new RuntimeException("Error parsing program configuraiton", e);
         }
     }
 
-    /**
-     * Parses the notifier
-     * 
-     * @return Notifier
-     */
-    private Notifier parseNotifier(Element aNotifier) {
-        String from = aNotifier.elementTextTrim(ELEM_FROM);
-        String to = aNotifier.elementTextTrim(ELEM_TO);
-        String subject = aNotifier.elementTextTrim(ELEM_SUBJECT);
-
-        Element smtp = aNotifier.element(ELEM_SMTP);
-        MailServer server = parseMailServer(smtp);
-
-        Element format = aNotifier.element(ELEM_FORMAT);
-        String htmlXslt = format.elementTextTrim(ELEM_HTML);
-        String textXslt = format.elementTextTrim(ELEM_TEXT);
-
-        return new MailNotifier(from, to, subject, htmlXslt, textXslt, server, _transformer);
-    }
-
-    /**
-     * Parses the mail server from the XML.
-     * 
-     * @param aSmtp
-     *            Mail server configuration.
-     * @return Mail server.
-     */
-    private MailServer parseMailServer(Element aSmtp) {
-        String host = aSmtp.elementTextTrim(ELEM_HOST);
-        Element portElem = aSmtp.element(ELEM_PORT);
-        int port = DEFAULT_SMTP_PORT;
-        if (portElem != null) {
-            port = Integer.valueOf(portElem.getTextTrim());
-        }
-        String username = aSmtp.elementTextTrim(ELEM_USERNAME);
-        String password = aSmtp.elementTextTrim(ELEM_PASSWORD);
-
-        return new MailServer(host, port, username, password);
-    }
-
     /**
      * Returns the list of program filters.
      * 
@@ -208,13 +138,4 @@ class ProgramConfigurationParser {
     public List<ProgramFilter> getFilters() {
         return _filters;
     }
-
-    /**
-     * Returns the notifier to use.
-     * 
-     * @return Notifier.
-     */
-    public Notifier getNotifier() {
-        return _notifier;
-    }
 }
index 3b6431d763db1ec78e290fba51bf185e2a1309e0..e464657214c2560b1dba226445853d82acbaaa09 100644 (file)
@@ -128,4 +128,18 @@ public class MailNotifier implements Notifier {
         String reportXmlText = aReport.asXML();
         return _transformer.textTransform(reportXmlText.getBytes(), _transformer.resolve(aXslt));
     }
+    
+    /* (non-Javadoc)
+     * @see org.wamblee.crawler.kiss.notification.Notifier#asHtml(org.dom4j.Element)
+     */
+    public String asHtml(Element aReport) throws IOException, TransformerException {
+        return transformReport(aReport, _htmlXslt);
+    }
+    
+    /* (non-Javadoc)
+     * @see org.wamblee.crawler.kiss.notification.Notifier#asText(org.dom4j.Element)
+     */
+    public String asText(Element aReport) throws IOException, TransformerException {
+        return transformReport(aReport, _textXslt);
+    }
 }
index ef35b6d4faae7e7afd36010cffced4322efef2f3..eda91ba9c200881cabd5120e29834772a99e5bcc 100644 (file)
  */
 package org.wamblee.crawler.kiss.notification;
 
+import java.io.IOException;
+
+import javax.xml.transform.TransformerException;
+
 import org.dom4j.Element;
 
 /**
@@ -30,4 +34,18 @@ public interface Notifier {
      *            Report to send.
      */
     void send(Element aReport) throws NotificationException;
+    
+    /**
+     * Converts the report to html.
+     * @param aReport Report to convert.
+     * @return
+     */
+    String asHtml(Element aReport) throws IOException, TransformerException;
+    
+    /**
+     * Converts the report to text.
+     * @param aReport Report to convert.
+     * @return
+     */
+    String asText(Element aReport) throws IOException, TransformerException;
 }
index bca8cd3c20e688debb4576e7689a99795bb240c2..ce749492a6a69b4799e83aa5abf54d93475637f0 100644 (file)
@@ -30,7 +30,8 @@
            <c:out value="${running}"/>
         </td>
       </tr>
-      <tr>
+      <c:if test="${lastReport != null}">
+            <tr>
         <td>
           Last executed at:
         </td>
           <c:out value="${lastResult}"/>
         </td>
       </tr>
-      <tr>
+        <tr>
         <td>
           Last message: 
         </td>
         <td>
           <c:out value="${lastMessage}" escapeXml="false"/>
         </td>
-      </tr>
+        </tr>
+        <tr>
+        <td>
+          Last report: 
+        </td>
+        <td>
+          <a href="?details=1">details</a>
+        </td>
+        </tr>
+      </c:if>
     </TABLE>
     <c:if test="${!running}">
     <FORM action="runnow">
index 0881652ffeeba25cf57daf86690433817de2f4f9..f1a89bd42bbf328ef5b726c2d7e4032ccbd30b34 100644 (file)
@@ -7,6 +7,7 @@
          class="org.springframework.context.support.ClassPathXmlApplicationContext">
          <constructor-arg>
              <list>
+                 <value>org.wamblee.crawler.notification.xml</value>
                  <value>org.wamblee.crawler.kiss.xml</value>
              </list>
          </constructor-arg>
index 01e88591439110d6a4486c1194fcde68775c03a7..325ef251fc0e71f9586c7836511dc58cefa557d6 100644 (file)
       class="org.wamblee.crawler.kiss.scheduling.CrawlerExecutorImpl">
       <constructor-arg><value>/home/erik/crawler/config.xml</value></constructor-arg>
       <constructor-arg><value>/home/erik/crawler/programs.xml</value></constructor-arg>
+      <constructor-arg><ref bean="org.wamblee.crawler.kiss.notification.Notifier"/></constructor-arg>
   </bean>
   
   <!-- The object that determines whether to execute the crawler when it is signalled by 
        the scheduler. --> 
-  <bean id="org.wamblee.crawler.kiss.scheduling.CrawlerSchedule"
-      class="org.wamblee.crawler.kiss.scheduling.CrawlerSchedule">
+  <bean id="org.wamblee.crawler.kiss.scheduling.CrawlerStatus"
+      class="org.wamblee.crawler.kiss.scheduling.CrawlerStatus">
       <constructor-arg><ref local="org.wamblee.crawler.kiss.scheduling.CrawlerExecutor"/></constructor-arg>
       <!-- The interval of the day in hours [hourmin, hourmax] over which crawling will be done and 
            retried if necessary --> 
index 428ba983cd059ff266e1a12d48fe13b70892a0bf..c5dba6fd129bd2f58891a9299ca98e9959f9e637 100644 (file)
@@ -18,6 +18,8 @@ package org.wamblee.crawler.kiss.scheduling;
 
 import java.util.Date;
 
+import org.wamblee.crawler.kiss.main.Report;
+
 /**
  * Encapsulates the actual execution of the crawler.
  * This interface makes it possible to test the scheduling logic
@@ -28,8 +30,9 @@ public interface CrawlerExecutor {
     
     /**
      * Executes the crawler. 
-     * @param aDate Date the crawler is being triggered. 
+     * @param aDate Date the crawler is being triggered.
+     * @param The report from the crawler.  
      * @throws Exception
      */
-    void execute(Date aDate) throws Exception;
+    void execute(Date aDate, Report aReport) throws Exception;
 }
index 35d3f923be224376c6d1524f3867c979867f1970..ad1782762653d241acbcd732921b888f7e96a820 100644 (file)
@@ -19,6 +19,8 @@ package org.wamblee.crawler.kiss.scheduling;
 import java.util.Date;
 
 import org.wamblee.crawler.kiss.main.KissCrawler;
+import org.wamblee.crawler.kiss.main.Report;
+import org.wamblee.crawler.kiss.notification.Notifier;
 
 /**
  * Implementation which executes the KiSS crawler for retrieving web content. 
@@ -26,22 +28,25 @@ import org.wamblee.crawler.kiss.main.KissCrawler;
 public class CrawlerExecutorImpl implements CrawlerExecutor {
     
     private String _crawlerConfig; 
-    private String _programConfig; 
-    
+    private String _programConfig;
+    private Notifier _notifier; 
+   
     /**
      * Constructs the crawler executor. 
      * @param aCrawlerConfig Crawler configuration file. 
-     * @param aProgramConfig Program configuration file. 
+     * @param aProgramConfig Program configuration file.
+     * @param aNotifier Object used to send notifications.  
      */
-    public CrawlerExecutorImpl(String aCrawlerConfig, String aProgramConfig) { 
+    public CrawlerExecutorImpl(String aCrawlerConfig, String aProgramConfig, Notifier aNotifier) { 
         _crawlerConfig = aCrawlerConfig; 
-        _programConfig = aProgramConfig; 
+        _programConfig = aProgramConfig;
+        _notifier = aNotifier;
     }
 
     /* (non-Javadoc)
      * @see org.wamblee.crawler.kiss.scheduling.CrawlerScheduler.CrawlerExecutor#execute(java.util.Date)
      */
-    public void execute(Date aDate) throws Exception {
-        KissCrawler crawler = new KissCrawler(_crawlerConfig, _programConfig);       
+    public void execute(Date aDate, Report aReport) throws Exception {
+        KissCrawler crawler = new KissCrawler(_crawlerConfig, _programConfig, _notifier, aReport);
     }
 }
index e529da074d410d008f5376d7a0e44f7af9539061..fefb8d9841aff0b60e06fe60646ba976eb7d423d 100644 (file)
 package org.wamblee.crawler.kiss.scheduling;
 
 /**
- * 
+ * Interface to the scheduler specific for working with the crawler. 
  */
 public interface CrawlerScheduler {
     
+    /**
+     * Initializes the scheduler. 
+     * @throws Exception In case of problems.
+     */
     void initialize() throws Exception;
     
+    /**
+     * Checks if the crawler is running. 
+     * @return True iff the crawler is running. 
+     * @throws Exception In case of problems. 
+     */
     boolean isCrawlerRunning() throws Exception; 
-    
+    /**
+     * Schedules the crawler for immediate execution. 
+     * @throws Exception In case of problems. 
+     */
     void scheduleNow() throws Exception; 
     
+    /**
+     * Shuts down the scheduler. 
+     * @throws Exception In case of problems. 
+     */
     void shutdown() throws Exception; 
-
 }
similarity index 82%
rename from crawler/kissweb/src/org/wamblee/crawler/kiss/scheduling/CrawlerSchedule.java
rename to crawler/kissweb/src/org/wamblee/crawler/kiss/scheduling/CrawlerStatus.java
index 5121f92058df76a437ca159e595c1b0e1f089866..065a229487b6d87fded759f7ba5e03fb2da6fba8 100644 (file)
@@ -22,6 +22,7 @@ import java.util.Date;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.wamblee.crawler.kiss.main.Report;
 
 /**
  * This class encapsulates the logic for deciding whether to
@@ -30,16 +31,18 @@ import org.apache.commons.logging.LogFactory;
  * more complex logic for determining whether to run the 
  * crawler. 
  */
-public class CrawlerSchedule implements Serializable {
+public class CrawlerStatus implements Serializable {
     
-    private static final Log LOG = LogFactory.getLog(CrawlerSchedule.class);
+    private static final Log LOG = LogFactory.getLog(CrawlerStatus.class);
     
     private CrawlerExecutor _crawler; 
     private Date _lastExecuted;
     private boolean _lastResult;
     private Exception _lastException;
+    private Report _lastReport; 
     private int _hourMin; 
     private int _hourMax;
+    private boolean _mustExecute; 
     
     /**
      * Constructs the scheduler.
@@ -53,13 +56,24 @@ public class CrawlerSchedule implements Serializable {
      * @param aHourMin The crawler may only run if hour &gt;= <code>aHourMin</code>
      * @param aHourMax The crawler may only run if hour &lt;= <code>aHourMax</code>
      */
-    public CrawlerSchedule(CrawlerExecutor aCrawler, int aHourMin, int aHourMax) { 
+    public CrawlerStatus(CrawlerExecutor aCrawler, int aHourMin, int aHourMax) { 
         _crawler = aCrawler; 
         _lastExecuted = new Date(); 
         _lastResult = true; // the crawler will automatically run the next day. 
-        _lastException = null; 
+        _lastException = null;
+        _lastReport = null; 
         _hourMin = aHourMin;
         _hourMax = aHourMax;
+        _mustExecute = false; 
+    }
+    
+    /**
+     * Determines whether or not the crawler must be run the next time it is triggered.
+     * @param aMustExecute If true then the crawler will run the next time it is triggered
+     *   by the scheduler. 
+     */
+    public void setMustExecute(boolean aMustExecute) { 
+        _mustExecute = aMustExecute; 
     }
     
     /**
@@ -71,8 +85,9 @@ public class CrawlerSchedule implements Serializable {
         
         if (mustExecute(aDate)) { 
             LOG.info("Executing crawler at " + aDate);
-            try {  
-                _crawler.execute(aDate);
+            Report report = new Report();
+            try {
+                _crawler.execute(aDate, report);
                 _lastResult = true; 
                 _lastException = null; 
             } catch (Exception e) {
@@ -80,6 +95,7 @@ public class CrawlerSchedule implements Serializable {
                 _lastException = e; 
             } finally { 
                 _lastExecuted = aDate;
+                _lastReport = report;
             }
         } 
     }
@@ -92,10 +108,6 @@ public class CrawlerSchedule implements Serializable {
         return _lastExecuted; 
     }
     
-    public void setLastExecuted(Date aDate) { 
-        _lastExecuted = aDate;
-    }
-    
     /**
      * Gets the result of the last execution. 
      * @return True iff last execution was a success. 
@@ -113,12 +125,24 @@ public class CrawlerSchedule implements Serializable {
         return _lastException; 
     }
     
+    /**
+     * Gets the last report from the scheduler. 
+     * @return Report. 
+     */
+    public Report getLastReport() { 
+        return _lastReport; 
+    }
+    
     /**
      * Determines whether or not the crawler must be run. 
      * @param aDate Current time. 
      * @return True iff the crawler must be run. 
      */
     private boolean mustExecute(Date aDate) {
+        if (_mustExecute) { 
+            _mustExecute = false;
+            return true; 
+        }
         if ( _lastExecuted == null ) {
             return false; // crawler must be started manually at least once after deployment.
         }
index b86f5a9248df488a6de5b5dbe4a70c1e63e8adfc..60e59e83dbb40746fc06e32856a21d2f78c708ca 100644 (file)
@@ -21,7 +21,7 @@ import org.apache.commons.logging.LogFactory;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.quartz.StatefulJob;
-import org.wamblee.crawler.kiss.scheduling.CrawlerSchedule;
+import org.wamblee.crawler.kiss.scheduling.CrawlerStatus;
 import org.wamblee.general.BeanKernel;
 
 /**
@@ -48,8 +48,8 @@ public class CrawlerJob implements StatefulJob {
             throws JobExecutionException {
         LOG.info("Job triggered");
         try {
-            CrawlerSchedule schedule = BeanKernel.getBeanFactory().find(
-                    CrawlerSchedule.class);
+            CrawlerStatus schedule = BeanKernel.getBeanFactory().find(
+                    CrawlerStatus.class);
             schedule.execute(aContext.getFireTime());
         } catch (Exception e) {
             throw new JobExecutionException("Error executing crawler", e, false);
index 19d3b6faf4f4f743684316e16925d81641c14438..9220a62f741ee8cbd0c222675eff63cc5a08280f 100644 (file)
@@ -19,7 +19,6 @@ package org.wamblee.crawler.kiss.servlet;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 
-import org.quartz.SchedulerException;
 import org.wamblee.crawler.kiss.scheduling.CrawlerScheduler;
 import org.wamblee.general.BeanKernel;
 
index 479c60b7fb3dbc7c2a1913276802eb24742aa557..1f9d08e59979b0fbe42985245d61efedf02fbb7f 100644 (file)
 package org.wamblee.crawler.kiss.servlet;
 
 import java.io.IOException;
-import java.util.Date;
+import java.io.OutputStream;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.wamblee.crawler.kiss.scheduling.CrawlerSchedule;
+import org.wamblee.crawler.kiss.main.Report;
+import org.wamblee.crawler.kiss.notification.Notifier;
 import org.wamblee.crawler.kiss.scheduling.CrawlerScheduler;
+import org.wamblee.crawler.kiss.scheduling.CrawlerStatus;
 import org.wamblee.general.BeanKernel;
 
 /**
@@ -45,12 +47,21 @@ public class CrawlerServlet extends HttpServlet {
 
         CrawlerScheduler scheduler = BeanKernel.getBeanFactory().find(
                 CrawlerScheduler.class);
-        CrawlerSchedule status = BeanKernel.getBeanFactory().find(
-                CrawlerSchedule.class);
+        CrawlerStatus status = BeanKernel.getBeanFactory().find(
+                CrawlerStatus.class);
 
         try {
-            if ( aRequest.getParameter("runnow") != null ) {
-                status.setLastExecuted(new Date(System.currentTimeMillis() - 24*3600*1000));
+            if (aRequest.getParameter("details") != null) {
+                Report report = status.getLastReport();
+                if (report != null) {
+                    Notifier notifier = BeanKernel.getBeanFactory().find(Notifier.class);
+                    OutputStream os = aResponse.getOutputStream();
+                    os.write(notifier.asHtml(report.asXml()).getBytes());
+                    return;
+                }
+            }
+            if (aRequest.getParameter("runnow") != null) {
+                status.setMustExecute(true);
                 scheduler.scheduleNow();
                 aResponse.sendRedirect("");
                 return;
@@ -59,10 +70,12 @@ public class CrawlerServlet extends HttpServlet {
             aRequest.setAttribute("lastExecuted", status.getLastExecuted());
             aRequest.setAttribute("lastResult", status.getLastResult());
             aRequest.setAttribute("lastException", status.getLastException());
-            String msg = ""; 
-            Throwable e = status.getLastException(); 
-            while ( e != null ) { 
-                msg = msg + e.getMessage() + "<br/>"; 
+            aRequest.setAttribute("lastReport", status.getLastReport());
+            String msg = "";
+            Throwable e = status.getLastException();
+            while (e != null) {
+                msg = msg + e.getClass().getName() + ": " + e.getMessage()
+                        + "<br/>";
                 e = e.getCause();
             }
             aRequest.setAttribute("lastMessage", msg);