Beállítások mentése
A korábbi SAL Scheduling példa szerint az időzítés már megfelelő, de egyelőre kódba égetett értéket használtunk az intervallumra. Ha ezt az action hívásával módosítottuk volna (reschedule), akkor a következő szerver újraindításkor a rendszer elfelejtette volna amit megadtunk. Ennek kezelésére a módosításokat adatbázisba menthetjük saját (ActiveObject) vagy a JIRA által kínált megoldással (PluginSettings).
Időzítő felület
Az időzítés ismétlődési ciklusának megadásához befejezzük a JIRA példa második felének Todo-ba integrálását. Így a SchedulerAction hívásával átállítható lesz az intervallum.
SchedulerAction.java
public class SchedulerAction extends JiraWebActionSupport {
private static final long serialVersionUID = -1993489970401317470L;
private final TodoMonitor todoMonitor;
private long interval;
public SchedulerAction(TodoMonitor todoMonitor, PluginSettingsFactory pluginSettingsFactory) {
this.todoMonitor = todoMonitor;
this.interval = todoMonitor.getInterval();
}
@Override
protected String doExecute() throws Exception {
return SUCCESS;
}
public String doReschedule() {
this.todoMonitor.reschedule(this.interval);
return getRedirect("TodoScheduler.jspa");
}
public long getInterval() {
return this.interval;
}
public void setInterval(long interval) {
this.interval = interval;
}
public Date getLastRun() {
return this.todoMonitor.getLastRun();
}
public Date getNextRun() {
return this.todoMonitor.getNextRun();
}
public int getTodoSize() {
return this.todoMonitor.getTodoSize();
}
public SimpleDateFormat getHunDateFormatter() {
return GlobalSettings.createHunDateFormatter();
}
}
PluginScheduler.java
private final PluginScheduler pluginScheduler;
private final TodoService todoService;
private final GlobalSettings settings;
private final HashMap<String, Object> jobDataMap = new HashMap<String, Object>();
private Date lastRun;
private Date nextRun;
private long interval = 0;
public TodoMonitorImpl(PluginScheduler pluginScheduler, TodoService todoService,
PluginSettingsFactory pluginSettingsFactory) {
this.pluginScheduler = pluginScheduler;
this.todoService = todoService;
this.settings = new GlobalSettings(pluginSettingsFactory.createGlobalSettings());
Long loadInterval = this.settings.loadInterval();
if (loadInterval != null) {
this.interval = loadInterval;
}
}
@Override
public void onStart() {
this.jobDataMap.put("TodoMonitorImpl:instance", TodoMonitorImpl.this);
this.jobDataMap.put("TodoService", this.todoService);
if (this.interval > 0) {
schedule();
}
}
@Override
public void reschedule(long interval) {
this.interval = interval;
this.settings.storeInterval(interval);
this.schedule();
}
PluginSettings
A beállításokat akár a PluginSettingsFactory-n keresztül is közvetlenül elérhetjük, de érdemes a funkciót kiemelni. Így az átállított értéket a GlobalSettings osztályon keresztül tölthetjük be és menthetjük el, ezzel leválasztva a beállított értékek kezelését a kód többi funkciójától.
GlobalSettings,java
public class GlobalSettings {
private final PluginSettings pluginSettings;
public GlobalSettings(PluginSettings pluginSettings) {
this.pluginSettings = pluginSettings;
}
public Long loadLong(String key) {
Object object = this.pluginSettings.get(key);
if (object == null) {
return null;
}
return Long.valueOf((String) object);
}
public Long loadInterval() {
return this.loadLong("todo.monitor.interval");
}
public void storeInterval(Long interval) {
this.pluginSettings.put("todo.monitor.interval", String.valueOf(interval));
}
public static SimpleDateFormat createHunDateFormatter() {
return new SimpleDateFormat("yyyy.MM.dd. HH:mm");
}
}
Plugin konfigurációs hivatkozás
A pluginhez tartozó beállítási oldalt kiemelhetjük a JIRA admin oldalára is a configure.url paraméter megadásával. Itt az időzítés beállításához használt TodoScheduler.jspa oldalt adjuk meg.
atlassian-plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<atlassian-plugin key="${project.groupId}.${project.artifactId}" name="${project.name}" plugins-version="2">
<plugin-info>
<description>${project.description}
<version>${project.version}
<vendor name="${project.organization.name}" url="${project.organization.url}" />
<param name="plugin-icon">images/pluginIcon.png</param>
<param name="plugin-logo">images/pluginLogo.png</param>
<param name="configure.url">/secure/TodoScheduler.jspa</param>
</plugin-info>
...
</atlassian-plugin>
Az admin oldalról a plugin beállításokat megnyitva vagy közvetlenül elérve (http://localhost:2990/jira/plugins/servlet/upm) a Configure linkre kattintva érhetjük el a plugin beállításokat.

Eredmény
A szerver indítása után még nincs beállított érték, de ha az időzítő felületen megadunk egyet, akkor az "Apply" után visszatérve már látjuk a következő futtatási időt (Legközelebb). Ha lefutott az első task, utána már a "Legutóbb" dátum is látható, és ezzel egy időben nő a rekordok száma is.

Apró hiba a működésben: Az időzítés első futásakor ismétlődően fut le a task, amit a 2.7.x verzióban még nem javítottak.
A fenti módosítások letölthetők SVN-en keresztül és becsomagolva a blog GoogleCode oldaláról a JiraDevTutor projektből.












