001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.hayabusa.taglib;
017
018import org.opengion.hayabusa.common.HybsSystem;
019import org.opengion.hayabusa.common.SystemManager;
020import org.opengion.hayabusa.db.DBColumn;
021import org.opengion.hayabusa.db.DBTableModel;
022import org.opengion.hayabusa.db.DBTableModelUtil;
023import org.opengion.hayabusa.html.ViewForm;
024import org.opengion.hayabusa.html.ViewFormFactory;
025import org.opengion.hayabusa.resource.ResourceManager;
026
027import static org.opengion.fukurou.util.StringUtil.nval ;
028
029import org.opengion.fukurou.util.HybsTimerTask;
030import org.opengion.fukurou.util.HybsTimerTaskManager;
031
032import java.util.Timer;
033import java.util.Map;
034import java.util.HashMap;
035import java.util.Iterator;
036
037/**
038 * アプリケーション共有のタイマー機能を用いて、繰り返しスケジュールを設定するタグです。
039 *
040 * タイマースケジュールは、帳票デーモンや、再編成処理、定期的バッチ処理など、エンジン上の
041 * スレッドで動作するスケジュールを登録します。
042 * スケジュールすべきクラスは、HybsTimerTask を拡張(extends)しておく必要があります。
043 *
044 * @og.formSample
045 * ●形式:<og:schedule timerTask="・・・" name="・・・" command="[SET|VIEW|REMOVE|CANCEL]" ・・・ />
046 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
047 *
048 * ●Tag定義:
049 *   <og:schedule
050 *       command            【TAG】コマンド(SET,VIEW,REMOVE,CANCEL)をセットします(初期値:SET)
051 *       timerTask        ○【TAG】処理を実行するクラス名(HybsTimerTask のサブクラス)を指定します(必須)。
052 *       name             ○【TAG】名称(ユニークキー)を設定します(必須)。
053 *       comment            【TAG】タイマータスクの説明を設定します
054 *       singleton          【TAG】Name属性が同一のタスクを2重登録出来ないよう[true/false]にします(初期値:true[出来ない])
055 *       delay              【TAG】ミリ秒単位の遅延時間を設定します(初期値:0)
056 *       period             【TAG】ミリ秒単位の繰り返し間隔を設定します(初期値:60000)
057 *       fixedDelay         【TAG】固定遅延実行を指定するかどうか[true:固定遅延実行/false:固定頻度実行]を設定します(初期値:true)
058 *       keys               【TAG】HybsTimerTask に渡す為のキー情報、CSV形式で複数指定します
059 *       vals               【TAG】HybsTimerTask に渡す為の値を、CSV形式で複数指定します
060 *       startTime          【TAG】24時間制(YYMMDD)の開始時刻を設定します(初期値:000000)
061 *       stopTime           【TAG】24時間制(YYMMDD)の終了時刻を設定します(初期値:000000)
062 *       scope              【TAG】キャッシュする場合のスコープ(local,request,page,session,applicaton)を指定します(初期値:local)
063 *       tableId            【TAG】(通常は使いません)結果をDBTableModelに書き込んで、sessionに登録するときのキーを指定します
064 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
065 *   >   ... Body ...
066 *   </og:schedule>
067 *
068 * ●使用例
069 *      帳票デーモンスケジュール登録
070 *      period は、ms単位で指定する必要があるため、1000倍しています。
071 *      <og:schedule
072 *          command     = "{@CMD}"
073 *          scope       = "request"
074 *          timerTask   = "org.opengion.hayabusa.report.ReportDaemon"
075 *          name        = "{@NAME}"
076 *          comment     = "Start-up By {@USER.INFO}"
077 *          singleton   = "true"
078 *          delay       = "0"
079 *          period      = "{@PERIOD}000"
080 *          fixedDelay  = "true"
081 *          keys        = "SYSTEM_ID,DMN_GRP"
082 *          vals        = "{@SYSTEM_ID},{@DMN_GRP}"
083 *      />
084 *
085 * @og.group その他部品
086 *
087 * @version  4.0
088 * @author   Kazuhiko Hasegawa
089 * @since    JDK5.0,
090 */
091public class ScheduleTag extends CommonTagSupport {
092        //* このプログラムのVERSION文字列を設定します。   {@value} */
093        private static final String VERSION = "4.0.0.0 (2007/10/18)" ;
094
095        private static final long serialVersionUID = 400020071018L ;
096
097        /** command 引数に渡す事の出来る コマンド  セット {@value} */
098        public static final String CMD_SET   = "SET";
099        /** command 引数に渡す事の出来る コマンド  ビュー {@value} */
100        public static final String CMD_VIEW   = "VIEW";
101        /** command 引数に渡す事の出来る コマンド  リムーブ {@value} */
102        public static final String CMD_REMOVE   = "REMOVE";
103        /** command 引数に渡す事の出来る コマンド  キャンセル {@value} */
104        public static final String CMD_CANCEL   = "CANCEL";
105
106        /** command 引数に渡す事の出来る コマンド リスト  */
107        private static final String[] COMMAND_LIST = new String[] {
108                CMD_SET , CMD_VIEW , CMD_REMOVE , CMD_CANCEL };
109
110        // 3.5.2.0 (2003/10/20) 結果を DBTableModel として、scope 属性に登録する。
111        private String            tableId          = HybsSystem.TBL_MDL_KEY;
112
113        private String  command         = CMD_SET;
114        private String  timerTask       = null;         // 処理を実行する HybsTimerTask のクラス名を指定します。
115        private String  name            = null;         // タイマータスクの名称(ユニークキー)
116        private String  comment         = null;         // タイマータスクの説明
117        private long    delay           = 0l;           // タスクが実行される前のミリ秒単位の遅延(初期値:0)
118        private long    period          = 60000l;       // 連続するタスク実行のミリ秒単位の時間(初期値:60000 mS)
119        private boolean fixedDelay      = true;         // 固定遅延実行(true)/固定頻度実行(false) (初期値:true)
120        private int             uniqKey         = -1;           // ありえない値を初期設定しておく。
121        private boolean singleton       = true;         // Name属性が同一のタスクを2重登録出来ないようにする(初期値:true)
122
123        private static final long FIXED_RATE_MIN_TIME = 1000;   // 固定頻度実行時の最小繰り返し時間
124
125        private static final String TIMER_KEY           = HybsSystem.SCEDULE_KEY;
126        private static final String TIMERTASK_KEY       = HybsSystem.SCEDULE_TASK_KEY;
127
128        // 3.2.2.0 (2003/05/31) HybsTimerTask に対して、設定値を渡せるように変更。
129        private String[]        keys    = null;         // タイマータスクへ渡すキー配列
130        private String[]        vals    = null;         // タイマータスクへ渡すバリュー配列
131        private String          body    = null;         // タイマータスクへ渡すボディー要素
132        private String          startTime       = "000000";     // 24時間制の開始時刻
133        private String          stopTime        = "000000";     // 24時間制の終了時刻
134
135        // 3.5.2.0 (2003/10/20) 結果を DBTableModel として、scope 属性に登録する。
136        private String          scope   = "local";      // local は互換性のため。"request","page","session","applicaton"
137
138        // 3.7.0.4 (2005/03/14) 帳票デーモンに、エラー時にスリープして待機する機能を追加
139        private final int ERROR_SLEEP_TIME = HybsSystem.sysInt( "REPORT_DAEMON_ERROR_SLEEP_TIME" );
140
141        // 4.0.0 (2006/11/17) HybsTimerTaskManager を static クラスから通常オブジェクトとして管理。
142        private static final HybsTimerTaskManager taskManager ;
143
144        // 4.0.0 (2005/01/31) Cleanable インターフェースによる初期化処理
145        // 4.3.6.2 (2009/04/15) コンテキスト終了時のみclear()されるように対応
146        static {
147                taskManager = new HybsTimerTaskManager();
148                // 4.3.6.2 (2009/04/15)
149                SystemManager.addCleanable( taskManager, true );
150        }
151
152        /**
153         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
154         *
155         * @og.rev 3.2.2.0 (2003/05/31) HybsTimerTask に対して、設定値を渡せるように変更。
156         *
157         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
158         */
159        @Override
160        public int doStartTag() {
161                return EVAL_BODY_BUFFERED ;     // Body を評価する。( extends BodyTagSupport 時)
162        }
163
164        /**
165         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
166         *
167         * @og.rev 3.2.2.0 (2003/05/31) HybsTimerTask に対して、設定値を渡せるように変更。
168         *
169         * @return      後続処理の指示(SKIP_BODY)
170         */
171        @Override
172        public int doAfterBody() {
173                body = getBodyString();
174
175                return SKIP_BODY ;
176        }
177
178        /**
179         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
180         *
181         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
182         * @og.rev 3.6.0.8 (2004/11/19) DBTableModel をセーブする時に、トランザクションチェックを行います。
183         *
184         * @return      後続処理の指示
185         */
186        @Override
187        public int doEndTag() {
188                debugPrint();           // 4.0.0 (2005/02/28)
189                if( !check( command, COMMAND_LIST ) ) { return EVAL_PAGE ; }
190
191                if( "session".equals( scope ) ) {
192                        startQueryTransaction( tableId );               // 3.6.0.8 (2004/11/19)
193                }
194
195                // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。
196                if( commandExec( command ) ) {
197                        return EVAL_PAGE ;              // ページの残りを評価する。
198                }
199                else {
200                        jspPrint( "ScheduleTag Query処理が割り込まれました。DBTableModel は登録しません。" );
201                        return SKIP_PAGE;
202                }
203        }
204
205        /**
206         * タグリブオブジェクトをリリースします。
207         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
208         *
209         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
210         * @og.rev 3.2.2.0 (2003/05/31) HybsTimerTask に対して、設定値を渡せるように変更。
211         * @og.rev 3.5.2.0 (2003/10/20) 結果を DBTableModel として、scope 属性に登録する。
212         */
213        @Override
214        protected void release2() {
215                super.release2();
216                command         = CMD_SET;
217                timerTask       = null;         // 処理を実行する HybsTimerTask のクラス名を指定します。
218                name            = null;         // タイマータスクの名称(ユニークキー)
219                comment         = null;         // タイマータスクの説明
220                delay           = 0;            // タスクが実行される前のミリ秒単位の遅延(初期値:0)
221                period          = 60000;        // 連続するタスク実行のミリ秒単位の時間(初期値:60000 mS)
222                fixedDelay      = true;         // 固定遅延実行(true)/固定頻度実行(false) (初期値:true)
223                uniqKey         = -1;           // ありえない値を初期設定しておく。
224                singleton       = true;         // Name属性が同一のタスクを2重登録出来ないようにする(初期値:true)
225                keys            = null;         // タイマータスクへ渡すキー配列
226                vals            = null;         // タイマータスクへ渡すバリュー配列
227                startTime       = "000000";     // 24時間制の開始時刻
228                stopTime        = "000000";     // 24時間制の終了時刻
229                tableId         = HybsSystem.TBL_MDL_KEY;               //
230                scope           = "local";      // local は互換性のため。"request","page","session","applicaton"
231        }
232
233        /**
234         * コマンドを実行します。
235         *
236         * コマンドは,HTMLから(SET/VIEW/REMOVE/CANCEL)指定されますので,setCommand()メソッドで
237         * 登録します。
238         * コマンドを登録すると同時に,実行も行ないます。
239         *
240         * @og.rev 3.5.2.0 (2003/10/20) viewAttribute()メソッドを、全てで実行します。
241         * @og.rev 3.6.0.8 (2004/11/19) 正常に登録できたかどうかを、返します。
242         * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( setMsg() ⇒ setLbl )
243         *
244         * @param   command コマンド(public static final 宣言されている文字列)
245         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ScheduleTag.CMD_SET">コマンド定数</a>
246         *
247         * @return 正常かどうか(true:正常/false:異常)
248         */
249        protected boolean commandExec( final String command ) {
250                if( CMD_SET.equals( command ) ) {
251                        setAttribute();
252                        setLbl( "MSG0059" );    // 登録しました。
253                        jspPrint( getMsglbl() );
254                }
255                else if( CMD_VIEW.equals( command ) ) {
256                        jspPrint( String.valueOf( taskManager.size() ) );
257                        setLbl( "MSG0033" );    //  件検索しました。
258                        jspPrint( getMsglbl() );
259                }
260                else if( CMD_REMOVE.equals( command ) ) {
261                        removeAttribute();
262                        setLbl( "MSG0061" );    // 削除しました。
263                        jspPrint( getMsglbl() );
264                }
265                else if( CMD_CANCEL.equals( command ) ) {
266                        cancelAttribute();
267                        setLbl( "MSG0063" );    // 完了しました。
268                        jspPrint( getMsglbl() );
269                }
270                return viewAttribute();
271        }
272
273        /**
274         * HybsTimerTask を登録します。
275         *
276         * @og.rev 3.2.2.0 (2003/05/31) HybsTimerTask に対して、設定値を渡せるように変更。
277         * @og.rev 3.6.0.7 (2004/11/06) パラメータをMapで渡すように変更。
278         * @og.rev 3.7.0.4 (2005/03/14) HybsTimerTask に setErrorSleepSec メソッドの追加
279         */
280        @SuppressWarnings(value={"unchecked"})
281        private void setAttribute() {
282                // シングルトンで、かつ、すでに、同一名称のタスクが
283                // 含まれている場合は、セットしない。
284                if( singleton && taskManager.contains( name ) ) { return ; }
285
286                // 3.6.0.7 (2004/11/06) パラメータをMapで渡すように変更
287                Map<String,String> param = null;
288                if( keys != null ) {
289                        param = new HashMap<String,String>();
290                        for( int i=0; i<keys.length; i++ ) {
291                                param.put( keys[i],vals[i] );
292                        }
293                }
294
295                HybsTimerTask task = (HybsTimerTask)HybsSystem.newInstance( timerTask );
296                taskManager.addTask( task );
297
298                task.setName( name );
299                task.setComment( comment );
300                task.setParameter( param );             // 3.6.0.7 (2004/11/06)
301                task.setBody( body );
302                task.setStartTime( startTime );
303                task.setStopTime( stopTime );
304                task.setErrorSleepSec( ERROR_SLEEP_TIME );      // 3.7.0.4 (2005/03/14)
305                task.initDaemon();
306
307                // 3.6.1.0 (2005/01/05) Timer 同一スレッドのため、個別に作成する。
308                Map<String,Timer> timerMap = (Map<String,Timer>)getContextAttribute( TIMER_KEY );
309                if( timerMap == null ) { timerMap = new HashMap<String,Timer>(); }
310
311                Timer timer = timerMap.get( name );
312                if( timer == null ) { timer = new Timer( true ); }
313
314                if( fixedDelay ) {
315                        if( period > 0 ) { timer.schedule( task,delay,period ); }
316                        else             { timer.schedule( task,delay ); }
317                }
318                else {
319                        if( period < FIXED_RATE_MIN_TIME ) { period = FIXED_RATE_MIN_TIME; }
320                        timer.scheduleAtFixedRate( task,delay,period );
321                }
322
323                // 3.6.1.0 (2005/01/05) Timer 同一スレッドのため、個別に作成する。
324                timerMap.put( name,timer );
325                setContextAttribute( TIMER_KEY,timerMap );
326        }
327
328        /**
329         * HybsTimerTask を一覧表示します。
330         *
331         * @og.rev 3.5.2.0 (2003/10/20) 結果を DBTableModel として、scope 属性に登録する。
332         * @og.rev 3.5.6.1 (2004/06/25) lang 言語コード 属性を削除します。
333         * @og.rev 3.6.0.8 (2004/11/19) DBTableModel をセーブする時に、トランザクションチェックを行います。
334         * @og.rev 3.6.0.8 (2004/11/19) 正常に登録できたかどうかを、返します。
335         *
336         * @return 正常かどうか(true:正常/false:異常)
337         */
338        private boolean viewAttribute() {
339                HybsTimerTask[] tasks = taskManager.toArray();
340                DBTableModel table = makeDBTable( tasks );
341
342                if( "local".equals( scope ) ) {
343                        if( table != null ) {
344                                ViewForm form = ViewFormFactory.newInstance( "HTMLTable" );
345                                form.clear();
346                                form.init( table );
347                                jspPrint( form.create() );
348                        }
349                }
350                else {
351                        super.setScope( scope );                // 3.6.0.9 (2004/12/03)
352                        // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。
353                        return commitTableObject( tableId, table );
354                }
355                return true;
356        }
357
358        /**
359         * HybsTimerTask を削除します。
360         *
361         * @og.rev 3.2.2.0 (2003/05/31) キャンセルを名前でもできる様にロジック追加。
362         *
363         */
364        private void removeAttribute() {
365                if( uniqKey >= 0 ) {
366                        taskManager.cancelTask( uniqKey );
367                }
368                else {
369                        taskManager.cancelTask( name );
370                }
371        }
372
373        /**
374         * Timer そのものをキャンセルします。
375         *
376         * すべての、HybsTimerTask は、削除されます。
377         *
378         * @og.rev 3.6.1.0 (2005/01/05) Timer 同一スレッドのため、個別に作成する。
379         */
380        @SuppressWarnings(value={"unchecked"})
381        private void cancelAttribute() {
382                taskManager.clear();
383
384                // 3.6.1.0 (2005/01/05)
385                Map<String,Timer> timerMap = (Map<String,Timer>)getContextAttribute( TIMER_KEY );
386                if( timerMap != null ) {
387                        Iterator<Timer> iterator = timerMap.values().iterator();        // 4.3.3.6 (2008/11/15) Generics警告対応
388                        while( iterator.hasNext() ) {
389                                (iterator.next()).cancel();     // 4.3.3.6 (2008/11/15) Generics警告対応
390                        }
391                        timerMap.clear();
392                }
393                removeContextAttribute( TIMER_KEY );
394        }
395
396        /**
397         * 【TAG】コマンド(SET,VIEW,REMOVE,CANCEL)をセットします(初期値:SET)。
398         *
399         * @og.tag
400         * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される
401         * フィールド定数値のいづれかを、指定できます。
402         * 何も設定されない、または、null の場合は、"SET" が初期値にセットされます。
403         *
404         * @param       cmd コマンド(public static final 宣言されている文字列)
405         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ScheduleTag.CMD_SET">コマンド定数</a>
406         */
407        public void setCommand( final String cmd ) {
408                command = nval( getRequestParameter( cmd ),command );
409        }
410
411        /**
412         * 【TAG】処理を実行するクラス名(HybsTimerTask のサブクラス)を指定します。
413         *
414         * @og.tag 処理を実行する HybsTimerTask のクラス名を指定します。
415         *
416         * @param   val クラス名
417         */
418        public void setTimerTask( final String val ) {
419                timerTask = getRequestParameter( val );
420        }
421
422        /**
423         * 【TAG】名称(ユニークキー)を設定します。
424         *
425         * @og.tag タイマータスクの名称(ユニークキー)を設定します。
426         *
427         * @param   nm タイマータスクの名称
428         */
429        public void setName( final String nm ) {
430                name = getRequestParameter( nm );
431        }
432
433        /**
434         * 【TAG】タイマータスクの説明を設定します。
435         *
436         * @og.tag タイマータスクの説明を設定します。
437         *
438         * @param   cmt タイマータスクの説明
439         */
440        public void setComment( final String cmt ) {
441                comment = getRequestParameter( cmt );
442        }
443
444        /**
445         * 【TAG】ミリ秒単位の遅延時間を設定します(初期値:0)。
446         *
447         * @og.tag タスクが実行される前のミリ秒単位の遅延を設定します(初期値:0)
448         *
449         * @param   val 遅延時間(ms)
450         */
451        public void setDelay( final String val ) {
452                delay = nval( getRequestParameter( val ),delay );
453        }
454
455        /**
456         * 【TAG】ミリ秒単位の繰り返し間隔を設定します(初期値:60000)。
457         *
458         * @og.tag 連続するタスク実行のミリ秒単位の時間を設定します(初期値:60000 mS)
459         *
460         * @param   val 繰り返し間隔(ms)
461         */
462        public void setPeriod( final String val ) {
463                period = nval( getRequestParameter( val ),period );
464        }
465
466        /**
467         * 【TAG】固定遅延実行を指定するかどうか[true:固定遅延実行/false:固定頻度実行]を設定します(初期値:true)。
468         *
469         * @og.tag
470         * 固定遅延実行では、前の実行の実際の実行時間を基準にしてそれぞれの実行がスケジュールされます。
471         * 何らかの理由で実行が遅延した場合 そのあとの実行も遅延されます。
472         * 最終的に、実行の頻度は通常、指定した期間の対応する頻度よりも若干遅くなります
473         *
474         * 固定頻度実行では、最初の実行のスケジュールされた実行時間を基準にしてそれぞれの実行が
475         * スケジュールされます。何らかの理由で実行が遅延した場合、「遅れを取り戻す」ために
476         * 2 つ以上の実行が連続して行われます。最終的に実行の頻度は、指定した期間の対応する頻度と
477         * 同じになります
478         * 初期値は、true:固定遅延実行 です。
479         *
480         * @param   flag  [true:固定遅延実行/false:固定頻度実行]
481         */
482        public void setFixedDelay( final String flag ) {
483                fixedDelay = nval( getRequestParameter( flag ),fixedDelay );
484        }
485
486        /**
487         * 【TAG】スケジュールを一意に決めるためのユニーク番号を指定します(初期値:-1)。
488         *
489         * @og.tag
490         * スケジュールを削除したりする場合に、必要なユニーク番号を指定します。
491         * 初期値は、-1:あり得ない値 です。
492         *
493         * @param   no ユニーク番号
494         */
495        public void setUniqKey( final String no ) {
496                uniqKey = nval( getRequestParameter( no ),uniqKey );
497        }
498
499        /**
500         * 【TAG】Name属性が同一のタスクを2重登録出来ないよう[true/false]にします(初期値:true[出来ない])。
501         *
502         * @og.tag
503         * 同一種類のタスクを複数同時立上げしたくない場合に、利用します。
504         * 一般に、タイマータスクそのものが、繰り返し実行されますので、
505         * 初期値は、2重登録禁止にしています。
506         *
507         * @param   flag Name属性が同一のタスクを2重登録出来ないようにする(初期値:true)
508         */
509        public void setSingleton( final String flag ) {
510                singleton = nval( getRequestParameter( flag ),singleton );
511        }
512
513        /**
514         * 【TAG】HybsTimerTask に渡す為のキー情報、CSV形式で複数指定します。
515         *
516         * @og.tag
517         * HybsTimerTask に渡す為の、キー情報をカンマ区切りで複数指定できます。
518         * vals 属性には、キーに対応する値を、設定してください。
519         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
520         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
521         *
522         * @og.rev 3.2.2.0 (2003/05/31) 新規追加
523         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
524         *
525         * @param       key キー情報(CSV形式)
526         */
527        public void setKeys( final String key ) {
528                keys = getCSVParameter( key );
529        }
530
531        /**
532         * 【TAG】HybsTimerTask に渡す為の値を、CSV形式で複数指定します。
533         *
534         * @og.tag
535         * キーに設定した値を、カンマ区切り文字で複数して出来ます。
536         * 指定順序は、キーと同じにしておいて下さい。
537         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
538         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
539         *
540         * @og.rev 3.2.2.0 (2003/05/31) 新規追加
541         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
542         *
543         * @param       val 値(CSV形式)
544         */
545        public void setVals( final String val ) {
546                vals = getCSVParameter( val );
547        }
548
549        /**
550         * 【TAG】24時間制(YYMMDD)の開始時刻を設定します(初期値:000000)。
551         *
552         * @og.tag
553         * 指定時刻範囲内での実行のみ許可するように開始時刻を設定します。
554         * これは、タイマーで指定した間隔ごとにチェックを入れるので、チェック時間が
555         * 長い場合は、正確に開始時刻から始まるというものではありません。
556         * 初期値は、"000000" です。
557         *
558         * @og.rev 3.2.2.0 (2003/05/31) 新規追加
559         *
560         * @param       st 開始時刻
561         */
562        public void setStartTime( final String st ) {
563                startTime = nval( getRequestParameter( st ),startTime ) ;
564        }
565
566        /**
567         * 【TAG】24時間制(YYMMDD)の終了時刻を設定します(初期値:000000)。
568         *
569         * @og.tag
570         * 指定時刻範囲内での実行のみ許可するように終了時刻を設定します。
571         * これは、タイマーで指定した間隔ごとにチェックを入れるので、チェック時間が
572         * 長い場合は、正確に終了時刻で終了するというものではありません。
573         * (終了時刻を越えてからの新規実行はありません。)
574         * 初期値は、"000000" です。
575         *
576         * @og.rev 3.2.2.0 (2003/05/31) 新規追加
577         *
578         * @param       st 終了時刻
579         */
580        public void setStopTime( final String st ) {
581                stopTime = nval( getRequestParameter( st ),stopTime ) ;
582        }
583
584        /**
585         * HybsTimerTask オブジェクト配列より、DBTableModel を作成して返します。
586         * カラム名は、"TaskName","UniqKey","Comment","CreateTime","scheduledTime" です。
587         *
588         * @param   tasks       タイマータスクオブジェクト配列
589         *
590         * @return      タイマータスクオブジェクトのテーブルモデル。 無ければ null
591         */
592        private DBTableModel makeDBTable( final HybsTimerTask[] tasks ) {
593                if( tasks == null || tasks.length == 0 ) { return null; }
594
595                ResourceManager  resource  = getResource();
596
597                String[] names = new String[] {
598                                                        "TaskName","UniqKey","Comment","CreateTime","scheduledTime"
599                                                };
600
601                DBTableModel table = DBTableModelUtil.newDBTable();
602                table.init( names.length );
603                for( int i=0; i<names.length; i++ ) {
604                        DBColumn dbColumn = resource.makeDBColumn( names[i] );
605                        table.setDBColumn( i,dbColumn );
606                }
607
608                for( int i=0; i<tasks.length; i++ ) {
609                        String[] clmVals = new String[names.length];
610                        clmVals[0] = tasks[i].getName() ;
611                        clmVals[1] = String.valueOf( tasks[i].getUniqKey() );
612                        clmVals[2] = tasks[i].getComment() ;
613                        clmVals[3] = HybsSystem.getDate( tasks[i].getCreateTime() );
614                        clmVals[4] = HybsSystem.getDate( tasks[i].scheduledExecutionTime() );
615                        table.addColumnValues( clmVals );
616                }
617
618                return table ;
619        }
620
621        /**
622         * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
623         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
624         *
625         * @og.tag
626         * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に
627         * 渡す場合に、通常は、session を利用します。その場合の登録キーです。
628         * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、
629         * この tableId 属性を利用して、メモリ空間を分けます。
630         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
631         *
632         * @param       id sessionに登録する時の ID
633         */
634        public void setTableId( final String id ) {
635                tableId = nval( getRequestParameter( id ),tableId );
636        }
637
638        /**
639         * 【TAG】キャッシュする場合のスコープ(local,request,page,session,applicaton)を指定します(初期値:local)。
640         *
641         * @og.tag
642         * "local","request","page","session","applicaton" が指定できます。
643         * "local" は、過去のバージョンとの互換性を保つ為の特殊な値です。
644         * 初期値は、"local" です。
645         *
646         * @og.rev 3.5.2.0 (2003/10/20) 新規作成
647         *
648         * @param       scp     スコープ
649         */
650        @Override
651        public void setScope( final String scp ) {
652                scope = nval( getRequestParameter( scp ),scope );
653        }
654
655        /**
656         * このオブジェクトの文字列表現を返します。
657         * 基本的にデバッグ目的に使用します。
658         *
659         * @return このクラスの文字列表現
660         */
661        @Override
662        public String toString() {
663                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
664                                .println( "VERSION"                             ,VERSION                )
665                                .println( "tableId"                             ,tableId                )
666                                .println( "command"                             ,command                )
667                                .println( "timerTask"                   ,timerTask              )
668                                .println( "name"                                ,name                   )
669                                .println( "comment"                             ,comment                )
670                                .println( "delay"                               ,delay                  )
671                                .println( "period"                              ,period                 )
672                                .println( "fixedDelay"                  ,fixedDelay             )
673                                .println( "uniqKey"                             ,uniqKey                )
674                                .println( "singleton"                   ,singleton              )
675                                .println( "FIXED_RATE_MIN_TIME" ,FIXED_RATE_MIN_TIME)
676                                .println( "TIMER_KEY"                   ,TIMER_KEY              )
677                                .println( "TIMERTASK_KEY"               ,TIMERTASK_KEY  )
678                                .println( "keys"                                ,keys                   )
679                                .println( "vals"                                ,vals                   )
680                                .println( "body"                                ,body                   )
681                                .println( "startTime"                   ,startTime              )
682                                .println( "stopTime"                    ,stopTime               )
683                                .println( "scope"                               ,scope                  )
684                                .println( "ERROR_SLEEP_TIME"    ,ERROR_SLEEP_TIME)
685                                .println( "COMMAND_LIST"                ,COMMAND_LIST   )
686                                .println( "Other..."    ,getAttributes().getAttribute() )
687                                .fixForm().toString() ;
688        }
689}