blob: 7e28d50984aaff1615cffb0b9006759fe0e21921 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
/* $Id$ */
package org.apache.lenya.cms.scheduler;
import javax.servlet.http.HttpServletRequest;
import org.apache.lenya.util.NamespaceMap;
import org.apache.lenya.xml.NamespaceHelper;
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.SchedulerException;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
/**
* Scheduling job that uses an HttpServletRequest to obtain its Job data.
*/
public abstract class ServletJob implements Job {
private static Logger log = Logger.getLogger(ServletJob.class);
/**
* <code>ELEMENT_JOB</code> The job element
*/
public static final String ELEMENT_JOB = "job";
/**
* <code>ATTRIBUTE_ID</code> The id attribute
*/
public static final String ATTRIBUTE_ID = "id";
/**
* <code>ATTRIBUTE_CLASS</code> The class attribute
*/
public static final String ATTRIBUTE_CLASS = "class";
/**
* <code>ATTRIBUTE_DOCUMENT_URL</code> The document url attribute
*/
public static final String ATTRIBUTE_DOCUMENT_URL = "url";
/**
* <code>ATTRIBUTE_SERVLET_CONTEXT</code> The servlet context attribute
*/
public static final String ATTRIBUTE_SERVLET_CONTEXT = "servletcontext";
/**
* <code>PARAMETER_DOCUMENT_URL</code> The document URL parameter
*/
public static final String PARAMETER_DOCUMENT_URL = "document-url";
/**
* Creates the job data from an HTTP request.
* @param request The request.
* @return A job data map.
* @throws SchedulerException when something went wrong.
*/
public JobDataMap createJobData(HttpServletRequest request)
throws SchedulerException {
JobDataMap map = new JobDataMap();
String key = NamespaceMap.getFullName(LoadQuartzServlet.PREFIX, PARAMETER_DOCUMENT_URL);
String documentUrl = request.getParameter(key);
if (documentUrl == null) {
throw new SchedulerException("Document URL must not be null!");
}
map.put(key, documentUrl);
return map;
}
/**
* Loads the job data from an XML element.
* @param element An XML element.
* @param jobGroup The job group the job belongs to.
* @param servletContextPath The servlet context path.
* @return A job detail object.
* @throws SchedulerException when something went wrong.
*/
public JobDetail load(Element element, String jobGroup, String servletContextPath)
throws SchedulerException {
String jobId = element.getAttribute(ATTRIBUTE_ID);
JobDetail jobDetail = new JobDetail(jobId, jobGroup, getClass());
return jobDetail;
}
/**
* Saves the job data to an XML element.
* @param helper The namespace helper of the document the element shall belong to.
* @param jobDetail The job detail to save.
* @return An XML element.
* @throws SchedulerException when something went wrong.
*/
public Element save(NamespaceHelper helper, JobDetail jobDetail) throws SchedulerException {
log.debug("Saving job");
try {
Element jobElement = helper.createElement(ELEMENT_JOB);
jobElement.setAttribute(ATTRIBUTE_ID, jobDetail.getName());
jobElement.setAttribute(ATTRIBUTE_CLASS, getClass().getName());
String documentUrl = getDocumentUrl(jobDetail);
jobElement.setAttribute(ATTRIBUTE_DOCUMENT_URL, documentUrl);
return jobElement;
} catch (final DOMException e) {
log.error("" +e.toString());
throw new SchedulerException(e);
}
}
/**
* Returns the document URL of a certain job.
* @param jobDetail The job detail.
* @return A string.
*/
public String getDocumentUrl(JobDetail jobDetail) {
JobDataMap map = jobDetail.getJobDataMap();
NamespaceMap wrapper = new NamespaceMap(map, LoadQuartzServlet.PREFIX);
String documentUrl = (String) wrapper.get(PARAMETER_DOCUMENT_URL);
return documentUrl;
}
/**
* Sets the document URL of a job.
* @param jobDetail The job detail.
* @param url The URL.
*/
public void setDocumentUrl(JobDetail jobDetail, String url) {
JobDataMap map = jobDetail.getJobDataMap();
NamespaceMap wrapper = new NamespaceMap(map, LoadQuartzServlet.PREFIX);
wrapper.put(PARAMETER_DOCUMENT_URL, url);
jobDetail.setJobDataMap(map);
}
}