/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.karaf.scheduler.core; import java.io.Serializable; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Map; import javax.xml.bind.DatatypeConverter; import org.apache.karaf.scheduler.ScheduleOptions; import org.quartz.CronExpression; import org.quartz.CronScheduleBuilder; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; /** * Scheduler options provide an extensible way of defining how to schedule a job. * @since 2.3 */ public class InternalScheduleOptions implements ScheduleOptions { public String name; public boolean canRunConcurrently = false; public Map<String, Serializable> configuration; public final String schedule; public final TriggerBuilder<? extends Trigger> trigger; public final IllegalArgumentException argumentException; public InternalScheduleOptions(Date date) { if ( date == null ) { this.trigger = null; this.argumentException = new IllegalArgumentException("Date can't be null"); } else { this.trigger = TriggerBuilder.newTrigger().startAt(date); this.argumentException = null; } this.schedule = "at(" + formatDate(date) + ")"; } public InternalScheduleOptions(Date date, int times, long period) { TriggerBuilder<? extends Trigger> trigger = null; IllegalArgumentException argumentException = null; try { if (date == null) { throw new IllegalArgumentException("Date can't be null"); } if (times < 2 && times != -1) { throw new IllegalArgumentException("Times argument must be higher than 1 or -1"); } if (period < 1) { throw new IllegalArgumentException("Period argument must be higher than 0"); } final SimpleScheduleBuilder sb; if (times == -1) { sb = SimpleScheduleBuilder.simpleSchedule().repeatForever(); } else { sb = SimpleScheduleBuilder.simpleSchedule().withRepeatCount(times - 1); } trigger = TriggerBuilder.newTrigger() .startAt(date) .withSchedule(sb.withIntervalInMilliseconds(period * 1000)); } catch (IllegalArgumentException e) { argumentException = e; } this.trigger = trigger; this.argumentException = argumentException; this.schedule = "at(" + formatDate(date) + ", " + times + ", " + period + ")"; } public InternalScheduleOptions(String expression) { TriggerBuilder<? extends Trigger> trigger = null; IllegalArgumentException argumentException = null; try { if ( expression == null ) { throw new IllegalArgumentException("Expression can't be null"); } if ( !CronExpression.isValidExpression(expression) ) { throw new IllegalArgumentException("Expression is invalid : " + expression); } trigger = TriggerBuilder.newTrigger() .withSchedule(CronScheduleBuilder.cronSchedule(expression)); } catch (IllegalArgumentException e) { argumentException = e; } this.trigger = trigger; this.argumentException = argumentException; this.schedule = "cron(" + expression + ")"; } /** * @see org.apache.karaf.scheduler.ScheduleOptions#config(java.util.Map) */ public ScheduleOptions config(final Map<String, Serializable> config) { this.configuration = config; return this; } /** * @see org.apache.karaf.scheduler.ScheduleOptions#name(java.lang.String) */ public ScheduleOptions name(final String name) { this.name = name; return this; } /** * @see org.apache.karaf.scheduler.ScheduleOptions#canRunConcurrently(boolean) */ public ScheduleOptions canRunConcurrently(final boolean flag) { this.canRunConcurrently = flag; return this; } @Override public String name() { return this.name; } @Override public boolean canRunConcurrently() { return this.canRunConcurrently; } @Override public String schedule() { return schedule; } private String formatDate(Date date) { if (date == null) { return "null"; } Calendar c = GregorianCalendar.getInstance(); c.setTime(date); return DatatypeConverter.printDateTime(c); } }