Author: jvdrean Date: 2008-01-14 19:25:59 +0100 (Mon, 14 Jan 2008) New Revision: 6822
Modified: xwiki-platform/xwiki-plugins/trunk/scheduler/src/main/java/com/xpn/xwiki/plugin/scheduler/SchedulerPlugin.java xwiki-platform/xwiki-plugins/trunk/scheduler/src/main/java/com/xpn/xwiki/plugin/scheduler/SchedulerPluginApi.java Log: XASCH-13 : Make the scheduler working in virtual mode Modified: xwiki-platform/xwiki-plugins/trunk/scheduler/src/main/java/com/xpn/xwiki/plugin/scheduler/SchedulerPlugin.java =================================================================== --- xwiki-platform/xwiki-plugins/trunk/scheduler/src/main/java/com/xpn/xwiki/plugin/scheduler/SchedulerPlugin.java 2008-01-14 17:56:28 UTC (rev 6821) +++ xwiki-platform/xwiki-plugins/trunk/scheduler/src/main/java/com/xpn/xwiki/plugin/scheduler/SchedulerPlugin.java 2008-01-14 18:25:59 UTC (rev 6822) @@ -41,8 +41,7 @@ import org.quartz.impl.StdSchedulerFactory; import java.text.ParseException; -import java.util.Date; -import java.util.List; +import java.util.*; /** * See [EMAIL PROTECTED] com.xpn.xwiki.plugin.scheduler.SchedulerPluginApi} for documentation. @@ -74,8 +73,7 @@ */ public SchedulerPlugin(String name, String className, XWikiContext context) { - super(name, className, context); - init(context); + super(name, className, context); } /** @@ -85,18 +83,53 @@ */ public void init(XWikiContext context) { - super.init(context); try { - updateSchedulerJobClass(context); + String initialDb = + !context.getDatabase().equals("") ? context.getDatabase() : context.getMainXWiki(); + List wikiServers = Collections.EMPTY_LIST; + + if (context.getWiki().isVirtual()) { + try { + wikiServers = context.getWiki().getVirtualWikisDatabaseNames(context); + if (!wikiServers.contains(context.getMainXWiki())) { + wikiServers.add(context.getMainXWiki()); + } + } catch (Exception e) { + LOG.error("error getting list of wiki servers!", e); + } + } else { + wikiServers = new ArrayList(); + wikiServers.add(context.getMainXWiki()); + } + + try { + for (Iterator iter = wikiServers.iterator(); iter.hasNext();) { + context.setDatabase((String) iter.next()); + updateSchedulerJobClass(context); + } + } finally { + context.setDatabase(initialDb); + } + setScheduler(getDefaultSchedulerInstance()); setStatusListener(); getScheduler().start(); - restoreExistingJobs(context); + + try { + // Iterate on all virtual wikis + for (Iterator iter = wikiServers.iterator(); iter.hasNext();) { + context.setDatabase((String) iter.next()); + restoreExistingJobs(context); + } + } finally { + context.setDatabase(initialDb); + } } catch (SchedulerException e) { LOG.error("Failed to start the scheduler", e); } catch (SchedulerPluginException e) { LOG.error("Failed to initialize the scheduler", e); } + super.init(context); } /** @@ -107,7 +140,6 @@ public void virtualInit(XWikiContext context) { super.virtualInit(context); - init(context); } /** @@ -140,8 +172,9 @@ job.setStringValue("contextLang", cLang); jobNeedsUpdate = true; } + String iDb = context.getDatabase(); String cDb = job.getStringValue("contextDatabase"); - if (cDb.equals("")) { + if (cDb.equals("") || !cDb.equals(iDb)) { cDb = context.getDatabase(); job.setStringValue("contextDatabase", cDb); jobNeedsUpdate = true; @@ -149,6 +182,7 @@ if (jobNeedsUpdate) { try { + context.setDatabase(cDb); XWikiDocument jobHolder = context.getWiki().getDocument(job.getName(), context); BaseObject jObj = jobHolder.getObject(SchedulerPlugin.XWIKI_JOB_CLASS, job.getNumber()); @@ -160,6 +194,8 @@ SchedulerPluginException.ERROR_SCHEDULERPLUGIN_UNABLE_TO_PREPARE_JOB_CONTEXT, "Failed to prepare context for job with job name " + job.getStringValue("jobName"), e); + } finally { + context.setDatabase(iDb); } } @@ -179,7 +215,7 @@ scontext.setLanguage(cLang); scontext.setDatabase(cDb); scontext.setMainXWiki(context.getMainXWiki()); - scontext.setVirtual(context.isVirtual()); + scontext.setVirtual(context.isVirtual()); com.xpn.xwiki.web.XWikiURLFactory xurf = context.getURLFactory(); if (xurf == null) { @@ -212,6 +248,8 @@ */ private void restoreExistingJobs(XWikiContext context) throws SchedulerPluginException { + int retval = 0; + String hql = ", BaseObject as obj where doc.web='Scheduler'" + " and obj.name=doc.fullName and obj.className='XWiki.SchedulerJobClass'"; try { @@ -253,10 +291,10 @@ * @return the status of the Job inside the quartz scheduler, as [EMAIL PROTECTED] * com.xpn.xwiki.plugin.scheduler.JobState} instance */ - public JobState getJobStatus(BaseObject object) throws SchedulerException + public JobState getJobStatus(BaseObject object, XWikiContext context) throws SchedulerException { int state = getScheduler() - .getTriggerState(getObjectUniqueId(object), Scheduler.DEFAULT_GROUP); + .getTriggerState(getObjectUniqueId(object, context), Scheduler.DEFAULT_GROUP); return new JobState(state); } @@ -267,8 +305,8 @@ try { JobDataMap data = new JobDataMap(); - // compute the job unique Id - String xjob = getObjectUniqueId(object); +// compute the job unique Id + String xjob = getObjectUniqueId(object, context); JobDetail job = new JobDetail(xjob, Scheduler.DEFAULT_GROUP, Class.forName(object.getStringValue("jobClass"))); @@ -276,7 +314,7 @@ Trigger trigger = new CronTrigger(xjob, Scheduler.DEFAULT_GROUP, xjob, Scheduler.DEFAULT_GROUP, object.getStringValue("cron")); - // Let's prepare an execution context... +// Let's prepare an execution context... XWikiContext stubContext = prepareJobStubContext(object, context); Context stub = new Context(stubContext); @@ -288,14 +326,14 @@ getScheduler().addJob(job, true); - JobState status = getJobStatus(object); + JobState status = getJobStatus(object, context); switch (status.getState()) { case Trigger.STATE_PAUSED: // a paused job must be resumed, not scheduled break; case Trigger.STATE_NORMAL: - if (getTrigger(object).compareTo(trigger) != 0) { + if (getTrigger(object, context).compareTo(trigger) != 0) { LOG.debug("Reschedule Job : " + object.getStringValue("jobName")); } getScheduler().rescheduleJob(trigger.getName(), trigger.getGroup(), trigger); @@ -348,7 +386,7 @@ public void pauseJob(BaseObject object, XWikiContext context) throws SchedulerPluginException { try { - getScheduler().pauseJob(getObjectUniqueId(object), Scheduler.DEFAULT_GROUP); + getScheduler().pauseJob(getObjectUniqueId(object, context), Scheduler.DEFAULT_GROUP); saveStatus("Paused", object, context); } catch (SchedulerException e) { throw new SchedulerPluginException( @@ -370,7 +408,7 @@ public void resumeJob(BaseObject object, XWikiContext context) throws SchedulerPluginException { try { - getScheduler().resumeJob(getObjectUniqueId(object), Scheduler.DEFAULT_GROUP); + getScheduler().resumeJob(getObjectUniqueId(object, context), Scheduler.DEFAULT_GROUP); saveStatus("Normal", object, context); } catch (SchedulerException e) { throw new SchedulerPluginException( @@ -393,7 +431,7 @@ throws SchedulerPluginException { try { - getScheduler().deleteJob(getObjectUniqueId(object), Scheduler.DEFAULT_GROUP); + getScheduler().deleteJob(getObjectUniqueId(object, context), Scheduler.DEFAULT_GROUP); saveStatus("None", object, context); } catch (SchedulerException e) { throw new SchedulerPluginException( @@ -412,9 +450,10 @@ * @param object the unwrapped XObject to be retrieve the trigger for * @return the trigger object of the given job */ - private Trigger getTrigger(BaseObject object) throws SchedulerPluginException + private Trigger getTrigger(BaseObject object, XWikiContext context) + throws SchedulerPluginException { - String job = getObjectUniqueId(object); + String job = getObjectUniqueId(object, context); Trigger trigger; try { trigger = getScheduler().getTrigger(job, Scheduler.DEFAULT_GROUP); @@ -438,9 +477,10 @@ * @param object unwrapped XObject job for which the next fire time will be given * @return the next Date the job will be fired at */ - public Date getNextFireTime(BaseObject object) throws SchedulerPluginException + public Date getNextFireTime(BaseObject object, XWikiContext context) + throws SchedulerPluginException { - return getTrigger(object).getNextFireTime(); + return getTrigger(object, context).getNextFireTime(); } /** @@ -529,9 +569,9 @@ * * @return a unique String that can identify the object */ - private String getObjectUniqueId(BaseObject object) + private String getObjectUniqueId(BaseObject object, XWikiContext context) { - return object.getName() + "_" + object.getNumber(); + return context.getDatabase() + ":" + object.getName() + "_" + object.getNumber(); } /** Modified: xwiki-platform/xwiki-plugins/trunk/scheduler/src/main/java/com/xpn/xwiki/plugin/scheduler/SchedulerPluginApi.java =================================================================== --- xwiki-platform/xwiki-plugins/trunk/scheduler/src/main/java/com/xpn/xwiki/plugin/scheduler/SchedulerPluginApi.java 2008-01-14 17:56:28 UTC (rev 6821) +++ xwiki-platform/xwiki-plugins/trunk/scheduler/src/main/java/com/xpn/xwiki/plugin/scheduler/SchedulerPluginApi.java 2008-01-14 18:25:59 UTC (rev 6822) @@ -90,12 +90,12 @@ public JobState getJobStatus(BaseObject object) throws SchedulerException, SchedulerPluginException { - return plugin.getJobStatus(object); + return plugin.getJobStatus(object, context); } public JobState getJobStatus(Object object) throws SchedulerException, SchedulerPluginException { - return plugin.getJobStatus(retrieveBaseObject(object)); + return plugin.getJobStatus(retrieveBaseObject(object), context); } /** @@ -301,7 +301,7 @@ public Date getNextFireTime(BaseObject object) { try { - return plugin.getNextFireTime(object); + return plugin.getNextFireTime(object, context); } catch (SchedulerPluginException e) { context.put("error", e.getMessage()); _______________________________________________ notifications mailing list notifications@xwiki.org http://lists.xwiki.org/mailman/listinfo/notifications