/**
* @version $Id: AutoSchedule.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2012/10/15 17:49:24
* @author kousuke-morishima
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.correction.auto;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Locale;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.ListenerList;
/**
* 自動実行のスケジュールを表すモデル.
*
* @author kousuke-morishima
*/
public class AutoSchedule implements Serializable, Cloneable {
private static final long serialVersionUID = 5241031190990865358L;
/**
* 自動実行スケジュールをファイル保存した時の拡張子
*/
static final String extension = "schedule"; //$NON-NLS-1$
protected transient IFile task;
protected String taskFilePath;
protected boolean doRun;
protected Calendar time;
protected Calendar nextRunDate;
/**
* コンストラクタ
*/
public AutoSchedule() {
doRun = true;
}
/**
* デシリアライズした場合、listenersがnullになって困るので、デシリアライズ後はこのメソッドを呼んで回避する
*/
void initTransientField() {
listeners = new ListenerList();
modified = false;
}
/**
* 解析フローを定義したファイルのインスタンスを返す。実行する解析フローが設定されていない場合、<code>null</code>を返す。
*
* @return 設定されている解析フロー
*/
public IFile getTask() {
return task;
}
/**
* 実行する解析フローを設定する。<code>null</code>を指定すると、設定解除になる。
*
* @param task
* 解析フロー
*/
public void setTask(IFile task) {
if (task == null) {
if (this.task == null) {
return;
}
} else if (this.task == null) {
} else if (this.task.equals(task)) {
return;
}
this.task = task;
if (task == null) {
taskFilePath = null;
} else {
taskFilePath = task.getFullPath().toOSString();
}
fireScheduleChanged();
}
/**
* 指定された実行日時が来たら実行するかどうか。
*
* @return 実行するならtrue
*/
public boolean isDoRun() {
return doRun;
}
/**
* @param doRun
* 実行するならtrue
*/
public void setDoRun(boolean doRun) {
if (this.doRun != doRun) {
this.doRun = doRun;
fireScheduleChanged();
}
}
private transient boolean modified = true;
/**
* 実行時間を設定する。
*
* @param hours
* 時(24時間表記)
* @param minutes
* 分
*/
public void setTime(int hours, int minutes) {
if (time == null) {
time = Calendar.getInstance(Locale.JAPAN);
time.set(Calendar.SECOND, 0);
modified = true;
}
if ((time.get(Calendar.HOUR_OF_DAY) != hours) || (time.get(Calendar.MINUTE) != minutes)) {
time.set(Calendar.HOUR_OF_DAY, hours);
time.set(Calendar.MINUTE, minutes);
modified = true;
}
getNextRunDate();
}
final Calendar getRunDate() {
Calendar calendar = Calendar.getInstance(Locale.JAPAN);
/* 時間を設定する */
if (time != null) {
calendar.set(Calendar.HOUR_OF_DAY, time.get(Calendar.HOUR_OF_DAY));
calendar.set(Calendar.MINUTE, time.get(Calendar.MINUTE));
calendar.set(Calendar.SECOND, time.get(Calendar.SECOND));
}
return calendar;
}
/**
* 次に実行すべき日時を返す。
*
* @return 次に実行すべき日時を返す
*/
public Calendar getNextRunDate() {
if (modified) {
updateNextRunDate();
fireScheduleChanged();
}
return (Calendar) nextRunDate.clone();
}
/**
* 次回実行日時を最新に更新する
*
* @return 次回実行日時
*/
public Calendar updateNextRunDate() {
modified = false;
nextRunDate = getRunDate();
/* 時間が過ぎていたら進める */
Calendar now = Calendar.getInstance(Locale.JAPAN);
if (!now.before(nextRunDate)) {
nextRunDate.set(Calendar.YEAR, now.get(Calendar.YEAR));
nextRunDate.set(Calendar.MONTH, now.get(Calendar.MONTH));
nextRunDate.set(Calendar.DATE, now.get(Calendar.DATE) + 1);
}
return (Calendar) nextRunDate.clone();
}
/**
* 実行できるかどうかを返す。すべてのパラメータが正しく設定されていない場合、falseを返す。
*
* @return 正しくパラメータが設定されていて、実行できる場合はtrue。そうでなければfalse
*/
boolean isRunnable() {
return task != null;
}
private transient ListenerList listeners = new ListenerList();
void addScheduleChangedListener(ScheduleChangedListener listener) {
listeners.add(listener);
}
void removeScheduleChangedListener(ScheduleChangedListener listener) {
listeners.remove(listener);
}
protected void fireScheduleChanged() {
for (Object l : listeners.getListeners()) {
((ScheduleChangedListener) l).scheduleChanged(this);
}
}
interface ScheduleChangedListener {
/**
* @param schedule
* 変更されたスケジュール
*/
void scheduleChanged(AutoSchedule schedule);
}
@Override
public String toString() {
StringBuilder string = new StringBuilder(128);
string.append("Task:"); //$NON-NLS-1$
string.append((task == null) ? "none" : task.getName()).append(", "); //$NON-NLS-1$ //$NON-NLS-2$
Calendar c = getNextRunDate();
string.append("Next:").append(c.get(Calendar.YEAR)).append("/").append(c.get(Calendar.MONTH) + 1).append("/").append(c.get(Calendar.DATE)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
string.append(" ").append(c.get(Calendar.HOUR_OF_DAY)).append(":").append(c.get(Calendar.MINUTE)).append(", "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
string.append("Run:").append(doRun); //$NON-NLS-1$
return string.toString();
}
@Override
public AutoSchedule clone() {
try {
return (AutoSchedule) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}