/*
 * This software is distributed under following license based on modified BSD
 * style license.
 * ----------------------------------------------------------------------
 * 
 * Copyright 2009 The Nimbus2 Project. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer. 
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE NIMBUS PROJECT ``AS IS'' AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
 * NO EVENT SHALL THE NIMBUS PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * The views and conclusions contained in the software and documentation are
 * those of the authors and should not be interpreted as representing official
 * policies, either expressed or implied, of the Nimbus2 Project.
 */
package jp.ossc.nimbus.service.scheduler;

import java.util.*;

import jp.ossc.nimbus.core.*;

/**
 * {@link DatabaseScheduleManagerService}のMBeanインタフェース。<p>
 * 
 * @author M.Takata
 */
public interface DatabaseScheduleManagerServiceMBean extends ServiceBaseMBean{
    
    /**
     * スケジュールの制御状態の監視に失敗した場合のログメッセージID。<p>
     */
    public static final String MSG_ID_CONTROL_STATE_CHECK_ERROR = "DSM__00001";
    
    /**
     * スケジュールのタイムオーバー監視に失敗した場合のログメッセージID。<p>
     */
    public static final String MSG_ID_TIMEOVER_CHECK_ERROR = "DSM__00002";
    
    /**
     * スケジュールのタイムオーバー監視でタイムオーバーしたスケジュールを発見した場合のログメッセージID。<p>
     */
    public static final String MSG_ID_TIMEOVER_ERROR = "DSM__00003";
    
    /**
     * スケジュールテーブルの日付カラムの日付フォーマットのデフォルト値。<p>
     */
    public static final String DEFAULT_DATE_FORMAT = "yyyyMMdd";
    
    /**
     * スケジュールテーブル及びスケジュールマスタテーブルの時刻カラムの時刻フォーマットのデフォルト値。<p>
     */
    public static final String DEFAULT_TIME_FORMAT = "HHmmssSSS";
    
    /**
     * スケジュール種別と{@link ScheduleMaker}サービスのマッピングを設定する。<p>
     *
     * @param mapping スケジュール種別とScheduleMakerサービスのマッピング。スケジュール種別=ScheduleMakerサービス名
     */
    public void setScheduleMakerTypeMapping(Properties mapping);
    
    /**
     * スケジュール種別と{@link ScheduleMaker}サービスのマッピングを取得する。<p>
     *
     * @return スケジュール種別とScheduleMakerサービスのマッピング
     */
    public Properties getScheduleMakerTypeMapping();
    
    /**
     * デフォルトの{@link ScheduleMaker}サービスのサービス名を設定する。<p>
     * 指定しない場合は、{@link DefaultScheduleMakerService}が適用される。<br>
     *
     * @param name ScheduleMakerサービスのサービス名
     */
    public void setDefaultScheduleMakerServiceName(ServiceName name);
    
    /**
     * デフォルトの{@link ScheduleMaker}サービスのサービス名を取得する。<p>
     *
     * @return ScheduleMakerサービスのサービス名
     */
    public ServiceName getDefaultScheduleMakerServiceName();
    
    /**
     * {@link jp.ossc.nimbus.service.connection.ConnectionFactory ConnectionFactory}サービスのサービス名を設定する。<p>
     *
     * @param name ConnectionFactoryサービスのサービス名
     */
    public void setConnectionFactoryServiceName(ServiceName name);
    
    /**
     * {@link jp.ossc.nimbus.service.connection.ConnectionFactory ConnectionFactory}サービスのサービス名を取得する。<p>
     *
     * @return ConnectionFactoryサービスのサービス名
     */
    public ServiceName getConnectionFactoryServiceName();
    
    /**
     * スケジュールテーブルの日付カラムの日付フォーマットを設定する。<p>
     * デフォルトは、{@link #DEFAULT_DATE_FORMAT}。<br>
     * 
     * @param format 日付フォーマット
     */
    public void setDateFormat(String format);
    
    /**
     * スケジュールテーブルの日付カラムの日付フォーマットを取得する。<p>
     * 
     * @return 日付フォーマット
     */
    public String getDateFormat();
    
    /**
     * スケジュールテーブル及びスケジュールマスタテーブルの時刻カラムの時刻フォーマットを設定する。<p>
     * デフォルトは、{@link #DEFAULT_TIME_FORMAT}。<br>
     * 
     * @param format 時刻フォーマット
     */
    public void setTimeFormat(String format);
    
    /**
     * スケジュールテーブル及びスケジュールマスタテーブルの時刻カラムの時刻フォーマットを取得する。<p>
     * 
     * @return 時刻フォーマット
     */
    public String getTimeFormat();
    
