1 10 package org.mmbase.module; 11 12 import java.io.IOException ; 13 import java.net.*; 14 import java.util.Iterator ; 15 import java.util.List ; 16 17 import org.mmbase.util.*; 18 import org.mmbase.module.core.*; 19 import org.mmbase.util.logging.*; 20 21 32 33 public class LinkChecker extends ProcessorModule implements Runnable { 34 35 private static final Logger log = Logging.getLoggerInstance(LinkChecker.class); 36 37 private static long INITIAL_WAIT_TIME = 5 * 60 * 1000; private static long WAIT_TIME = 0; private static long WAIT_TIME_BETWEEN_CHECKS = 5 * 1000; 41 private MMBase mmbase; 42 43 public void init() { 44 super.init(); 45 String value = getInitParameter("waittime"); 46 if (value!=null) { 47 try { 48 WAIT_TIME = Long.parseLong(value); 49 } catch (NumberFormatException nfe) { 50 log.warn("The value for property 'waittime' (" + value + ") is not a valid number."); 51 } 52 } 53 value = getInitParameter("initialwaittime"); 54 if (value!=null) { 55 try { 56 INITIAL_WAIT_TIME = Long.parseLong(value); 57 } catch (NumberFormatException nfe) { 58 log.warn("The value for property 'initialwaittime' (" + value + ") is not a valid number."); 59 } 60 } 61 value = getInitParameter("waittimebetweenchecks"); 62 if (value!=null) { 63 try { 64 WAIT_TIME_BETWEEN_CHECKS = Long.parseLong(value); 65 } catch (NumberFormatException nfe) { 66 log.warn("The value for property 'waittimebetweenchecks' (" + value + ") is not a valid number."); 67 } 68 } 69 70 mmbase = MMBase.getMMBase(); 71 log.info("Module LinkChecker started"); 72 MMBaseContext.startThread(this, "LinkChecker"); 73 } 74 75 public String getModuleInfo() { 76 return "This module checks all urls in the urls and jumpers builders"; 77 } 78 79 public void run() { 80 long waitTime = INITIAL_WAIT_TIME; while (!mmbase.isShutdown()) { 82 try { 83 Thread.sleep(waitTime); 84 } catch (InterruptedException ie) { 85 return; 86 } 87 log.service("LinkChecker starting to check all Jumpers and Urls"); 88 89 StringBuffer data = new StringBuffer (); 90 checkUrls("urls", "url", data); 91 checkUrls("jumpers", "url", data); 92 93 try { 94 SendMailInterface sendmail = (SendMailInterface) getModule("sendmail"); 95 if (sendmail != null) { 96 String from = getInitParameter("from"); 98 String to = getInitParameter("to"); 99 String subject = getInitParameter("subject"); 100 if (subject == null || subject.equals("")) { 101 subject = "List of incorrect urls and jumpers"; 102 } 103 if (!data.toString().equals("")) { 105 Mail mail = new Mail(to, from); 106 mail.setSubject(subject); 107 mail.setText(data.toString()); 108 sendmail.sendMail(mail); 109 } 110 } else { 111 log.warn("LinkChecker requires the sendmail module to be active"); 112 } 113 } catch (RuntimeException re) { 114 log.error("LinkChecker -> Error in Run() " + re); 115 } 116 waitTime = WAIT_TIME; 119 if (waitTime == 0) { 120 log.debug("LinkChecker finished, thread terminated."); 121 return; 122 } 123 } 124 } 125 126 133 protected void checkUrls(String builderName, String fieldName, StringBuffer data) { 134 MMObjectBuilder urls = mmbase.getBuilder(builderName); 136 if (urls != null) { 137 List nodes = urls.getNodes(); 138 for (Iterator iter = nodes.iterator(); iter.hasNext();) { 139 MMObjectNode node = (MMObjectNode) iter.next(); 140 long number = node.getNumber(); 141 String url = "" + node.getValue(fieldName); 142 try { 144 if (!checkUrl(url)) { 145 data.append("Incorrect url: " + url + " (objectnumber: " + number + ")\n"); 146 } 147 } catch (MalformedURLException mue) { 148 data.append("Error in url (malformed): " + url + " (objectnumber: " + number + ")\n"); 149 } catch (IOException ioe) { 150 data.append("Error in url (IO failure): " + url + " (objectnumber: " + number + ")\n"); 151 } catch (RuntimeException re) { 152 data.append("Error in url (unknown): " + url + " (objectnumber: " + number + ", error: "+re.getMessage()+")\n"); 153 } 154 try { 155 Thread.sleep(WAIT_TIME_BETWEEN_CHECKS); 156 } catch (InterruptedException ie) {} } 158 } 159 } 160 161 166 protected boolean checkUrl(String url) throws MalformedURLException, IOException { 167 if (url.indexOf("http") == 0 || url.indexOf("ftp") == 0) { 168 URL urlToCheck = new URL(url); 169 URLConnection uc = urlToCheck.openConnection(); 170 String header = uc.getHeaderField(0); 171 return header.indexOf("404") == -1; 172 } else { 173 return true; 175 } 176 } 177 } 178 | Popular Tags |