001    /*
002     * Copyright 2011 The Kuali Foundation.
003     * 
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     * 
008     * http://www.opensource.org/licenses/ecl2.php
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.kfs.sys.batch;
017    
018    import java.util.Properties;
019    
020    import javax.sql.DataSource;
021    
022    import org.kuali.rice.ksb.messaging.quartz.MessageServiceExecutorJobListener;
023    import org.quartz.Scheduler;
024    import org.quartz.SchedulerException;
025    import org.quartz.SchedulerFactory;
026    
027    /**
028     * This class wraps the spring version to allow deploy time determination of whether to actually create a scheduler and whether to
029     * use the jdbc or ram job store.
030     */
031    public class SchedulerFactoryBean extends org.springframework.scheduling.quartz.SchedulerFactoryBean {
032        private static final Scheduler SCHEDULER_DUMMY = new SchedulerDummy();
033        private boolean useQuartzScheduling;
034        private boolean useJdbcJobstore;
035        private DataSource dataSourceReference;
036        private Properties quartzPropertiesReference;
037        private DataSource nonTransactionalDataSourceReference;
038    
039        @Override
040        public void destroy() throws SchedulerException {
041            if (useQuartzScheduling) {
042                super.destroy();
043            }
044        }
045    
046        public void afterPropertiesSet() throws Exception {
047            if (useQuartzScheduling) {
048                if (useJdbcJobstore) {
049                    quartzPropertiesReference.put("org.quartz.jobStore.useProperties", "false");
050                    quartzPropertiesReference.put("org.quartz.jobStore.isClustered", "true");
051                    setDataSource(dataSourceReference);
052                    setNonTransactionalDataSource(nonTransactionalDataSourceReference);
053                }
054                setQuartzProperties(quartzPropertiesReference);
055                super.afterPropertiesSet();
056            }
057        }
058    
059        public Object getObject() {
060            if (useQuartzScheduling) {
061                return super.getObject();
062            }
063            return SCHEDULER_DUMMY;
064        }
065    
066        /**
067         * @see org.springframework.scheduling.quartz.SchedulerFactoryBean#createScheduler(org.quartz.SchedulerFactory, java.lang.String)
068         */
069        @Override
070        protected Scheduler createScheduler(SchedulerFactory schedulerFactory, String schedulerName) throws SchedulerException {
071            Scheduler scheduler = super.createScheduler(schedulerFactory, schedulerName);
072            scheduler.addJobListener(new MessageServiceExecutorJobListener());
073            return scheduler;
074        }
075        
076        /**
077         * Sets the dataSourceReference attribute value.
078         * 
079         * @param dataSourceReference The dataSourceReference to set.
080         */
081        public void setDataSourceReference(DataSource dataSourceReference) {
082            this.dataSourceReference = dataSourceReference;
083        }
084    
085        /**
086         * Sets the useJdbcJobstore attribute value.
087         * 
088         * @param useJdbcJobstore The useJdbcJobstore to set.
089         */
090        public void setUseJdbcJobstore(boolean useJdbcJobstore) {
091            this.useJdbcJobstore = useJdbcJobstore;
092        }
093    
094        /**
095         * Sets the useQuartzScheduling attribute value.
096         * 
097         * @param useQuartzScheduling The useQuartzScheduling to set.
098         */
099        public void setUseQuartzScheduling(boolean useQuartzScheduling) {
100            this.useQuartzScheduling = useQuartzScheduling;
101        }
102    
103        /**
104         * Sets the quartzPropertiesReference attribute value.
105         * 
106         * @param quartzPropertiesReference The quartzPropertiesReference to set.
107         */
108        public void setQuartzPropertiesReference(Properties quartzPropertiesReference) {
109            this.quartzPropertiesReference = quartzPropertiesReference;
110        }
111    
112        public DataSource getNonTransactionalDataSourceReference() {
113            return nonTransactionalDataSourceReference;
114        }
115    
116        public void setNonTransactionalDataSourceReference(DataSource nonTransactionalDataSourceReference) {
117            this.nonTransactionalDataSourceReference = nonTransactionalDataSourceReference;
118        }
119    }