/* * 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. */ package org.apache.cocoon.components.cron; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.service.ServiceManager; import org.quartz.Calendar; import org.quartz.CronTrigger; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.SimpleTrigger; import org.quartz.Trigger; import org.quartz.impl.jdbcjobstore.DriverDelegate; import org.quartz.spi.ClassLoadHelper; import org.quartz.utils.Key; import org.quartz.utils.TriggerStatus; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import java.util.Set; /** * Wrapper around another DriverDelegate instance. * * <p>This wrapper makes sure that three Cocoon specific transient objects are * removed from the JobDataMap before serializing it into the database, and * populated back into the map when JobDetailMap is loaded from the database. * These objects are:</p> * <ul> * <li>Logger</li> * <li>ServiceManager</li> * <li>Context</li> * <li> * * @version CVS $Id$ * @since 2.1.6 */ public class QuartzDriverDelegate implements DriverDelegate { private Logger logger; private ServiceManager manager; private Context context; private DriverDelegate delegate; public QuartzDriverDelegate(Logger logger, ServiceManager manager, Context context, DriverDelegate delegate) { this.logger = logger; this.manager = manager; this.context = context; this.delegate = delegate; } public int insertJobDetail(Connection conn, JobDetail job) throws IOException, SQLException { removeTransientData(job); return delegate.insertJobDetail(conn, job); } public int updateJobDetail(Connection conn, JobDetail job) throws IOException, SQLException { removeTransientData(job); return delegate.updateJobDetail(conn, job); } public int updateJobData(Connection conn, JobDetail job) throws IOException, SQLException { removeTransientData(job); return delegate.updateJobData(conn, job); } private void removeTransientData(JobDetail job) { JobDataMap map = job.getJobDataMap(); if (map != null) { this.logger.debug("QuartzDriverDelegate: Removing transient data"); map.remove(QuartzJobScheduler.DATA_MAP_LOGGER); map.remove(QuartzJobScheduler.DATA_MAP_CONTEXT); map.remove(QuartzJobScheduler.DATA_MAP_MANAGER); } } public JobDetail selectJobDetail(Connection conn, String jobName, String groupName, ClassLoadHelper loadHelper) throws ClassNotFoundException, IOException, SQLException { JobDetail job = delegate.selectJobDetail(conn, jobName, groupName, loadHelper); if (job != null) { JobDataMap map = job.getJobDataMap(); if (map != null) { this.logger.debug("QuartzDriverDelegate: Adding transient data"); map.put(QuartzJobScheduler.DATA_MAP_LOGGER, this.logger); map.put(QuartzJobScheduler.DATA_MAP_CONTEXT, this.context); map.put(QuartzJobScheduler.DATA_MAP_MANAGER, this.manager); } } return job; } // // Delegate all other methods // public int updateTriggerStatesFromOtherStates(Connection conn, String newState, String oldState1, String oldState2) throws SQLException { return delegate.updateTriggerStatesFromOtherStates(conn, newState, oldState1, oldState2); } public Key[] selectMisfiredTriggers(Connection conn, long ts) throws SQLException { return delegate.selectMisfiredTriggers(conn, ts); } public Key[] selectMisfiredTriggersInState(Connection conn, String state, long ts) throws SQLException { return delegate.selectMisfiredTriggersInState(conn, state, ts); } public Key[] selectMisfiredTriggersInGroupInState(Connection conn, String groupName, String state, long ts) throws SQLException { return delegate.selectMisfiredTriggersInGroupInState(conn, groupName, state, ts); } public Trigger[] selectTriggersForRecoveringJobs(Connection conn) throws SQLException, IOException, ClassNotFoundException { return delegate.selectTriggersForRecoveringJobs(conn); } public int deleteFiredTriggers(Connection conn) throws SQLException { return delegate.deleteFiredTriggers(conn); } public int deleteFiredTriggers(Connection conn, String instanceId) throws SQLException { return delegate.deleteFiredTriggers(conn, instanceId); } public int deleteVolatileFiredTriggers(Connection conn) throws SQLException { return delegate.deleteVolatileFiredTriggers(conn); } public Key[] selectVolatileTriggers(Connection conn) throws SQLException { return delegate.selectVolatileTriggers(conn); } public Key[] selectVolatileJobs(Connection conn) throws SQLException { return delegate.selectVolatileJobs(conn); } public Key[] selectTriggerNamesForJob(Connection conn, String jobName, String groupName) throws SQLException { return delegate.selectTriggerNamesForJob(conn, jobName, groupName); } public int deleteJobListeners(Connection conn, String jobName, String groupName) throws SQLException { return delegate.deleteJobListeners(conn, jobName, groupName); } public int deleteJobDetail(Connection conn, String jobName, String groupName) throws SQLException { return delegate.deleteJobDetail(conn, jobName, groupName); } public boolean isJobStateful(Connection conn, String jobName, String groupName) throws SQLException { return delegate.isJobStateful(conn, jobName, groupName); } public boolean jobExists(Connection conn, String jobName, String groupName) throws SQLException { return delegate.jobExists(conn, jobName, groupName); } public int insertJobListener(Connection conn, JobDetail job, String listener) throws SQLException { return delegate.insertJobListener(conn, job, listener); } public String[] selectJobListeners(Connection conn, String jobName, String groupName) throws SQLException { return delegate.selectJobListeners(conn, jobName, groupName); } public int selectNumJobs(Connection conn) throws SQLException { return delegate.selectNumJobs(conn); } public String[] selectJobGroups(Connection conn) throws SQLException { return delegate.selectJobGroups(conn); } public String[] selectJobsInGroup(Connection conn, String groupName) throws SQLException { return delegate.selectJobsInGroup(conn, groupName); } public int insertTrigger(Connection conn, Trigger trigger, String state, JobDetail jobDetail) throws SQLException, IOException { return delegate.insertTrigger(conn, trigger, state, jobDetail); } public int insertSimpleTrigger(Connection conn, SimpleTrigger trigger) throws SQLException { return delegate.insertSimpleTrigger(conn, trigger); } public int insertBlobTrigger(Connection conn, Trigger trigger) throws SQLException, IOException { return delegate.insertBlobTrigger(conn, trigger); } public int insertCronTrigger(Connection conn, CronTrigger trigger) throws SQLException { return delegate.insertCronTrigger(conn, trigger); } public int updateTrigger(Connection conn, Trigger trigger, String state, JobDetail jobDetail) throws SQLException, IOException { return delegate.updateTrigger(conn, trigger, state, jobDetail); } public int updateSimpleTrigger(Connection conn, SimpleTrigger trigger) throws SQLException { return delegate.updateSimpleTrigger(conn, trigger); } public int updateCronTrigger(Connection conn, CronTrigger trigger) throws SQLException { return delegate.updateCronTrigger(conn, trigger); } public int updateBlobTrigger(Connection conn, Trigger trigger) throws SQLException, IOException { return delegate.updateBlobTrigger(conn, trigger); } public boolean triggerExists(Connection conn, String triggerName, String groupName) throws SQLException { return delegate.triggerExists(conn, triggerName, groupName); } public int updateTriggerState(Connection conn, String triggerName, String groupName, String state) throws SQLException { return delegate.updateTriggerState(conn, triggerName, groupName, state); } public int updateTriggerStateFromOtherState(Connection conn, String triggerName, String groupName, String newState, String oldState) throws SQLException { return delegate.updateTriggerStateFromOtherState(conn, triggerName, groupName, newState, oldState); } public int updateTriggerStateFromOtherStates(Connection conn, String triggerName, String groupName, String newState, String oldState1, String oldState2, String oldState3) throws SQLException { return delegate.updateTriggerStateFromOtherStates(conn, triggerName, groupName, newState, oldState1, oldState2, oldState3); } public int updateTriggerStateFromOtherStatesBeforeTime(Connection conn, String newState, String oldState1, String oldState2, long time) throws SQLException { return delegate.updateTriggerStateFromOtherStatesBeforeTime(conn, newState, oldState1, oldState2, time); } public int updateTriggerGroupStateFromOtherStates(Connection conn, String groupName, String newState, String oldState1, String oldState2, String oldState3) throws SQLException { return delegate.updateTriggerGroupStateFromOtherStates(conn, groupName, newState, oldState1, oldState2, oldState3); } public int updateTriggerGroupStateFromOtherState(Connection conn, String groupName, String newState, String oldState) throws SQLException { return delegate.updateTriggerGroupStateFromOtherState(conn, groupName, newState, oldState); } public int updateTriggerStatesForJob(Connection conn, String jobName, String groupName, String state) throws SQLException { return delegate.updateTriggerStatesForJob(conn, jobName, groupName, state); } public int updateTriggerStatesForJobFromOtherState(Connection conn, String jobName, String groupName, String state, String oldState) throws SQLException { return delegate.updateTriggerStatesForJobFromOtherState(conn, jobName, groupName, state, oldState); } public int deleteTriggerListeners(Connection conn, String triggerName, String groupName) throws SQLException { return delegate.deleteTriggerListeners(conn, triggerName, groupName); } public int insertTriggerListener(Connection conn, Trigger trigger, String listener) throws SQLException { return delegate.insertTriggerListener(conn, trigger, listener); } public String[] selectTriggerListeners(Connection conn, String triggerName, String groupName) throws SQLException { return delegate.selectTriggerListeners(conn, triggerName, groupName); } public int deleteSimpleTrigger(Connection conn, String triggerName, String groupName) throws SQLException { return delegate.deleteSimpleTrigger(conn, triggerName, groupName); } public int deleteBlobTrigger(Connection conn, String triggerName, String groupName) throws SQLException { return delegate.deleteBlobTrigger(conn, triggerName, groupName); } public int deleteCronTrigger(Connection conn, String triggerName, String groupName) throws SQLException { return delegate.deleteCronTrigger(conn, triggerName, groupName); } public int deleteTrigger(Connection conn, String triggerName, String groupName) throws SQLException { return delegate.deleteTrigger(conn, triggerName, groupName); } public int selectNumTriggersForJob(Connection conn, String jobName, String groupName) throws SQLException { return delegate.selectNumTriggersForJob(conn, jobName, groupName); } public JobDetail selectJobForTrigger(Connection conn, String triggerName, String groupName, ClassLoadHelper loadHelper) throws SQLException, ClassNotFoundException { return delegate.selectJobForTrigger(conn, triggerName, groupName, loadHelper); } public List selectStatefulJobsOfTriggerGroup(Connection conn, String groupName) throws SQLException { return delegate.selectStatefulJobsOfTriggerGroup(conn, groupName); } public Trigger[] selectTriggersForJob(Connection conn, String jobName, String groupName) throws SQLException, ClassNotFoundException, IOException { return delegate.selectTriggersForJob(conn, jobName, groupName); } public Trigger[] selectTriggersForCalendar(Connection conn, String calName) throws SQLException, ClassNotFoundException, IOException { return delegate.selectTriggersForCalendar(conn, calName); } public Trigger selectTrigger(Connection conn, String triggerName, String groupName) throws SQLException, ClassNotFoundException, IOException { return delegate.selectTrigger(conn, triggerName, groupName); } public String selectTriggerState(Connection conn, String triggerName, String groupName) throws SQLException { return delegate.selectTriggerState(conn, triggerName, groupName); } public TriggerStatus selectTriggerStatus(Connection conn, String triggerName, String groupName) throws SQLException { return delegate.selectTriggerStatus(conn, triggerName, groupName); } public int selectNumTriggers(Connection conn) throws SQLException { return delegate.selectNumTriggers(conn); } public String[] selectTriggerGroups(Connection conn) throws SQLException { return delegate.selectTriggerGroups(conn); } public String[] selectTriggersInGroup(Connection conn, String groupName) throws SQLException { return delegate.selectTriggersInGroup(conn, groupName); } public Key[] selectTriggersInState(Connection conn, String state) throws SQLException { return delegate.selectTriggersInState(conn, state); } public int insertPausedTriggerGroup(Connection conn, String groupName) throws SQLException { return delegate.insertPausedTriggerGroup(conn, groupName); } public int deletePausedTriggerGroup(Connection conn, String groupName) throws SQLException { return delegate.deletePausedTriggerGroup(conn, groupName); } public int deleteAllPausedTriggerGroups(Connection conn) throws SQLException { return delegate.deleteAllPausedTriggerGroups(conn); } public boolean isTriggerGroupPaused(Connection conn, String groupName) throws SQLException { return delegate.isTriggerGroupPaused(conn, groupName); } public Set selectPausedTriggerGroups(Connection conn) throws SQLException { return delegate.selectPausedTriggerGroups(conn); } public boolean isExistingTriggerGroup(Connection conn, String groupName) throws SQLException { return delegate.isExistingTriggerGroup(conn, groupName); } public int insertCalendar(Connection conn, String calendarName, Calendar calendar) throws IOException, SQLException { return delegate.insertCalendar(conn, calendarName, calendar); } public int updateCalendar(Connection conn, String calendarName, Calendar calendar) throws IOException, SQLException { return delegate.updateCalendar(conn, calendarName, calendar); } public boolean calendarExists(Connection conn, String calendarName) throws SQLException { return delegate.calendarExists(conn, calendarName); } public Calendar selectCalendar(Connection conn, String calendarName) throws ClassNotFoundException, IOException, SQLException { return delegate.selectCalendar(conn, calendarName); } public boolean calendarIsReferenced(Connection conn, String calendarName) throws SQLException { return delegate.calendarIsReferenced(conn, calendarName); } public int deleteCalendar(Connection conn, String calendarName) throws SQLException { return delegate.deleteCalendar(conn, calendarName); } public int selectNumCalendars(Connection conn) throws SQLException { return delegate.selectNumCalendars(conn); } public String[] selectCalendars(Connection conn) throws SQLException { return delegate.selectCalendars(conn); } public long selectNextFireTime(Connection conn) throws SQLException { return delegate.selectNextFireTime(conn); } public Key selectTriggerForFireTime(Connection conn, long fireTime) throws SQLException { return delegate.selectTriggerForFireTime(conn, fireTime); } public int insertFiredTrigger(Connection conn, Trigger trigger, String state, JobDetail jobDetail) throws SQLException { return delegate.insertFiredTrigger(conn, trigger, state, jobDetail); } public List selectFiredTriggerRecords(Connection conn, String triggerName, String groupName) throws SQLException { return delegate.selectFiredTriggerRecords(conn, triggerName, groupName); } public List selectFiredTriggerRecordsByJob(Connection conn, String jobName, String groupName) throws SQLException { return delegate.selectFiredTriggerRecordsByJob(conn, jobName, groupName); } public List selectInstancesFiredTriggerRecords(Connection conn, String instanceName) throws SQLException { return delegate.selectInstancesFiredTriggerRecords(conn, instanceName); } public int deleteFiredTrigger(Connection conn, String entryId) throws SQLException { return delegate.deleteFiredTrigger(conn, entryId); } public int selectJobExecutionCount(Connection conn, String jobName, String jobGroup) throws SQLException { return delegate.selectJobExecutionCount(conn, jobName, jobGroup); } public int insertSchedulerState(Connection conn, String instanceId, long checkInTime, long interval, String recoverer) throws SQLException { return delegate.insertSchedulerState(conn, instanceId, checkInTime, interval, recoverer); } public int deleteSchedulerState(Connection conn, String instanceId) throws SQLException { return delegate.deleteSchedulerState(conn, instanceId); } public List selectSchedulerStateRecords(Connection conn, String instanceId) throws SQLException { return delegate.selectSchedulerStateRecords(conn, instanceId); } public JobDataMap selectTriggerJobDataMap(Connection conn, String triggerName, String groupName) throws SQLException, ClassNotFoundException, IOException { return delegate.selectTriggerJobDataMap(conn, triggerName, groupName); } public int updateSchedulerState(Connection conn, String instanceId, long checkInTime, String recoverer) throws SQLException { return delegate.updateSchedulerState(conn, instanceId, checkInTime, recoverer); } }