    /**
     * スケジュールテーブル及びスケジュール依存関係テーブルの更新ユーザIDカラムの値を設定する。<p>
     * デフォルトは、ローカルホスト名。<br>
     * 
     * @param id 更新ユーザID
     */
    public void setUpdateUserId(String id);
    
    /**
     * スケジュールテーブル及びスケジュール依存関係テーブルの更新ユーザIDカラムの値を取得する。<p>
     * 
     * @return 更新ユーザID
     */
    public String getUpdateUserId();
    
    /**
     * スケジュールマスタテーブルのスキーマ情報を取得する。<p>
     *
     * @return スケジュールマスタテーブルのスキーマ情報
     */
    public DatabaseScheduleManagerService.ScheduleMasterTableSchema getScheduleMasterTableSchema();
    
    /**
     * スケジュールマスタテーブルのスキーマ情報を設定する。<p>
     *
     * @param schema スケジュールマスタテーブルのスキーマ情報
     */
    public void setScheduleMasterTableSchema(DatabaseScheduleManagerService.ScheduleMasterTableSchema schema);
    
    /**
     * スケジュール依存関係マスタテーブルのスキーマ情報を取得する。<p>
     *
     * @return スケジュール依存関係マスタテーブルのスキーマ情報
     */
    public DatabaseScheduleManagerService.ScheduleDependsMasterTableSchema getScheduleDependsMasterTableSchema();
    
    /**
     * スケジュール依存関係マスタテーブルのスキーマ情報を設定する。<p>
     *
     * @param schema スケジュール依存関係マスタテーブルのスキーマ情報
     */
    public void setScheduleDependsMasterTableSchema(DatabaseScheduleManagerService.ScheduleDependsMasterTableSchema schema);
    
    /**
     * スケジュールテーブルのスキーマ情報を取得する。<p>
     *
     * @return スケジュールテーブルのスキーマ情報
     */
    public DatabaseScheduleManagerService.ScheduleTableSchema getScheduleTableSchema();
    
    /**
     * スケジュールテーブルのスキーマ情報を設定する。<p>
     *
     * @param schema スケジュールテーブルのスキーマ情報
     */
    public void setScheduleTableSchema(DatabaseScheduleManagerService.ScheduleTableSchema schema);
    
    /**
     * スケジュール依存関係テーブルのスキーマ情報を取得する。<p>
     *
     * @return スケジュール依存関係テーブルのスキーマ情報
     */
    public DatabaseScheduleManagerService.ScheduleDependsTableSchema getScheduleDependsTableSchema();
    
    /**
     * スケジュール依存関係テーブルのスキーマ情報を設定する。<p>
     *
     * @param schema スケジュール依存関係テーブルのスキーマ情報
     */
    public void setScheduleDependsTableSchema(DatabaseScheduleManagerService.ScheduleDependsTableSchema schema);
    
    /**
     * スケジュールIDを発番するSQLを設定する。<p>
     *
     * @param query SQL
     */
    public void setNextScheduleIdSelectQuery(String query);
    
    /**
     * スケジュールIDを発番するSQLを取得する。<p>
     *
     * @return SQL
     */
    public String getNextScheduleIdSelectQuery();
    
    /**
     * 制御状態をチェックする間隔[ms]を設定する。<p>
     * デフォルトは、1秒。<br>
     *
     * @param interval 間隔[ms]
     */
    public void setControlStateCheckInterval(long interval);
    
    /**
     * 制御状態をチェックする間隔[ms]を判定する。<p>
     *
     * @return 間隔[ms]
     */
    public long getControlStateCheckInterval();
    
    /**
     * 最大遅延時間をチェックする間隔[ms]を設定する。<p>
     * デフォルトは、1秒。<br>
     *
     * @param interval 間隔[ms]
     */
    public void setTimeoverCheckInterval(long interval);
    
    /**
     * 最大遅延時間をチェックする間隔[ms]を判定する。<p>
     *
     * @return 間隔[ms]
     */
    public long getTimeoverCheckInterval();
    
    /**
     * サービスの開始時にシステム日付を使って、スケジュールを作成するかどうかを設定する。<p>
     *
     * @param isMake 作成する場合、true
     */
    public void setMakeScheduleOnStart(boolean isMake);
    
    /**
     * サービスの開始時にシステム日付を使って、スケジュールを作成するかどうかを判定する。<p>
     *
     * @return trueの場合、作成する
     */
    public boolean isMakeScheduleOnStart();
    
