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 );
150                SystemManager.addCleanable( taskManager, true );
151        }
152
153        /**
154         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
155         *
156         * @og.rev 3.2.2.0 (2003/05/31) HybsTimerTask に対して、設定値を渡せるように変更。
157         *
158         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
159         */
160        @Override
161        public int doStartTag() {
162                return( EVAL_BODY_BUFFERED );   // Body を評価する。( extends BodyTagSupport 時)
163        }
164
165        /**
166         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
167         *
168         * @og.rev 3.2.2.0 (2003/05/31) HybsTimerTask に対して、設定値を渡せるように変更。
169         *
170         * @return      後続処理の指示(SKIP_BODY)
171         */
172        @Override
173        public int doAfterBody() {
174                body = getBodyString();
175
176                return(SKIP_BODY);
177        }
178
179        /**
180         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
181         *
182         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
183         * @og.rev 3.6.0.8 (2004/11/19) DBTableModel をセーブする時に、トランザクションチェックを行います。
184         *
185         * @return      後続処理の指示
186         */
187        @Override
188        public int doEndTag() {
189                debugPrint();           // 4.0.0 (2005/02/28)
190                if( !check( command, COMMAND_LIST ) ) { return( EVAL_PAGE ); }
191
192                if( "session".equals( scope ) ) {
193                        startQueryTransaction( tableId );               // 3.6.0.8 (2004/11/19)
194                }
195
196                // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。
197                if( commandExec( command ) ) {
198                        return(EVAL_PAGE);              // ページの残りを評価する。
199                }
200                else {
201                        jspPrint( "ScheduleTag Query処理が割り込まれました。DBTableModel は登録しません。" );
202                        return (SKIP_PAGE);
203                }
204        }
205
206        /**
207         * タグリブオブジェクトをリリースします。
208         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
209         *
210         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
211         * @og.rev 3.2.2.0 (2003/05/31) HybsTimerTask に対して、設定値を渡せるように変更。
212         * @og.rev 3.5.2.0 (2003/10/20) 結果を DBTableModel として、scope 属性に登録する。
213         */
214        @Override
215        protected void release2() {
216                super.release2();
217                command         = CMD_SET;
218                timerTask       = null;         // 処理を実行する HybsTimerTask のクラス名を指定します。
219                name            = null;         // タイマータスクの名称(ユニークキー)
220                comment         = null;         // タイマータスクの説明
221                delay           = 0;            // タスクが実行される前のミリ秒単位の遅延(初期値:0)
222                period          = 60000;        // 連続するタスク実行のミリ秒単位の時間(初期値:60000 mS)
223                fixedDelay      = true;         // 固定遅延実行(true)/固定頻度実行(false) (初期値:true)
224                uniqKey         = -1;           // ありえない値を初期設定しておく。
225                singleton       = true;         // Name属性が同一のタスクを2重登録出来ないようにする(初期値:true)
226                keys            = null;         // タイマータスクへ渡すキー配列
227                vals            = null;         // タイマータスクへ渡すバリュー配列
228                startTime       = "000000";     // 24時間制の開始時刻
229                stopTime        = "000000";     // 24時間制の終了時刻
230                tableId         = HybsSystem.TBL_MDL_KEY;               //
231                scope           = "local";      // local は互換性のため。"request","page","session","applicaton"
232        }
233
234        /**
235         * コマンドを実行します。
236         *
237         * コマンドは,HTMLから(SET/VIEW/REMOVE/CANCEL)指定されますので,setCommand()メソッドで
238         * 登録します。
239         * コマンドを登録すると同時に,実行も行ないます。
240         *
241         * @og.rev 3.5.2.0 (2003/10/20) viewAttribute()メソッドを、全てで実行します。
242         * @og.rev 3.6.0.8 (2004/11/19) 正常に登録できたかどうかを、返します。
243         * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( setMsg() ⇒ setLbl )
244         *
245         * @param   command コマンド(public static final 宣言されている文字列)
246         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ScheduleTag.CMD_SET">コマンド定数</a>
247         *
248         * @return 正常かどうか(true:正常/false:異常)
249         */
250        protected boolean commandExec( final String command ) {
251                if( CMD_SET.equals( command ) ) {
252                        setAttribute();
253//                      setMsg( "MSG0059" );    // 登録しました。
254                        setLbl( "MSG0059" );    // 登録しました。
255                        jspPrint( getMsglbl() );
256                }
257                else if( CMD_VIEW.equals( command ) ) {
258                        jspPrint( String.valueOf( taskManager.size() ) );
259//                      setMsg( "MSG0033" );    //  件検索しました。
260                        setLbl( "MSG0033" );    //  件検索しました。
261                        jspPrint( getMsglbl() );
262                }
263                else if( CMD_REMOVE.equals( command ) ) {
264                        removeAttribute();
265//                      setMsg( "MSG0061" );    // 削除しました。
266                        setLbl( "MSG0061" );    // 削除しました。
267                        jspPrint( getMsglbl() );
268                }
269                else if( CMD_CANCEL.equals( command ) ) {
270                        cancelAttribute();
271//                      setMsg( "MSG0063" );    // 完了しました。
272                        setLbl( "MSG0063" );    // 完了しました。
273                        jspPrint( getMsglbl() );
274                }
275                return viewAttribute();
276        }
277
278        /**
279         * HybsTimerTask を登録します。
280         *
281         * @og.rev 3.2.2.0 (2003/05/31) HybsTimerTask に対して、設定値を渡せるように変更。
282         * @og.rev 3.6.0.7 (2004/11/06) パラメータをMapで渡すように変更。
283         * @og.rev 3.7.0.4 (2005/03/14) HybsTimerTask に setErrorSleepSec メソッドの追加
284         */
285        @SuppressWarnings(value={"unchecked"})
286        private void setAttribute() {
287                // シングルトンで、かつ、すでに、同一名称のタスクが
288                // 含まれている場合は、セットしない。
289                if( singleton && taskManager.contains( name ) ) { return ; }
290
291                // 3.6.0.7 (2004/11/06) パラメータをMapで渡すように変更
292                Map<String,String> param = null;
293                if( keys != null ) {
294                        param = new HashMap<String,String>();
295                        for( int i=0; i<keys.length; i++ ) {
296                                param.put( keys[i],vals[i] );
297                        }
298                }
299
300                HybsTimerTask task = (HybsTimerTask)HybsSystem.newInstance( timerTask );
301                taskManager.addTask( task );
302
303                task.setName( name );
304                task.setComment( comment );
305                task.setParameter( param );             // 3.6.0.7 (2004/11/06)
306                task.setBody( body );
307                task.setStartTime( startTime );
308                task.setStopTime( stopTime );
309                task.setErrorSleepSec( ERROR_SLEEP_TIME );      // 3.7.0.4 (2005/03/14)
310                task.initDaemon();
311
312                // 3.6.1.0 (2005/01/05) Timer 同一スレッドのため、個別に作成する。
313                Map<String,Timer> timerMap = (Map<String,Timer>)getContextAttribute( TIMER_KEY );
314                if( timerMap == null ) { timerMap = new HashMap<String,Timer>(); }
315
316                Timer timer = timerMap.get( name );
317                if( timer == null ) { timer = new Timer( true ); }
318
319                if( fixedDelay ) {
320                        if( period > 0 ) { timer.schedule( task,delay,period ); }
321                        else             { timer.schedule( task,delay ); }
322                }
323                else {
324                        if( period < FIXED_RATE_MIN_TIME ) { period = FIXED_RATE_MIN_TIME; }
325                        timer.scheduleAtFixedRate( task,delay,period );
326                }
327
328                // 3.6.1.0 (2005/01/05) Timer 同一スレッドのため、個別に作成する。
329                timerMap.put( name,timer );
330                setContextAttribute( TIMER_KEY,timerMap );
331        }
332
333        /**
334         * HybsTimerTask を一覧表示します。
335         *
336         * @og.rev 3.5.2.0 (2003/10/20) 結果を DBTableModel として、scope 属性に登録する。
337         * @og.rev 3.5.6.1 (2004/06/25) lang 言語コード 属性を削除します。
338         * @og.rev 3.6.0.8 (2004/11/19) DBTableModel をセーブする時に、トランザクションチェックを行います。
339         * @og.rev 3.6.0.8 (2004/11/19) 正常に登録できたかどうかを、返します。
340         *
341         * @return 正常かどうか(true:正常/false:異常)
342         */
343        private boolean viewAttribute() {
344                HybsTimerTask[] tasks = taskManager.toArray();
345                DBTableModel table = makeDBTable( tasks );
346
347                if( "local".equals( scope ) ) {
348                        if( table != null ) {
349                                ViewForm form = ViewFormFactory.newInstance( "HTMLTable" );
350                                form.clear();
351                                form.init( table );
352                                jspPrint( form.create() );
353                        }
354                }
355                else {
356                        super.setScope( scope );                // 3.6.0.9 (2004/12/03)
357                        // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。
358                        return commitTableObject( tableId, table );
359                }
360                return true;
361        }
362
363        /**
364         * HybsTimerTask を削除します。
365         *
366         * @og.rev 3.2.2.0 (2003/05/31) キャンセルを名前でもできる様にロジック追加。
367         *
368         */
369        private void removeAttribute() {
370                if( uniqKey >= 0 ) {
371                        taskManager.cancelTask( uniqKey );
372                }
373                else {
374                        taskManager.cancelTask( name );
375                }
376        }
377
378        /**
379         * Timer そのものをキャンセルします。
380         *
381         * すべての、HybsTimerTask は、削除されます。
382         *
383         * @og.rev 3.6.1.0 (2005/01/05) Timer 同一スレッドのため、個別に作成する。
384         */
385        @SuppressWarnings(value={"unchecked"})
386        private void cancelAttribute() {
387                taskManager.clear();
388
389                // 3.6.1.0 (2005/01/05)
390                Map<String,Timer> timerMap = (Map<String,Timer>)getContextAttribute( TIMER_KEY );
391                if( timerMap != null ) {
392                        Iterator<Timer> iterator = timerMap.values().iterator();  // 4.3.3.6 (2008/11/15) Generics警告対応
393                        while( iterator.hasNext() ) {
394//                              ((Timer)iterator.next()).cancel();
395                                (iterator.next()).cancel();     // 4.3.3.6 (2008/11/15) Generics警告対応
396                        }
397                        timerMap.clear();
398                }
399                removeContextAttribute( TIMER_KEY );
400        }
401
402        /**
403         * 【TAG】コマンド(SET,VIEW,REMOVE,CANCEL)をセットします(初期値:SET)。
404         *
405         * @og.tag
406         * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される
407         * フィールド定数値のいづれかを、指定できます。
408         * 何も設定されない、または、null の場合は、"SET" が初期値にセットされます。
409         *
410         * @param       cmd コマンド(public static final 宣言されている文字列)
411         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ScheduleTag.CMD_SET">コマンド定数</a>
412         */
413        public void setCommand( final String cmd ) {
414                command = nval( getRequestParameter( cmd ),command );
415        }
416
417        /**
418         * 【TAG】処理を実行するクラス名(HybsTimerTask のサブクラス)を指定します。
419         *
420         * @og.tag 処理を実行する HybsTimerTask のクラス名を指定します。
421         *
422         * @param   val クラス名
423         */
424        public void setTimerTask( final String val ) {
425                timerTask = getRequestParameter( val );
426        }
427
428        /**
429         * 【TAG】名称(ユニークキー)を設定します。
430         *
431         * @og.tag タイマータスクの名称(ユニークキー)を設定します。
432         *
433         * @param   nm タイマータスクの名称
434         */
435        public void setName( final String nm ) {
436                name = getRequestParameter( nm );
437        }
438
439        /**
440         * 【TAG】タイマータスクの説明を設定します。
441         *
442         * @og.tag タイマータスクの説明を設定します。
443         *
444         * @param   cmt タイマータスクの説明
445         */
446        public void setComment( final String cmt ) {
447                comment = getRequestParameter( cmt );
448        }
449
450        /**
451         * 【TAG】ミリ秒単位の遅延時間を設定します(初期値:0)。
452         *
453         * @og.tag タスクが実行される前のミリ秒単位の遅延を設定します(初期値:0)
454         *
455         * @param   val 遅延時間(ms)
456         */
457        public void setDelay( final String val ) {
458                delay = nval( getRequestParameter( val ),delay );
459        }
460
461        /**
462         * 【TAG】ミリ秒単位の繰り返し間隔を設定します(初期値:60000)。
463         *
464         * @og.tag 連続するタスク実行のミリ秒単位の時間を設定します(初期値:60000 mS)
465         *
466         * @param   val 繰り返し間隔(ms)
467         */
468        public void setPeriod( final String val ) {
469                period = nval( getRequestParameter( val ),period );
470        }
471
472        /**
473         * 【TAG】固定遅延実行を指定するかどうか[true:固定遅延実行/false:固定頻度実行]を設定します(初期値:true)。
474         *
475         * @og.tag
476         * 固定遅延実行では、前の実行の実際の実行時間を基準にしてそれぞれの実行がスケジュールされます。
477         * 何らかの理由で実行が遅延した場合 そのあとの実行も遅延されます。
478         * 最終的に、実行の頻度は通常、指定した期間の対応する頻度よりも若干遅くなります
479         *
480         * 固定頻度実行では、最初の実行のスケジュールされた実行時間を基準にしてそれぞれの実行が
481         * スケジュールされます。何らかの理由で実行が遅延した場合、「遅れを取り戻す」ために
482         * 2 つ以上の実行が連続して行われます。最終的に実行の頻度は、指定した期間の対応する頻度と
483         * 同じになります
484         * 初期値は、true:固定遅延実行 です。
485         *
486         * @param   flag  [true:固定遅延実行/false:固定頻度実行]
487         */
488        public void setFixedDelay( final String flag ) {
489                fixedDelay = nval( getRequestParameter( flag ),fixedDelay );
490        }
491
492        /**
493         * 【TAG】スケジュールを一意に決めるためのユニーク番号を指定します(初期値:-1)。
494         *
495         * @og.tag
496         * スケジュールを削除したりする場合に、必要なユニーク番号を指定します。
497         * 初期値は、-1:あり得ない値 です。
498         *
499         * @param   no ユニーク番号
500         */
501        public void setUniqKey( final String no ) {
502                uniqKey = nval( getRequestParameter( no ),uniqKey );
503        }
504
505        /**
506         * 【TAG】Name属性が同一のタスクを2重登録出来ないよう[true/false]にします(初期値:true[出来ない])。
507         *
508         * @og.tag
509         * 同一種類のタスクを複数同時立上げしたくない場合に、利用します。
510         * 一般に、タイマータスクそのものが、繰り返し実行されますので、
511         * 初期値は、2重登録禁止にしています。
512         *
513         * @param   flag Name属性が同一のタスクを2重登録出来ないようにする(初期値:true)
514         */
515        public void setSingleton( final String flag ) {
516                singleton = nval( getRequestParameter( flag ),singleton );
517        }
518
519        /**
520         * 【TAG】HybsTimerTask に渡す為のキー情報、CSV形式で複数指定します。
521         *
522         * @og.tag
523         * HybsTimerTask に渡す為の、キー情報をカンマ区切りで複数指定できます。
524         * vals 属性には、キーに対応する値を、設定してください。
525         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
526         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
527         *
528         * @og.rev 3.2.2.0 (2003/05/31) 新規追加
529         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
530         *
531         * @param       key キー情報(CSV形式)
532         */
533        public void setKeys( final String key ) {
534                keys = getCSVParameter( key );
535        }
536
537        /**
538         * 【TAG】HybsTimerTask に渡す為の値を、CSV形式で複数指定します。
539         *
540         * @og.tag
541         * キーに設定した値を、カンマ区切り文字で複数して出来ます。
542         * 指定順序は、キーと同じにしておいて下さい。
543         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
544         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
545         *
546         * @og.rev 3.2.2.0 (2003/05/31) 新規追加
547         * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
548         *
549         * @param       val 値(CSV形式)
550         */
551        public void setVals( final String val ) {
552                vals = getCSVParameter( val );
553        }
554
555        /**
556         * 【TAG】24時間制(YYMMDD)の開始時刻を設定します(初期値:000000)。
557         *
558         * @og.tag
559         * 指定時刻範囲内での実行のみ許可するように開始時刻を設定します。
560         * これは、タイマーで指定した間隔ごとにチェックを入れるので、チェック時間が
561         * 長い場合は、正確に開始時刻から始まるというものではありません。
562         * 初期値は、"000000" です。
563         *
564         * @og.rev 3.2.2.0 (2003/05/31) 新規追加
565         *
566         * @param       st 開始時刻
567         */
568        public void setStartTime( final String st ) {
569                startTime = nval( getRequestParameter( st ),startTime ) ;
570        }
571
572        /**
573         * 【TAG】24時間制(YYMMDD)の終了時刻を設定します(初期値:000000)。
574         *
575         * @og.tag
576         * 指定時刻範囲内での実行のみ許可するように終了時刻を設定します。
577         * これは、タイマーで指定した間隔ごとにチェックを入れるので、チェック時間が
578         * 長い場合は、正確に終了時刻で終了するというものではありません。
579         * (終了時刻を越えてからの新規実行はありません。)
580         * 初期値は、"000000" です。
581         *
582         * @og.rev 3.2.2.0 (2003/05/31) 新規追加
583         *
584         * @param       st 終了時刻
585         */
586        public void setStopTime( final String st ) {
587                stopTime = nval( getRequestParameter( st ),stopTime ) ;
588        }
589
590        /**
591         * HybsTimerTask オブジェクト配列より、DBTableModel を作成して返します。
592         * カラム名は、"TaskName","UniqKey","Comment","CreateTime","scheduledTime" です。
593         *
594         * @param   tasks       タイマータスクオブジェクト配列
595         *
596         * @return      タイマータスクオブジェクトのテーブルモデル。 無ければ null
597         */
598        private DBTableModel makeDBTable( final HybsTimerTask[] tasks ) {
599                if( tasks == null || tasks.length == 0 ) { return null; }
600
601                ResourceManager  resource  = getResource();
602
603                String[] names = new String[] {
604                                                        "TaskName","UniqKey","Comment","CreateTime","scheduledTime"
605                                                };
606
607                DBTableModel table = DBTableModelUtil.newDBTable();
608                table.init( names.length );
609                for( int i=0; i<names.length; i++ ) {
610                        DBColumn dbColumn = resource.makeDBColumn( names[i] );
611                        table.setDBColumn( i,dbColumn );
612                }
613
614                for( int i=0; i<tasks.length; i++ ) {
615                        String[] clmVals = new String[names.length];
616                        clmVals[0] = tasks[i].getName() ;
617                        clmVals[1] = String.valueOf( tasks[i].getUniqKey() );
618                        clmVals[2] = tasks[i].getComment() ;
619                        clmVals[3] = HybsSystem.getDate( tasks[i].getCreateTime() );
620                        clmVals[4] = HybsSystem.getDate( tasks[i].scheduledExecutionTime() );
621                        table.addColumnValues( clmVals );
622                }
623
624                return table ;
625        }
626
627        /**
628         * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
629         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
630         *
631         * @og.tag
632         * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に
633         * 渡す場合に、通常は、session を利用します。その場合の登録キーです。
634         * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、
635         * この tableId 属性を利用して、メモリ空間を分けます。
636         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
637         *
638         * @param       id sessionに登録する時の ID
639         */
640        public void setTableId( final String id ) {
641                tableId = nval( getRequestParameter( id ),tableId );
642        }
643
644        /**
645         * 【TAG】キャッシュする場合のスコープ(local,request,page,session,applicaton)を指定します(初期値:local)。
646         *
647         * @og.tag
648         * "local","request","page","session","applicaton" が指定できます。
649         * "local" は、過去のバージョンとの互換性を保つ為の特殊な値です。
650         * 初期値は、"local" です。
651         *
652         * @og.rev 3.5.2.0 (2003/10/20) 新規作成
653         *
654         * @param       scp     スコープ
655         */
656        @Override
657        public void setScope( final String scp ) {
658                scope = nval( getRequestParameter( scp ),scope );
659        }
660
661        /**
662         * このオブジェクトの文字列表現を返します。
663         * 基本的にデバッグ目的に使用します。
664         *
665         * @return このクラスの文字列表現
666         */
667        @Override
668        public String toString() {
669                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
670                                .println( "VERSION"                             ,VERSION                )
671                                .println( "tableId"                             ,tableId                )
672                                .println( "command"                             ,command                )
673                                .println( "timerTask"                   ,timerTask              )
674                                .println( "name"                                ,name                   )
675                                .println( "comment"                             ,comment                )
676                                .println( "delay"                               ,delay                  )
677                                .println( "period"                              ,period                 )
678                                .println( "fixedDelay"                  ,fixedDelay             )
679                                .println( "uniqKey"                             ,uniqKey                )
680                                .println( "singleton"                   ,singleton              )
681                                .println( "FIXED_RATE_MIN_TIME" ,FIXED_RATE_MIN_TIME)
682                                .println( "TIMER_KEY"                   ,TIMER_KEY              )
683                                .println( "TIMERTASK_KEY"               ,TIMERTASK_KEY  )
684                                .println( "keys"                                ,keys                   )
685                                .println( "vals"                                ,vals                   )
686                                .println( "body"                                ,body                   )
687                                .println( "startTime"                   ,startTime              )
688                                .println( "stopTime"                    ,stopTime               )
689                                .println( "scope"                               ,scope                  )
690                                .println( "ERROR_SLEEP_TIME"    ,ERROR_SLEEP_TIME)
691                                .println( "COMMAND_LIST"                ,COMMAND_LIST   )
692                                .println( "Other..."    ,getAttributes().getAttribute() )
693                                .fixForm().toString() ;
694        }
695}