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 package org.apache.camel.component.quartz; 018 019 import java.net.URI; 020 import java.util.Map; 021 022 import org.apache.camel.CamelContext; 023 import org.apache.camel.impl.DefaultComponent; 024 import org.apache.camel.util.IntrospectionSupport; 025 import org.apache.commons.logging.Log; 026 import org.apache.commons.logging.LogFactory; 027 028 import org.quartz.CronTrigger; 029 import org.quartz.JobDetail; 030 import org.quartz.Scheduler; 031 import org.quartz.SchedulerException; 032 import org.quartz.SchedulerFactory; 033 import org.quartz.Trigger; 034 import org.quartz.impl.StdSchedulerFactory; 035 036 /** 037 * A <a href="http://activemq.apache.org/camel/quartz.html">Quartz Component</a> 038 * 039 * @version $Revision:520964 $ 040 */ 041 public class QuartzComponent extends DefaultComponent<QuartzExchange> { 042 private static final transient Log LOG = LogFactory.getLog(QuartzComponent.class); 043 private SchedulerFactory factory; 044 private Scheduler scheduler; 045 private Map<Trigger, JobDetail> triggers; 046 047 public QuartzComponent() { 048 } 049 050 public QuartzComponent(CamelContext context) { 051 super(context); 052 } 053 054 @Override 055 protected QuartzEndpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception { 056 QuartzEndpoint answer = new QuartzEndpoint(uri, this, getScheduler()); 057 058 // lets split the remaining into a group/name 059 URI u = new URI(uri); 060 String name; 061 String group = "Camel"; 062 String path = u.getPath(); 063 CronTrigger cronTrigger = null; 064 if (path != null && path.length() > 1) { 065 if (path.startsWith("/")) { 066 path = path.substring(1); 067 } 068 int idx = path.indexOf('/'); 069 if (idx > 0) { 070 cronTrigger = new CronTrigger(); 071 name = path.substring(0, idx); 072 String cronExpression = path.substring(idx + 1); 073 // lets allow / instead of spaces and allow $ instead of ? 074 cronExpression = cronExpression.replace('/', ' '); 075 cronExpression = cronExpression.replace('$', '?'); 076 LOG.debug("Creating cron trigger: " + cronExpression); 077 cronTrigger.setCronExpression(cronExpression); 078 answer.setTrigger(cronTrigger); 079 } else { 080 name = path; 081 } 082 group = u.getHost(); 083 } else { 084 name = u.getHost(); 085 } 086 /* 087 * String[] names = ObjectHelper.splitOnCharacter(remaining, "/", 2); if 088 * (names[1] != null) { group = names[0]; name = names[1]; } else { name = 089 * names[0]; } 090 */ 091 Trigger trigger = cronTrigger; 092 if (trigger == null) { 093 trigger = answer.getTrigger(); 094 } 095 trigger.setName(name); 096 trigger.setGroup(group); 097 098 Map triggerParameters = IntrospectionSupport.extractProperties(parameters, "trigger."); 099 Map jobParameters = IntrospectionSupport.extractProperties(parameters, "job."); 100 101 IntrospectionSupport.setProperties(trigger, triggerParameters); 102 IntrospectionSupport.setProperties(answer.getJobDetail(), jobParameters); 103 104 return answer; 105 } 106 107 @Override 108 protected void doStart() throws Exception { 109 super.doStart(); 110 getScheduler().start(); 111 } 112 113 @Override 114 protected void doStop() throws Exception { 115 if (scheduler != null) { 116 scheduler.shutdown(); 117 } 118 super.doStop(); 119 } 120 121 // Properties 122 // ------------------------------------------------------------------------- 123 public SchedulerFactory getFactory() { 124 if (factory == null) { 125 factory = createSchedulerFactory(); 126 } 127 return factory; 128 } 129 130 public void setFactory(SchedulerFactory factory) { 131 this.factory = factory; 132 } 133 134 public Scheduler getScheduler() throws SchedulerException { 135 if (scheduler == null) { 136 scheduler = createScheduler(); 137 } 138 return scheduler; 139 } 140 141 public void setScheduler(Scheduler scheduler) { 142 this.scheduler = scheduler; 143 } 144 145 public Map getTriggers() { 146 return triggers; 147 } 148 149 public void setTriggers(Map triggers) { 150 this.triggers = triggers; 151 } 152 153 // Implementation methods 154 // ------------------------------------------------------------------------- 155 protected SchedulerFactory createSchedulerFactory() { 156 return new StdSchedulerFactory(); 157 } 158 159 protected Scheduler createScheduler() throws SchedulerException { 160 return getFactory().getScheduler(); 161 } 162 }