    /**
     * {@link #findExecutableSchedules(Date, String[])}呼び出し時に、該当スケジュールのレコードをロックするかどうかを設定する。<p>
     * デフォルトは、falseでロックしない。<br>
     *
     * @param isLock ロックする場合true
     */
    public void setLockForFindExecutable(boolean isLock);
    
    /**
     * {@link #findExecutableSchedules(Date, String[])}呼び出し時に、該当スケジュールのレコードをロックするかどうかを判定する。<p>
     *
     * @return ロックする場合true
     */
    public boolean isLockForFindExecutable();
    
    /**
     * {@link jp.ossc.nimbus.service.distribute.ClusterService クラスタ}サービスのサービス名を設定する。<p>
     * この属性を設定した場合、クラスタサービスが{@link jp.ossc.nimbus.service.distribute.ClusterService#isMain() ClusterService.isMain()}=trueとなっている場合のみ、制御状態のチェック及び、最大遅延時間のチェックを行う。<br>
     *
     * @param name クラスタサービスのサービス名
     */
    public void setClusterServiceName(ServiceName name);
    
    /**
     * {@link jp.ossc.nimbus.service.distribute.ClusterService クラスタ}サービスのサービス名を取得する。<p>
     *
     * @return クラスタサービスのサービス名
     */
    public ServiceName getClusterServiceName();
    
    /**
     * スケジュールIDを発番する{@link jp.ossc.nimbus.service.sequence.Sequence Sequence}サービスのサービス名を設定する。<p>
     *
     * @param name Sequenceサービスのサービス名
     */
    public void setSequenceServiceName(ServiceName name);
    
    /**
     * スケジュールIDを発番する{@link jp.ossc.nimbus.service.sequence.Sequence Sequence}サービスのサービス名を取得する。<p>
     *
     * @return Sequenceサービスのサービス名
     */
    public ServiceName getSequenceServiceName();
    
    /**
     * 内部で使用するSQLで文字列連結にCONCAT関数を使うかどうかを設定する。<p>
     * デフォルトは、falseで、"||"で連結する。<br>
     *
     * @param isUse CONCAT関数を使う場合true
     */
    public void setUseConcatFunction(boolean isUse);
    
    /**
     * 内部で使用するSQLで文字列連結にCONCAT関数を使うかどうかを判定する。<p>
     *
     * @return trueの場合、CONCAT関数を使う
     */
    public boolean isUseConcatFunction();
    
    /**
     * 指定された日付のスケジュールを作成する。<p>
     *
     * @param date 日付
     * @throws ScheduleMakeException スケジュール作成に失敗した場合
     */
    public void makeSchedule(Date date) throws ScheduleMakeException;
    
    /**
     * 全てのスケジュールを検索する。<p>
     *
     * @return スケジュールリスト
     * @exception ScheduleManageException スケジュールの検索に失敗した場合
     */
    public List<Schedule> findAllSchedules() throws ScheduleManageException;
    
    /**
     * 指定されたスケジュールを検索する。<p>
     *
     * @param id スケジュールのID
     * @return スケジュール
     * @exception ScheduleManageException スケジュールの検索に失敗した場合
     */
    public Schedule findSchedule(String id) throws ScheduleManageException;
    
    /**
     * 指定された期間のスケジュールを検索する。<p>
     *
     * @param from 期間の開始日時
     * @param to 期間の終了日時
     * @return スケジュールリスト
     * @exception ScheduleManageException スケジュールの検索に失敗した場合
     */
    public List<Schedule> findSchedules(Date from, Date to) throws ScheduleManageException;
    
    /**
     * 指定された状態のスケジュールを検索する。<p>
     *
     * @param states スケジュール状態の配列
     * @return スケジュールリスト
     * @exception ScheduleManageException スケジュールの検索に失敗した場合
     */
    public List<Schedule> findSchedules(int[] states) throws ScheduleManageException;
    
    /**
     * 指定された期間、指定された状態のスケジュールを検索する。<p>
     *
     * @param from 期間の開始日時
     * @param to 期間の終了日時
     * @param states スケジュール状態の配列
     * @return スケジュールリスト
     * @exception ScheduleManageException スケジュールの検索に失敗した場合
     */
    public List<Schedule> findSchedules(Date from, Date to, int[] states) throws ScheduleManageException;
    
    /**
     * 指定された日時と実行種別で実行可能なスケジュールを検索する。<p>
     *
     * @param date 日時
     * @param executorTypes 実行種別配列
     * @return スケジュールリスト
     * @exception ScheduleManageException スケジュールの検索に失敗した場合
     */
    public List<Schedule> findExecutableSchedules(Date date, String[] executorTypes) throws ScheduleManageException;
    
