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.camel.util.ObjectHelper;
025    import org.quartz.SimpleTrigger;
026    import org.quartz.Trigger;
027    import org.slf4j.Logger;
028    import org.slf4j.LoggerFactory;
029    
030    public class SimpleScheduledRoutePolicy extends ScheduledRoutePolicy {
031        private static final transient Logger LOG = LoggerFactory.getLogger(CronScheduledRoutePolicy.class);
032        private Date routeStartDate;
033        private int routeStartRepeatCount;
034        private long routeStartRepeatInterval;
035        private Date routeStopDate;
036        private int routeStopRepeatCount;
037        private long routeStopRepeatInterval;
038        private Date routeSuspendDate; 
039        private int routeSuspendRepeatCount;
040        private long routeSuspendRepeatInterval;
041        private Date routeResumeDate; 
042        private int routeResumeRepeatCount;
043        private long routeResumeRepeatInterval;    
044        
045        public void onInit(Route route) {
046            try {
047                doOnInit(route);
048            } catch (Exception e) {
049                throw ObjectHelper.wrapRuntimeCamelException(e);
050            }
051        }
052    
053        protected void doOnInit(Route route) throws Exception {
054            QuartzComponent quartz = route.getRouteContext().getCamelContext().getComponent("quartz", QuartzComponent.class);
055            setScheduler(quartz.getScheduler());
056                
057            // Important: do not start scheduler as QuartzComponent does that automatic
058            // when CamelContext has been fully initialized and started
059    
060            if (getRouteStopGracePeriod() == 0) {
061                setRouteStopGracePeriod(10000);
062            }
063    
064            if (getTimeUnit() == null) {
065                setTimeUnit(TimeUnit.MILLISECONDS);
066            }
067    
068            // validate time options has been configured
069            if ((getRouteStartDate() == null) && (getRouteStopDate() == null) && (getRouteSuspendDate() == null) && (getRouteResumeDate() == null)) {
070                throw new IllegalArgumentException("Scheduled Route Policy for route {} has no stop/stop/suspend/resume times specified");
071            }
072    
073            if (scheduledRouteDetails == null) {
074                scheduledRouteDetails = new ScheduledRouteDetails();
075                scheduledRouteDetails.setRoute(route);
076    
077                if (getRouteStartDate() != null) {
078                    scheduleRoute(Action.START);
079                }
080                if (getRouteStopDate() != null) {
081                    scheduleRoute(Action.STOP);
082                }
083    
084                if (getRouteSuspendDate() != null) {
085                    scheduleRoute(Action.SUSPEND);
086                }
087                if (getRouteResumeDate() != null) {
088                    scheduleRoute(Action.RESUME);
089                }
090            }
091        }
092    
093        @Override
094        protected void doStop() throws Exception {
095            if (scheduledRouteDetails.getStartJobDetail() != null) {
096                deleteRouteJob(Action.START);
097            }
098            if (scheduledRouteDetails.getStopJobDetail() != null) {
099                deleteRouteJob(Action.STOP);
100            }
101            if (scheduledRouteDetails.getSuspendJobDetail() != null) {
102                deleteRouteJob(Action.SUSPEND);
103            }
104            if (scheduledRouteDetails.getResumeJobDetail() != null) {
105                deleteRouteJob(Action.RESUME);
106            }
107        }
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        public Date getRouteStartDate() {
131            return routeStartDate;
132        }
133    
134        public void setRouteStartDate(Date routeStartDate) {
135            this.routeStartDate = routeStartDate;
136        }
137    
138        public Date getRouteStopDate() {
139            return routeStopDate;
140        }
141    
142        public void setRouteStopDate(Date routeStopDate) {
143            this.routeStopDate = routeStopDate;
144        }
145    
146        public Date getRouteSuspendDate() {
147            return routeSuspendDate;
148        }
149    
150        public void setRouteSuspendDate(Date routeSuspendDate) {
151            this.routeSuspendDate = routeSuspendDate;
152        }
153    
154        public int getRouteStartRepeatCount() {
155            return routeStartRepeatCount;
156        }
157    
158        public void setRouteStartRepeatCount(int routeStartRepeatCount) {
159            this.routeStartRepeatCount = routeStartRepeatCount;
160        }
161    
162        public long getRouteStartRepeatInterval() {
163            return routeStartRepeatInterval;
164        }
165    
166        public void setRouteStartRepeatInterval(long routeStartRepeatInterval) {
167            this.routeStartRepeatInterval = routeStartRepeatInterval;
168        }
169    
170        public int getRouteStopRepeatCount() {
171            return routeStopRepeatCount;
172        }
173    
174        public void setRouteStopRepeatCount(int routeStopRepeatCount) {
175            this.routeStopRepeatCount = routeStopRepeatCount;
176        }
177    
178        public long getRouteStopRepeatInterval() {
179            return routeStopRepeatInterval;
180        }
181    
182        public void setRouteStopRepeatInterval(long routeStopRepeatInterval) {
183            this.routeStopRepeatInterval = routeStopRepeatInterval;
184        }
185    
186        public int getRouteSuspendRepeatCount() {
187            return routeSuspendRepeatCount;
188        }
189    
190        public void setRouteSuspendRepeatCount(int routeSuspendRepeatCount) {
191            this.routeSuspendRepeatCount = routeSuspendRepeatCount;
192        }
193    
194        public long getRouteSuspendRepeatInterval() {
195            return routeSuspendRepeatInterval;
196        }
197    
198        public void setRouteSuspendRepeatInterval(long routeSuspendRepeatInterval) {
199            this.routeSuspendRepeatInterval = routeSuspendRepeatInterval;
200        }
201    
202        public void setRouteResumeDate(Date routeResumeDate) {
203            this.routeResumeDate = routeResumeDate;
204        }
205    
206        public Date getRouteResumeDate() {
207            return routeResumeDate;
208        }
209    
210        public void setRouteResumeRepeatCount(int routeResumeRepeatCount) {
211            this.routeResumeRepeatCount = routeResumeRepeatCount;
212        }
213    
214        public int getRouteResumeRepeatCount() {
215            return routeResumeRepeatCount;
216        }
217    
218        public void setRouteResumeRepeatInterval(long routeResumeRepeatInterval) {
219            this.routeResumeRepeatInterval = routeResumeRepeatInterval;
220        }
221    
222        public long getRouteResumeRepeatInterval() {
223            return routeResumeRepeatInterval;
224        }
225        
226    }