diff options
Diffstat (limited to 'pki/base/common/src/com/netscape/cmscore/jobs')
4 files changed, 0 insertions, 1116 deletions
diff --git a/pki/base/common/src/com/netscape/cmscore/jobs/CronItem.java b/pki/base/common/src/com/netscape/cmscore/jobs/CronItem.java deleted file mode 100644 index 91574c6cc..000000000 --- a/pki/base/common/src/com/netscape/cmscore/jobs/CronItem.java +++ /dev/null @@ -1,168 +0,0 @@ -// --- BEGIN COPYRIGHT BLOCK --- -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// (C) 2007 Red Hat, Inc. -// All rights reserved. -// --- END COPYRIGHT BLOCK --- -package com.netscape.cmscore.jobs; - -import java.util.StringTokenizer; -import java.util.Vector; - -import com.netscape.certsrv.apps.CMS; -import com.netscape.certsrv.base.EBaseException; -import com.netscape.certsrv.logging.ILogger; - -/** - * class representing one Job cron item - * <p> - * here, an "item" refers to one of the 5 fields in a cron string; "element" refers to any comma-deliminated element in - * an "item"...which includes both numbers and '-' separated ranges. - * <p> - * for each of the 5 cron fields, it's represented as a CronItem - * - * @author cfu - * @version $Revision$, $Date$ - */ -public class CronItem { - protected static final String ALL = "*"; - protected static final String DELIM = ","; - protected static final String RANGE = "-"; - private ILogger mLogger = CMS.getLogger(); - - int mMin; // minimum - int mMax; // maximum - - // store all elements in a field. - // elements can either be numbers or ranges (CronRange) - protected Vector<CronRange> mElements = new Vector<CronRange>(); - - public CronItem(int min, int max) { - mMin = min; - mMax = max; - } - - /** - * parses and sets a string cron item - * - * @param sItem the string representing an item of a cron string. - * item can be potentially comma separated with ranges specified - * with '-'s - */ - public void set(String sItem) throws EBaseException { - - if (sItem.equals(ALL)) { - // System.out.println("CronItem set(): item is ALL"); - CronRange cr = new CronRange(); - - cr.setBegin(mMin); - cr.setEnd(mMax); - mElements.addElement(cr); - } else { - // break comma-separated elements - StringTokenizer st = new StringTokenizer(sItem, DELIM); - - while (st.hasMoreTokens()) { - String tok = (String) st.nextToken(); - // elements could be ranges (separated by '-') - int r = tok.indexOf(RANGE); - - if (r != -1) { - // potential range - String sBegin = tok.substring(0, r); - int begin = 0; - int end = 0; - - try { - begin = Integer.parseInt(sBegin); - } catch (NumberFormatException e) { - // throw ... - log(ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_JOBS_INVALID_TOKEN", tok, e.toString())); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - String sEnd = tok.substring(r + 1, tok.length()); - - try { - end = Integer.parseInt(sEnd); - } catch (NumberFormatException e) { - // throw ... - log(ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_JOBS_INVALID_TOKEN", tok, e.toString())); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - // got both begin and end for range - CronRange cr = new CronRange(); - - cr.setBegin(begin); - cr.setEnd(end); - // check range - if (!cr.isValidRange(mMin, mMax)) { - // throw... - log(ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_JOBS_INVALID_RANGE", - tok)); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - // System.out.println("CronItem set(): adding a range"); - mElements.addElement(cr); - } else { - // number element, begin and end are the same - try { - CronRange cr = new CronRange(); - int num = Integer.parseInt(tok); - - cr.setBegin(num); - cr.setEnd(num); - // check range - if (!cr.isValidRange(mMin, mMax)) { - // throw... - log(ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_JOBS_INVALID_MIN_MAX_RANGE", Integer.toString(mMin), - Integer.toString(mMax))); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - // System.out.println("CronItem set(): adding a number"); - mElements.addElement(cr); - } catch (NumberFormatException e) { - // throw... - log(ILogger.LL_FAILURE, - "invalid item in cron: " + tok); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - } - } - } - } - - /** - * get the vector stuffed with elements where each element is - * represented as CronRange - * - * @return a vector of CronRanges - */ - public Vector<CronRange> getElements() { - return mElements; - } - - /** - * logs an entry in the log file. - */ - protected void log(int level, String msg) { - if (mLogger == null) - return; - mLogger.log(ILogger.EV_SYSTEM, ILogger.S_OTHER, - level, "jobs/CronItem: " + msg); - } -} diff --git a/pki/base/common/src/com/netscape/cmscore/jobs/CronRange.java b/pki/base/common/src/com/netscape/cmscore/jobs/CronRange.java deleted file mode 100644 index af5ae2a51..000000000 --- a/pki/base/common/src/com/netscape/cmscore/jobs/CronRange.java +++ /dev/null @@ -1,84 +0,0 @@ -// --- BEGIN COPYRIGHT BLOCK --- -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// (C) 2007 Red Hat, Inc. -// All rights reserved. -// --- END COPYRIGHT BLOCK --- -package com.netscape.cmscore.jobs; - -/** - * class representing one Job cron element - * <p> - * here, an "item" refers to one of the 5 fields in a cron string; "element" refers to any comma-deliminated element in - * an "item"...which includes both numbers and '-' separated ranges. - * <p> - * an Element can contain either an integer number or a range specified as CronRange. In case of integer numbers, begin - * and end are of the same value - * - * @author cfu - * @version $Revision$, $Date$ - */ -public class CronRange { - int mBegin = 0; - int mEnd = 0; - - public CronRange() { - } - - /** - * sets the lower boundary value of the range - */ - public void setBegin(int i) { - mBegin = i; - } - - /** - * gets the lower boundary value of the range - */ - public int getBegin() { - return mBegin; - } - - /** - * sets the higher boundary value of the range - */ - public void setEnd(int i) { - mEnd = i; - } - - /** - * gets the higher boundary value of the range - */ - public int getEnd() { - return mEnd; - } - - /** - * checks to see if the lower and higher boundary values are - * within the min/max. - * - * @param min the minimum value one can specify in this field - * @param max the maximum value one can specify in this field - * @return a boolean (true/false) on whether the begin/end values - * are within the min/max passed in the params - */ - public boolean isValidRange(int min, int max) { - if ((mEnd < mBegin) || - (mBegin < min) || - (mEnd > max)) - return false; - else - return true; - } -} diff --git a/pki/base/common/src/com/netscape/cmscore/jobs/JobCron.java b/pki/base/common/src/com/netscape/cmscore/jobs/JobCron.java deleted file mode 100644 index 164c1250e..000000000 --- a/pki/base/common/src/com/netscape/cmscore/jobs/JobCron.java +++ /dev/null @@ -1,355 +0,0 @@ -// --- BEGIN COPYRIGHT BLOCK --- -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// (C) 2007 Red Hat, Inc. -// All rights reserved. -// --- END COPYRIGHT BLOCK --- -package com.netscape.cmscore.jobs; - -import java.util.Calendar; -import java.util.Enumeration; -import java.util.StringTokenizer; -import java.util.Vector; - -import com.netscape.certsrv.apps.CMS; -import com.netscape.certsrv.base.EBaseException; -import com.netscape.certsrv.jobs.IJobCron; -import com.netscape.certsrv.logging.ILogger; - -/** - * class representing one Job cron information - * <p> - * here, an "item" refers to one of the 5 fields in a cron string; "element" refers to any comma-deliminated element in - * an "item"...which includes both numbers and '-' separated ranges. A cron string in the configuration takes the - * following format: <i>minute (0-59), hour (0-23), day of the month (1-31), month of the year (1-12), day of the week - * (0-6 with 0=Sunday)</i> - * <p> - * e.g. jobsScheduler.job.rnJob1.cron=30 11,23 * * 1-5 In this example, the job "rnJob1" will be executed from Monday - * through Friday, at 11:30am and 11:30pm. - * <p> - * - * @author cfu - * @version $Revision$, $Date$ - */ -public class JobCron implements IJobCron { - - /** - * CRON_MINUTE, CRON_HOUR, CRON_DAY_OF_MONTH, CRON_MONTH_OF_YEAR, - * and CRON_DAY_OF_WEEK are to be used in <b>getItem()</b> to - * retrieve the corresponding <b>CronItem</b> - */ - public static final String CRON_MINUTE = "minute"; - public static final String CRON_HOUR = "hour"; - public static final String CRON_DAY_OF_MONTH = "dom"; - public static final String CRON_MONTH_OF_YEAR = "moy"; - public static final String CRON_DAY_OF_WEEK = "dow"; - private ILogger mLogger = CMS.getLogger(); - - String mCronString = null; - - CronItem cMinute = null; - CronItem cHour = null; - CronItem cDOM = null; - CronItem cMOY = null; - CronItem cDOW = null; - - public JobCron(String cronString) - throws EBaseException { - mCronString = cronString; - - // create all 5 items in the cron - cMinute = new CronItem(0, 59); - cHour = new CronItem(0, 23); - cDOM = new CronItem(1, 31); - cMOY = new CronItem(1, 12); - cDOW = new CronItem(0, 6); // 0=Sunday - - cronToVals(mCronString); - } - - private void cronToVals(String cronString) - throws EBaseException { - StringTokenizer st = new StringTokenizer(cronString); - - String sMinute = null; - String sHour = null; - String sDayOMonth = null; - String sMonthOYear = null; - String sDayOWeek = null; - - try { - if (st.hasMoreTokens()) { - sMinute = st.nextToken(); - cMinute.set(sMinute); - } - } catch (EBaseException e) { - log(ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_JOBS_INVALID_MIN", e.toString())); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - - try { - if (st.hasMoreTokens()) { - sHour = st.nextToken(); - cHour.set(sHour); - } - } catch (EBaseException e) { - log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSCORE_JOBS_INVALID_HOUR", e.toString())); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - - if (st.hasMoreTokens()) { - sDayOMonth = st.nextToken(); - // cDOM.set(sDayOMonth); - } - - try { - if (st.hasMoreTokens()) { - sMonthOYear = st.nextToken(); - cMOY.set(sMonthOYear); - } - } catch (EBaseException e) { - log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSCORE_JOBS_INVALID_MONTH", e.toString())); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - - if (st.hasMoreTokens()) { - sDayOWeek = st.nextToken(); - // cDOW.set(sDayOWeek); - } - - /** - * day-of-month or day-of-week, or both? - * if only one of them is '*', the non '*' one prevails, - * the '*' one will remain empty (no elements) - */ - // day-of-week - if ((sDayOMonth != null) - && sDayOMonth.equals(CronItem.ALL) && (sDayOWeek != null) && !sDayOWeek.equals(CronItem.ALL)) { - try { - cDOW.set(sDayOWeek); - } catch (EBaseException e) { - log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSCORE_JOBS_INVALID_DAY_OF_WEEK", e.toString())); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - } else if ((sDayOMonth != null) - && !sDayOMonth.equals(CronItem.ALL) && (sDayOWeek != null) && sDayOWeek.equals(CronItem.ALL)) { - try { - cDOM.set(sDayOMonth); - } catch (EBaseException e) { - log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSCORE_JOBS_INVALID_DAY_OF_MONTH", e.toString())); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - } else { // if both '*', every day, if neither is '*', do both - try { - if (sDayOWeek != null) { - cDOW.set(sDayOWeek); - } - } catch (EBaseException e) { - log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSCORE_JOBS_INVALID_DAY_OF_WEEK", e.toString())); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - try { - if (sDayOMonth != null) { - cDOM.set(sDayOMonth); - } - } catch (EBaseException e) { - log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSCORE_JOBS_INVALID_DAY_OF_MONTH", e.toString())); - throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_JOB_CRON")); - } - } - } - - /** - * retrieves the cron item - * - * @param item name of the item. must be one of the <b>CRON_*</b> - * strings defined in this class - * @return an instance of the CronItem class which represents the - * requested cron item - */ - public CronItem getItem(String item) { - if (item.equals(CRON_MINUTE)) { - return cMinute; - } else if (item.equals(CRON_HOUR)) { - return cHour; - } else if (item.equals(CRON_DAY_OF_MONTH)) { - return cDOM; - } else if (item.equals(CRON_MONTH_OF_YEAR)) { - return cMOY; - } else if (item.equals(CRON_DAY_OF_WEEK)) { - return cDOW; - } else { - // throw... - } - - return null; - } - - /** - * Does the element fit any element in the item - * - * @param element the element of "now" in cron format - * @param item the item consists of a vector of elements - * @return boolean (true/false) on whether the element is one of - * the elements in the item - */ - boolean isElement(int element, Vector<CronRange> item) { - // loop through all of the elements of an item - for (Enumeration<CronRange> e = item.elements(); e.hasMoreElements();) { - CronRange cElement = e.nextElement(); - - // is a number - if (cElement.getBegin() == cElement.getEnd()) { - if (element == cElement.getBegin()) { - return true; - } - } else { // is a range - if ((element >= cElement.getBegin()) && - (element <= cElement.getEnd())) { - return true; - } - } - } - // no fit - return false; - } - - /** - * convert the day of the week representation from Calendar to - * cron - * - * @param time the Calendar value represents a moment of time - * @return an integer value that represents a cron Day-Of-Week - * element - */ - public int DOW_cal2cron(Calendar time) { - int calDow = time.get(Calendar.DAY_OF_WEEK); - int cronDow = 0; // default should never be used - - // convert the Calendar representation of dow to the cron one - switch (calDow) { - case Calendar.SUNDAY: - cronDow = 0; - break; - - case Calendar.MONDAY: - cronDow = 1; - break; - - case Calendar.TUESDAY: - cronDow = 2; - break; - - case Calendar.WEDNESDAY: - cronDow = 3; - break; - - case Calendar.THURSDAY: - cronDow = 4; - break; - - case Calendar.FRIDAY: - cronDow = 5; - break; - - case Calendar.SATURDAY: - cronDow = 6; - break; - - default: - throw new IllegalArgumentException(); - } - - return cronDow; - } - - /** - * convert the month of year representation from Calendar to cron - * - * @param time the Calendar value represents a moment of time - * @return an integer value that represents a cron Month-Of-Year - * element - */ - public int MOY_cal2cron(Calendar time) { - int calMoy = time.get(Calendar.MONTH); - int cronMoy = 0; - - // convert the Calendar representation of moy to the cron one - switch (calMoy) { - case Calendar.JANUARY: - cronMoy = 1; - break; - - case Calendar.FEBRUARY: - cronMoy = 2; - break; - - case Calendar.MARCH: - cronMoy = 3; - break; - - case Calendar.APRIL: - cronMoy = 4; - break; - - case Calendar.MAY: - cronMoy = 5; - break; - - case Calendar.JUNE: - cronMoy = 6; - break; - - case Calendar.JULY: - cronMoy = 7; - break; - - case Calendar.AUGUST: - cronMoy = 8; - break; - - case Calendar.SEPTEMBER: - cronMoy = 9; - break; - - case Calendar.OCTOBER: - cronMoy = 10; - break; - - case Calendar.NOVEMBER: - cronMoy = 11; - break; - - case Calendar.DECEMBER: - cronMoy = 12; - break; - - default: - throw new IllegalArgumentException(); - } - - return cronMoy; - } - - /** - * logs an entry in the log file. - */ - protected void log(int level, String msg) { - if (mLogger == null) - return; - mLogger.log(ILogger.EV_SYSTEM, ILogger.S_OTHER, - level, msg); - } -} diff --git a/pki/base/common/src/com/netscape/cmscore/jobs/JobsScheduler.java b/pki/base/common/src/com/netscape/cmscore/jobs/JobsScheduler.java deleted file mode 100644 index b35f8c340..000000000 --- a/pki/base/common/src/com/netscape/cmscore/jobs/JobsScheduler.java +++ /dev/null @@ -1,509 +0,0 @@ -// --- BEGIN COPYRIGHT BLOCK --- -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -// -// (C) 2007 Red Hat, Inc. -// All rights reserved. -// --- END COPYRIGHT BLOCK --- -package com.netscape.cmscore.jobs; - -import java.util.Calendar; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Vector; - -import com.netscape.certsrv.apps.CMS; -import com.netscape.certsrv.base.EBaseException; -import com.netscape.certsrv.base.IConfigStore; -import com.netscape.certsrv.base.ISubsystem; -import com.netscape.certsrv.jobs.EJobsException; -import com.netscape.certsrv.jobs.IJob; -import com.netscape.certsrv.jobs.IJobCron; -import com.netscape.certsrv.jobs.IJobsScheduler; -import com.netscape.certsrv.jobs.JobPlugin; -import com.netscape.certsrv.logging.ILogger; -import com.netscape.cmscore.util.Debug; - -/** - * This is a daemon thread that handles scheduled jobs like cron would - * do with different jobs. This daemon wakes up at a pre-configured - * interval to see - * if there is any job to be done, if so, a thread is created to execute - * the job(s). - * <p> - * The interval <b>jobsScheduler.interval</b> in the configuration is specified as number of minutes. If not set, the - * default is 1 minute. Note that the cron specification for each job CAN NOT be finer than the granularity of the - * Scheduler daemon interval. For example, if the daemon interval is set to 5 minute, a job cron for every minute at 7am - * on each Tuesday (e.g. * 7 * * 2) will result in the execution of the job thread only once every 5 minutes during that - * hour. <b>The inteval value is recommended at 1 minute, setting it otherwise has the potential of forever missing the - * beat</b>. Use with caution. - * - * @author cfu - * @see JobCron - * @version $Revision$, $Date$ - */ -public class JobsScheduler implements Runnable, IJobsScheduler { - - protected static final long MINUTE_MILLI = 60000; - protected static final String DELIM = ","; - - /** - * Scheduler thread doing job scheduling - */ - protected String mId = ID; - protected Thread mScheduleThread = null; - - public Hashtable<String, JobPlugin> mJobPlugins = new Hashtable<String, JobPlugin>(); - public Hashtable<String, IJob> mJobs = new Hashtable<String, IJob>(); - private Hashtable<String, Thread> mJobThreads = new Hashtable<String, Thread>(); - - private IConfigStore mConfig = null; - private ILogger mLogger = null; - - // in milliseconds. daemon wakeup interval, default 1 minute. - private long mInterval = 0; - - // singleton enforcement - - private static JobsScheduler mInstance = new JobsScheduler(); - - public static JobsScheduler getInstance() { - return mInstance; - } - - // end singleton enforcement. - - private JobsScheduler() { - } - - /** - * read from the config file all implementations of Jobs, - * register and initialize them - * <p> - * the config params have the following formats: jobScheduler.impl.[implementation name].class=[package name] - * jobScheduler.job.[job name].pluginName=[implementation name] jobScheduler.job.[job name].cron=[crontab format] - * jobScheduler.job.[job name].[any job specific params]=[values] - * - * @param config jobsScheduler configStore - */ - public void init(ISubsystem owner, IConfigStore config) - throws EBaseException, EJobsException { - mLogger = CMS.getLogger(); - - // read in config parameters and set variables - mConfig = config; - - // getting/setting interval - int i; - - try { - i = mConfig.getInteger(PROP_INTERVAL); - } catch (Exception e) { - i = 1; // default 1 minute - } - setInterval(i); - - IConfigStore c = mConfig.getSubStore(PROP_IMPL); - Enumeration<String> mImpls = c.getSubStoreNames(); - - // register all job plugins - while (mImpls.hasMoreElements()) { - String id = mImpls.nextElement(); - String pluginPath = c.getString(id + "." + PROP_CLASS); - - JobPlugin plugin = new JobPlugin(id, pluginPath); - - mJobPlugins.put(id, plugin); - } - - // register all jobs - c = config.getSubStore(PROP_JOB); - Enumeration<String> jobs = c.getSubStoreNames(); - - while (jobs.hasMoreElements()) { - String jobName = jobs.nextElement(); - String implName = c.getString(jobName + "." + PROP_PLUGIN); - JobPlugin plugin = mJobPlugins.get(implName); - - if (plugin == null) { - log(ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_JOBS_CLASS_NOT_FOUND", - implName)); - throw new EJobsException(CMS.getUserMessage("CMS_JOB_PLUGIN_NOT_FOUND", implName)); - } - String classPath = plugin.getClassPath(); - - // instantiate and init the job - try { - IJob job = (IJob) - Class.forName(classPath).newInstance(); - IConfigStore jconfig = c.getSubStore(jobName); - - job.init(this, jobName, implName, jconfig); - - // register the job - mJobs.put(jobName, job); - - } catch (ClassNotFoundException e) { - log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSCORE_JOBS_INIT_ERROR", e.toString())); - throw new EJobsException(CMS.getUserMessage("CMS_JOB_LOAD_CLASS_FAILED", classPath)); - - } catch (IllegalAccessException e) { - log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSCORE_JOBS_INIT_ERROR", e.toString())); - throw new EJobsException(CMS.getUserMessage("CMS_JOB_LOAD_CLASS_FAILED", classPath)); - - } catch (InstantiationException e) { - log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSCORE_JOBS_INIT_ERROR", e.toString())); - throw new EJobsException(CMS.getUserMessage("CMS_JOB_LOAD_CLASS_FAILED", classPath)); - - } catch (EBaseException e) { - log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSCORE_JOBS_INIT_ERROR", e.toString())); - throw e; - } - } - - // are we enabled? - if (mConfig.getBoolean(PROP_ENABLED, false) == true) { - // start the daemon thread - startDaemon(); - } - } - - public Hashtable<String, JobPlugin> getPlugins() { - return mJobPlugins; - } - - public Hashtable<String, IJob> getInstances() { - return mJobs; - } - - /** - * when wake up: - * . execute the scheduled job(s) - * * if job still running from previous interval, skip it - * . figure out when is the next wakeup time (every interval). If - * current wakup time runs over the interval, skip the missed interval(s) - * . sleep till the next wakeup time - */ - public void run() { - long wokeupTime = 0; - - while (true) { - // get time now - Calendar cal = Calendar.getInstance(); - long rightNow = cal.getTime().getTime(); - long duration; - long second = cal.get(Calendar.SECOND); - - if (second != 1) { // scheduler needs adjustment - // adjust to wake up at 1st second - long milliSec = cal.get(Calendar.MILLISECOND); - - // possible to be at exactly second 1, millisecond 0, - // just let it skip to next second, fine. - duration = (60 - second) * 1000 + 1000 - milliSec; - log(ILogger.LL_INFO, - "adjustment for cron behavior: sleep for " + - duration + " milliseconds"); - } else { - - // when is the next wakeup time for the JobsScheduler? - // reset next wakeup time - wake up every preset interval - - duration = mInterval - rightNow + wokeupTime; - - } - - while (duration < 0) { - duration += mInterval; - } - - if (duration != 0) { - try { - Thread.sleep(duration); - } catch (InterruptedException e) { - System.out.println(e); - } - } - - // if (duration == 0), it's time - - // woke up... - try { - if (mConfig.getBoolean(PROP_ENABLED, false) == false) { - return; - } - } catch (Exception e) { - return; - } - - // check to see if new jobs are registered - // ... later - - // get time now - cal = Calendar.getInstance(); - - /** - * Get the current time outside the jobs while loop - * to make sure that the rightful jobs are run - * -- milliseconds from the epoch - */ - wokeupTime = cal.getTime().getTime(); - - for (Enumeration<IJob> e = mJobs.elements(); e.hasMoreElements(); ) { - IJob job = e.nextElement(); - - // is it enabled? - IConfigStore cs = job.getConfigStore(); - - try { - if (cs.getBoolean(PROP_ENABLED, false) == false) - continue; - } catch (Exception ex) { - continue; // ignore this job - } - - // first, check to see if thread already running - // ... - - // start the job thread if necessary - if (isShowTime(job, cal) == true) { - // log(ILogger.LL_INFO, "show time for: "+job.getId()); - - // if previous thread still alive, skip - Thread jthread = mJobThreads.get(job.getId()); - - if ((jthread == null) || (!jthread.isAlive())) { - Thread jobThread = new Thread((Runnable) job, job.getId()); - - jobThread.start(); - // put into job thread control - mJobThreads.put(job.getId(), jobThread); - } else { - // previous thread still alive, log it - log(ILogger.LL_INFO, "Job " + job.getId() + - " still running...skipping this round"); - } - } - } // for - - } - } - - public IJobCron createJobCron(String cs) throws EBaseException { - return new JobCron(cs); - } - - /** - * Is it time for the job? - */ - protected boolean isShowTime(IJob job, Calendar now) { - JobCron jcron = (JobCron) job.getJobCron(); - - if (jcron == null) { - // the impossible has happened - log(ILogger.LL_INFO, "isShowTime(): jobcron null"); - return false; - } - - /** - * is it the right month? - */ - Vector<CronRange> moy = - jcron.getItem(JobCron.CRON_MONTH_OF_YEAR).getElements(); - - int cronMoy = jcron.MOY_cal2cron(now); - - if (jcron.isElement(cronMoy, moy) == false) { - return false; - } - // is the right month! - - /** - * is it the right date? - */ - Vector<CronRange> dow = jcron.getItem(JobCron.CRON_DAY_OF_WEEK).getElements(); - Vector<CronRange> dom = jcron.getItem(JobCron.CRON_DAY_OF_MONTH).getElements(); - - // can't be both empty - if ((dow.isEmpty()) && dom.isEmpty()) { - // throw... or return false? - } - - int cronDow = jcron.DOW_cal2cron(now); - - if ((jcron.isElement(cronDow, dow) == false) && - (jcron.isElement(now.get(Calendar.DAY_OF_MONTH), dom) == false)) { - return false; - } - // is the right date! - - /** - * is it the right hour? - */ - Vector<CronRange> hour = jcron.getItem(JobCron.CRON_HOUR).getElements(); - - if (jcron.isElement(now.get(Calendar.HOUR_OF_DAY), hour) == false) { - return false; - } - // is the right hour! - - /** - * is it the right minute? - */ - Vector<CronRange> minute = jcron.getItem(JobCron.CRON_MINUTE).getElements(); - - if (jcron.isElement(now.get(Calendar.MINUTE), minute) == false) { - return false; - } - // is the right minute! We're on! - - return true; - } - - /** - * Retrieves id (name) of this subsystem. - * - * @return name of the Jobs Scheduler subsystem - */ - public String getId() { - return mId; - } - - /** - * Sets id string to this subsystem. - * <p> - * Use with caution. Should not do it when sharing with others - * - * @param id name to be applied to an Jobs Scheduler subsystem - */ - public void setId(String id) throws EBaseException { - mId = id; - } - - /** - * creates and starts the daemon thread - */ - public void startDaemon() { - mScheduleThread = new Thread(this, "JobScheduler"); - log(ILogger.LL_INFO, "started Jobs Scheduler daemon thread"); - mScheduleThread.setDaemon(true); - mScheduleThread.start(); - } - - /** - * registers the administration servlet with the administration subsystem. - */ - public void startup() throws EBaseException { - //remove, already logged from S_ADMIN - //String infoMsg = "Jobs Scheduler subsystem administration Servlet registered"; - //log(ILogger.LL_INFO, infoMsg); - } - - /** - * shuts down Jobs one by one. - * <P> - */ - public void shutdown() { - for (IJob job : mJobs.values()) { - job.stop(); - } - } - - /** - * Returns the root configuration storage of this system. - * <P> - * - * @return configuration store of this subsystem - */ - public IConfigStore getConfigStore() { - return mConfig; - } - - /** - * Gets configuration parameters for the given - * job plugin. - * - * @param implName Name of the job plugin. - * @return Hashtable of required parameters. - */ - public String[] getConfigParams(String implName) - throws EJobsException { - if (Debug.ON) - Debug.trace("in getCofigParams()"); - - // is this a registered implname? - JobPlugin plugin = mJobPlugins.get(implName); - - if (plugin == null) { - log(ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_JOBS_CLASS_NOT_FOUND", implName)); - if (Debug.ON) - Debug.trace("Job plugin " + implName + " not found."); - throw new EJobsException(CMS.getUserMessage("CMS_JOB_PLUGIN_NOT_FOUND", - implName)); - } - - // XXX can find an instance of this plugin in existing - // auth manager instantces to avoid instantiation just for this. - - // a temporary instance - String className = plugin.getClassPath(); - - if (Debug.ON) - Debug.trace("className = " + className); - try { - IJob jobInst = (IJob) - Class.forName(className).newInstance(); - if (Debug.ON) - Debug.trace("class instantiated"); - return (jobInst.getConfigParams()); - } catch (InstantiationException e) { - log(ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_JOBS_CREATE_NEW", e.toString())); - if (Debug.ON) - Debug.trace("class NOT instantiated: " + e); - throw new EJobsException(CMS.getUserMessage("CMS_JOB_LOAD_CLASS_FAILED", className)); - } catch (ClassNotFoundException e) { - log(ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_JOBS_CREATE_NEW", e.toString())); - if (Debug.ON) - Debug.trace("class NOT instantiated: " + e); - throw new EJobsException(CMS.getUserMessage("CMS_JOB_LOAD_CLASS_FAILED", className)); - } catch (IllegalAccessException e) { - log(ILogger.LL_FAILURE, - CMS.getLogMessage("CMSCORE_JOBS_CREATE_NEW", e.toString())); - if (Debug.ON) - Debug.trace("class NOT instantiated: " + e); - throw new EJobsException(CMS.getUserMessage("CMS_JOB_LOAD_CLASS_FAILED", className)); - } - } - - public void setInterval(int minutes) { - mInterval = minutes * MINUTE_MILLI; - } - - /** - * logs an entry in the log file. - */ - public void log(int level, String msg) { - if (mLogger == null) - return; - mLogger.log(ILogger.EV_SYSTEM, ILogger.S_OTHER, - level, msg); - } - - public Hashtable<String, JobPlugin> getJobPlugins() { - return mJobPlugins; - } -} |