001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: /* $Id: TaskJob.java 473861 2006-11-12 03:51:14Z gregor $ */
020:
021: package org.apache.lenya.cms.scheduler;
022:
023: import java.util.Enumeration;
024: import java.util.HashMap;
025: import java.util.Map;
026:
027: import javax.servlet.http.HttpServletRequest;
028:
029: import org.apache.lenya.cms.task.DefaultTaskWrapper;
030: import org.apache.lenya.cms.task.ExecutionException;
031: import org.apache.lenya.cms.task.TaskParameters;
032: import org.apache.lenya.cms.task.TaskWrapper;
033: import org.apache.lenya.util.NamespaceMap;
034: import org.apache.lenya.xml.NamespaceHelper;
035: import org.apache.log4j.Logger;
036: import org.quartz.JobDataMap;
037: import org.quartz.JobDetail;
038: import org.quartz.JobExecutionContext;
039: import org.quartz.JobExecutionException;
040: import org.quartz.SchedulerException;
041: import org.w3c.dom.Element;
042:
043: /**
044: * A TaskJob is a Job that executes a Task. The task ID is obtained from the <code>task-id</code>
045: * request parameter.
046: */
047: public class TaskJob extends ServletJob {
048: private static Logger log = Logger.getLogger(TaskJob.class);
049:
050: /**
051: * Un-prefix the parameters.
052: * @param wrapperMap the prefixed parameters.
053: * @return the parameters
054: * @throws SchedulerException when something went wrong.
055: */
056: protected Map stripPrefixes(Map wrapperMap)
057: throws SchedulerException {
058:
059: NamespaceMap taskParameters = new NamespaceMap(
060: TaskParameters.PREFIX);
061: taskParameters.putAll(wrapperMap);
062: wrapperMap.putAll(taskParameters.getPrefixedMap());
063:
064: DefaultTaskWrapper wrapper = new DefaultTaskWrapper(wrapperMap,
065: null);
066: return wrapper.getParameters();
067: }
068:
069: /**
070: * Creates the job data for a job.
071: * @param request The request.
072: * @return A job data map.
073: * @throws SchedulerException when something went wrong.
074: */
075: public JobDataMap createJobData(HttpServletRequest request)
076: throws SchedulerException {
077: log.debug("Creating job data map:");
078: JobDataMap map = super .createJobData(request);
079:
080: Enumeration parameters = request.getParameterNames();
081: Map wrapperMap = new HashMap();
082: while (parameters.hasMoreElements()) {
083: String key = (String) parameters.nextElement();
084: Object value;
085: String[] values = request.getParameterValues(key);
086: if (values.length == 1) {
087: value = values[0];
088: } else {
089: value = values;
090: }
091: wrapperMap.put(key, value);
092: }
093:
094: map.putAll(stripPrefixes(wrapperMap));
095: return map;
096: }
097:
098: /**
099: * <p>
100: * Called by the <code>{@link org.quartz.Scheduler}</code> when a <code>{@link
101: * org.quartz.Trigger}</code> fires that is associated with the <code>Job</code>.
102: * </p>
103: * @param context The context
104: * @throws JobExecutionException if there is an exception while executing the job.
105: */
106: public void execute(JobExecutionContext context)
107: throws JobExecutionException {
108: log.info("Executing job");
109: JobDetail jobDetail = context.getJobDetail();
110:
111: DefaultTaskWrapper wrapper = new DefaultTaskWrapper(jobDetail
112: .getJobDataMap(), null);
113: try {
114: wrapper.execute();
115: } catch (ExecutionException e) {
116: log.error("Task execution failed: ", e);
117: throw new JobExecutionException();
118: }
119: }
120:
121: /**
122: * Loads a job details object from an XML element.
123: * @param jobElement The XML element.
124: * @param jobGroup The job group the job belongs to.
125: * @param servletContextPath The servlet context path.
126: * @throws SchedulerException when something went wrong.
127: * @return A job details object.
128: */
129: public JobDetail load(Element jobElement, String jobGroup,
130: String servletContextPath) throws SchedulerException {
131: JobDetail jobDetail = super .load(jobElement, jobGroup,
132: servletContextPath);
133:
134: NamespaceHelper helper = SchedulerStore.getNamespaceHelper();
135: DefaultTaskWrapper wrapper = new DefaultTaskWrapper(helper,
136: jobElement);
137: wrapper.getTaskParameters().setServletContextPath(
138: servletContextPath);
139:
140: JobDataMap map = new JobDataMap(wrapper.getParameters());
141: jobDetail.setJobDataMap(map);
142:
143: return jobDetail;
144: }
145:
146: /**
147: * Save a job detail
148: * @param jobDetail The job detail to save
149: * @param helper namespace helper
150: * @throws SchedulerException when something went wrong.
151: * @return The job element
152: */
153: public Element save(NamespaceHelper helper, JobDetail jobDetail)
154: throws SchedulerException {
155:
156: Element jobElement = super .save(helper, jobDetail);
157: TaskWrapper wrapper = new DefaultTaskWrapper(jobDetail
158: .getJobDataMap(), null);
159: jobElement.appendChild(wrapper.save(helper));
160:
161: return jobElement;
162: }
163: }
|