KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > openedit > modules > scheduler > SchedulerModule


1 /*
2  * Created on Oct 18, 2004
3  */

4 package com.openedit.modules.scheduler;
5
6 import java.io.StringWriter JavaDoc;
7 import java.util.Iterator JavaDoc;
8 import java.util.Timer JavaDoc;
9 import java.util.TimerTask JavaDoc;
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 /**
25  * @author Matthew Avery, mavery@einnovation.com
26  */

27 public class SchedulerModule extends BaseModule implements Shutdownable
28 {
29     private static final Log log = LogFactory.getLog(SchedulerModule.class);
30     protected Timer JavaDoc fieldTimer;
31     protected ClassLoader JavaDoc fieldClassLoader; // this is the servlet/web-app class loader
32
protected WebServer fieldWebServer;
33     protected Scheduler fieldScheduler;
34     protected Action selectedAction;
35     
36     public SchedulerModule()
37     {
38         super();
39         // TODO Auto-generated constructor stub
40
}
41     public void loadSettings()
42     {
43         if( fieldTimer != null)
44         {
45             getTimer().cancel();
46         }
47         fieldTimer = null;
48         //initFromFile("/openedit/scheduler/configuration.xml");
49
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 JavaDoc 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 JavaDoc actionName = inReq.getRequestParameter("actionname");
71         if (actionName != null && actionName.length() > 0)
72         {
73             String JavaDoc delay = inReq.getRequestParameter("delay");
74             String JavaDoc 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 JavaDoc 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 JavaDoc getTimer()
114     {
115         if (fieldTimer == null)
116         {
117             fieldTimer = new Timer JavaDoc( false );
118         }
119         return fieldTimer;
120     }
121     
122     private void handleException( String JavaDoc inActionName, Exception JavaDoc 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 JavaDoc ex )
134         {
135             log.error( "Error handle error ignored: " + ex);
136         }
137     }
138     public ClassLoader JavaDoc getClassLoader()
139     {
140         return fieldClassLoader;
141     }
142     public void setClassLoader(ClassLoader JavaDoc 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 JavaDoc 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 JavaDoc path = inAction.getPath();
192         final User user = getUserManager().getUser(inAction.getUserName());
193         if (!inAction.isStarted())
194         {
195             TimerTask JavaDoc task = new TimerTask JavaDoc()
196             {
197                 public void run()
198                 {
199                     BaseWebPageRequest request = new BaseWebPageRequest();
200                     request.setWriter(new StringWriter JavaDoc() );
201                     request.setUser(user);
202                     try
203                     {
204                         String JavaDoc[] parts = path.split("[?]"); //TODO: Move this to Util class
205
Page page = getPageManager().getPage(parts[0]);
206
207                         if (parts.length > 1)
208                         {
209                             String JavaDoc[] args = parts[1].split("&");
210                             for (int i = 0; i < args.length; i++)
211                             {
212                                 String JavaDoc[] 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 JavaDoc thread = Thread.currentThread();
222                           ClassLoader JavaDoc 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 JavaDoc e )
233                     {
234                         handleException( path, e , request);
235                     }
236                     catch( Throwable JavaDoc e )
237                     {
238                         //handleException( path, e , request);
239
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