1 4 package com.openedit.modules.scheduler; 5 6 import java.io.StringWriter ; 7 import java.util.Iterator ; 8 import java.util.Timer ; 9 import java.util.TimerTask ; 10 11 import org.apache.commons.logging.Log; 12 import org.apache.commons.logging.LogFactory; 13 14 import com.openedit.BaseWebPageRequest; 15 import com.openedit.Shutdownable; 16 import com.openedit.WebPageRequest; 17 import com.openedit.WebServer; 18 import com.openedit.error.ErrorHandler; 19 import com.openedit.modules.BaseModule; 20 import com.openedit.page.Page; 21 import com.openedit.users.User; 22 import com.openedit.util.PathUtilities; 23 24 27 public class SchedulerModule extends BaseModule implements Shutdownable 28 { 29 private static final Log log = LogFactory.getLog(SchedulerModule.class); 30 protected Timer fieldTimer; 31 protected ClassLoader fieldClassLoader; protected WebServer fieldWebServer; 33 protected Scheduler fieldScheduler; 34 protected Action selectedAction; 35 36 public SchedulerModule() 37 { 38 super(); 39 } 41 public void loadSettings() 42 { 43 if( fieldTimer != null) 44 { 45 getTimer().cancel(); 46 } 47 fieldTimer = null; 48 getScheduler(); 50 } 51 52 public void listActions(WebPageRequest inReq) 53 { 54 inReq.putPageValue("actions", getScheduler().getActions()); 55 } 56 57 public void selectAction(WebPageRequest inReq) 58 { 59 String actionName = inReq.getRequestParameter("actionname"); 60 if (actionName != null && actionName.length() > 0) 61 { 62 Action action = getScheduler().getAction(actionName); 63 setSelectedAction(action); 64 } 65 inReq.putPageValue("selectedAction", getSelectedAction()); 66 } 67 68 public void saveAction(WebPageRequest inReq) 69 { 70 String actionName = inReq.getRequestParameter("actionname"); 71 if (actionName != null && actionName.length() > 0) 72 { 73 String delay = inReq.getRequestParameter("delay"); 74 String period = inReq.getRequestParameter("period"); 75 getSelectedAction().setPath(actionName); 76 if (delay != null && delay.length() > 0) 77 { 78 getSelectedAction().setDelay(delay); 79 } 80 if (period != null && period.length() > 0) 81 { 82 getSelectedAction().setPeriod(period); 83 } 84 85 User user = inReq.getUser(); 86 if (user != null) 87 { 88 String username = user.getUserName(); 89 getSelectedAction().setUserName(username); 90 } 91 92 restartAction(getSelectedAction()); 93 getScheduler().saveConfig(inReq); 94 } 95 } 96 97 public void addNewAction(WebPageRequest inReq) 98 { 99 Action action = new Action(); 100 action.setPath("/run.html"); 101 getScheduler().addAction(action); 102 setSelectedAction(action); 103 } 104 105 public void deleteAction(WebPageRequest inReq) 106 { 107 getSelectedAction().getTimerTask().cancel(); 108 getScheduler().removeAction(getSelectedAction()); 109 setSelectedAction(null); 110 getScheduler().saveConfig(inReq); 111 } 112 113 public Timer getTimer() 114 { 115 if (fieldTimer == null) 116 { 117 fieldTimer = new Timer ( false ); 118 } 119 return fieldTimer; 120 } 121 122 private void handleException( String inActionName, Exception e, WebPageRequest inReq ) 123 { 124 log.error( "Scheduler failed to execution action " + inActionName + " " + e.getMessage() ); 125 126 e.printStackTrace(); 127 128 try 129 { 130 ErrorHandler handler = (ErrorHandler)getModuleManager().getBean("defaultErrorHandler"); 131 handler.handleError(e, inReq); 132 } 133 catch ( Throwable ex ) 134 { 135 log.error( "Error handle error ignored: " + ex); 136 } 137 } 138 public ClassLoader getClassLoader() 139 { 140 return fieldClassLoader; 141 } 142 public void setClassLoader(ClassLoader inClassLoader) 143 { 144 fieldClassLoader = inClassLoader; 145 } 146 public void shutdown() 147 { 148 if ( fieldTimer != null) 149 { 150 getTimer().cancel(); 151 fieldTimer = null; 152 } 153 } 154 public WebServer getWebServer() 155 { 156 return fieldWebServer; 157 } 158 public void setWebServer(WebServer inWebServer) 159 { 160 fieldWebServer = inWebServer; 161 } 162 163 public Scheduler getScheduler() 164 { 165 if (fieldScheduler == null) 166 { 167 fieldScheduler = new Scheduler(); 168 fieldScheduler.setPageManager(getPageManager()); 169 fieldScheduler.loadFromFile(); 170 startAllTasks(); 171 } 172 173 return fieldScheduler; 174 } 175 public void setScheduler(Scheduler inScheduler) 176 { 177 fieldScheduler = inScheduler; 178 } 179 180 private void startAllTasks() 181 { 182 for (Iterator iter = getScheduler().getActions().iterator(); iter.hasNext();) 183 { 184 Action action = (Action) iter.next(); 185 startTask(action); 186 } 187 } 188 189 public void startTask( Action inAction ) 190 { 191 final String path = inAction.getPath(); 192 final User user = getUserManager().getUser(inAction.getUserName()); 193 if (!inAction.isStarted()) 194 { 195 TimerTask task = new TimerTask () 196 { 197 public void run() 198 { 199 BaseWebPageRequest request = new BaseWebPageRequest(); 200 request.setWriter(new StringWriter () ); 201 request.setUser(user); 202 try 203 { 204 String [] parts = path.split("[?]"); Page page = getPageManager().getPage(parts[0]); 206 207 if (parts.length > 1) 208 { 209 String [] args = parts[1].split("&"); 210 for (int i = 0; i < args.length; i++) 211 { 212 String [] pairs = args[i].split("="); 213 request.setRequestParameter(pairs[0], pairs[1]); 214 } 215 } 216 217 request.setPage(page); 218 request.setContentPage(page); 219 220 getWebServer().getOpenEditEngine().createPageStreamer( page, request); 221 Thread thread = Thread.currentThread(); 222 ClassLoader oldLoader = thread.getContextClassLoader(); 223 try { 224 thread.setContextClassLoader(getClassLoader()); 225 log.debug("running " + path); 226 getModuleManager().executePageActions(page, request ); 227 getModuleManager().executePathActions(page, request ); 228 } finally { 229 thread.setContextClassLoader(oldLoader); 230 } 231 } 232 catch( Exception e ) 233 { 234 handleException( path, e , request); 235 } 236 catch( Throwable e ) 237 { 238 log.error( e ); 240 } 241 242 } 243 }; 244 inAction.setTimerTask(task); 245 getTimer().scheduleAtFixedRate(task, inAction.getDelay(), inAction.getPeriod() ); 246 } 247 } 248 249 private void restartAction(Action inAction) 250 { 251 inAction.stop(); 252 startTask(inAction); 253 } 254 255 public Action getSelectedAction() 256 { 257 return selectedAction; 258 } 259 public void setSelectedAction(Action inSelectedAction) 260 { 261 selectedAction = inSelectedAction; 262 } 263 264 } 265 | Popular Tags |