    /**
     * 指定された実行キーと実行種別、日時で実行可能なスケジュールを検索する。<p>
     *
     * @param date 日時
     * @param executorTypes 実行種別配列
     * @param executorKey 実行キー
     * @return スケジュールリスト
     * @exception ScheduleManageException スケジュールの検索に失敗した場合
     */
    public List<Schedule> findExecutableSchedules(Date date, String[] executorTypes, String executorKey) throws ScheduleManageException;
    
    /**
     * スケジュールを登録する。<p>
     *
     * @param masterId スケジュールマスタID
     * @param time スケジュール時刻
     * @param taskName タスク名
     * @param input 入力データ
     * @param depends 依存するスケジュールマスタIDの配列
     * @param executorKey ScheduleExecutorを特定するキー
     * @param executorType ScheduleExecutorの種類
     * @param retryInterval リトライ間隔[ms]
     * @param retryEndTime リトライ終了時刻
     * @param maxDelayTime 最大遅延時間[ms]
     * @exception ScheduleManageException スケジュールの登録に失敗した場合
     */
    public void addSchedule(
        String masterId,
        Date time,
        String taskName,
        Object input,
        String[] depends,
        String executorKey,
        String executorType,
        long retryInterval,
        Date retryEndTime,
        long maxDelayTime
    ) throws ScheduleManageException;
    
    /**
     * スケジュール時刻を変更する。<p>
     *
     * @param id スケジュールのID
     * @param time 時刻
     * @return スケジュールが更新された場合true
     * @exception ScheduleManageException スケジュールの更新に失敗した場合
     */
    public boolean reschedule(String id, Date time) throws ScheduleManageException;
    
    /**
     * スケジュールを削除する。<p>
     *
     * @param id スケジュールのID
     * @return スケジュールが削除された場合true
     * @exception ScheduleManageException スケジュールの削除に失敗した場合
     */
    public boolean removeSchedule(String id) throws ScheduleManageException;
    
    /**
     * スケジュールを削除する。<p>
     *
     * @param masterId スケジュールマスタのID
     * @return スケジュールが削除された場合true
     * @exception ScheduleManageException スケジュールの削除に失敗した場合
     */
    public boolean removeScheduleByMasterId(String masterId) throws ScheduleManageException;
    
    /**
     * 指定された日付のスケジュールを削除する。<p>
     *
     * @param date 日付
     * @return スケジュールが削除された場合true
     * @exception ScheduleManageException スケジュールの削除に失敗した場合
     */
    public boolean removeSchedule(Date date) throws ScheduleManageException;
    
    /**
     * スケジュールを実行する{@link ScheduleExecutor}を設定する。<p>
     *
     * @param id スケジュールのID
     * @param key ScheduleExecutorを特定するキー
     */
    public void setExecutorKey(String id, String key) throws ScheduleManageException;
    
    /**
     * 指定されたスケジュールの状態を取得する。<p>
     *
     * @param id スケジュールID
     * @return 状態
     * @exception ScheduleStateControlException スケジュール状態の取得に失敗した場合
     */
    public int getState(String id) throws ScheduleStateControlException;
    
    /**
     * 指定されたスケジュールの制御状態を取得する。<p>
     *
     * @param id スケジュールID
     * @return 制御状態
     * @exception ScheduleStateControlException スケジュール制御状態の取得に失敗した場合
     */
    public int getControlState(String id) throws ScheduleStateControlException;
    
    /**
     * 指定されたスケジュールの状態を変更する。<p>
     *
     * @param id スケジュールID
     * @param state 状態
     * @return 状態が変更された場合true
     * @exception ScheduleStateControlException スケジュール状態の変更に失敗した場合
     */
    public boolean changeState(String id, int state) throws ScheduleStateControlException;
    
    /**
     * 指定されたスケジュールの状態を変更する。<p>
     *
     * @param id スケジュールID
     * @param state 状態
     * @param output 実行結果
     * @return 状態が変更された場合true
     * @exception ScheduleStateControlException スケジュール状態の変更に失敗した場合
     */
    public boolean changeState(String id, int state, Object output) throws ScheduleStateControlException;
    
    /**
     * 指定されたスケジュールの制御状態を変更する。<p>
     *
     * @param id スケジュールID
     * @param state 制御状態
     * @return 制御状態が変更された場合true
     * @exception ScheduleStateControlException スケジュール制御状態の変更に失敗した場合
     */
    public boolean changeControlState(String id, int state) throws ScheduleStateControlException;
}
