<?xml version="1.0" encoding="ISO-8859-1"?>

<xwikidoc>
<web>Scheduler</web>
<name>WebHome</name>
<language></language>
<defaultLanguage>en</defaultLanguage>
<translation>0</translation>
<parent>Main.WebHome</parent>
<customClass></customClass>
<title></title>
<template></template>
<defaultTemplate></defaultTemplate>
<validationScript></validationScript>
<comment></comment>
<minorEdit>false</minorEdit>
<object>
<class>
<name>XWiki.TagClass</name>
<customClass></customClass>
<customMapping></customMapping>
<defaultViewSheet></defaultViewSheet>
<defaultEditSheet></defaultEditSheet>
<defaultWeb></defaultWeb>
<nameField></nameField>
<validationScript></validationScript>
<tags>
<cache>0</cache>
<displayType>input</displayType>
<multiSelect>1</multiSelect>
<name>tags</name>
<number>1</number>
<prettyName>Tags</prettyName>
<relationalStorage>1</relationalStorage>
<separator> </separator>
<separators> ,|</separators>
<size>30</size>
<unmodifiable>0</unmodifiable>
<values></values>
<classType>com.xpn.xwiki.objects.classes.StaticListClass</classType>
</tags>
</class>
<name>Scheduler.WebHome</name>
<number>0</number>
<className>XWiki.TagClass</className>
<property>
<tags/>
</property>
</object>
<object>
<class>
<name>XWiki.XWikiRights</name>
<customClass></customClass>
<customMapping></customMapping>
<defaultViewSheet></defaultViewSheet>
<defaultEditSheet></defaultEditSheet>
<defaultWeb></defaultWeb>
<nameField></nameField>
<validationScript></validationScript>
<allow>
<defaultValue>1</defaultValue>
<displayFormType>select</displayFormType>
<displayType>allow</displayType>
<name>allow</name>
<number>4</number>
<prettyName>Allow/Deny</prettyName>
<unmodifiable>0</unmodifiable>
<classType>com.xpn.xwiki.objects.classes.BooleanClass</classType>
</allow>
<groups>
<cache>0</cache>
<displayType>select</displayType>
<multiSelect>1</multiSelect>
<name>groups</name>
<number>4</number>
<prettyName>Groups</prettyName>
<relationalStorage>0</relationalStorage>
<separator> </separator>
<size>5</size>
<unmodifiable>0</unmodifiable>
<usesList>1</usesList>
<classType>com.xpn.xwiki.objects.classes.GroupsClass</classType>
</groups>
<levels>
<cache>0</cache>
<displayType>select</displayType>
<multiSelect>1</multiSelect>
<name>levels</name>
<number>4</number>
<prettyName>Levels</prettyName>
<relationalStorage>0</relationalStorage>
<separator> </separator>
<size>3</size>
<unmodifiable>0</unmodifiable>
<classType>com.xpn.xwiki.objects.classes.LevelsClass</classType>
</levels>
<users>
<cache>0</cache>
<displayType>select</displayType>
<multiSelect>1</multiSelect>
<name>users</name>
<number>4</number>
<prettyName>Users</prettyName>
<relationalStorage>0</relationalStorage>
<separator> </separator>
<size>5</size>
<unmodifiable>0</unmodifiable>
<usesList>1</usesList>
<classType>com.xpn.xwiki.objects.classes.UsersClass</classType>
</users>
</class>
<name>Scheduler.WebHome</name>
<number>0</number>
<className>XWiki.XWikiRights</className>
<property>
<allow></allow>
</property>
<property>
<groups></groups>
</property>
<property>
<levels></levels>
</property>
<property>
<users></users>
</property>
</object>
<content>## First, set a shortcut to our Scheduler plugin
##
#set($scheduler=$xwiki.scheduler)
##
## If the sheet is called with an action ($request.do), let us first process this action
## Possible values are : "schedule", "pause", "resume", "unschedule", "delete"
##
#if($request.do &amp;&amp; $request.do!="")
 ##
 ## Obtain the Job document and object for which the action has been called
 ##
 #set($tJobHolder=$request.which)
 #set($jobDoc=$xwiki.getDocument($tJobHolder))
 #set($jobObj=$jobDoc.getObject('XWiki.SchedulerJobClass'))
 #if($request.do=="schedule")
  ##
  ## Schedule a job
  ##
  #set($ok=$scheduler.scheduleJob($jobObj))
  #if($ok==false) 
   #error("$context.get('error')")
  #else 
   #info("Job ~~$jobObj.get('jobName')~~ *scheduled*. Next fire time : *$scheduler.getNextFireTime($jobObj)*")
  #end
 #elseif($request.do=="pause")
  ##
  ## Pause a scheduled job
  ##
  #set($ok=$scheduler.pauseJob($jobObj))
  #if($ok==false) 
   #error("$context.get('error')")
  #else
   #info("Job ~~$jobObj.get('jobName')~~ *paused*.")
  #end
 #elseif($request.do=="resume")
  ##
  ## Resume a paused job
  ##
  #set($ok=$scheduler.resumeJob($jobObj))
  #if($ok==false) 
   #error("$context.get('error')")
  #else
   #info("Job ~~$jobObj.get('jobName')~~ *resumed*. Next fire time : *$scheduler.getNextFireTime($jobObj)*")
  #end
 #elseif($request.do=="unschedule")
  ##
  ## Unschedule a scheduled job (paused or not)
  ##
  #set($ok=$scheduler.unscheduleJob($jobObj))
  #if($ok==false)
   #error("$context.get('error')")
  #else
   #info("Job ~~$jobObj.get('jobName')~~ *unscheduled*")
  #end
 #elseif($request.do=="delete")
  ##
  ## Delete a job
  ## First unschedule it (if needed), then delete its document holder
  ##
  #set($jobName=$jobObj.get('jobName'))
  #if($jobObj.get("status")=="Normal"||$jobObj.get('status')=="Paused")
   #set($ok=$scheduler.unscheduleJob($jobObj))
   #if($ok==true)
    #set($deleteRedirect = $xwiki.getURL($jobObj.getName(),"delete"))
    $response.sendRedirect($deleteRedirect)
   #else
    #error("$context.get('error')")
   #end
  #else
    #set($deleteRedirect = $xwiki.getURL($jobObj.getName(),"delete"))
    $response.sendRedirect($deleteRedirect))
  #end
 #end
