001    /**
002     *
003     * Licensed to the Apache Software Foundation (ASF) under one or more
004     * contributor license agreements.  See the NOTICE file distributed with
005     * this work for additional information regarding copyright ownership.
006     * The ASF licenses this file to You under the Apache License, Version 2.0
007     * (the "License"); you may not use this file except in compliance with
008     * the License.  You may obtain a copy of the License at
009     *
010     * http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.camel.component.quartz;
019    
020    import org.apache.camel.CamelContext;
021    import org.apache.camel.impl.DefaultComponent;
022    import org.apache.camel.util.IntrospectionSupport;
023    import org.apache.camel.util.ObjectHelper;
024    import org.apache.commons.logging.Log;
025    import org.apache.commons.logging.LogFactory;
026    import org.quartz.JobDetail;
027    import org.quartz.Scheduler;
028    import org.quartz.SchedulerException;
029    import org.quartz.SchedulerFactory;
030    import org.quartz.Trigger;
031    import org.quartz.CronTrigger;
032    import org.quartz.impl.StdSchedulerFactory;
033    
034    import java.util.Map;
035    import java.net.URI;
036    
037    import com.sun.jndi.toolkit.url.Uri;
038    
039    /**
040     * A <a href="http://activemq.apache.org/camel/quartz.html">Quartz Component</a>
041     *
042     * @version $Revision:520964 $
043     */
044    public class QuartzComponent extends DefaultComponent<QuartzExchange> {
045        private static final transient Log log = LogFactory.getLog(QuartzComponent.class);
046        private SchedulerFactory factory;
047        private Scheduler scheduler;
048        private Map<Trigger, JobDetail> triggers;
049    
050        public QuartzComponent() {
051        }
052    
053        public QuartzComponent(CamelContext context) {
054            super(context);
055        }
056    
057        @Override
058        protected QuartzEndpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception {
059            QuartzEndpoint answer = new QuartzEndpoint(uri, this, getScheduler());
060    
061            // lets split the remaining into a group/name
062            URI u = new URI(uri);
063            String name;
064            String group = "Camel";
065            String path = u.getPath();
066            CronTrigger cronTrigger = null;
067            if (path != null && path.length() > 1) {
068                if (path.startsWith("/")) {
069                    path = path.substring(1);
070                }
071                int idx = path.indexOf('/');
072                if (idx > 0) {
073                    cronTrigger = new CronTrigger();
074                    name = path.substring(0, idx);
075                    String cronExpression = path.substring(idx + 1);
076                    // lets allow / instead of spaces and allow $ instead of ?
077                    cronExpression = cronExpression.replace('/', ' ');
078                    cronExpression = cronExpression.replace('$', '?');
079                    log.debug("Creating cron trigger: " + cronExpression);
080                    cronTrigger.setCronExpression(cronExpression);
081                    answer.setTrigger(cronTrigger);
082                }
083                else {
084                    name = path;
085                }
086                group = u.getHost();
087            }
088            else {
089                name = u.getHost();
090            }
091    /*
092            String[] names = ObjectHelper.splitOnCharacter(remaining, "/", 2);
093            if (names[1] != null) {
094                group = names[0];
095                name = names[1];
096            }
097            else {
098                name = names[0];
099            }
100    */
101            Trigger trigger = cronTrigger;
102            if (trigger == null) {
103                trigger = answer.getTrigger();
104            }
105            trigger.setName(name);
106            trigger.setGroup(group);
107    
108            Map triggerParameters = IntrospectionSupport.extractProperties(parameters, "trigger.");
109            Map jobParameters = IntrospectionSupport.extractProperties(parameters, "job.");
110    
111            IntrospectionSupport.setProperties(trigger, triggerParameters);
112            IntrospectionSupport.setProperties(answer.getJobDetail(), jobParameters);
113    
114            return answer;
115        }
116    
117        @Override
118        protected void doStart() throws Exception {
119            super.doStart();
120            getScheduler().start();
121        }
122    
123        @Override
124        protected void doStop() throws Exception {
125            if (scheduler != null) {
126                scheduler.shutdown();
127            }
128            super.doStop();
129        }
130    
131        // Properties
132        //-------------------------------------------------------------------------
133        public SchedulerFactory getFactory() {
134            if (factory == null) {
135                factory = createSchedulerFactory();
136            }
137            return factory;
138        }
139    
140        public void setFactory(SchedulerFactory factory) {
141            this.factory = factory;
142        }
143    
144        public Scheduler getScheduler() throws SchedulerException {
145            if (scheduler == null) {
146                scheduler = createScheduler();
147            }
148            return scheduler;
149        }
150    
151        public void setScheduler(Scheduler scheduler) {
152            this.scheduler = scheduler;
153        }
154    
155        public Map getTriggers() {
156            return triggers;
157        }
158    
159        public void setTriggers(Map triggers) {
160            this.triggers = triggers;
161        }
162    
163        // Implementation methods
164        //-------------------------------------------------------------------------
165        protected SchedulerFactory createSchedulerFactory() {
166            return new StdSchedulerFactory();
167        }
168    
169        protected Scheduler createScheduler() throws SchedulerException {
170            return getFactory().getScheduler();
171        }
172    }