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.routepolicy.quartz;
018    
019    import java.util.Date;
020    import java.util.concurrent.TimeUnit;
021    
022    import org.apache.camel.Route;
023    import org.apache.camel.component.quartz.QuartzComponent;
024    import org.apache.commons.logging.Log;
025    import org.apache.commons.logging.LogFactory;
026    import org.quartz.SimpleTrigger;
027    import org.quartz.Trigger;
028    
029    public class SimpleScheduledRoutePolicy extends ScheduledRoutePolicy {
030        private static final transient Log LOG = LogFactory.getLog(CronScheduledRoutePolicy.class);
031        private Date routeStartDate;
032        private int routeStartRepeatCount;
033        private long routeStartRepeatInterval;
034        private Date routeStopDate;
035        private int routeStopRepeatCount;
036        private long routeStopRepeatInterval;
037        private Date routeSuspendDate; 
038        private int routeSuspendRepeatCount;
039        private long routeSuspendRepeatInterval;
040        private Date routeResumeDate; 
041        private int routeResumeRepeatCount;
042        private long routeResumeRepeatInterval;    
043        
044        public void onInit(Route route) {   
045            try {       
046                QuartzComponent quartz = route.getRouteContext().getCamelContext().getComponent("quartz", QuartzComponent.class);
047                setScheduler(quartz.getScheduler());
048                
049                if (getRouteStopGracePeriod() == 0) {
050                    setRouteStopGracePeriod(10000);
051                }
052             
053                if (getTimeUnit() == null) {
054                    setTimeUnit(TimeUnit.MILLISECONDS);
055                }
056                
057                if ((getRouteStartDate() == null) && (getRouteStopDate() == null) && (getRouteSuspendDate() == null) && (getRouteResumeDate() == null)) {
058                    if (LOG.isWarnEnabled()) {
059                        LOG.warn("Scheduled Route Policy for route " + route.getId() + " is not set since the no start, stop and/or suspend times are specified");
060                    }
061                    return;
062                }
063            
064                if (scheduledRouteDetails == null) {
065                    scheduledRouteDetails = new ScheduledRouteDetails();
066                    scheduledRouteDetails.setRoute(route);
067                    
068                    if (getRouteStartDate() != null) {
069                        scheduleRoute(Action.START); 
070                    }
071    
072                    if (getRouteStopDate() != null) {
073                        scheduleRoute(Action.STOP);
074                    }
075                    
076                    if (getRouteSuspendDate() != null) {
077                        scheduleRoute(Action.SUSPEND);
078                    }
079                    if (getRouteResumeDate() != null) {
080                        scheduleRoute(Action.RESUME);
081                    }
082                }
083    
084                getScheduler().start();
085            } catch (Exception e) {
086                handleException(e);
087            }        
088        }   
089    
090        @Override
091        protected void doStop() throws Exception {
092            if (scheduledRouteDetails.getStartJobDetail() != null) {
093                deleteRouteJob(Action.START);
094            }
095            if (scheduledRouteDetails.getStopJobDetail() != null) {
096                deleteRouteJob(Action.STOP);
097            }
098            if (scheduledRouteDetails.getSuspendJobDetail() != null) {
099                deleteRouteJob(Action.SUSPEND);
100            }
101            if (scheduledRouteDetails.getResumeJobDetail() != null) {
102                deleteRouteJob(Action.RESUME);
103            }
104        }
105    
106        /* (non-Javadoc)
107         * @see org.apache.camel.routepolicy.quartz.ScheduledRoutePolicy#createTrigger(org.apache.camel.routepolicy.quartz.ScheduledRoutePolicyConstants.Action)
108         */
109        @Override
110        protected Trigger createTrigger(Action action, Route route) throws Exception {
111            SimpleTrigger trigger = null;
112            
113            if (action == Action.START) {
114                trigger = new SimpleTrigger(TRIGGER_START + route.getId(), TRIGGER_GROUP + route.getId(), 
115                    getRouteStartDate(), null, getRouteStartRepeatCount(), getRouteStartRepeatInterval());
116            } else if (action == Action.STOP) {
117                trigger = new SimpleTrigger(TRIGGER_STOP + route.getId(), TRIGGER_GROUP + route.getId(), 
118                    getRouteStopDate(), null, getRouteStopRepeatCount(), getRouteStopRepeatInterval());
119            } else if (action == Action.SUSPEND) {
120                trigger = new SimpleTrigger(TRIGGER_SUSPEND + route.getId(), TRIGGER_GROUP + route.getId(), 
121                        getRouteSuspendDate(), null, getRouteSuspendRepeatCount(), getRouteSuspendRepeatInterval());
122            } else if (action == Action.RESUME) {
123                trigger = new SimpleTrigger(TRIGGER_RESUME + route.getId(), TRIGGER_GROUP + route.getId(), 
124                        getRouteResumeDate(), null, getRouteResumeRepeatCount(), getRouteResumeRepeatInterval());
125            }
126            
127            return trigger;
128        }
129    
130        
131        
132        public Date getRouteStartDate() {
133            return routeStartDate;
134        }
135    
136        public void setRouteStartDate(Date routeStartDate) {
137            this.routeStartDate = routeStartDate;
138        }
139    
140        public Date getRouteStopDate() {
141            return routeStopDate;
142        }
143    
144        public void setRouteStopDate(Date routeStopDate) {
145            this.routeStopDate = routeStopDate;
146        }
147    
148        public Date getRouteSuspendDate() {
149            return routeSuspendDate;
150        }
151    
152        public void setRouteSuspendDate(Date routeSuspendDate) {
153            this.routeSuspendDate = routeSuspendDate;
154        }
155    
156        public int getRouteStartRepeatCount() {
157            return routeStartRepeatCount;
158        }
159    
160        public void setRouteStartRepeatCount(int routeStartRepeatCount) {
161            this.routeStartRepeatCount = routeStartRepeatCount;
162        }
163    
164        public long getRouteStartRepeatInterval() {
165            return routeStartRepeatInterval;
166        }
167    
168        public void setRouteStartRepeatInterval(long routeStartRepeatInterval) {
169            this.routeStartRepeatInterval = routeStartRepeatInterval;
170        }
171    
172        public int getRouteStopRepeatCount() {
173            return routeStopRepeatCount;
174        }
175    
176        public void setRouteStopRepeatCount(int routeStopRepeatCount) {
177            this.routeStopRepeatCount = routeStopRepeatCount;
178        }
179    
180        public long getRouteStopRepeatInterval() {
181            return routeStopRepeatInterval;
182        }
183    
184        public void setRouteStopRepeatInterval(long routeStopRepeatInterval) {
185            this.routeStopRepeatInterval = routeStopRepeatInterval;
186        }
187    
188        public int getRouteSuspendRepeatCount() {
189            return routeSuspendRepeatCount;
190        }
191    
192        public void setRouteSuspendRepeatCount(int routeSuspendRepeatCount) {
193            this.routeSuspendRepeatCount = routeSuspendRepeatCount;
194        }
195    
196        public long getRouteSuspendRepeatInterval() {
197            return routeSuspendRepeatInterval;
198        }
199    
200        public void setRouteSuspendRepeatInterval(long routeSuspendRepeatInterval) {
201            this.routeSuspendRepeatInterval = routeSuspendRepeatInterval;
202        }
203    
204        public void setRouteResumeDate(Date routeResumeDate) {
205            this.routeResumeDate = routeResumeDate;
206        }
207    
208        public Date getRouteResumeDate() {
209            return routeResumeDate;
210        }
211    
212        public void setRouteResumeRepeatCount(int routeResumeRepeatCount) {
213            this.routeResumeRepeatCount = routeResumeRepeatCount;
214        }
215    
216        public int getRouteResumeRepeatCount() {
217            return routeResumeRepeatCount;
218        }
219    
220        public void setRouteResumeRepeatInterval(long routeResumeRepeatInterval) {
221            this.routeResumeRepeatInterval = routeResumeRepeatInterval;
222        }
223    
224        public long getRouteResumeRepeatInterval() {
225            return routeResumeRepeatInterval;
226        }
227        
228    }