#end
1 Job Scheduler

Welcome to the Job scheduler. This application allows you to create administration scripts that can be triggered periodically.

1.1 List of existing jobs
##
## Retrieve all scheduler jobs living in this space
## Display their name, status, possible next fire time, and avaible actions
##
{table}
Job Name|Job Status|Next fire time|Actions
#set($hql = ", BaseObject as job where doc.web='Scheduler' and job.name=doc.fullName and job.className='XWiki.SchedulerJobClass' ")
#foreach($docName in $xwiki.searchDocuments($hql))
 #set($actions = $xwiki.hashMap) ## get a hash to store action urls
 #set($jobHolder = $xwiki.getDocument($docName))
 #set($job = $jobHolder.getObject('XWiki.SchedulerJobClass'))
 #set($status = "") #set($status = $job.get('status')) #if($status=="") #set($status="None") #end
 #set($firetime = "") #if($status!="None") #set($firetime = $scheduler.getNextFireTime($job))  #else #set($firetime="N/A") #end
  #if($status=="None") 
   #set( $ok = $!actions.put("schedule",$doc.getURL("view","do=schedule&amp;amp;which=${jobHolder.fullName}")) )
  #elseif($status=="Normal")
   #set( $ok = $!actions.put("pause",$doc.getURL("view","do=pause&amp;amp;which=${jobHolder.fullName}")) )
   #set( $ok = $!actions.put("unschedule",$doc.getURL("view","do=unschedule&amp;amp;which=${jobHolder.fullName}")) )
  #elseif($status=="Paused")
   #set( $ok = $!actions.put("resume",$doc.getURL("view","do=resume&amp;amp;which=${jobHolder.fullName}")) )
   #set( $ok = $!actions.put("unschedule",$doc.getURL("view","do=unschedule&amp;amp;which=${jobHolder.fullName}")) )
  #end
  #set($ok = $!actions.put("delete",$doc.getURL("view","do=delete&amp;amp;which=${jobHolder.fullName}")) )
$job.get("jobName")|$status|$firetime| *Infos* : [view&gt;$jobHolder.fullName] #if($jobHolder.hasAccessLevel("programming")) &lt;a href="${jobHolder.getURL('inline')}"&gt;edit&lt;/a&gt; #end *Job* : #foreach($action in $actions.keySet()) &lt;a href="${actions.get($action)}"&gt;$action&lt;/a&gt; #end

#end
{table}

#if($doc.hasAccessLevel("programming"))
##
## Job creation is offered only for programmers, because the job page needs to be saved 
## with programming right for groovy jobs to be executed.
## However, this page should stay accessibles to admins, that can manipulate existing jobs :
## scheduler, pause, etc.
##
1.1 Create a new job
##
## Form to create a new Job
##
 
#info("Enter here the name of the page that will hold your job. The job will be created in the current Scheduler space.")

&lt;form action="" id="newdoc"&gt;
&lt;div&gt;
&lt;input type="hidden" name="parent" value="Scheduler.WebHome" /&gt;
&lt;input type="hidden" name="template" value="XWiki.SchedulerJobTemplate" /&gt;
&lt;input type="hidden" name="sheet" value="1" /&gt;
&lt;input type="hidden" name="webname" value="Scheduler"/&gt;
&lt;input type="hidden" name="name" value=""/&gt;
&lt;input type="hidden" name="parent" value="${doc.fullName}"/&gt;
&lt;input type="text" name="title" value="Job page name" size="30"/&gt;
&lt;input type="button" value="Add" onclick='if (updateName(this.form.title,this.form.name)) { action="../../inline/" + this.form.webname.value + "/" + this.form.name.value; this.form.submit(); }' /&gt;
&lt;/div&gt;
&lt;/form&gt;
#else
 #warning("Job creation is reserved for programmers. It seems you do not have programming access right allowed on the Scheduler space.")
#end</content>
</xwikidoc>
