Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/LoadQuartzServlet.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/LoadQuartzServlet.java?rev=617035&r1=617034&r2=617035&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/LoadQuartzServlet.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/LoadQuartzServlet.java Wed Jan 30 23:44:03 2008
@@ -14,11 +14,8 @@
* limitations under the License.
*
*/
-
/* $Id$ */
-
package org.apache.lenya.cms.scheduler;
-
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
@@ -31,14 +28,12 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-
import org.apache.lenya.cms.publication.DocumentBuildException;
import org.apache.lenya.cms.publication.Publication;
import org.apache.lenya.cms.publication.PublicationException;
@@ -47,368 +42,334 @@
import org.apache.lenya.cms.scheduler.xml.TriggerHelper;
import org.apache.lenya.util.NamespaceMap;
import org.apache.lenya.xml.DocumentHelper;
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
import org.quartz.SchedulerException;
import org.w3c.dom.Document;
-
/**
* A simple servlet that starts an instance of a Quartz scheduler.
*/
public class LoadQuartzServlet extends HttpServlet {
- private static Category log = Category.getInstance(LoadQuartzServlet.class);
- private static SchedulerWrapper scheduler = null;
- private ServletContext servletContext;
- private String schedulerConfigurations;
-
- public static final String PREFIX = "scheduler";
- public static final String PARAMETER_ACTION = "action";
- public static final String PARAMETER_PUBLICATION_ID = "publication-id";
- public static final String PARAMETER_DOCUMENT_URL = "document-url";
- public static final String CONFIGURATION_ELEMENT = "scheduler-configurations";
-
- /**
- * Returns the scheduler wrapper.
- * @return A scheduler wrapper.
- */
- public static SchedulerWrapper getScheduler() {
- return scheduler;
- }
-
- /**
- * Maps servlet context names to servlets.
- */
- private static Map servlets = new HashMap();
-
- /**
- * Initializes the servlet.
- * @param config The servlet configuration.
- * @throws ServletException when something went wrong.
- */
- public void init(ServletConfig config) throws ServletException {
- super.init(config);
-
- this.schedulerConfigurations = config.getInitParameter(CONFIGURATION_ELEMENT);
- this.servletContext = config.getServletContext();
-
- log.debug(
- ".init(): Servlet Context Path: " + getServletContextDirectory().getAbsolutePath());
-
- try {
- log.debug("Storing servlet");
- String contextPath = getServletContextDirectory().getCanonicalPath();
- log.debug(" Context path: [" + contextPath + "]");
- servlets.put(contextPath, this);
- } catch (IOException e) {
- throw new ServletException(e);
- }
-
- log.debug(".init(): Scheduler Configurations: " + this.schedulerConfigurations);
-
- try {
- log.info("Working?...");
- process();
- log.info("OK");
- } catch (Exception e) {
- log.error("Init of LoadQuartzServlet failed", e);
- throw new ServletException(e);
- }
- }
-
- /**
- * Process.
- *
- * @throws ServletException when an error occurs.
- * @throws SchedulerException when an error occurs.
- */
- public void process() throws ServletException, SchedulerException {
- scheduler =
- new SchedulerWrapper(
- getServletContextDirectory().getAbsolutePath(),
- schedulerConfigurations);
-
- try {
- ShutdownHook();
- } catch (Exception e) {
- log.error(e.toString(), e);
- }
-
- restoreJobs();
- }
-
- /**
- * Shuts down the scheduler.
- */
- public void destroy() {
- destroyScheduler();
- }
-
- /**
- * Shuts down the scheduler.
- */
- public static void destroyScheduler() {
- log.debug("destroy: ");
- getScheduler().shutdown();
- }
-
- /**
- * This method sets a ShutdownHook to the system This traps the CTRL+C or kill signal and
- * shutdows Correctly the system.
- *
- * @throws Exception when something went wrong.
- */
- public static void ShutdownHook() throws Exception {
- log.debug("-------------------- ShutdownHook --------------------");
- Runtime.getRuntime().addShutdownHook(new Thread() {
- public void run() {
- LoadQuartzServlet.destroyScheduler();
- }
- });
- log.debug("-------------------- End ShutdownHook --------------------");
- }
-
- /**
- * Handles a GET request.
- * @param request The request.
- * @param response The response.
- * @throws IOException when an error occured.
- * @throws ServletException when an error occured.
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- handleRequest(request, response);
- }
-
- /**
- * Handles a POST request.
- *
- * @param req The requust.
- * @param resp The response.
- *
- * @throws ServletException when an error occured.
- * @throws IOException when an error occured.
- */
- public void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doGet(req, resp);
- }
-
- protected static final String ADD = "add";
- protected static final String MODIFY = "modify";
- protected static final String DELETE = "delete";
- protected static final String DOCUMENT_DELETED = "document-deleted";
-
- /**
- * Handles a servlet request.
- * @param request The request.
- * @param response The response.
- * @throws IOException when something went wrong.
- */
- protected void handleRequest(HttpServletRequest request, HttpServletResponse response)
- throws IOException {
- log.debug("----------------------------------------------------------------");
- log.debug("- Incoming request at URI: ");
- log.debug(
- request.getServerName() + ":" + request.getServerPort() + request.getRequestURI());
- log.debug("----------------------------------------------------------------");
- log.debug("Request parameters:");
-
- NamespaceMap schedulerParameters = getSchedulerParameters(request);
-
- try {
- String publicationId = (String) schedulerParameters.get(PARAMETER_PUBLICATION_ID);
- log.debug("Scheduler invoked.");
-
- log.debug("Scheduler Parameters:");
- log.debug(" scheduler.publication-id: [" + publicationId + "]");
-
- logSessionAttributes(request);
-
- // check if the request wants to submit, modify or delete a job.
- String action = (String) schedulerParameters.get(PARAMETER_ACTION);
- log.debug(" scheduler.action: [" + action + "]");
- if (action == null) {
- } else if (action.equals(ADD)) {
- Date startTime = TriggerHelper.getDate(schedulerParameters);
- getScheduler().addJob(publicationId, startTime, request);
- } else if (action.equals(MODIFY)) {
- Date startTime = TriggerHelper.getDate(schedulerParameters);
- String jobId = getJobId(schedulerParameters);
- getScheduler().modifyJob(jobId, publicationId, startTime);
- } else if (action.equals(DELETE)) {
- String jobId = getJobId(schedulerParameters);
- getScheduler().deleteJob(jobId, publicationId);
- } else if (action.equals(DOCUMENT_DELETED)) {
-
- Publication publication =
- PublicationFactory.getPublication(
- publicationId,
- getServletContextDirectory().getAbsolutePath());
-
- String documentUrl = (String) schedulerParameters.get(PARAMETER_DOCUMENT_URL);
- org.apache.lenya.cms.publication.Document document =
- publication.getDocumentBuilder().buildDocument(publication, documentUrl);
- deleteDocumentJobs(document);
- }
-
- // handle the remainder of the request by simply returning all
- // scheduled jobs (for the given publication ID).
- PrintWriter writer = response.getWriter();
- response.setContentType("text/xml");
-
- Document snapshot = getScheduler().getSnapshot();
-
- DocumentHelper.writeDocument(snapshot, writer);
- } catch (Exception e) {
- log.error("Can't create job snapshot: ", e);
- throw new IOException(e.getMessage() + " (view log for details)");
- }
- }
-
- /**
- * Extracts the scheduler parameters from a request.
- * @param request The request.
- * @return A namespace map.
- */
- public static NamespaceMap getSchedulerParameters(HttpServletRequest request) {
- Map parameterMap = new HashMap();
- List keys = new ArrayList();
- for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
- String key = (String) e.nextElement();
- keys.add(key);
- }
- Collections.sort(keys);
- for (Iterator i = keys.iterator(); i.hasNext();) {
- String key = (String) i.next();
- String[] values = request.getParameterValues(key);
- log.debug(" [" + key + "] = [" + values[0] + "]");
- if (values.length == 1) {
- parameterMap.put(key, values[0]);
- } else {
- parameterMap.put(key, values);
- }
- }
-
- NamespaceMap schedulerParameters = new NamespaceMap(parameterMap, PREFIX);
- return schedulerParameters;
- }
-
- /**
- * Deletes
- * @param document
- * @throws DocumentBuildException
- * @throws SchedulerException
- * @throws PublicationException
- */
- public void deleteDocumentJobs(org.apache.lenya.cms.publication.Document document)
- throws DocumentBuildException, SchedulerException, PublicationException {
- log.debug("Requested to delete jobs for document URL [" + document.getCompleteURL() + "]");
- getScheduler().deleteJobs(document);
- }
-
- /**
- * Extracts the job ID from the scheduler parameters.
- * @param schedulerParameters A namespace map.
- * @return A string.
- */
- protected String getJobId(NamespaceMap schedulerParameters) {
- String parameterName =
- NamespaceMap.getFullName(SchedulerWrapper.JOB_PREFIX, SchedulerWrapper.JOB_ID);
- String jobId = (String) schedulerParameters.get(parameterName);
- log.debug(" scheduler.job.id: [" + jobId + "]");
- return jobId;
- }
-
- /**
- * Logs the session attributes of a request.
- * @param request The request.
- */
- protected void logSessionAttributes(HttpServletRequest request) {
- log.debug("-------------------- Session Attributes --------------------");
- for (Enumeration e = request.getSession().getAttributeNames(); e.hasMoreElements();) {
- String name = (String) e.nextElement();
- log.debug(name + " = " + request.getSession().getAttribute(name));
- }
- log.debug("-------------------- End Session Attributes --------------------");
- }
-
- /**
- * Returns the servlet context path.
- *
- * @return A string.
- */
- public File getServletContextDirectory() {
- return new File(this.servletContext.getRealPath("/"));
- }
-
- /**
- * Restores the jobs.
- * @throws SchedulerException when something went wrong.
- */
- public void restoreJobs() throws SchedulerException {
-
- File publicationsDirectory =
- new File(getServletContextDirectory(), PublishingEnvironment.PUBLICATION_PREFIX);
-
- File[] publicationDirectories = publicationsDirectory.listFiles(new FileFilter() {
- public boolean accept(File file) {
- return file.isDirectory();
- }
- });
-
- log.debug("=========================================");
- log.debug(" Restoring jobs.");
- log.debug(" servlet context: [" + getServletContextDirectory() + "]");
- log.debug(" publications directory: [" + publicationsDirectory + "]");
- log.debug("=========================================");
-
- for (int i = 0; i < publicationDirectories.length; i++) {
- File directory = publicationDirectories[i];
- String publicationId = directory.getName();
- if (PublicationFactory
- .existsPublication(publicationId, getServletContextDirectory().getAbsolutePath())) {
- getScheduler().restoreJobs(publicationId);
- }
- }
- }
-
- public static final String SERVLET_URL = "/servlet/QuartzSchedulerServlet";
-
- /**
- * Returns the servlet for a certain canonical servlet context path.
- * @param contextPath The canonical servlet context path.
- * @return A LoadQuartzServlet.
- */
- public static LoadQuartzServlet getServlet(String contextPath) {
- return (LoadQuartzServlet) servlets.get(contextPath);
- }
-
- /**
- * Generates the request URI needed to delete the jobs for a certain document.
- * @param document The document.
- * @return A string.
- */
- public static String getDeleteDocumentRequestURI(
- String port,
- String servletContextPath,
- org.apache.lenya.cms.publication.Document document) {
-
- NamespaceMap requestParameters = new NamespaceMap(PREFIX);
- requestParameters.put(PARAMETER_ACTION, DOCUMENT_DELETED);
- requestParameters.put(PARAMETER_PUBLICATION_ID, document.getPublication().getId());
- requestParameters.put(PARAMETER_DOCUMENT_URL, document.getCompleteURL());
-
- String requestUri = "http://127.0.0.1:" + port + servletContextPath + "?";
- Map map = requestParameters.getMap();
-
- String[] keys = (String[]) map.keySet().toArray(new String[map.keySet().size()]);
- for (int i = 0; i < keys.length; i++) {
- if (i > 0) {
- requestUri += "&";
- }
- String value = (String) map.get(keys[i]);
- requestUri += keys[i] + "=" + value;
- }
-
- return requestUri;
- }
+ private static final long serialVersionUID = 1L;
+ private static Logger log = Logger.getLogger(LoadQuartzServlet.class);
+ private static SchedulerWrapper scheduler = null;
+ private ServletContext servletContext;
+ private String schedulerConfigurations;
+ public static final String PREFIX = "scheduler";
+ public static final String PARAMETER_ACTION = "action";
+ public static final String PARAMETER_PUBLICATION_ID = "publication-id";
+ public static final String PARAMETER_DOCUMENT_URL = "document-url";
+ public static final String CONFIGURATION_ELEMENT = "scheduler-configurations";
+ /**
+ * Returns the scheduler wrapper.
+ *
+ * @return A scheduler wrapper.
+ */
+ public static SchedulerWrapper getScheduler() {
+ return scheduler;
+ }
+ /**
+ * Maps servlet context names to servlets.
+ */
+ private static Map servlets = new HashMap();
+ /**
+ * Initializes the servlet.
+ *
+ * @param config
+ * The servlet configuration.
+ * @throws ServletException
+ * when something went wrong.
+ */
+ public void init(ServletConfig config) throws ServletException {
+ super.init(config);
+ this.schedulerConfigurations = config.getInitParameter(CONFIGURATION_ELEMENT);
+ this.servletContext = config.getServletContext();
+ log.debug(".init(): Servlet Context Path: " + getServletContextDirectory().getAbsolutePath());
+ try{
+ log.debug("Storing servlet");
+ String contextPath = getServletContextDirectory().getCanonicalPath();
+ log.debug(" Context path: [" + contextPath + "]");
+ servlets.put(contextPath, this);
+ }catch(IOException e){
+ throw new ServletException(e);
+ }
+ log.debug(".init(): Scheduler Configurations: " + this.schedulerConfigurations);
+ try{
+ log.info("Working?...");
+ process();
+ log.info("OK");
+ }catch(Exception e){
+ log.error("Init of LoadQuartzServlet failed", e);
+ throw new ServletException(e);
+ }
+ }
+ /**
+ * Process.
+ *
+ * @throws ServletException
+ * when an error occurs.
+ * @throws SchedulerException
+ * when an error occurs.
+ */
+ public void process() throws ServletException, SchedulerException {
+ scheduler = new SchedulerWrapper(getServletContextDirectory().getAbsolutePath(), schedulerConfigurations);
+ try{
+ ShutdownHook();
+ }catch(Exception e){
+ log.error(e.toString(), e);
+ }
+ restoreJobs();
+ }
+ /**
+ * Shuts down the scheduler.
+ */
+ public void destroy() {
+ destroyScheduler();
+ }
+ /**
+ * Shuts down the scheduler.
+ */
+ public static void destroyScheduler() {
+ log.debug("destroy: ");
+ getScheduler().shutdown();
+ }
+ /**
+ * This method sets a ShutdownHook to the system This traps the CTRL+C or kill signal and shutdows Correctly the system.
+ *
+ * @throws Exception
+ * when something went wrong.
+ */
+ public static void ShutdownHook() throws Exception {
+ log.debug("-------------------- ShutdownHook --------------------");
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ public void run() {
+ LoadQuartzServlet.destroyScheduler();
+ }
+ });
+ log.debug("-------------------- End ShutdownHook --------------------");
+ }
+ /**
+ * Handles a GET request.
+ *
+ * @param request
+ * The request.
+ * @param response
+ * The response.
+ * @throws IOException
+ * when an error occured.
+ * @throws ServletException
+ * when an error occured.
+ */
+ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+ handleRequest(request, response);
+ }
+ /**
+ * Handles a POST request.
+ *
+ * @param req
+ * The requust.
+ * @param resp
+ * The response.
+ *
+ * @throws ServletException
+ * when an error occured.
+ * @throws IOException
+ * when an error occured.
+ */
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ doGet(req, resp);
+ }
+ protected static final String ADD = "add";
+ protected static final String MODIFY = "modify";
+ protected static final String DELETE = "delete";
+ protected static final String DOCUMENT_DELETED = "document-deleted";
+ /**
+ * Handles a servlet request.
+ *
+ * @param request
+ * The request.
+ * @param response
+ * The response.
+ * @throws IOException
+ * when something went wrong.
+ */
+ protected void handleRequest(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ log.debug("----------------------------------------------------------------");
+ log.debug("- Incoming request at URI: ");
+ log.debug(request.getServerName() + ":" + request.getServerPort() + request.getRequestURI());
+ log.debug("----------------------------------------------------------------");
+ log.debug("Request parameters:");
+ NamespaceMap schedulerParameters = getSchedulerParameters(request);
+ try{
+ String publicationId = (String) schedulerParameters.get(PARAMETER_PUBLICATION_ID);
+ log.debug("Scheduler invoked.");
+ log.debug("Scheduler Parameters:");
+ log.debug(" scheduler.publication-id: [" + publicationId + "]");
+ logSessionAttributes(request);
+ // check if the request wants to submit, modify or delete a job.
+ String action = (String) schedulerParameters.get(PARAMETER_ACTION);
+ log.debug(" scheduler.action: [" + action + "]");
+ if(action == null){
+ }else if(action.equals(ADD)){
+ Date startTime = TriggerHelper.getDate(schedulerParameters);
+ getScheduler().addJob(publicationId, startTime, request);
+ }else if(action.equals(MODIFY)){
+ Date startTime = TriggerHelper.getDate(schedulerParameters);
+ String jobId = getJobId(schedulerParameters);
+ getScheduler().modifyJob(jobId, publicationId, startTime);
+ }else if(action.equals(DELETE)){
+ String jobId = getJobId(schedulerParameters);
+ getScheduler().deleteJob(jobId, publicationId);
+ }else if(action.equals(DOCUMENT_DELETED)){
+ Publication publication = PublicationFactory.getPublication(publicationId, getServletContextDirectory().getAbsolutePath());
+ String documentUrl = (String) schedulerParameters.get(PARAMETER_DOCUMENT_URL);
+ org.apache.lenya.cms.publication.Document document = publication.getDocumentBuilder().buildDocument(publication, documentUrl);
+ deleteDocumentJobs(document);
+ }
+ // handle the remainder of the request by simply returning all
+ // scheduled jobs (for the given publication ID).
+ PrintWriter writer = response.getWriter();
+ response.setContentType("text/xml");
+ Document snapshot = getScheduler().getSnapshot();
+ DocumentHelper.writeDocument(snapshot, writer);
+ }catch(Exception e){
+ log.error("Can't create job snapshot: ", e);
+ throw new IOException(e.getMessage() + " (view log for details)");
+ }
+ }
+ /**
+ * Extracts the scheduler parameters from a request.
+ *
+ * @param request
+ * The request.
+ * @return A namespace map.
+ */
+ public static NamespaceMap getSchedulerParameters(HttpServletRequest request) {
+ Map parameterMap = new HashMap();
+ List keys = new ArrayList();
+ for(Enumeration e = request.getParameterNames(); e.hasMoreElements();){
+ String key = (String) e.nextElement();
+ keys.add(key);
+ }
+ Collections.sort(keys);
+ for(Iterator i = keys.iterator(); i.hasNext();){
+ String key = (String) i.next();
+ String[] values = request.getParameterValues(key);
+ log.debug(" [" + key + "] = [" + values[0] + "]");
+ if(values.length == 1){
+ parameterMap.put(key, values[0]);
+ }else{
+ parameterMap.put(key, values);
+ }
+ }
+ NamespaceMap schedulerParameters = new NamespaceMap(parameterMap, PREFIX);
+ return schedulerParameters;
+ }
+ /**
+ * Deletes
+ *
+ * @param document
+ * @throws DocumentBuildException
+ * @throws SchedulerException
+ * @throws PublicationException
+ */
+ public void deleteDocumentJobs(org.apache.lenya.cms.publication.Document document) throws DocumentBuildException, SchedulerException, PublicationException {
+ log.debug("Requested to delete jobs for document URL [" + document.getCompleteURL() + "]");
+ getScheduler().deleteJobs(document);
+ }
+ /**
+ * Extracts the job ID from the scheduler parameters.
+ *
+ * @param schedulerParameters
+ * A namespace map.
+ * @return A string.
+ */
+ protected String getJobId(NamespaceMap schedulerParameters) {
+ String parameterName = NamespaceMap.getFullName(SchedulerWrapper.JOB_PREFIX, SchedulerWrapper.JOB_ID);
+ String jobId = (String) schedulerParameters.get(parameterName);
+ log.debug(" scheduler.job.id: [" + jobId + "]");
+ return jobId;
+ }
+ /**
+ * Logs the session attributes of a request.
+ *
+ * @param request
+ * The request.
+ */
+ protected void logSessionAttributes(HttpServletRequest request) {
+ log.debug("-------------------- Session Attributes --------------------");
+ for(Enumeration e = request.getSession().getAttributeNames(); e.hasMoreElements();){
+ String name = (String) e.nextElement();
+ log.debug(name + " = " + request.getSession().getAttribute(name));
+ }
+ log.debug("-------------------- End Session Attributes --------------------");
+ }
+ /**
+ * Returns the servlet context path.
+ *
+ * @return A string.
+ */
+ public File getServletContextDirectory() {
+ return new File(this.servletContext.getRealPath("/"));
+ }
+ /**
+ * Restores the jobs.
+ *
+ * @throws SchedulerException
+ * when something went wrong.
+ */
+ public void restoreJobs() throws SchedulerException {
+ File publicationsDirectory = new File(getServletContextDirectory(), PublishingEnvironment.PUBLICATION_PREFIX);
+ File[] publicationDirectories = publicationsDirectory.listFiles(new FileFilter() {
+ public boolean accept(File file) {
+ return file.isDirectory();
+ }
+ });
+ log.debug("=========================================");
+ log.debug(" Restoring jobs.");
+ log.debug(" servlet context: [" + getServletContextDirectory() + "]");
+ log.debug(" publications directory: [" + publicationsDirectory + "]");
+ log.debug("=========================================");
+ for(int i = 0; i < publicationDirectories.length; i++){
+ File directory = publicationDirectories[i];
+ String publicationId = directory.getName();
+ if(PublicationFactory.existsPublication(publicationId, getServletContextDirectory().getAbsolutePath())){
+ getScheduler().restoreJobs(publicationId);
+ }
+ }
+ }
+ public static final String SERVLET_URL = "/servlet/QuartzSchedulerServlet";
+ /**
+ * Returns the servlet for a certain canonical servlet context path.
+ *
+ * @param contextPath
+ * The canonical servlet context path.
+ * @return A LoadQuartzServlet.
+ */
+ public static LoadQuartzServlet getServlet(String contextPath) {
+ return (LoadQuartzServlet) servlets.get(contextPath);
+ }
+ /**
+ * Generates the request URI needed to delete the jobs for a certain document.
+ *
+ * @param document
+ * The document.
+ * @return A string.
+ */
+ public static String getDeleteDocumentRequestURI(String port, String servletContextPath, org.apache.lenya.cms.publication.Document document) {
+ NamespaceMap requestParameters = new NamespaceMap(PREFIX);
+ requestParameters.put(PARAMETER_ACTION, DOCUMENT_DELETED);
+ requestParameters.put(PARAMETER_PUBLICATION_ID, document.getPublication().getId());
+ requestParameters.put(PARAMETER_DOCUMENT_URL, document.getCompleteURL());
+ String requestUri = "http://127.0.0.1:" + port + servletContextPath + "?";
+ Map map = requestParameters.getMap();
+ String[] keys = (String[]) map.keySet().toArray(new String[map.keySet().size()]);
+ for(int i = 0; i < keys.length; i++){
+ if(i > 0){
+ requestUri += "&";
+ }
+ String value = (String) map.get(keys[i]);
+ requestUri += keys[i] + "=" + value;
+ }
+ return requestUri;
+ }
}
Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/SchedulerStore.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/SchedulerStore.java?rev=617035&r1=617034&r2=617035&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/SchedulerStore.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/SchedulerStore.java Wed Jan 30 23:44:03 2008
@@ -14,11 +14,8 @@
* limitations under the License.
*
*/
-
/* $Id$ */
-
package org.apache.lenya.cms.scheduler;
-
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
@@ -26,281 +23,237 @@
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
-
import org.apache.lenya.cms.publication.Publication;
import org.apache.lenya.cms.scheduler.xml.TriggerHelper;
import org.apache.lenya.xml.DocumentHelper;
import org.apache.lenya.xml.NamespaceHelper;
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
import org.quartz.JobDetail;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
/**
* Store for scheduler jobs.
*/
public class SchedulerStore {
-
- public static final String ELEMENT_JOB_GROUP = "job-group";
- public static final String ELEMENT_JOB = "job";
- public static final String TITLE_ELEMENT = "title";
-
- private static final Category log = Category.getInstance(SchedulerStore.class);
-
- public static final String SNAPSHOT_FILE =
- "config/scheduler/jobs.xml".replace('/', File.separatorChar);
-
- /**
- * Ctor.
- * @param publication The publication.
- */
- public SchedulerStore() {
- }
-
- /**
- * Returns the job snapshot file for a publication..
- * @param Publication The publication.
- * @return A file.
- * @throws SchedulerException when the publication could not be built.
- */
- protected File getJobsFile(Publication publication) throws SchedulerException {
- File jobsFile;
- jobsFile = new File(publication.getDirectory(), SNAPSHOT_FILE);
- log.debug("Resolved job snapshot file: [" + jobsFile.getAbsolutePath() + "]");
- return jobsFile;
- }
-
- /**
- * Writes a job snapshot.
- * @param publication The publication.
- * @throws SchedulerException when something went wrong.
- */
- protected void writeSnapshot(Publication publication, JobWrapper[] jobs)
- throws SchedulerException {
-
- log.debug("Writing job snapshot for publication [" + publication.getId() + "]");
- File jobsFile = getJobsFile(publication);
-
- try {
- File directory = jobsFile.getParentFile();
-
- if (!directory.exists()) {
- directory.mkdirs();
- log.debug("Creating job snapshot directory: " + directory.getPath());
- }
-
- jobsFile.createNewFile();
- DocumentHelper.writeDocument(getSnapshot(publication, jobs), jobsFile);
- } catch (Exception e) {
- log.error("Writing job snapshot failed: ", e);
- }
- }
-
- /**
- * Return an xml description of all scheduled jobs for the given publication.
- *
- * @param publication The publication.
- * @return An XML document.
- * @exception SchedulerException if an error occurs
- */
- public Document getSnapshot(Publication publication, JobWrapper[] jobs)
- throws SchedulerException {
- NamespaceHelper helper = SchedulerStore.getNamespaceHelper();
- Document document = helper.getDocument();
- Element root = document.getDocumentElement();
-
- log.debug("Creating job snapshot for publication [" + publication.getId() + "]");
- root.appendChild(createSnapshot(helper, publication, jobs));
-
- return document;
- }
-
- /** The namespace for the <code>jobs.xml</code> file. */
- public static final String NAMESPACE = "http://apache.org/cocoon/lenya/scheduler/1.0";
-
- /**
- * Returns a scheduler namespace helper for a document.
- * @param document The XML document.
- * @return a namespace helper.
- */
- public static NamespaceHelper getNamespaceHelper(Document document) {
- return new NamespaceHelper(NAMESPACE, "sch", document);
- }
-
- /**
- * Returns a new scheduler namespace helper with an document containing
- * a <sch:scheduler> element.
- * @return a namespace helper.
- */
- public static NamespaceHelper getNamespaceHelper() {
- try {
- return new NamespaceHelper(NAMESPACE, "sch", "scheduler");
- } catch (Exception e) {
- log.error("Could not create namespace helper: ", e);
-
- return null;
- }
- }
-
- /**
- * Creates an XML element containting a snapshot of a job group.
- * @param helper The namespace helper to use.
- * @param jobGroup The job group.
- * @return An XMl element.
- * @throws SchedulerException when something went wrong.
- */
- protected Element createSnapshot(
- NamespaceHelper helper,
- Publication publication,
- JobWrapper[] jobs)
- throws SchedulerException {
- Element jobGroupElement = helper.createElement(ELEMENT_JOB_GROUP);
- jobGroupElement.setAttribute("name", publication.getId());
-
- for (int i = 0; i < jobs.length; i++) {
-
- ServletJob job = jobs[i].getJob();
- Element jobElement = job.save(helper, jobs[i].getJobDetail());
- jobGroupElement.appendChild(jobElement);
-
- Trigger trigger = jobs[i].getTrigger();
-
- if (trigger != null) {
- Element triggerElement = TriggerHelper.createElement(helper, trigger);
- jobElement.appendChild(triggerElement);
- }
- }
-
- return jobGroupElement;
- }
-
- /**
- * Restores the jobs of a certain job group from the snapshot file.
- * @param jobGroup The job group.
- * @throws SchedulerException when something went wrong.
- */
- public JobWrapper[] restoreJobs(Publication publication) throws SchedulerException {
-
- log.debug("Restoring jobs for publication [" + publication.getId() + "]");
-
- List wrappers = new ArrayList();
- File jobsFile = getJobsFile(publication);
-
- if (jobsFile.exists()) {
- Element[] jobElements = getJobElements(publication);
- Document document;
- try {
- document = DocumentHelper.readDocument(jobsFile);
- } catch (Exception e) {
- throw new SchedulerException(e);
- }
- NamespaceHelper helper = SchedulerStore.getNamespaceHelper(document);
-
- for (int i = 0; i < jobElements.length; i++) {
- wrappers.add(restoreJob(helper, jobElements[i], publication));
- }
- }
- else {
- log.debug("Could not restore jobs for publication [" + publication.getId() + "] - jobs file does not exist.");
- }
-
- return (JobWrapper[]) wrappers.toArray(new JobWrapper[wrappers.size()]);
- }
-
- /**
- * Restores the jobs from a certain XML element.
- * @param jobElement The XML element.
- * @param jobGroup The job group the job belongs to.
- */
- protected JobWrapper restoreJob(
- NamespaceHelper helper,
- Element jobElement,
- Publication publication)
- throws SchedulerException {
- log.debug("Restoring job ");
- JobWrapper wrapper;
-
- try {
- String jobClassName = jobElement.getAttribute(ServletJob.ATTRIBUTE_CLASS);
- ServletJob job = ServletJobFactory.createJob(jobClassName);
- JobDetail jobDetail =
- job.load(
- jobElement,
- publication.getId(),
- publication.getServletContext().getAbsolutePath());
-
- Trigger trigger = null;
-
- Element triggerElement = helper.getFirstChild(jobElement, "trigger");
- if (triggerElement != null) {
- trigger =
- TriggerHelper.createTrigger(
- triggerElement,
- jobDetail.getName(),
- jobDetail.getGroup());
-
- Date now = new GregorianCalendar().getTime();
- if (log.isDebugEnabled()) {
- DateFormat format = new SimpleDateFormat();
- log.debug(
- " Trigger time: [" + format.format(trigger.getFinalFireTime()) + "]");
- log.debug(" Current time: [" + format.format(now) + "]");
- }
- if (!trigger.getFinalFireTime().after(now)) {
- trigger = null;
- }
- }
- wrapper = new JobWrapper(jobDetail, trigger);
-
- } catch (Exception e) {
- throw new SchedulerException(e);
- }
- return wrapper;
- }
-
- /**
- * Returns the job elements of a publication.
- * @param publication
- * @return
- * @throws SchedulerException when something went wrong.
- */
- protected Element[] getJobElements(Publication publication) throws SchedulerException {
- Element[] jobElements;
- try {
- File jobsFile = getJobsFile(publication);
- if (jobsFile.exists()) {
- Document document = DocumentHelper.readDocument(jobsFile);
- Element schedulerElement = document.getDocumentElement();
- NamespaceHelper helper = SchedulerStore.getNamespaceHelper(document);
-
- Element jobGroupElement =
- helper.getFirstChild(schedulerElement, SchedulerStore.ELEMENT_JOB_GROUP);
- if (jobGroupElement == null) {
- throw new SchedulerException("No <job-group> element found!");
- }
-
- String jobGroupAttribute = jobGroupElement.getAttribute("name");
-
- if (!jobGroupAttribute.equals(publication.getId())) {
- throw new SchedulerException(
- "The jobs.xml file contains a wrong job group: ["
- + jobGroupAttribute
- + "]");
- } else {
- jobElements = helper.getChildren(jobGroupElement, SchedulerStore.ELEMENT_JOB);
-
- }
- } else {
- throw new SchedulerException(
- "The jobs file [" + jobsFile.getAbsolutePath() + "] does not exist!");
- }
- } catch (SchedulerException e) {
- throw e;
- } catch (Exception e) {
+ private static Logger log = Logger.getLogger(SchedulerStore.class);
+ public static final String ELEMENT_JOB_GROUP = "job-group";
+ public static final String ELEMENT_JOB = "job";
+ public static final String TITLE_ELEMENT = "title";
+ public static final String SNAPSHOT_FILE = "config/scheduler/jobs.xml".replace('/', File.separatorChar);
+ /**
+ * Ctor.
+ *
+ * @param publication
+ * The publication.
+ */
+ public SchedulerStore() {
+ }
+ /**
+ * Returns the job snapshot file for a publication..
+ *
+ * @param Publication
+ * The publication.
+ * @return A file.
+ * @throws SchedulerException
+ * when the publication could not be built.
+ */
+ protected File getJobsFile(Publication publication) throws SchedulerException {
+ File jobsFile;
+ jobsFile = new File(publication.getDirectory(), SNAPSHOT_FILE);
+ log.debug("Resolved job snapshot file: [" + jobsFile.getAbsolutePath() + "]");
+ return jobsFile;
+ }
+ /**
+ * Writes a job snapshot.
+ *
+ * @param publication
+ * The publication.
+ * @throws SchedulerException
+ * when something went wrong.
+ */
+ protected void writeSnapshot(Publication publication, JobWrapper[] jobs) throws SchedulerException {
+ log.debug("Writing job snapshot for publication [" + publication.getId() + "]");
+ File jobsFile = getJobsFile(publication);
+ try{
+ File directory = jobsFile.getParentFile();
+ if(!directory.exists()){
+ directory.mkdirs();
+ log.debug("Creating job snapshot directory: " + directory.getPath());
+ }
+ jobsFile.createNewFile();
+ DocumentHelper.writeDocument(getSnapshot(publication, jobs), jobsFile);
+ }catch(Exception e){
+ log.error("Writing job snapshot failed: ", e);
+ }
+ }
+ /**
+ * Return an xml description of all scheduled jobs for the given publication.
+ *
+ * @param publication
+ * The publication.
+ * @return An XML document.
+ * @exception SchedulerException
+ * if an error occurs
+ */
+ public Document getSnapshot(Publication publication, JobWrapper[] jobs) throws SchedulerException {
+ NamespaceHelper helper = SchedulerStore.getNamespaceHelper();
+ Document document = helper.getDocument();
+ Element root = document.getDocumentElement();
+ log.debug("Creating job snapshot for publication [" + publication.getId() + "]");
+ root.appendChild(createSnapshot(helper, publication, jobs));
+ return document;
+ }
+ /** The namespace for the <code>jobs.xml</code> file. */
+ public static final String NAMESPACE = "http://apache.org/cocoon/lenya/scheduler/1.0";
+ /**
+ * Returns a scheduler namespace helper for a document.
+ *
+ * @param document
+ * The XML document.
+ * @return a namespace helper.
+ */
+ public static NamespaceHelper getNamespaceHelper(Document document) {
+ return new NamespaceHelper(NAMESPACE, "sch", document);
+ }
+ /**
+ * Returns a new scheduler namespace helper with an document containing a <sch:scheduler> element.
+ *
+ * @return a namespace helper.
+ */
+ public static NamespaceHelper getNamespaceHelper() {
+ try{
+ return new NamespaceHelper(NAMESPACE, "sch", "scheduler");
+ }catch(Exception e){
+ log.error("Could not create namespace helper: ", e);
+ return null;
+ }
+ }
+ /**
+ * Creates an XML element containting a snapshot of a job group.
+ *
+ * @param helper
+ * The namespace helper to use.
+ * @param jobGroup
+ * The job group.
+ * @return An XMl element.
+ * @throws SchedulerException
+ * when something went wrong.
+ */
+ protected Element createSnapshot(NamespaceHelper helper, Publication publication, JobWrapper[] jobs) throws SchedulerException {
+ Element jobGroupElement = helper.createElement(ELEMENT_JOB_GROUP);
+ jobGroupElement.setAttribute("name", publication.getId());
+ for(int i = 0; i < jobs.length; i++){
+ ServletJob job = jobs[i].getJob();
+ Element jobElement = job.save(helper, jobs[i].getJobDetail());
+ jobGroupElement.appendChild(jobElement);
+ Trigger trigger = jobs[i].getTrigger();
+ if(trigger != null){
+ Element triggerElement = TriggerHelper.createElement(helper, trigger);
+ jobElement.appendChild(triggerElement);
+ }
+ }
+ return jobGroupElement;
+ }
+ /**
+ * Restores the jobs of a certain job group from the snapshot file.
+ *
+ * @param jobGroup
+ * The job group.
+ * @throws SchedulerException
+ * when something went wrong.
+ */
+ public JobWrapper[] restoreJobs(Publication publication) throws SchedulerException {
+ log.debug("Restoring jobs for publication [" + publication.getId() + "]");
+ List wrappers = new ArrayList();
+ File jobsFile = getJobsFile(publication);
+ if(jobsFile.exists()){
+ Element[] jobElements = getJobElements(publication);
+ Document document;
+ try{
+ document = DocumentHelper.readDocument(jobsFile);
+ }catch(Exception e){
throw new SchedulerException(e);
- }
- return jobElements;
- }
+ }
+ NamespaceHelper helper = SchedulerStore.getNamespaceHelper(document);
+ for(int i = 0; i < jobElements.length; i++){
+ wrappers.add(restoreJob(helper, jobElements[i], publication));
+ }
+ }else{
+ log.debug("Could not restore jobs for publication [" + publication.getId() + "] - jobs file does not exist.");
+ }
+ return (JobWrapper[]) wrappers.toArray(new JobWrapper[wrappers.size()]);
+ }
+ /**
+ * Restores the jobs from a certain XML element.
+ *
+ * @param jobElement
+ * The XML element.
+ * @param jobGroup
+ * The job group the job belongs to.
+ */
+ protected JobWrapper restoreJob(NamespaceHelper helper, Element jobElement, Publication publication) throws SchedulerException {
+ log.debug("Restoring job ");
+ JobWrapper wrapper;
+ try{
+ String jobClassName = jobElement.getAttribute(ServletJob.ATTRIBUTE_CLASS);
+ ServletJob job = ServletJobFactory.createJob(jobClassName);
+ JobDetail jobDetail = job.load(jobElement, publication.getId(), publication.getServletContext().getAbsolutePath());
+ Trigger trigger = null;
+ Element triggerElement = helper.getFirstChild(jobElement, "trigger");
+ if(triggerElement != null){
+ trigger = TriggerHelper.createTrigger(triggerElement, jobDetail.getName(), jobDetail.getGroup());
+ Date now = new GregorianCalendar().getTime();
+ if(log.isDebugEnabled()){
+ DateFormat format = new SimpleDateFormat();
+ log.debug(" Trigger time: [" + format.format(trigger.getFinalFireTime()) + "]");
+ log.debug(" Current time: [" + format.format(now) + "]");
+ }
+ if(!trigger.getFinalFireTime().after(now)){
+ trigger = null;
+ }
+ }
+ wrapper = new JobWrapper(jobDetail, trigger);
+ }catch(Exception e){
+ throw new SchedulerException(e);
+ }
+ return wrapper;
+ }
+ /**
+ * Returns the job elements of a publication.
+ *
+ * @param publication
+ * @return
+ * @throws SchedulerException
+ * when something went wrong.
+ */
+ protected Element[] getJobElements(Publication publication) throws SchedulerException {
+ Element[] jobElements;
+ try{
+ File jobsFile = getJobsFile(publication);
+ if(jobsFile.exists()){
+ Document document = DocumentHelper.readDocument(jobsFile);
+ Element schedulerElement = document.getDocumentElement();
+ NamespaceHelper helper = SchedulerStore.getNamespaceHelper(document);
+ Element jobGroupElement = helper.getFirstChild(schedulerElement, SchedulerStore.ELEMENT_JOB_GROUP);
+ if(jobGroupElement == null){
+ throw new SchedulerException("No <job-group> element found!");
+ }
+ String jobGroupAttribute = jobGroupElement.getAttribute("name");
+ if(!jobGroupAttribute.equals(publication.getId())){
+ throw new SchedulerException("The jobs.xml file contains a wrong job group: [" + jobGroupAttribute + "]");
+ }else{
+ jobElements = helper.getChildren(jobGroupElement, SchedulerStore.ELEMENT_JOB);
+ }
+ }else{
+ throw new SchedulerException("The jobs file [" + jobsFile.getAbsolutePath() + "] does not exist!");
+ }
+ }catch(SchedulerException e){
+ throw e;
+ }catch(Exception e){
+ throw new SchedulerException(e);
+ }
+ return jobElements;
+ }
}
Modified: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/SchedulerWrapper.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/SchedulerWrapper.java?rev=617035&r1=617034&r2=617035&view=diff
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/SchedulerWrapper.java (original)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/scheduler/SchedulerWrapper.java Wed Jan 30 23:44:03 2008
@@ -14,11 +14,8 @@
* limitations under the License.
*
*/
-
/* $Id$ */
-
package org.apache.lenya.cms.scheduler;
-
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
@@ -26,9 +23,7 @@
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
-
import javax.servlet.http.HttpServletRequest;
-
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
import org.apache.lenya.cms.publication.Publication;
@@ -36,7 +31,7 @@
import org.apache.lenya.cms.publication.PublicationFactory;
import org.apache.lenya.cms.scheduler.xml.TriggerHelper;
import org.apache.lenya.xml.NamespaceHelper;
-import org.apache.log4j.Category;
+import org.apache.log4j.Logger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
@@ -46,488 +41,469 @@
import org.quartz.impl.StdSchedulerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
public class SchedulerWrapper {
-
- private static Category log = Category.getInstance(SchedulerWrapper.class);
- public static final String JOB_PREFIX = "job";
- public static final String JOB_ID = "id";
- private static int jobId = 0;
- private Scheduler scheduler = null;
- private String servletContextPath;
- private String schedulerConfigurationPath;
- private SchedulerStore store = new SchedulerStore();
-
- /**
- * Creates a new instance of SchedulerWrapper
- *
- * @param servletContextPath The servlet context path.
- * @param schedulerConfigurationPath The scheduler configuration path.
- */
- public SchedulerWrapper(String servletContextPath, String schedulerConfigurationPath) {
- this.servletContextPath = servletContextPath;
- this.schedulerConfigurationPath = schedulerConfigurationPath;
-
- SchedulerFactory factory = new StdSchedulerFactory();
- log.info("------- Starting up -----------------------");
-
- try {
- scheduler = factory.getScheduler();
-
- scheduler.addSchedulerListener(new AbstractSchedulerListener());
- scheduler.start();
- } catch (SchedulerException e) {
- log.error("Can't initialize SchedulerWrapper: ", e);
- log.error("------- Startup failed -------------------");
- }
-
- log.info("------- Startup complete ------------------");
- }
-
- /**
- * Returns the store.
- * @return A scheduler store.
- */
- protected SchedulerStore getStore() {
- return store;
- }
-
- /**
- * Returns the scheduler.
- * @return A scheduler.
- */
- private Scheduler getScheduler() {
- return scheduler;
- }
-
- /**
- * Shuts down the scheduler.
- */
- public void shutdown() {
- log.info("------- Shutting Down ---------------------");
-
- // try to save state here
- try {
- getScheduler().shutdown();
- } catch (SchedulerException e) {
- log.error("------- Shutdown Failed -----------------", e);
- }
-
- log.info("------- Shutdown Complete -----------------");
- }
-
- /**
- * Returns the servlet context path.
- * @return The servlet context path.
- */
- protected String getServletContextPath() {
- return servletContextPath;
- }
-
- /**
- * Returns the scheduler configuration path.
- * @return A string.
- */
- protected String getSchedulerConfigurationPath() {
- return schedulerConfigurationPath;
- }
-
- /**
- * Returns the next job ID to use (calculated using the current time).
- * @return A string.
- */
- protected synchronized static String getNextJobId() {
- return "job_" + jobId++ +System.currentTimeMillis();
- }
-
- /**
- * Adds a job.
- * @param jobGroup The job group.
- * @param startTime The start time.
- * @param jobClass The class of the job.
- * @param map The job parameters.
- * @throws SchedulerException if an error occurs.
- * @throws PublicationException if an error occurs.
- */
- protected void addJob(String jobGroup, Date startTime, Class jobClass, JobDataMap map)
- throws SchedulerException, PublicationException {
- String uniqueJobId = getNextJobId();
- log.debug("Job ID: [" + uniqueJobId + "]");
-
- JobDetail jobDetail = new JobDetail(uniqueJobId, jobGroup, jobClass);
- jobDetail.setJobDataMap(map);
-
- Date now = new GregorianCalendar().getTime();
- if (log.isDebugEnabled()) {
- DateFormat format = new SimpleDateFormat();
- log.debug("Trigger time: [" + format.format(startTime) + "]");
- log.debug("Current time: [" + format.format(now) + "]");
- }
-
- if (startTime.after(now)) {
- Trigger trigger =
- TriggerHelper.createSimpleTrigger(uniqueJobId, jobGroup, startTime);
- addJob(jobDetail, trigger);
- log.debug("Scheduling job.");
- } else {
- addJob(jobDetail);
- log.debug("Adding job without scheduling.");
- }
-
- log.debug("----------------------------------------------");
-
- store.writeSnapshot(getPublication(jobGroup), getJobWrappers(jobGroup));
- }
-
- /**
- * Adds a job.
- * @param jobGroup The job group.
- * @param startTime The start time.
- * @param request The request to obtain the parameters from.
- * @throws SchedulerException when something went wrong.
- */
- public void addJob(String jobGroup, Date startTime, HttpServletRequest request)
- throws SchedulerException {
-
- if (jobGroup == null) {
- throw new SchedulerException("Job group must not be null!");
- }
-
- try {
- log.debug("----------------------------------------------");
- log.debug("Adding Job for group [" + jobGroup + "]");
-
- // FIXME: more flexible
- Class jobClass = TaskJob.class;
-
- ServletJob job = ServletJobFactory.createJob(jobClass);
- JobDataMap map = job.createJobData(request);
-
- addJob(jobGroup, startTime, jobClass, map);
- } catch (Exception e) {
- log.error("Adding job failed: ", e);
- throw new SchedulerException(e);
- }
- }
-
- /**
- * Returns the publication for a job group.
- * @param jobGroup A job group.
- * @return A publication.
- * @throws PublicationException when the publication does not exist.
- */
- protected Publication getPublication(String jobGroup) throws PublicationException {
- return PublicationFactory.getPublication(jobGroup, getServletContextPath());
- }
-
- /**
- * Adds a job.
- * @param detail The job information.
- * @param trigger The trigger to trigger the job.
- */
- protected void addJob(JobDetail detail, Trigger trigger) {
- try {
- detail.setDurability(true);
-
- Date ft = getScheduler().scheduleJob(detail, trigger);
- log.debug("Job " + detail.getFullName() + " will run at: " + ft);
- } catch (Exception e) {
- log.error("Adding job failed: ", e);
- }
- }
-
- /**
- * Adds a job.
- * @param detail The job information.
- */
- protected void addJob(JobDetail detail) {
- try {
- detail.setDurability(true);
- getScheduler().addJob(detail, true);
- } catch (SchedulerException e) {
- log.error("Adding job failed: ", e);
- }
- }
-
- /**
- * Deletes a job.
- * @param jobName The job name.
- * @param jobGroup The job group.
- */
- protected void deleteJob(String jobName, String jobGroup) {
- try {
- log.debug("-----------------------------------");
- log.debug("\n Deleting job [" + jobGroup + "/" + jobName + "]");
- log.debug("-----------------------------------");
- getScheduler().deleteJob(jobName, jobGroup);
- getStore().writeSnapshot(getPublication(jobGroup), getJobWrappers(jobGroup));
- } catch (Exception e) {
- log.error("Deleting job failed: ", e);
- }
- }
-
- /**
- * Reads the scheduler configuration.
- * @return A configuration.
- */
- protected Configuration getSchedulerConfiguration() {
- try {
- DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
- String path = getServletContextPath() + getSchedulerConfigurationPath();
- log.debug("Initializing scheduler configuration: " + path);
-
- File configurationFile = new File(path);
- Configuration configuration = builder.buildFromFile(configurationFile);
-
- return configuration;
- } catch (Exception e) {
- log.error("Can't initialize scheduler configuration: ", e);
-
- return null;
- }
- }
-
- public static final String ELEMENT_TRIGGERS = "triggers";
- public static final String ELEMENT_TRIGGER = "trigger";
- public static final String TYPE_ATTRIBUTE = "type";
- public static final String CLASS_ATTRIBUTE = "class";
-
- /**
- * Returns an XML element containing the trigger types.
- * @param helper The namespace helper of the document that shall contain the element.
- * @return An XML element.
- */
- protected Element getTriggerTypes(NamespaceHelper helper) {
- try {
- Configuration configuration = getSchedulerConfiguration();
- Configuration[] triggerConfigurations =
- configuration.getChild(ELEMENT_TRIGGERS).getChildren(ELEMENT_TRIGGER);
-
- Element triggersElement = helper.createElement("triggers");
-
- for (int i = 0; i < triggerConfigurations.length; i++) {
- Configuration conf = triggerConfigurations[i];
- String type = conf.getAttribute(TYPE_ATTRIBUTE);
- String className = conf.getAttribute(CLASS_ATTRIBUTE);
-
- Element triggerElement = helper.createElement("trigger");
- triggerElement.setAttribute("name", type);
- triggerElement.setAttribute("src", className);
- triggersElement.appendChild(triggerElement);
+ private static Logger log = Logger.getLogger(SchedulerWrapper.class);
+ public static final String JOB_PREFIX = "job";
+ public static final String JOB_ID = "id";
+ private static int jobId = 0;
+ private Scheduler scheduler = null;
+ private String servletContextPath;
+ private String schedulerConfigurationPath;
+ private SchedulerStore store = new SchedulerStore();
+ /**
+ * Creates a new instance of SchedulerWrapper
+ *
+ * @param servletContextPath
+ * The servlet context path.
+ * @param schedulerConfigurationPath
+ * The scheduler configuration path.
+ */
+ public SchedulerWrapper(String servletContextPath, String schedulerConfigurationPath) {
+ this.servletContextPath = servletContextPath;
+ this.schedulerConfigurationPath = schedulerConfigurationPath;
+ SchedulerFactory factory = new StdSchedulerFactory();
+ log.info("------- Starting up -----------------------");
+ try{
+ scheduler = factory.getScheduler();
+ scheduler.addSchedulerListener(new AbstractSchedulerListener());
+ scheduler.start();
+ }catch(SchedulerException e){
+ log.error("Can't initialize SchedulerWrapper: ", e);
+ log.error("------- Startup failed -------------------");
+ }
+ log.info("------- Startup complete ------------------");
+ }
+ /**
+ * Returns the store.
+ *
+ * @return A scheduler store.
+ */
+ protected SchedulerStore getStore() {
+ return store;
+ }
+ /**
+ * Returns the scheduler.
+ *
+ * @return A scheduler.
+ */
+ private Scheduler getScheduler() {
+ return scheduler;
+ }
+ /**
+ * Shuts down the scheduler.
+ */
+ public void shutdown() {
+ log.info("------- Shutting Down ---------------------");
+ // try to save state here
+ try{
+ getScheduler().shutdown();
+ }catch(SchedulerException e){
+ log.error("------- Shutdown Failed -----------------", e);
+ }
+ log.info("------- Shutdown Complete -----------------");
+ }
+ /**
+ * Returns the servlet context path.
+ *
+ * @return The servlet context path.
+ */
+ protected String getServletContextPath() {
+ return servletContextPath;
+ }
+ /**
+ * Returns the scheduler configuration path.
+ *
+ * @return A string.
+ */
+ protected String getSchedulerConfigurationPath() {
+ return schedulerConfigurationPath;
+ }
+ /**
+ * Returns the next job ID to use (calculated using the current time).
+ *
+ * @return A string.
+ */
+ protected synchronized static String getNextJobId() {
+ return "job_" + jobId++ + System.currentTimeMillis();
+ }
+ /**
+ * Adds a job.
+ *
+ * @param jobGroup
+ * The job group.
+ * @param startTime
+ * The start time.
+ * @param jobClass
+ * The class of the job.
+ * @param map
+ * The job parameters.
+ * @throws SchedulerException
+ * if an error occurs.
+ * @throws PublicationException
+ * if an error occurs.
+ */
+ protected void addJob(String jobGroup, Date startTime, Class jobClass, JobDataMap map) throws SchedulerException, PublicationException {
+ String uniqueJobId = getNextJobId();
+ log.debug("Job ID: [" + uniqueJobId + "]");
+ JobDetail jobDetail = new JobDetail(uniqueJobId, jobGroup, jobClass);
+ jobDetail.setJobDataMap(map);
+ Date now = new GregorianCalendar().getTime();
+ if(log.isDebugEnabled()){
+ DateFormat format = new SimpleDateFormat();
+ log.debug("Trigger time: [" + format.format(startTime) + "]");
+ log.debug("Current time: [" + format.format(now) + "]");
+ }
+ if(startTime.after(now)){
+ Trigger trigger = TriggerHelper.createSimpleTrigger(uniqueJobId, jobGroup, startTime);
+ addJob(jobDetail, trigger);
+ log.debug("Scheduling job.");
+ }else{
+ addJob(jobDetail);
+ log.debug("Adding job without scheduling.");
+ }
+ log.debug("----------------------------------------------");
+ store.writeSnapshot(getPublication(jobGroup), getJobWrappers(jobGroup));
+ }
+ /**
+ * Adds a job.
+ *
+ * @param jobGroup
+ * The job group.
+ * @param startTime
+ * The start time.
+ * @param request
+ * The request to obtain the parameters from.
+ * @throws SchedulerException
+ * when something went wrong.
+ */
+ public void addJob(String jobGroup, Date startTime, HttpServletRequest request) throws SchedulerException {
+ if(jobGroup == null){
+ throw new SchedulerException("Job group must not be null!");
+ }
+ try{
+ log.debug("----------------------------------------------");
+ log.debug("Adding Job for group [" + jobGroup + "]");
+ // FIXME: more flexible
+ Class jobClass = TaskJob.class;
+ ServletJob job = ServletJobFactory.createJob(jobClass);
+ JobDataMap map = job.createJobData(request);
+ addJob(jobGroup, startTime, jobClass, map);
+ }catch(Exception e){
+ log.error("Adding job failed: ", e);
+ throw new SchedulerException(e);
+ }
+ }
+ /**
+ * Returns the publication for a job group.
+ *
+ * @param jobGroup
+ * A job group.
+ * @return A publication.
+ * @throws PublicationException
+ * when the publication does not exist.
+ */
+ protected Publication getPublication(String jobGroup) throws PublicationException {
+ return PublicationFactory.getPublication(jobGroup, getServletContextPath());
+ }
+ /**
+ * Adds a job.
+ *
+ * @param detail
+ * The job information.
+ * @param trigger
+ * The trigger to trigger the job.
+ */
+ protected void addJob(JobDetail detail, Trigger trigger) {
+ try{
+ detail.setDurability(true);
+ Date ft = getScheduler().scheduleJob(detail, trigger);
+ log.debug("Job " + detail.getFullName() + " will run at: " + ft);
+ }catch(Exception e){
+ log.error("Adding job failed: ", e);
+ }
+ }
+ /**
+ * Adds a job.
+ *
+ * @param detail
+ * The job information.
+ */
+ protected void addJob(JobDetail detail) {
+ try{
+ detail.setDurability(true);
+ getScheduler().addJob(detail, true);
+ }catch(SchedulerException e){
+ log.error("Adding job failed: ", e);
+ }
+ }
+ /**
+ * Deletes a job.
+ *
+ * @param jobName
+ * The job name.
+ * @param jobGroup
+ * The job group.
+ */
+ protected void deleteJob(String jobName, String jobGroup) {
+ try{
+ log.debug("-----------------------------------");
+ log.debug("\n Deleting job [" + jobGroup + "/" + jobName + "]");
+ log.debug("-----------------------------------");
+ getScheduler().deleteJob(jobName, jobGroup);
+ getStore().writeSnapshot(getPublication(jobGroup), getJobWrappers(jobGroup));
+ }catch(Exception e){
+ log.error("Deleting job failed: ", e);
+ }
+ }
+ /**
+ * Reads the scheduler configuration.
+ *
+ * @return A configuration.
+ */
+ protected Configuration getSchedulerConfiguration() {
+ try{
+ DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
+ String path = getServletContextPath() + getSchedulerConfigurationPath();
+ log.debug("Initializing scheduler configuration: " + path);
+ File configurationFile = new File(path);
+ Configuration configuration = builder.buildFromFile(configurationFile);
+ return configuration;
+ }catch(Exception e){
+ log.error("Can't initialize scheduler configuration: ", e);
+ return null;
+ }
+ }
+ public static final String ELEMENT_TRIGGERS = "triggers";
+ public static final String ELEMENT_TRIGGER = "trigger";
+ public static final String TYPE_ATTRIBUTE = "type";
+ public static final String CLASS_ATTRIBUTE = "class";
+ /**
+ * Returns an XML element containing the trigger types.
+ *
+ * @param helper
+ * The namespace helper of the document that shall contain the element.
+ * @return An XML element.
+ */
+ protected Element getTriggerTypes(NamespaceHelper helper) {
+ try{
+ Configuration configuration = getSchedulerConfiguration();
+ Configuration[] triggerConfigurations = configuration.getChild(ELEMENT_TRIGGERS).getChildren(ELEMENT_TRIGGER);
+ Element triggersElement = helper.createElement("triggers");
+ for(int i = 0; i < triggerConfigurations.length; i++){
+ Configuration conf = triggerConfigurations[i];
+ String type = conf.getAttribute(TYPE_ATTRIBUTE);
+ String className = conf.getAttribute(CLASS_ATTRIBUTE);
+ Element triggerElement = helper.createElement("trigger");
+ triggerElement.setAttribute("name", type);
+ triggerElement.setAttribute("src", className);
+ triggersElement.appendChild(triggerElement);
+ }
+ return triggersElement;
+ }catch(Exception e){
+ log.error("Can't configure trigger types: " + e);
+ return null;
+ }
+ }
+ /**
+ * Returns the trigger of a certain job.
+ *
+ * @param jobName
+ * The job name.
+ * @param jobGroup
+ * The job group.
+ * @return A trigger.
+ * @throws SchedulerException
+ * when something went wrong.
+ */
+ protected Trigger getTrigger(String jobName, String jobGroup) throws SchedulerException {
+ log.debug("Resolving trigger for job [" + jobName + " ][ " + jobGroup + "]");
+ String[] triggerGroups = getScheduler().getTriggerGroupNames();
+ for(int groupIndex = 0; groupIndex < triggerGroups.length; groupIndex++){
+ String[] triggerNames = getScheduler().getTriggerNames(triggerGroups[groupIndex]);
+ for(int nameIndex = 0; nameIndex < triggerNames.length; nameIndex++){
+ log.debug("Trigger name: " + triggerNames[nameIndex]);
+ Trigger trigger = getScheduler().getTrigger(triggerNames[nameIndex], triggerGroups[groupIndex]);
+ log.debug("Job group: " + trigger.getJobGroup());
+ if(trigger.getJobGroup().equals(jobGroup) && trigger.getJobName().equals(jobName)){
+ return trigger;
}
-
- return triggersElement;
- } catch (Exception e) {
- log.error("Can't configure trigger types: " + e);
-
- return null;
- }
- }
-
- /**
- * Returns the trigger of a certain job.
- * @param jobName The job name.
- * @param jobGroup The job group.
- * @return A trigger.
- * @throws SchedulerException when something went wrong.
- */
- protected Trigger getTrigger(String jobName, String jobGroup) throws SchedulerException {
- log.debug("Resolving trigger for job [" + jobName + " ][ " + jobGroup + "]");
- String[] triggerGroups = getScheduler().getTriggerGroupNames();
-
- for (int groupIndex = 0; groupIndex < triggerGroups.length; groupIndex++) {
- String[] triggerNames = getScheduler().getTriggerNames(triggerGroups[groupIndex]);
-
- for (int nameIndex = 0; nameIndex < triggerNames.length; nameIndex++) {
- log.debug("Trigger name: " + triggerNames[nameIndex]);
-
- Trigger trigger =
- getScheduler().getTrigger(triggerNames[nameIndex], triggerGroups[groupIndex]);
- log.debug("Job group: " + trigger.getJobGroup());
-
- if (trigger.getJobGroup().equals(jobGroup)
- && trigger.getJobName().equals(jobName)) {
- return trigger;
- }
+ }
+ }
+ return null;
+ }
+ /**
+ * Return an XML description certain job groups.
+ *
+ * @param jobGroupNames
+ * The job group names.
+ * @return An XML document.
+ * @exception SchedulerException
+ * if an error occurs
+ */
+ public Document getSnapshot(String[] jobGroupNames) throws SchedulerException {
+ log.debug("Creating job snapshot");
+ NamespaceHelper helper = SchedulerStore.getNamespaceHelper();
+ Document document = helper.getDocument();
+ Element root = document.getDocumentElement();
+ // print a list of all available trigger types
+ root.appendChild(getTriggerTypes(helper));
+ for(int groupIndex = 0; groupIndex < jobGroupNames.length; groupIndex++){
+ log.debug("Creating job snapshot for group [" + jobGroupNames[groupIndex] + "]");
+ root.appendChild(getSnapshot(helper, jobGroupNames[groupIndex]));
+ }
+ return document;
+ }
+ /**
+ * Returns the snapshot of a certain job group.
+ *
+ * @param helper
+ * The namespace helper.
+ * @param group
+ * The job group.
+ * @return An XML element.
+ * @throws SchedulerException
+ * when something went wrong.
+ */
+ protected Element getSnapshot(NamespaceHelper helper, String group) throws SchedulerException {
+ JobWrapper[] jobs = getJobWrappers(group);
+ Element element;
+ try{
+ element = getStore().createSnapshot(helper, getPublication(group), jobs);
+ }catch(SchedulerException e){
+ throw e;
+ }catch(PublicationException e){
+ throw new SchedulerException(e);
+ }
+ return element;
+ }
+ /**
+ * Returns the job wrappers for a certain job group.
+ *
+ * @param jobGroupName
+ * The job group.
+ * @return An array of job wrappers.
+ * @throws SchedulerException
+ * when something went wrong.
+ */
+ protected JobWrapper[] getJobWrappers(String jobGroupName) throws SchedulerException {
+ List wrappers = new ArrayList();
+ String[] jobNames = getScheduler().getJobNames(jobGroupName);
+ for(int nameIndex = 0; nameIndex < jobNames.length; nameIndex++){
+ JobDetail jobDetail = getScheduler().getJobDetail(jobNames[nameIndex], jobGroupName);
+ Trigger trigger = getTrigger(jobNames[nameIndex], jobGroupName);
+ wrappers.add(new JobWrapper(jobDetail, trigger));
+ }
+ return (JobWrapper[]) wrappers.toArray(new JobWrapper[wrappers.size()]);
+ }
+ /**
+ * Return an xml description of all scheduled jobs.
+ *
+ * @return DOCUMENT ME!
+ * @exception SchedulerException
+ * if an error occurs
+ */
+ public Document getSnapshot() throws SchedulerException {
+ String[] jobGroupNames = getScheduler().getJobGroupNames();
+ return getSnapshot(jobGroupNames);
+ }
+ /**
+ * Restores the jobs of a certain job group from the snapshot file.
+ *
+ * @param jobGroup
+ * The job group.
+ * @throws SchedulerException
+ * when something went wrong.
+ */
+ public void restoreJobs(String jobGroup) throws SchedulerException {
+ log.debug("--------------------------------------------------");
+ log.debug("Restoring jobs for job group [" + jobGroup + "]");
+ log.debug("--------------------------------------------------");
+ try{
+ JobWrapper[] jobs = getStore().restoreJobs(getPublication(jobGroup));
+ for(int i = 0; i < jobs.length; i++){
+ if(jobs[i].getTrigger() != null){
+ if(log.isDebugEnabled()){
+ log.debug(" Trigger time in future - scheduling job.");
+ }
+ addJob(jobs[i].getJobDetail(), jobs[i].getTrigger());
+ }else{
+ if(log.isDebugEnabled()){
+ log.debug(" Trigger time has expired - adding job without scheduling.");
+ }
+ addJob(jobs[i].getJobDetail());
}
- }
-
- return null;
- }
-
- /**
- * Return an XML description certain job groups.
- * @param jobGroupNames The job group names.
- * @return An XML document.
- * @exception SchedulerException if an error occurs
- */
- public Document getSnapshot(String[] jobGroupNames) throws SchedulerException {
- log.debug("Creating job snapshot");
-
- NamespaceHelper helper = SchedulerStore.getNamespaceHelper();
- Document document = helper.getDocument();
- Element root = document.getDocumentElement();
-
- // print a list of all available trigger types
- root.appendChild(getTriggerTypes(helper));
-
- for (int groupIndex = 0; groupIndex < jobGroupNames.length; groupIndex++) {
- log.debug("Creating job snapshot for group [" + jobGroupNames[groupIndex] + "]");
- root.appendChild(getSnapshot(helper, jobGroupNames[groupIndex]));
- }
-
- return document;
- }
-
- /**
- * Returns the snapshot of a certain job group.
- * @param helper The namespace helper.
- * @param group The job group.
- * @return An XML element.
- * @throws SchedulerException when something went wrong.
- */
- protected Element getSnapshot(NamespaceHelper helper, String group) throws SchedulerException {
- JobWrapper[] jobs = getJobWrappers(group);
- Element element;
- try {
- element = getStore().createSnapshot(helper, getPublication(group), jobs);
- } catch (SchedulerException e) {
+ }
+ }catch(Exception e){
+ log.error("Restoring jobs failed: ", e);
+ }
+ }
+ /**
+ * Modifies the execution time of a job.
+ *
+ * @param jobId
+ * The job ID.
+ * @param jobGroup
+ * The job group.
+ * @param startTime
+ * The new start time.
+ * @throws SchedulerException
+ * when the job was not found.
+ */
+ public void modifyJob(String jobId, String jobGroup, Date startTime) throws SchedulerException {
+ log.debug("Modifying job [" + jobId + "][" + jobGroup + "]");
+ JobDetail jobDetail = getScheduler().getJobDetail(jobId, jobGroup);
+ if(jobDetail == null){
+ throw new SchedulerException("Job not found!");
+ }
+ Trigger trigger = getTrigger(jobDetail.getName(), jobGroup);
+ if(trigger == null){
+ log.debug(" No trigger found.");
+ }else{
+ log.debug(" Trigger found. Setting new start time.");
+ jobDetail.setDurability(true);
+ if(startTime.after(new GregorianCalendar().getTime())){
+ log.debug(" Start time is in future - re-scheduling job.");
+ getScheduler().unscheduleJob(trigger.getName(), trigger.getGroup());
+ trigger = TriggerHelper.createSimpleTrigger(jobId, jobGroup, startTime);
+ getScheduler().scheduleJob(trigger);
+ }else{
+ log.debug(" Start time has already expired - deleting job.");
+ getScheduler().deleteJob(jobId, jobGroup);
+ }
+ try{
+ getStore().writeSnapshot(getPublication(jobGroup), getJobWrappers(jobGroup));
+ }catch(SchedulerException e){
throw e;
- } catch (PublicationException e) {
+ }catch(PublicationException e){
throw new SchedulerException(e);
- }
- return element;
- }
-
- /**
- * Returns the job wrappers for a certain job group.
- * @param jobGroupName The job group.
- * @return An array of job wrappers.
- * @throws SchedulerException when something went wrong.
- */
- protected JobWrapper[] getJobWrappers(String jobGroupName) throws SchedulerException {
-
- List wrappers = new ArrayList();
- String[] jobNames = getScheduler().getJobNames(jobGroupName);
-
- for (int nameIndex = 0; nameIndex < jobNames.length; nameIndex++) {
- JobDetail jobDetail = getScheduler().getJobDetail(jobNames[nameIndex], jobGroupName);
- Trigger trigger = getTrigger(jobNames[nameIndex], jobGroupName);
- wrappers.add(new JobWrapper(jobDetail, trigger));
- }
-
- return (JobWrapper[]) wrappers.toArray(new JobWrapper[wrappers.size()]);
- }
-
- /**
- * Return an xml description of all scheduled jobs.
- * @return DOCUMENT ME!
- * @exception SchedulerException if an error occurs
- */
- public Document getSnapshot() throws SchedulerException {
- String[] jobGroupNames = getScheduler().getJobGroupNames();
- return getSnapshot(jobGroupNames);
- }
-
- /**
- * Restores the jobs of a certain job group from the snapshot file.
- * @param jobGroup The job group.
- * @throws SchedulerException when something went wrong.
- */
- public void restoreJobs(String jobGroup) throws SchedulerException {
-
- log.debug("--------------------------------------------------");
- log.debug("Restoring jobs for job group [" + jobGroup + "]");
- log.debug("--------------------------------------------------");
-
- try {
- JobWrapper[] jobs = getStore().restoreJobs(getPublication(jobGroup));
- for (int i = 0; i < jobs.length; i++) {
- if (jobs[i].getTrigger() != null) {
- if (log.isDebugEnabled()) {
- log.debug(" Trigger time in future - scheduling job.");
- }
- addJob(jobs[i].getJobDetail(), jobs[i].getTrigger());
- } else {
- if (log.isDebugEnabled()) {
- log.debug(" Trigger time has expired - adding job without scheduling.");
- }
- addJob(jobs[i].getJobDetail());
- }
- }
- } catch (Exception e) {
- log.error("Restoring jobs failed: ", e);
- }
-
- }
-
- /**
- * Modifies the execution time of a job.
- * @param jobId The job ID.
- * @param jobGroup The job group.
- * @param startTime The new start time.
- * @throws SchedulerException when the job was not found.
- */
- public void modifyJob(String jobId, String jobGroup, Date startTime)
- throws SchedulerException {
- log.debug("Modifying job [" + jobId + "][" + jobGroup + "]");
-
- JobDetail jobDetail = getScheduler().getJobDetail(jobId, jobGroup);
- if (jobDetail == null) {
- throw new SchedulerException("Job not found!");
- }
-
- Trigger trigger = getTrigger(jobDetail.getName(), jobGroup);
- if (trigger == null) {
- log.debug(" No trigger found.");
- } else {
- log.debug(" Trigger found. Setting new start time.");
- jobDetail.setDurability(true);
- if (startTime.after(new GregorianCalendar().getTime())) {
- log.debug(" Start time is in future - re-scheduling job.");
- getScheduler().unscheduleJob(trigger.getName(), trigger.getGroup());
- trigger = TriggerHelper.createSimpleTrigger(jobId, jobGroup, startTime);
- getScheduler().scheduleJob(trigger);
- } else {
- log.debug(" Start time has already expired - deleting job.");
- getScheduler().deleteJob(jobId, jobGroup);
- }
- try {
- getStore().writeSnapshot(getPublication(jobGroup), getJobWrappers(jobGroup));
- } catch (SchedulerException e) {
- throw e;
- } catch (PublicationException e) {
- throw new SchedulerException(e);
- }
- }
- }
-
- /**
- * Deletes the jobs for a certain document. This method is called when
- * a document has been moved or deleted.
- * @param document A document.
- * @throws SchedulerException when something went wrong.
- * @throws PublicationException when something went wrong.
- */
- public void deleteJobs(org.apache.lenya.cms.publication.Document document)
- throws SchedulerException, PublicationException {
-
- log.debug("Deleting jobs for document [" + document + "]");
-
- String jobGroup = document.getPublication().getId();
- JobWrapper[] jobs = getJobWrappers(jobGroup);
- boolean changed = false;
- for (int i = 0; i < jobs.length; i++) {
- ServletJob job = jobs[i].getJob();
- String documentUrl = job.getDocumentUrl(jobs[i].getJobDetail());
- if (documentUrl.equals(document.getCompleteURL())) {
- deleteJob(jobs[i].getJobDetail().getName(), jobGroup);
- changed = true;
- }
- }
- if (changed) {
- getStore().writeSnapshot(getPublication(jobGroup), getJobWrappers(jobGroup));
- }
- }
-
+ }
+ }
+ }
+ /**
+ * Deletes the jobs for a certain document. This method is called when a document has been moved or deleted.
+ *
+ * @param document
+ * A document.
+ * @throws SchedulerException
+ * when something went wrong.
+ * @throws PublicationException
+ * when something went wrong.
+ */
+ public void deleteJobs(org.apache.lenya.cms.publication.Document document) throws SchedulerException, PublicationException {
+ log.debug("Deleting jobs for document [" + document + "]");
+ String jobGroup = document.getPublication().getId();
+ JobWrapper[] jobs = getJobWrappers(jobGroup);
+ boolean changed = false;
+ for(int i = 0; i < jobs.length; i++){
+ ServletJob job = jobs[i].getJob();
+ String documentUrl = job.getDocumentUrl(jobs[i].getJobDetail());
+ if(documentUrl.equals(document.getCompleteURL())){
+ deleteJob(jobs[i].getJobDetail().getName(), jobGroup);
+ changed = true;
+ }
+ }
+ if(changed){
+ getStore().writeSnapshot(getPublication(jobGroup), getJobWrappers(jobGroup));
+ }
+ }
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.