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.HybsSystemException;
020
021import static org.opengion.fukurou.util.StringUtil.nval ;
022
023import java.io.ObjectOutputStream;
024import java.io.ObjectInputStream;
025import java.io.IOException;
026import java.util.Map;
027import java.util.HashMap;
028
029/**
030 * viewタグの viewFormType が ImageTimeBar の場合にパラメータを設定します。
031 *
032 * キー、日時、状況コードを持つ稼働状況の表示を行う、ViewForm_ImageTimeBar クラスに対して、
033 * 各種パラメータを設定します。
034 * (パラメータを使用するには、viewタグのuseParam 属性をtrueに設定する必要があります。)
035 *
036 * SELECT文は、キー、日時、状況コードが、必須項目で、カラムの並び順は、完全に固定です。
037 * よって、カラム位置を指定する必要はありませんが、SELECT文を自由に設定することも
038 * 出来ませんので、ご注意ください。
039 * この固定化に伴い、WRITABLE 指定も使用できません。(そもそも書き込み不可です)
040 * それ以降のカラムについては、内部処理としては、使用していません。
041 * ただし、パラメータで、カラー色指定、ラベル表記部、イメージ重ね合わせ、
042 * ポップアップ表記、リンク表記に使えます。
043 *
044 * データの並び順(ORDER BY)も、キー、日時順にしてください。
045 * データは、キー単位に1レコード作成されます。(キーブレイク)その間、日時順に
046 * データを処理します。
047 *
048 * データの表示は、今のレコードの日時から、次のレコードの日時までを一つの状態と
049 * して表します。今のレコードを表示するには、次のレコードが必要になります。
050 * 画面表示は、表示開始日時(minStartTime) から 表示期間(timeSpan)分を表示します。
051 * 通常、開始時刻は、表示開始時刻より前より始まり、次のレコードで、終了時刻が決定
052 * されます。最後のデータは、期間満了まで続いていると仮定されます。
053 * データが存在しないのであれば、「存在しないデータ」を作成してください。
054 * 
055 * ImageTimeBar では、キーでまとめた値について、各状況コードをカラー化し、積み上げ
056 * 帯グラフ形式でPNG画像化します。
057 * この画像を、読み込む HTML を出力することで、画面上に、積み上げ帯グラフを表示します。
058 * 状況コードに対応する色は、標準では自動作成ですが、外部から色文字列を与えることで
059 * 自由に指定する事も可能です。
060 *
061 * ポップアップ表記(tipsClm)、リンク表記(linkClm)は、この画像に対するエリア指定タグを出力する事で実現します。
062 * 画像ファイルは、全データに対して、1画像だけなので、サイズは大きくなりますが、1レコード
063 * 単位に画像を作成しないため、レスポンスは向上します。
064 * それぞれ、viewMarker , viewLink を利用することが可能です。特に、リンク表記(linkClm) については、
065 * linkタグの hrefTarget 属性を true に設定することで適用できます。
066 *
067 * 画像ファイルは、java.io.File.createTempFile( File ) で作成するため、JavaVM(=Tomcat)が
068 * 正常終了するときに、削除されます。異常終了時には残りますが、temp フォルダを定期的に
069 * 整理すれば、それほど大量のファイルが残ることはないと思われます。
070 *
071 * データは、イベント発生時に作成されると仮定しています。つまり、書き込まれた日時から、
072 * 状況コードに対応する状況が発生し、次の状況違いのレコードまで継続していると考えます。
073 * よって、データを途中で切り出す場合、切り出す範囲の前の状態が必要になります。
074 * 一番最初の状態は、"不明" として扱います。(空欄=白色)
075 *
076 * <img src="doc-files/ViewTimeBarParamTag.png" alt="ViewTimeBarParamTag" >
077 *
078 * @og.formSample
079 * ●形式:&lt;og:timeBarParam startDate="・・・" timeSpan="・・・" ・・・ /&gt;
080 * ●body:なし
081 *
082 * ●Tag定義:
083 *   &lt;og:timeBarParam
084 *       startDate       【TAG】タイムテーブルの表示開始日時をセットします(必須)。
085 *       timeSpan        【TAG】タイムテーブルの表示期間を時間で指定します(必須)。
086 *       labelClms       【TAG】一覧表のラベル表示部に表示するカラムをCSV形式で指定します(初期値:キーのRenderer値)。
087 *       colorClm        【TAG】レコードに付ける色を色文字列で指定する場合のカラム名を指定します(初期値:指定しない)。
088 *       tipsClm         【TAG】レコード単位に、マウスオーバー時のTips表示を行うカラムを指定します(初期値:指定しない)。
089 *       linkClm         【TAG】レコード単位に、クリッカブルリンクを設定するカラムを指定します(初期値:指定しない)。
090 *       useLegend       【TAG】カラーの凡例を使用するかどうか[true/false]を指定します(初期値:{@og.value #USE_LEGEND})。
091 *       maxLabelWidth   【TAG】ラベル表記部の最大サイズをpxで指定します(初期値:{@og.value #MAX_LABEL_WIDTH})。
092 *       maxTimeWidth    【TAG】タイム表記部の最大サイズをpxで指定をpxで指定します(初期値:{@og.value #MAX_TIME_WIDTH})。
093 *       chartHeight     【TAG】1行のタイムチャートの幅をpxで指定します(初期値:{@og.value #CHART_HEIGHT})。
094 *       padding         【TAG】イメージ作成の 全体テーブルの隙間(パディング)をpxで指定します(初期値:{@og.value #CHART_PADDING})。
095 *       margin          【TAG】1レコードの文字やタイムチャートのマージンをpxで指定します(初期値:{@og.value #RECODE_MARGIN})。
096 *       useLastData     【TAG】行の最後の情報が、継続しているとして使うかどうか[true/false]を指定(初期値:{@og.value #USE_LAST_DATA})。
097 *       debug           【TAG】内部情報を出力します(初期値:false)。
098 *   /&gt;
099 *
100 * ●使用例
101 *     ViewFormTag の viewFormType が、ImageTimeBar の場合に使用します。
102 *     useParam 属性を設定しておかないと、使用されません。
103 *     &lt;og:view
104 *         viewFormType = "ImageTimeBar"
105 *         command      = "{&#064;command}"
106 *         <b>useParam     = "true"</b>
107 *     &gt;
108 *         &lt;og:timeBarParam
109 *             startDate   = "{&#064;DYFROM}"
110 *             timeSpan    = "24"
111 *         /&gt;
112 *     &lt;/og:view &gt;
113 *
114 * @og.group 画面表示
115 * @og.rev 5.5.5.6 (2012/08/31) 新規追加
116 *
117 * @version  4.0
118 * @author       Kazuhiko Hasegawa
119 * @since    JDK5.0,
120 */
121public class ViewTimeBarParamTag extends ViewParamTag {
122        //* このプログラムのVERSION文字列を設定します。   {@value} */
123        private static final String VERSION = "5.6.1.1 (2013/02/08)" ;
124
125        private static final long serialVersionUID = 561120130208L ;
126
127        private static final String START_DATE          = null;         // タイムテーブルの表示開始日時をセットします(初期値:データの最小日時)。
128        private static final String TIME_SPAN           = "24";         // タイムテーブルの表示期間を時間で指定します(初期値:{@og.value #TIME_SPAN})。
129
130        private static final String LABEL_CLMS          = null;         // 一覧表のラベル表示部に表示するカラムをCSV形式で指定します。
131        private static final String COLOR_CLM           = null;         // レコードに付ける色を色文字列で指定する場合のカラム名を指定します。
132        private static final String TIPS_CLM            = null;         // レコード単位に、マウスオーバー時のTips表示を行うカラム名を指定します。
133        private static final String LINK_CLM            = null;         // レコード単位に、クリッカブルリンクを設定するカラム名を指定します。
134
135        private static final String USE_LEGEND          = "true";       // カラーの凡例を使用するかどうか[true/false]を指定します。
136        private static final String MAX_LABEL_WIDTH     = null;         // ラベル表記部の最大サイズをpxで指定。何もなければ、可変長サイズ
137        private static final String MAX_TIME_WIDTH      = "600";        // タイム表記部の最大サイズをpxで指定。
138        private static final String CHART_HEIGHT        = "20";         // 1レコードのチャートの間隔をpxで指定。実際の幅は、CHART_HEIGHT+MARGIN*2
139        private static final String CHART_PADDING       = "5";          // イメージ作成の 全体テーブルの隙間
140        private static final String RECODE_MARGIN       = "3";          // 各レコード、文字等の内部の間隔
141
142        private static final String USE_LAST_DATA       = "true";       // 5.6.1.1 (2013/02/08) 行の最後の情報が、継続しているとして使うかどうか[true/false]を指定します。
143
144        /** パラメータの初期値設定 */
145        private static final Map<String,String> INIT_PARAM = new HashMap<String,String>();
146        static {
147                INIT_PARAM.put( "START_DATE"            , START_DATE            );
148                INIT_PARAM.put( "TIME_SPAN"                     , TIME_SPAN                     );
149                INIT_PARAM.put( "LABEL_CLMS"            , LABEL_CLMS            );
150                INIT_PARAM.put( "COLOR_CLM"                     , COLOR_CLM                     );
151                INIT_PARAM.put( "TIPS_CLM"                      , TIPS_CLM                      );
152                INIT_PARAM.put( "LINK_CLM"                      , LINK_CLM                      );
153                INIT_PARAM.put( "USE_LEGEND"            , USE_LEGEND            );
154                INIT_PARAM.put( "MAX_LABEL_WIDTH"       , MAX_LABEL_WIDTH       );
155                INIT_PARAM.put( "MAX_TIME_WIDTH"        , MAX_TIME_WIDTH        );
156                INIT_PARAM.put( "CHART_HEIGHT"          , CHART_HEIGHT          );
157                INIT_PARAM.put( "CHART_PADDING"         , CHART_PADDING         );
158                INIT_PARAM.put( "RECODE_MARGIN"         , RECODE_MARGIN         );
159                INIT_PARAM.put( "USE_LAST_DATA"         , USE_LAST_DATA         );              // 5.6.1.1 (2013/02/08)
160                INIT_PARAM.put( "TEMP_DIR"                      , null                          );
161                INIT_PARAM.put( "TEMP_URL"                      , null                          );
162        }
163
164        /**
165         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
166         *
167         * @return      後続処理の指示
168         */
169        @Override
170        public int doStartTag() {
171                initParam( INIT_PARAM );
172
173                String FILE_DIR         = HybsSystem.sys( "CHART_TEMP_DIR" );           // 画像ファイルの作成DIR
174
175                putParam( "TEMP_DIR" , HybsSystem.url2dir( FILE_DIR ) );
176                putParam( "TEMP_URL" , getContextPath() + "/" + FILE_DIR );
177
178                return SKIP_BODY ;                              // Body を評価しない
179        }
180
181        /**
182         * 【TAG】タイムテーブルの表示開始日時をセットします(初期値:データの最小日時)。
183         *
184         * @og.tag
185         * 表示開始日時を起点として、タイムテーブルを表示します。
186         * 実際に画面に表示されるのは、開始時刻から終了時刻の範囲内だけですが、
187         * 起点は、この日時になります。
188         * 
189         * 指定方法として、フォーマットされた日付、時刻情報も設定可能です。(内部的に処理します)
190         * また、処理後(例:20120824102823)14ケタ以上の場合は、14ケタにカットします。
191         * 8ケタ以上の場合は、時刻 000000 を追加します。
192         * それ以下の場合は、設定エラーとして、HybsSystemException を throw します。
193         * 
194         * 表示開始日時が指定されない場合は、データの最小時刻を利用して表示します。
195         * 初期値は、データの最小日時 です。
196         *
197         * @param       startDate タイムテーブルの表示開始日時
198         */
199        public void setStartDate( final String startDate ) {
200                String date = nval( getRequestParameter( startDate ),START_DATE );
201                if( date != null ) {
202                        if( date.indexOf( '-' ) >= 0 ) { date = date.replaceAll( "-","" ); }
203                        if( date.indexOf( '/' ) >= 0 ) { date = date.replaceAll( "/","" ); }
204                        if( date.indexOf( ':' ) >= 0 ) { date = date.replaceAll( ":","" ); }
205                        if( date.indexOf( ' ' ) >= 0 ) { date = date.replaceAll( " ","" ); }
206
207                        int len = date.length();
208                        if( len > 14 ) { date = date.substring( 0,14 ); }       // ミリ秒まで指定されていると想定
209                        else if( len > 8 && len < 14 ) { date = ( date + "000000" ).substring( 0,14 ) ; }       // 西暦からの日付は入っていると考えます。
210                        else {
211                                String errMsg = "日付データの設定エラーです。date=[" + startDate + "]" ;
212                                throw new HybsSystemException( errMsg );
213                        }
214                }
215                putParam( "START_DATE" , date );
216        }
217
218        /**
219         * 【TAG】タイムテーブルの表示期間を時間で指定します(初期値:{@og.value #TIME_SPAN})。
220         *
221         * @og.tag
222         * 表示開始日時から、どれだけの時間範囲を表示対象とするかを指定します。
223         * 指定する単位は、時間です。
224         * 小数点は指定できません。また、10日なら、"240" 、1か月(30日)なら、"720"
225         * 1年(365日)なら、"8760" を指定します。
226         * 実際に画面に表示されるのは、開始時刻から終了時刻の範囲内だけです。
227         * 初期値は、"{@og.value #TIME_SPAN}" です。
228         *
229         * @param       timeSpan タイムテーブルの表示期間(時)
230         */
231        public void setTimeSpan( final String timeSpan ) {
232                putParam( "TIME_SPAN" , nval( getRequestParameter( timeSpan ),TIME_SPAN ) );
233        }
234
235        /**
236         * 【TAG】一覧表のラベル表示部に表示するカラムをCSV形式で指定します(初期値:キーのRenderer値)。
237         *
238         * @og.tag
239         * ラベル表示部に表示するカラムをカンマ区切り文字列で指定します。
240         * 指定されたカラムの値の、Renderer値を画面上に表示します。
241         * ラベル表記部の最大サイズ(maxLblWidth)を指定しない場合は、ここで指定されたカラムの
242         * 値のそれぞれの最大長を加算した値が、ラベル表記部の最大サイズ(maxLblWidth)になります。
243         * 初期値は、キーのRenderer値 です。
244         *
245         * @param       labelClms ラベル表示部に表示するカラム(CSV形式)
246         */
247        public void setLabelClms( final String labelClms ) {
248                putParam( "LABEL_CLMS" , nval( getRequestParameter( labelClms ),LABEL_CLMS ) );
249        }
250
251        /**
252         * 【TAG】レコードに付ける色を色文字列で指定する場合のカラム名を指定します(初期値:指定しない)。
253         *
254         * @og.tag
255         * レコード単位に、色を付ける場合、指定の色を付けたい場合に、外部から色文字列を与えることが可能です。
256         * 色文字列は、java.awt.Color の フィールド定義されているコードと同じ文字列です。
257         * また、#XXXXXX 形式の 16進文字列を与えることで、任意の色を指定可能です。
258         *
259         * 初期値は、"指定しない" です。
260         *
261         * @param       colorClm 色文字列で指定する場合のカラム名
262         */
263        public void setColorClm( final String colorClm ) {
264                putParam( "COLOR_CLM" , nval( getRequestParameter( colorClm ),COLOR_CLM ) );
265        }
266
267        /**
268         * 【TAG】レコード単位に、マウスオーバー時のTips表示を行うカラムを指定します(初期値:指定しない)。
269         *
270         * @og.tag
271         * レコード単位に、画像にマウスオーバー時のツールチップ表示のためのデータを作成します。
272         * HTMLのareaタグの alt 属性を出力します。
273         *
274         * 通常は、複数の文字列を使用しますので、viewMarker タグ等で整形してください。
275         * 何も指定しない場合は、リンクがなければ、なにも出力しません。
276         * 初期値は、"指定しない" です。
277         *
278         * @param       tipsClm マウスオーバー時のTips表示を行うカラム名
279         */
280        public void setTipsClm( final String tipsClm ) {
281                putParam( "TIPS_CLM" , nval( getRequestParameter( tipsClm ),TIPS_CLM ) );
282        }
283
284        /**
285         * 【TAG】レコード単位に、クリッカブルリンクを設定するカラムを指定します(初期値:指定しない)。
286         *
287         * @og.tag
288         * レコード単位に、画像にクリッカブルリンクを設定するためのデータを作成します。
289         * HTMLのareaタグ の href 属性を出力します。
290         *
291         * 通常は、viewLink タグ等でリンクを作成してください。
292         * 何も指定しない場合は、Tipsがなければ、なにも出力しません。
293         * 初期値は、"指定しない" です。
294         *
295         * @param       linkClm クリッカブルリンクを設定するカラム名
296         */
297        public void setLinkClm( final String linkClm ) {
298                putParam( "LINK_CLM" , nval( getRequestParameter( linkClm ),LINK_CLM ) );
299        }
300
301        /**
302         * 【TAG】カラーの凡例を使用するかどうか[true/false]を指定します(初期値:{@og.value #USE_LEGEND})。
303         *
304         * @og.tag
305         * 状況コード、または、色文字列等でグラフ作成した場合の色に対する凡例を使用するかどうかを指定します。
306         * 凡例の表示位置は、グラフの上側で、1レコード分出力します。
307         *
308         * 初期値は、"{@og.value #USE_LEGEND}" です。
309         *
310         * @param       useLegend カラーの凡例を使用するかどうか[true/false]
311         */
312        public void setUseLegend( final String useLegend ) {
313                putParam( "USE_LEGEND" , nval( getRequestParameter( useLegend ),USE_LEGEND ) );
314        }
315
316        /**
317         * 【TAG】ラベル表記部の最大サイズをpxで指定します(初期値:{@og.value #MAX_LABEL_WIDTH})。
318         *
319         * @og.tag
320         * 画像の1行は、ラベル表記部と、タイムチャート部に分かれます。
321         * その、ラベル表記部の最大サイズを指定します。
322         * 何も指定しなければ、可変長サイズ(ラベルの大きさに合わせた値)になります。
323         * 単位は px です。(pxは記述不要です)
324         * 初期値は、"{@og.value #MAX_LABEL_WIDTH}" です。
325         *
326         * @param       maxLblWidth ラベル表記部の最大サイズ(px)
327         */
328        public void setMaxLabelWidth( final String maxLblWidth ) {
329                putPxParam( "MAX_LABEL_WIDTH" , maxLblWidth , MAX_LABEL_WIDTH );
330        }
331
332        /**
333         * 【TAG】タイム表記部の最大サイズをpxで指定をpxで指定します(初期値:{@og.value #MAX_TIME_WIDTH})。
334         *
335         * @og.tag
336         * 画像の1行は、ラベル表記部と、タイムチャート部に分かれます。
337         * そのタイムチャート部の最大サイズを指定します。
338         * この幅は、ここで指定した幅に固定されるため、時間範囲が多ければ、1時間当たりの表示幅が
339         * 小さくなります。
340         * たとえば、8H~20H=12H を 600px で表示すれば、1時間=50px になりますし、24H 表示ならば、
341         * 半分の 25px 、6H ならば、倍の 100px が、1時間の表示幅になります。
342         *
343         * 単位は px です。(pxは記述不要です)
344         * 初期値は、"{@og.value #MAX_TIME_WIDTH}" です。
345         *
346         * @param       maxTmWidth タイム表記部の最大サイズ(px)
347         */
348        public void setMaxTimeWidth( final String maxTmWidth ) {
349                putPxParam( "MAX_TIME_WIDTH" , maxTmWidth , MAX_TIME_WIDTH );
350        }
351
352        /**
353         * 【TAG】1行のタイムチャートの幅をpxで指定します(初期値:{@og.value #CHART_HEIGHT})。
354         *
355         * @og.tag
356         * 画像の1行の間隔は、上下のRECODE_MARGIN と、このチャート本体の幅になります(CHART_HEIGHT+RECODE_MARGIN*2)。
357         * ここでは、チャート本体の幅を指定します。
358         *
359         * 単位は px です。(pxは記述不要です)
360         * 初期値は、"{@og.value #CHART_HEIGHT}" です。
361         *
362         * @param       chartHeight タイムチャートの幅
363         */
364        public void setChartHeight( final String chartHeight ) {
365                putPxParam( "CHART_HEIGHT" , chartHeight , CHART_HEIGHT );
366        }
367
368        /**
369         * 【TAG】イメージ作成の 全体テーブルの隙間(パディング)をpxで指定します(初期値:{@og.value #CHART_PADDING})。
370         *
371         * @og.tag
372         * イメージは、データの全行を含んだ1枚の画像ファイルになります。
373         * 画像ファイル自体の大きさと、書き込まれた画像の大きさは異なります。
374         * この、padding は、画像の周りに、余白として指定するサイズをpx単位で指定します。
375         * ここでは、上下左右に、均等にとります。
376         *
377         * 単位は px です。(pxは記述不要です)
378         * 初期値は、"{@og.value #CHART_PADDING}" です。
379         *
380         * @param       padding 全体テーブルの隙間(パディング)
381         */
382        public void setPadding( final String padding ) {
383                putPxParam( "CHART_PADDING" , padding , CHART_PADDING );
384        }
385
386        /**
387         * 【TAG】1レコードの文字やタイムチャートのマージンをpxで指定します(初期値:{@og.value #RECODE_MARGIN})。
388         *
389         * @og.tag
390         * イメージは、1レコードづつ書き込まれますが、そのレコードの幅は、chartHeight で指定された
391         * タイムチャートの幅+マージン*2 になります。
392         * 同様に、ラベル表記部の文字の書き出し位置も、この、マージンが適用されます。
393         * (文字の場合は、上下左右に適用され、チャート部は、上下のみ適用されます。)
394         *
395         * 単位は px です。(pxは記述不要です)
396         * 初期値は、"{@og.value #RECODE_MARGIN}" です。
397         *
398         * @param       margin タイムチャートのマージン
399         */
400        public void setMargin( final String margin ) {
401                putPxParam( "RECODE_MARGIN" , margin , RECODE_MARGIN );
402        }
403
404        /**
405         * 【TAG】行の最後の情報が、継続しているとして使うかどうか[true/false]を指定します(初期値:{@og.value #USE_LAST_DATA})。
406         *
407         * @og.tag
408         * データは、開始時刻を与えられ、次のデータの開始時刻が前のデータの終了時刻として
409         * 処理しています。行の最後のデータは、表示範囲いっぱいまで、続いていると認識する場合は、
410         * この値を true とします。つまり、最後のデータは利用されます。
411         * 最後のデータがそこで処理を停止したイベントの場合、そのデータは使われません。
412         * その場合は、false に設定します。イベント色としては、"不明"(空欄=白色) として扱います。
413         *
414         * 初期値は、"{@og.value #USE_LAST_DATA}" です。
415         *
416         * @og.rev 5.6.1.1 (2013/02/08) 新規追加
417         *
418         * @param       useLastData タイムチャートのマージン
419         */
420        public void setUseLastData( final String useLastData ) {
421                putPxParam( "USE_LAST_DATA" , useLastData , USE_LAST_DATA );
422        }
423
424        /**
425         * 引数の "px" 文字列を取り除く共通メソッド。
426         *
427         * 指定のパラメータに、"px" 文字列を含む場合、"px"文字列以降を削除します。
428         * HTML上には、px を付けた方が分かりやすいケースが考えられるためです。
429         * ここでは、putParam( String , String ) するために必要な、キー、初期値も指定する事で、
430         * 呼び出し元の処理を簡素化します。
431         * この処理では、val 引数を、getRequestParameter 処理し、結果を、nval で 初期値設定したあと、
432         * null 判定で、null でなければ、putParam にセットする処理をおこないます。
433         * この処理の中で、"px" 削除処理をおこないます。
434         *
435         * @param       key putParam する場合のキー
436         * @param       val "px"文字列があれば、取り除く引数。
437         * @param       def 引数が null の場合の、初期値
438         * @see         #putParam( String , String )
439         */
440        private void putPxParam( final String key , final String val , final String def ) {
441                String tmp = nval( getRequestParameter( val ),def );
442                if( tmp != null ) {
443                        int idx = tmp.indexOf( "px" );
444                        if( idx > 0 ) { tmp = tmp.substring( 0,idx ); }
445
446                        putParam( key , tmp );
447                }
448        }
449
450        /**
451         * タグの名称を、返します。
452         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
453         *
454         * @return  タグの名称
455         */
456        @Override
457        protected String getTagName() {
458                return "timeBarParam" ;
459        }
460
461        /**
462         * シリアライズ用のカスタムシリアライズ書き込みメソッド
463         *
464         * @serialData 一部のオブジェクトは、シリアライズされません。
465         *
466         * @param       strm    ObjectOutputStreamオブジェクト
467         * @throws IOException  入出力エラーが発生した場合
468         */
469        private void writeObject( final ObjectOutputStream strm ) throws IOException {
470                strm.defaultWriteObject();
471        }
472
473        /**
474         * シリアライズ用のカスタムシリアライズ読み込みメソッド
475         *
476         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
477         *
478         * @serialData 一部のオブジェクトは、シリアライズされません。
479         *
480         * @param       strm    ObjectInputStreamオブジェクト
481         * @see #release2()
482         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
483         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
484         */
485        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
486                strm.defaultReadObject();
487        }
488}