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 static org.opengion.fukurou.util.StringUtil.nval ;
019import org.opengion.hayabusa.common.HybsSystem;
020import org.opengion.hayabusa.common.HybsSystemException;
021import org.opengion.hayabusa.io.ChartCreate;
022import org.opengion.hayabusa.io.ChartDataset;
023import org.opengion.hayabusa.io.HybsURLTagFragmentGenerator;
024
025import java.io.File;
026import java.io.IOException;
027import java.util.List;
028import java.util.ArrayList;
029import java.util.Map ;
030import java.util.concurrent.ConcurrentHashMap;                                          // 6.4.3.1 (2016/02/12) refactoring
031
032import org.jfree.chart.JFreeChart;
033import org.jfree.chart.ChartUtilities;
034
035import org.jfree.chart.ChartRenderingInfo;
036import org.jfree.chart.entity.StandardEntityCollection;
037import org.jfree.chart.imagemap.ImageMapUtilities;
038import org.jfree.chart.imagemap.StandardToolTipTagFragmentGenerator;
039import org.jfree.chart.imagemap.ToolTipTagFragmentGenerator;
040import org.jfree.chart.imagemap.URLTagFragmentGenerator;
041
042/**
043 * BODY部に指定のSQLの検索結果をチャート(円、棒、線)で表示するタグです。
044 *
045 * チャート化には、JFreeChart (http://www.jfree.org/jfreechart/) を使用しています。
046 * チャートの種類は、chartDataset タグで指定します。これは、複数の異なるチャートを
047 * 合成表示する機能が、JFreeChart にある為です。ただし、専門的には、CategoryDataset のみ
048 * いまは、合成が可能です。
049 * 処理の実行にあたり、キャッシュが有効(useCache="true")であれば、キャッシュデータを
050 * 使用します。
051 * キャッシュは、画面ID + masterKey 属性で指定されたキーワード毎に、保管されます。
052 *
053 * ※ 6.0.2.0 (2014/09/19) 以降は、キャッシュは、イメージタグのみになりましたので、
054 * seriesPikup 違いの場合は、再検索させる必要がありますので、masterKey を
055 * 変更する必要があります。(または、seriesPikup 属性をmasterKeyに含めてください。)
056 *
057 * ※ 6.3.5.0 (2015/08/08) 
058 *    ① chartFile属性(画像ファイル名の指定) が可能です。
059 *       繰返し画像を作成する場合、無駄にファイルを生成しなくできます。
060 *    ② cacheScope属性を追加しています。
061 *       cacheScope="application" で、全ユーザー共有のキャッシュになります。
062 *    ③ 直後の実行結果を、{@CHART.TAG} 変数で取得できます。(requestスコープ)
063 *
064 * 各属性は、{@XXXX} 変数が使用できます。
065 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に割り当てます。
066 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。
067 *
068 * @og.formSample
069 * ●形式:<og:chartCreate title="…" … />
070 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
071 *
072 * ●Tag定義:
073 *   <og:chartCreate
074 *       title              【TAG】チャートのタイトルをセットします
075 *       width              【TAG】チャートの横幅をセットします(初期値:200)
076 *       height             【TAG】チャートの縦幅をセットします(初期値:200)
077 *       domainLabel        【TAG】チャートのドメインラベルを指定します
078 *       showLegend         【TAG】チャートの凡例の表示可否[true/false]をセットします(初期値:true[表示する])
079 *       rectangleEdge      【TAG】チャートの表示箇所を、[TOP/BOTTOM/RIGHT/LEFT]で指定します(初期値:BOTTOM)
080 *       plotOrientation    【TAG】チャートのプロット(Plot)表示方向を、[VERTICAL(or V),HORIZONTAL(or H)]で指定します
081 *       chartBackColor     【TAG】チャートの背景色を指定します
082 *       plotBackColor      【TAG】チャートの描画領域の色を指定します
083 *       rotationLabel      【TAG】チャートのカテゴリーラベルの方向を指定します[1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・ ](初期値:3:60度)
084 *       useVerticalLabels  【TAG】横軸ラベルの表示向きを縦にするかどうか[false/true]を指定します(初期値:false)
085 *       domainMarker       【TAG】チャートの横軸の値(ドメイン)に合致する位置にマーカーラインを設定します
086 *       useDomainLabel     【TAG】横軸ラベルのラベルを表示するかどうか[true/false]を指定します(初期値:true)
087 *       useMarkerLabel     【TAG】マーカーラインに、その設定値を表示するかどうか[true/false]を指定します(初期値:true)
088 *       useCache           【TAG】JFreeChartで作成されたイメージタグをキャッシュするかどうか[true/false]を指定します(初期値:false)
089 *       cacheTime          【TAG】キャッシュ時の制限時間を、秒で指定します(初期値:CHART_CACHE_TIME[={@og.value SystemData#CHART_CACHE_TIME}])。
090 *       cacheScope         【TAG】useCache="true" 時のキャッシュの保存先scopeを指定します(初期値:session)
091 *       masterKey          【TAG】キャッシュ用マスタキーを指定します(初期値:imgTag)
092 *       seriesPikup        【TAG】複数シリーズのピックアップを行う場合のシリーズ番号を指定します
093 *       imageMapUrl        【TAG】クリッカブル・マップ用URLを指定します
094 *       imageMapTarget     【TAG】クリッカブル・マップ用TARGETを指定します
095 *       categoryMargin     【TAG】カテゴリマージン(0.0~1.0)を指定します
096 *       lowerMargin        【TAG】下方マージン(0.0~1.0)を指定します
097 *       upperMargin        【TAG】上方マージン(0.0~1.0)を指定します
098 *       useDomainLine      【TAG】横軸のグリッド表示有無(垂直線)を指定します(初期値:false)
099 *       domainLineColor    【TAG】横軸のグリッド線の色を指定します
100 *       categorySkip       【TAG】横軸ラベルをスキップする間隔を指定します
101 *       categoryCutNo      【TAG】横軸ラベルの文字位置指定のカット文字数を指定します
102 *       categoryAnchor     【TAG】横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END)を指定します
103 *       useRangeLine       【TAG】縦軸のグリッド表示有無(水平線)を指定します(初期値:true)
104 *       useToolTip         【TAG】ツールチップスの使用可否[true:利用する/false:利用しない]を指定します(初期値:false)
105 *       rangeLineColor     【TAG】縦軸のグリッド線の色を指定します
106 *       rangeSkip          【TAG】縦軸のグリッド線(水平線)をスキップする間隔を指定します
107 *       dateAxisFormat     【TAG】Time,XYTime Polt関係の時間軸を表す場合のフォーマットを指定します(初期値:MM/dd)
108 *       dateSegSize        【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのsegment size を、分単位で指定します。
109 *       dateSegIncluded    【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのincluded segments(スペース)を数値で指定します。
110 *       dateSegExcluded    【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのexcluded segments(EE)を数値で指定します。
111 *       dateStartTime      【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのStartTime(segment groupの開始位置) を、yyyyMMddHHmmss形式で指定します。
112 *       chartFile          【TAG】チャートの画像ファイル名を指定します(初期値:自動)
113 *       useTimeView        【TAG】処理時間を表示する TimeView を表示するかどうかを指定します
114 *                                                                              (初期値:VIEW_USE_TIMEBAR[={@og.value SystemData#VIEW_USE_TIMEBAR}])。
115 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
116 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
117 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
118 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
119 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
120 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
121 *   >   ... Body ...
122 *   </og:chartCreate>
123 *
124 * ●使用例
125 *      <og:chartCreate
126 *          title       = "JFreeChart Test"             チャートタイトル
127 *          domainLabel = "ドメインラベル"              横軸ラベル
128 *          width       = "200"                         チャート表示幅
129 *          height      = "200"                         チャート表示高さ
130 *          showLegend  = "[true/false]"                凡例の表示可否[true/false]
131 *          rectangleEdge   = "[TOP|BOTTOM|RIGHT|LEFT]" 凡例の表示箇所
132 *          plotOrientation = "[VERTICAL|HORIZONTAL]"   チャートの軸表示方向
133 *          chartBackColor  = "WHITE"                   背景色
134 *          plotBackColor   = "LIGHT_GRAY"              描画領域色
135 *          rotationLabel   = "3"                       横軸ラベルの傾き
136 *          useVerticalLabels = "false"                                 横軸ラベルの向き(true:縦/false:横)
137 *          domainMarker    = "KING"                    横軸のマーカーライン(縦棒)
138 *          useMarkerLabel  = "[true/false]"            マーカーラインの文字有無
139 *          useDomainLabel  = "[true/false]"            横軸ラベルの表示有無
140 *          categorySkip    = "3"                       横軸ラベルをスキップする間隔
141 *          categoryCutNo   = "6"                       横軸ラベルの文字位置指定のカット文字数
142 *          categoryAnchor  = "[START|MIDDLE|END]"      横軸のグリッド(垂直線)の書き出し位置
143 *          useDomainLine   = "[false/true]"            横軸のグリッド表示有無(垂直線)
144 *          domainLineColor = "LIGHT_GRAY"              横軸のグリッド線の色
145 *          useRangeLine    = "[true/false]"            縦軸のグリッド表示有無(水平線)
146 *          rangeLineColor  = "LIGHT_GRAY"              縦軸のグリッド線の色
147 *          rangeSkip       = "5"                       縦軸のグリッド(水平線)をスキップする間隔
148 *          useCache        = "[false|true]"            キャッシュの有無
149 *          masterKey       = "{@XXXX}"            キャッシュ用マスタキー(初期値:imgTag)
150 *          cacheTime       = "10"                      キャッシュ時の制限時間を、秒で指定 (6.0.2.0 (2014/09/19))
151 *          seriesPikup     = "2"                       ピックアップするシリーズNo
152 *          imageMapUrl     = "link.jsp,BLOCK"          クリッカブル・マップ用URL
153 *          imageMapTarget  = "CONTENTS"                クリッカブル・マップ用TARGET
154 *          categoryMargin  = "[0.0~1.0]"              カテゴリマージン(0.0~1.0)
155 *          lowerMargin     = "[0.0~1.0]"              下方マージン(0.0~1.0)
156 *          upperMargin     = "[0.0~1.0]"              上方マージン(0.0~1.0)
157 *       >
158 *              <og:chartDataset
159 *                  chartType   = "{@chartType}"
160 *                  valueLabel  = "{@valueLabel}"
161 *                  lowerBound  = "{@lowerBound}"
162 *                  upperBound  = "{@upperBound}"
163 *                  markValues  = "{@markValues}"
164 *                  markColors  = "{@markColors}"
165 *                  useGradient   = "{@useGradient}"
166 *                  shapesVisible = "{@shapesVisible}"
167 *                  useDottedLine = "{@useDottedLine}"
168 *                  seriesColors  = "{@seriesColors}"
169 *                  valueLabelsVisible = "[true|false]"
170 *                  valueMarksVisible  = "[true|false]"
171 *              >
172 *                         {@SQL}
173 *              </og:chartDataset>
174 *      </og:chartCreate>
175 *
176 *    複数のグラフを重ね合わせる場合は、chartDataset タグを chartCreate のBODY部に
177 *    複数記述します。
178 *      <og:chartCreate
179 *          title       = "{@title}"
180 *          domainLabel = "{@domainLabel}"
181 *          width       = "{@width}"
182 *          height      = "{@height}" >
183 *              <og:chartDataset
184 *                  chartType   = "{@chartType1}"
185 *                  valueLabel  = "{@valueLabel1}"
186 *                  lowerBound  = "{@lowerBound1}"
187 *                  upperBound  = "{@upperBound1}"
188 *                  markValues  = "{@markValues1}"
189 *                  markColors  = "{@markColors1}"
190 *              >
191 *                         {@SQL1}
192 *              </og:chartDataset>
193 *              <og:chartDataset
194 *                  chartType   = "{@chartType2}"
195 *                  valueLabel  = "{@valueLabel2}"
196 *                  lowerBound  = "{@lowerBound2}"
197 *                  upperBound  = "{@upperBound2}"
198 *                  markValues  = "{@markValues2}"
199 *                  markColors  = "{@markColors2}"
200 *              >
201 *                         {@SQL2}
202 *              </og:chartDataset>
203 *      </og:chartCreate>
204 *
205 *    rectangleEdge属性 は、凡例の表示箇所を示す、RectangleEdge クラスの値を設定します。
206 *    [rectangleEdge属性]
207 *      TOP      上側
208 *      BOTTOM   下側
209 *      RIGHT    右側
210 *      LEFT     左側
211 *
212 *    plotOrientation属性 は、チャートの軸表示方向を設定します。
213 *    [renderer属性]
214 *      VERTICAL    縦方向
215 *      HORIZONTAL  横方向
216 *
217 * @og.group 画面表示
218 *
219 * @version  0.9.0      2007/06/19
220 * @author       Nakamura
221 * @since        JDK1.4,
222 */
223public class ChartCreateTag extends CommonTagSupport {
224        /** このプログラムのVERSION文字列を設定します。   {@value} */
225        private static final String VERSION = "6.7.3.0 (2017/01/27)" ;
226        private static final long serialVersionUID = 673020170127L ;
227
228        private static final String FILE_URL = HybsSystem.sys( "CHART_TEMP_DIR" );
229
230        private static final String CHART_CACHE_KEY = HybsSystem.JF_CHART_CACHE_KEY;
231
232        private transient List<ChartDataset> chartDataset       ;               // 6.3.9.0 (2015/11/06) transient 追加
233
234        /** 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。  */
235        private transient Map<String,ChartCache> chrtMap ;      // キャッシュ用マップ                    // 6.4.3.1 (2016/02/12) 変数名も変えておきます。
236
237        private String  title                   ;
238        private int             width                   = 200;
239        private int             height                  = 200;
240        private String  domainLabel             ;
241        private boolean showLegend              = true;
242        private String  rectangleEdge   = "BOTTOM";
243        private String  plotOrientation = "VERTICAL";
244        private String  chartBackColor  ;                               // 背景色の設定
245        private String  plotBackColor   ;                               // 描画領域の設定
246        private int             rotationLabel   = 3;                    // 横軸ラベルの傾き(1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・ )
247        private boolean useVerticalLabels;                              // 5.6.4.3 (2013/05/24) 横軸ラベルの表示向き(横書き:false/縦書き:true) 
248        private String  domainMarker    ;                               // 横軸のマーカーライン
249        private boolean useDomainLabel  = true;                 // 横軸ラベルの表示有無
250        private boolean useMarkerLabel  = true;                 // マーカーライン時の文字有無
251        private boolean useCache                ;                               // JFreeChart オブジェクトをキャッシュするかどうか
252        private int             seriesPikup             = -1;                   // ピックアップするシリーズ番号
253        private String  masterKey               = "imgTag";             // キャッシュ用マスタキー                  // 6.3.5.1 (2015/08/16) 初期値指定
254        private int             cacheTime               = HybsSystem.sysInt( "CHART_CACHE_TIME" );                      // 6.0.2.0 (2014/09/19) キャッシュ時の制限時間を、秒で指定
255        private String  imgTag                  ;                               // キャッシュ用イメージタグ
256        private String  imageMapUrl             ;                               // クリッカブル・マップ用URL
257        private String  imageMapTarget  ;                               // クリッカブル・マップ用TARGET
258        private long    dyStart                 ;                               // 3.5.4.7 (2004/02/06) 実行時間測定用のDIV要素を出力します。
259        private boolean useTimeView             = HybsSystem.sysBool( "VIEW_USE_TIMEBAR" );             // 6.3.6.0 (2015/08/16)
260
261        // 4.0.2.0 (2007/12/20)
262        private String  categoryMargin  ;                               // カテゴリマージン(0.0~1.0)
263        private String  lowerMargin             ;                               // 下方マージン(0.0~1.0)
264        private String  upperMargin             ;                               // 上方マージン(0.0~1.0)
265
266        private boolean useDomainLine   ;                               // 4.0.3.0 (2008/01/07) 横軸のグリッド表示有無(垂直線)
267        private String  domainLineColor ;                               // 4.0.3.0 (2008/01/07) 横軸のグリッド線の色
268        private boolean useRangeLine    = true;                 // 4.0.3.0 (2008/01/07) 縦軸のグリッド表示有無(水平線)
269        private String  rangeLineColor  ;                               // 4.0.3.0 (2008/01/07) 縦軸のグリッド線の色
270        private int             categorySkip    = 1;                    // 4.0.3.0 (2008/01/07) 横軸ラベルをスキップする間隔
271        private int             categoryCutNo   = -1;                   // 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のカット文字数
272        private String  categoryAnchor  ;                               // 4.1.1.0 (2008/02/14) 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END)
273        private int             rangeSkip               = -1;                   // 4.1.1.0 (2008/02/04) 縦軸のグリッドをスキップする間隔(初期値:-1)
274        private boolean useToolTip              ;                               // 4.3.1.0 (2008/08/09) ツールチップスを利用するか
275
276        private String  dateAxisFormat  = "MM/dd";              // 5.6.1.0 (2013/02/01) Time,XYTime Polt関係の時間軸を表す場合のフォーマット
277        private int             dateSegSize             ;                               // 6.7.3.0 (2017/01/27) SegmentedTimelineのsegment size を、分単位で指定します。
278        private int             dateSegIncluded ;                               // 6.7.3.0 (2017/01/27) SegmentedTimelineのincluded segments(スペース)を数値で指定します。
279        private int             dateSegExcluded ;                               // 6.7.3.0 (2017/01/27) SegmentedTimelineのexcluded segments(EE)を数値で指定します。
280        private String  dateStartTime   ;                               // 6.7.3.0 (2017/01/27) SegmentedTimelineのStartTime(segment groupの開始位置) を、yyyyMMddHHmmss形式で指定します。 
281
282        private String  chartFile               ;                               // 6.3.5.0 (2015/08/08) チャートの画像ファイル名
283
284        /**
285         * デフォルトコンストラクター
286         *
287         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
288         */
289        public ChartCreateTag() { super(); }            // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
290
291        /**
292         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
293         *
294         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
295         * @og.rev 6.3.5.1 (2015/08/16) キャッシュ処理のロジックを整理します。
296         * @og.rev 6.3.6.0 (2015/08/16) キャッシュ処理のロジックを整理します。
297         * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。変数名も変えておきます。
298         *
299         * @return      後続処理の指示
300         */
301        @SuppressWarnings(value={"unchecked"})
302        @Override
303        public int doStartTag() {
304                if( !useTag() ) { return SKIP_BODY ; }  // 6.3.4.0 (2015/08/01)
305                dyStart = System.currentTimeMillis();
306
307                if( useCache ) {
308                        // キャッシュから、取り出す。
309                        chrtMap = (Map<String,ChartCache>)getObject( CHART_CACHE_KEY );                                         // 6.4.3.1 (2016/02/12) 変数名も変えておきます。
310                        // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
311                        if( chrtMap == null ) {
312                                // 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。
313                                chrtMap = new ConcurrentHashMap<>();    // キャッシュ用のMapが未作成の場合。   // 6.4.3.1 (2016/02/12) 変数名も変えておきます。
314                        }
315                        else {
316                                // キャッシュのタイムアウトを判定し、削除します。
317                                chrtMap.values().removeIf( cache -> !cache.isAvailable() );             // jdk1.8               // 6.4.3.1 (2016/02/12) 変数名も変えておきます。
318
319                                final String cacheKey = getGUIInfoAttri( "KEY" ) + masterKey ;  // 6.4.3.1 (2016/02/12) 位置変更
320                                final ChartCache cache = chrtMap.get( cacheKey );                               // 6.4.3.1 (2016/02/12) 変数名も変えておきます。
321                                if( cache != null && cache.isAvailable() ) {    // キャッシュ有効
322                                        // キャッシュから、イメージを取り出す。存在しなければ、null
323                                        imgTag = cache.getImageTag();                           // 6.3.5.1 (2015/08/16) メソッド名を変更します。
324                                        return SKIP_BODY ;                                                      // キャッシュ使用
325                                }
326                        }
327                }
328
329                return EVAL_BODY_BUFFERED;
330        }
331
332        /**
333         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
334         *
335         * @og.rev 5.2.1.0 (2010/10/01) debugPrint() メソッドの処理条件見直し
336         * @og.rev 6.0.2.0 (2014/09/19) キャッシュ時の制限時間対応
337         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
338         * @og.rev 6.3.5.0 (2015/08/08) クリッカブル・マップ処理のロジックを整理します。
339         * @og.rev 6.3.5.1 (2015/08/16) キャッシュ処理のロジックを整理します。
340         * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。変数名も変えておきます。
341         *
342         * @return      後続処理の指示
343         */
344        @Override
345        public int doEndTag() {
346                debugPrint();           // 5.2.1.0 (2010/10/01) debugPrint() メソッド自体に、isDebug() が組み込まれている。
347                if( !useTag() ) { return EVAL_PAGE ; }  // 6.3.4.0 (2015/08/01)
348
349                final long queryEnd = System.currentTimeMillis();
350                if( useTimeView ) {             // 6.3.6.0 (2015/08/16)
351                        jspPrint( "<div id=\"queryTime\" value=\"" + (queryEnd-dyStart) + "\"></div>" );        // 3.5.6.3 (2004/07/12)
352                }
353                // イメージタグのキャッシュがあれば、それを返す。
354                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
355                if( imgTag == null ) {
356                        // 6.0.2.0 (2014/09/19) キャッシュは、イメージタグのみ
357                        // チャートがない、または、無効になっている場合は、新規作成する。
358                        final ChartCreate chartCreate = create();
359                        final JFreeChart chart = chartCreate.getChart();
360
361                        final File file = getTempFile( FILE_URL );
362                        try {
363                                // クリッカブル・マップ
364                                final String fname = file.getName();
365                                final String filename = getContextPath() + "/" + FILE_URL + fname;
366
367                                // 6.3.5.0 (2015/08/08) クリッカブル・マップ処理のロジックを整理します。
368                                if( imageMapUrl != null || useToolTip ) {
369                                        final String keyword = fname.substring( 0, fname.length() - 4 ); // ".png" 分を削除
370                                        // 4.3.1.0 (2008/08/09) ツールチップスのマップ情報取得
371                                        final ToolTipTagFragmentGenerator toolTipGen =
372                                                                                useToolTip ? new StandardToolTipTagFragmentGenerator() : null ;
373                                        // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
374                                        final URLTagFragmentGenerator urlGen =
375                                                                                imageMapUrl == null ? null : new HybsURLTagFragmentGenerator( imageMapTarget ) ;
376                                        final ChartRenderingInfo objCri = new ChartRenderingInfo( new StandardEntityCollection() );
377
378                                        ChartUtilities.saveChartAsPNG( file, chart, width, height, objCri );
379                                        imgTag = ImageMapUtilities.getImageMap( keyword, objCri, toolTipGen, urlGen ) + makeTag2( filename, keyword );
380                                }
381                                else {
382                                        ChartUtilities.saveChartAsPNG( file, chart, width, height );
383                                        imgTag = makeTag2( filename, null );
384                                }
385
386                        }
387                        catch( final IOException ex ) {
388                                final String errMsg = "ファイル I/O が実行できませんでした。"
389                                        + CR + file + CR
390                                                + ex.getMessage();
391                                throw new HybsSystemException( errMsg,ex );
392                        }
393
394                        jspPrint( imgTag );
395
396                        // キャッシュ時にセーブする。
397                        if( useCache ) {
398                                final ChartCache cache = new ChartCache( imgTag,cacheTime );
399                                final String cacheKey = getGUIInfoAttri( "KEY" ) + masterKey ;
400                                chrtMap.put( cacheKey,cache );                                          // 6.4.3.1 (2016/02/12) 変数名も変えておきます。
401                                setObject( CHART_CACHE_KEY,chrtMap );                           // 6.4.3.1 (2016/02/12) 変数名も変えておきます。
402                        }
403                }
404                // イメージタグのキャッシュがあれば、それを返す。
405                else {
406                        jspPrint( imgTag );
407                }
408
409                // 6.3.5.1 (2015/08/16) 
410                // ③ 直後の実行結果を、{&#064;CHART.TAG} 変数で取得できます。(requestスコープ)
411                setRequestAttribute( "CHART.TAG" , imgTag );
412
413                // 3.5.4.7 (2004/02/06)
414                if( useTimeView ) {             // 6.3.6.0 (2015/08/16)
415                        final long dyEnd = System.currentTimeMillis();
416                        jspPrint( "<div id=\"viewTime\" value=\"" + (dyEnd-queryEnd) + "\"></div>" );   // 6.3.6.0 (2015/08/16)
417                }
418                return EVAL_PAGE;
419        }
420
421        /**
422         * タグリブオブジェクトをリリースします。
423         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
424         *
425         * @og.rev 4.0.1.0 (2007/12/13) categoryMargin、lowerMargin、upperMargin 属性を追加
426         * @og.rev 4.1.1.0 (2008/02/04) categoryCutNo , categoryAnchor , rangeSkip 属性を追加
427         * @og.rev 5.6.1.0 (2013/02/01) dateAxisFormat 属性を追加
428         * @og.rev 5.6.4.3 (2013/05/24) useVerticalLabels 属性を追加
429         * @og.rev 6.0.2.0 (2014/09/19) rangeSkip 属性 の初期値を、-1(設定なし)に変更
430         * @og.rev 6.0.2.0 (2014/09/19) cacheTime 属性 の追加
431         * @og.rev 6.3.5.0 (2015/08/08) チャートの画像ファイル名指定に対応。
432         * @og.rev 6.3.5.1 (2015/08/16) cache は、ローカル変数とする。masterKey に、初期値指定。
433         * @og.rev 6.3.6.0 (2015/08/16) useTimeView の初期値を、VIEW_USE_TIMEBAR にする。
434         * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。変数名も変えておきます。
435         * @og.rev 6.7.3.0 (2017/01/27) 日付軸(dateAxis)の指定で、dateSegSize,dateSegIncluded,dateSegExcluded,dateStartTime を追加します。
436         */
437        @Override
438        protected void release2() {
439                super.release2();
440                chartDataset    = null;
441                title                   = null;
442                width                   = 200;
443                height                  = 200;
444                domainLabel             = null;
445                showLegend              = true;
446                rectangleEdge   = "BOTTOM";
447                plotOrientation = "VERTICAL";
448                chartBackColor  = null;                 // 背景色の設定
449                plotBackColor   = null;                 // 描画領域の設定
450                rotationLabel   = 3;                    // 横軸ラベルの傾き(1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・ )
451                useVerticalLabels = false;              // 5.6.4.3 (2013/05/24) 横軸ラベルの表示向き(横書き:false/縦書き:true) 
452                domainMarker    = null;                 // 横軸のマーカーライン
453                useDomainLabel  = true;                 // 横軸ラベルの表示有無
454                useMarkerLabel  = true;                 // マーカーライン時の文字有無
455                useCache                = false;                // キャッシュするかどうか
456                seriesPikup             = -1;                   // ピックアップするシリーズ番号
457                masterKey               = "imgTag";             // キャッシュ用マスタキー                  // 6.3.5.1 (2015/08/16) 初期値指定
458                cacheTime               = HybsSystem.sysInt( "CHART_CACHE_TIME" );                      // 6.0.2.0 (2014/09/19) キャッシュ時の制限時間を、秒で指定
459                chrtMap                 = null;                 // キャッシュ用マップ                            // 6.4.3.1 (2016/02/12) 変数名も変えておきます。
460                imgTag                  = null;                 // キャッシュ用イメージタグ
461                imageMapUrl             = null;                 // クリッカブル・マップ
462                imageMapTarget  = null;                 // クリッカブル・マップ用TARGET
463                categoryMargin  = null;                 // 4.0.2.0 (2007/12/20) カテゴリマージン(0.0~1.0)
464                lowerMargin             = null;                 // 4.0.2.0 (2007/12/20) 下方マージン(0.0~1.0)
465                upperMargin             = null;                 // 4.0.2.0 (2007/12/20) 上方マージン(0.0~1.0)
466                useDomainLine   = false;                // 4.0.3.0 (2008/01/07) 横軸のグリッド表示有無(垂直線)
467                domainLineColor = null;                 // 4.0.3.0 (2008/01/07) 横軸のグリッド線の色
468                useRangeLine    = true;                 // 4.0.3.0 (2008/01/07) 縦軸のグリッド表示有無(水平線)
469                rangeLineColor  = null;                 // 4.0.3.0 (2008/01/07) 縦軸のグリッド線の色
470                categorySkip    = 1;                    // 4.0.3.0 (2008/01/07) 横軸ラベルをスキップする間隔
471                categoryCutNo   = -1;                   // 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のカット文字数
472                categoryAnchor  = null;                 // 4.1.1.0 (2008/02/14) 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END)
473                rangeSkip               = -1;                   // 4.1.1.0 (2008/02/04) 縦軸のグリッドをスキップする間隔(初期値:-1)
474                dateAxisFormat  = "MM/dd";              // 5.6.1.0 (2013/02/01) Time,XYTime Polt関係の時間軸を表す場合のフォーマット
475                dateSegSize             = 0;                    // 6.7.3.0 (2017/01/27) SegmentedTimelineのsegment size を、分単位で指定します。
476                dateSegIncluded = 0;                    // 6.7.3.0 (2017/01/27) SegmentedTimelineのincluded segments(スペース)を数値で指定します。
477                dateSegExcluded = 0;                    // 6.7.3.0 (2017/01/27) SegmentedTimelineのexcluded segments(EE)を数値で指定します。
478                dateStartTime   = null;                 // 6.7.3.0 (2017/01/27) SegmentedTimelineのStartTime(segment groupの開始位置) を、yyyyMMddHHmmss形式で指定します。 
479                chartFile               = null;                 // 6.3.5.0 (2015/08/08) チャートの画像ファイル名
480                useTimeView             = HybsSystem.sysBool( "VIEW_USE_TIMEBAR" );     // 6.3.6.0 (2015/08/16)
481        }
482
483        /**
484         * チャートを表示するためのタグを作成します。
485         *
486         * @param       filename        画像ファイル
487         * @param       keyword         クリッカブル・マップの対応づける為のキーワード
488         *
489         * @return      タグ文字列
490         * @og.rtnNotNull
491         */
492        private String makeTag2( final String filename,final String keyword ) {
493                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE )
494                        .append( "<img" );
495
496                if( keyword != null ) {
497                        rtn.append( " usemap=\"#").append( keyword ).append( '"');              // 6.0.2.5 (2014/10/31) char を append する。
498                }
499                rtn.append( " width=\""  ).append( width  )
500                        .append( "px\" height=\"" ).append( height  )
501                        .append( "px\" src=\""    ).append( filename )
502                        .append( "\" /> ");
503
504                return rtn.toString();
505        }
506
507        /**
508         * ChartCreate のオブジェクトを生成します。
509         *
510         * @og.rev 4.1.1.0 (2008/02/04) categoryCutNo , categoryAnchor 属性を追加
511         * @og.rev 5.6.1.0 (2013/02/01) dateAxisFormat 属性を追加
512         * @og.rev 5.6.1.0 (2013/02/01) useVerticalLabels 属性を追加
513         * @og.rev 6.7.3.0 (2017/01/27) 日付軸(dateAxis)の指定で、dateSegSize,dateSegIncluded,dateSegExcluded,dateStartTime を追加します。
514         *
515         * @return  ChartCreateオブジェクト
516         * @og.rtnNotNull
517         */
518        private ChartCreate create() {
519                final ChartCreate tempCreate = new ChartCreate();
520
521                tempCreate.setTitle( title );
522                tempCreate.setDomainLabel( domainLabel );
523                tempCreate.setShowLegend( showLegend );
524                tempCreate.setRectangleEdge( rectangleEdge );
525                tempCreate.setPlotOrientation( plotOrientation );
526                tempCreate.setChartBackColor( chartBackColor );                 // 背景色の設定
527                tempCreate.setPlotBackColor( plotBackColor );                   // 描画領域の設定
528                tempCreate.setRotationLabel( rotationLabel );                   // 横軸ラベルの傾き
529                tempCreate.setUseVerticalLabels( useVerticalLabels );   // 5.6.4.3 (2013/05/24)) ラベルの表示向き
530                tempCreate.setDomainMarker( domainMarker );                             // ドメインマーカー
531                tempCreate.setUseDomainLabel( useDomainLabel );                 // 横軸ラベルの表示有無
532                tempCreate.setUseMarkerLabel( useMarkerLabel );                 // マーカーの設定値表示
533                tempCreate.setSeriesPikup( seriesPikup );                               // ピックアップするシリーズ番号
534                tempCreate.setImageMapUrl( imageMapUrl );                               // クリッカブル・マップ用URL
535                tempCreate.setCategoryMargin( categoryMargin );                 // 4.0.2.0 (2007/12/20) カテゴリマージン(0.0~1.0)
536                tempCreate.setLowerMargin( lowerMargin );                               // 4.0.2.0 (2007/12/20) 下方マージン(0.0~1.0)
537                tempCreate.setUpperMargin( upperMargin );                               // 4.0.2.0 (2007/12/20) 上方マージン(0.0~1.0)
538                tempCreate.setUseDomainLine( useDomainLine );                   // 4.0.3.0 (2008/01/07) 横軸のグリッド表示有無(垂直線)
539                tempCreate.setDomainLineColor( domainLineColor );               // 4.0.3.0 (2008/01/07) 横軸のグリッド線の色
540                tempCreate.setUseRangeLine( useRangeLine );                             // 4.0.3.0 (2008/01/07) 縦軸のグリッド表示有無(水平線)
541                tempCreate.setRangeLineColor( rangeLineColor );                 // 4.0.3.0 (2008/01/07) 縦軸のグリッド線の色
542                tempCreate.setCategorySkip( categorySkip );                             // 4.0.3.0 (2008/01/07) 横軸ラベルをスキップする間隔
543                tempCreate.setCategoryCutNo( categoryCutNo );                   // 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のカット文字数
544                tempCreate.setCategoryAnchor( categoryAnchor );                 // 4.1.1.0 (2008/02/04) 横軸のグリッド(垂直線)の書き出し位置
545                tempCreate.setRangeSkip( rangeSkip );                                   // 4.1.1.0 (2008/02/04) 縦軸のグリッド線(水平線)をスキップする間隔
546                tempCreate.setUseToolTip( useToolTip );                                 // 4.3.1.0 (2008/08/09) ツールチップスの利用
547                tempCreate.setDateAxisFormat( dateAxisFormat );                 // 5.6.1.0 (2013/02/01) Time,XYTime Polt関係の時間軸を表す場合のフォーマット指定
548                tempCreate.setSegmentedTimelineInfo( dateSegSize,dateSegIncluded,dateSegExcluded,dateStartTime );       // 6.7.3.0 (2017/01/27) SegmentedTimeline 関係
549
550                if( isDebug() ) { tempCreate.setDebug( true );  }               // 4.0.2.0 (2007/12/20)
551
552                tempCreate.setDatasetList( chartDataset );
553
554                return tempCreate ;
555        }
556
557        /**
558         * テンポラリFile を取得します。
559         *
560         * ここでは、一般的なファイル出力を考慮した テンポラリFile を作成します。
561         *
562         * ※ 6.3.5.0 (2015/08/08) で、chartFile属性を指定する事で、任意のファイルで
563         * 画像を作成できるようになりました。ただし、出力先フォルダは、CHART_TEMP_DIR
564         * です。
565         *      (CHART_TEMP_DIR[={@og.value SystemData#CHART_TEMP_DIR}])。
566         *
567         * @og.rev 6.3.5.0 (2015/08/08) チャートの画像ファイル名指定に対応。
568         *
569         * @param       fileURL ファイルを作成するディレクトリ
570         *
571         * @return      テンポラリFile
572         * @og.rtnNotNull
573         */
574        private File getTempFile( final String fileURL ) {
575
576                final String directory = HybsSystem.url2dir( fileURL );
577                final File dir = new File( directory );
578                if( ! dir.exists() && ! dir.mkdirs() ) {
579                        final String errMsg = "ディレクトリの作成に失敗しました。[" + directory + "]";
580                        throw new HybsSystemException( errMsg );
581                }
582
583                final File file ;
584                try {
585                        // 6.3.5.0 (2015/08/08) チャートの画像ファイル名指定に対応。
586                        // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
587                        if( chartFile == null ) {
588                                file = File.createTempFile( "JFree",".png",dir );
589                                file.deleteOnExit();
590                        }
591                        else {
592                                file = new File( dir , chartFile );
593                        }
594
595                }
596                catch( final IOException ex ) {
597                        final String errMsg = "ファイル名がオープン出来ませんでした。"
598                                + CR
599                                        + "Url:" + fileURL ;
600                        throw new HybsSystemException( errMsg,ex );
601                }
602
603                return file ;
604        }
605
606        /**
607         * 【TAG】チャートのタイトルをセットします。
608         *
609         * @og.tag チャートのタイトルをセットします。
610         *
611         * @param   ttl タイトル
612         */
613        public void setTitle( final String ttl ) {
614                title = nval( getRequestParameter( ttl ),title );
615        }
616
617        /**
618         * 【TAG】チャートの横幅をセットします(初期値:200)。
619         *
620         * @og.tag
621         * タイトルや凡例も含んだ大きさです。データ領域は自動計算されます。
622         *
623         * @og.rev 4.0.1.0 (2007/12/13) 引数に "px" を使用できるようにする。
624         *
625         * @param   wd 横幅
626         */
627        public void setWidth( final String wd ) {
628                // 引数に、"px" が使用されていた場合は、それを取り除く。
629                if( wd != null && wd.length() >= 3 && wd.endsWith( "px" ) ) {
630                        width = Integer.parseInt( wd.substring( 0,wd.length()-2 ) );            // 6.0.2.4 (2014/10/17) メソッド間違い
631                }
632                else {
633                        width = nval( getRequestParameter( wd ),width );
634                }
635        }
636
637        /**
638         * 【TAG】チャートの縦幅をセットします(初期値:200)。
639         *
640         * @og.tag
641         * タイトルや凡例も含んだ大きさです。データ領域は自動計算されます。
642         *
643         * @og.rev 4.0.1.0 (2007/12/13) 引数に "px" を使用できるようにする。
644         *
645         * @param   ht 縦幅
646         */
647        public void setHeight( final String ht ) {
648                // 引数に、"px" が使用されていた場合は、それを取り除く。
649                if( ht != null && ht.length() >= 3 && ht.endsWith( "px" ) ) {
650                        height = Integer.parseInt( ht.substring( 0,ht.length()-2 ) );           // 6.0.2.4 (2014/10/17) メソッド間違い
651                }
652                else {
653                        height = nval( getRequestParameter( ht ),height );
654                }
655        }
656
657        /**
658         * 【TAG】チャートのドメインラベルを指定します。
659         *
660         * @og.tag
661         * チャートのドメインラベルを指定します。
662         *
663         * @param   dmLbl ドメインラベル
664         */
665        public void setDomainLabel( final String dmLbl ) {
666                domainLabel = nval( getRequestParameter( dmLbl ),domainLabel );
667        }
668
669        /**
670         * 【TAG】チャートの凡例の表示可否[true/false]をセットします(初期値:true[表示する])。
671         *
672         * @og.tag
673         * 初期値は、表示する(true) です。
674         *
675         * @param   swLegend 凡例の表示可否 [true:表示する/それ以外:しない]
676         */
677        public void setShowLegend( final String swLegend ) {
678                showLegend = nval( getRequestParameter( swLegend ),showLegend );
679        }
680
681        /**
682         * 【TAG】チャートの表示箇所を、[TOP/BOTTOM/RIGHT/LEFT]で指定します(初期値:BOTTOM)。
683         *
684         * @og.tag
685         * 表示箇所は、org.jfree.ui.RectangleEdge クラスの設定値を使用します。
686         * 指定できるのは、TOP、BOTTOM、RIGHT、LEFT で、各文字の頭一文字で
687         * 判定してます。つまり、T,B,R,L で、判定を行い、それ以外はエラーになります。
688         * 初期値は、BOTTOM です。
689         *
690         * @param   rectEdge 凡例表示方向 [TOP/BOTTOM/RIGHT/LEFT]
691         */
692        public void setRectangleEdge( final String rectEdge ) {
693                rectangleEdge = nval( getRequestParameter( rectEdge ),rectangleEdge );
694        }
695
696        /**
697         * 【TAG】チャートのプロット(Plot)表示方向を、[VERTICAL(or V)/HORIZONTAL(or H)]で指定します(初期値:VERTICAL)。
698         *
699         * @og.tag
700         * 軸表示方向は、org.jfree.chart.plot.PlotOrientation クラスの設定値を使用します。
701         * 指定できるのは、VERTICAL、HORIZONTALで、各文字の頭一文字で
702         * 判定してます。つまり、V,H で、判定を行い、それ以外はエラーになります。
703         * 初期値は、VERTICAL です。
704         *
705         * @param   orientation 表示方向 [VERTICAL(or V)/HORIZONTAL(or H)]
706         */
707        public void setPlotOrientation( final String orientation ) {
708                plotOrientation = nval( getRequestParameter( orientation ),plotOrientation );
709        }
710
711        /**
712         * 【TAG】チャートの背景色を指定します。
713         *
714         * @og.tag
715         * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。
716         * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
717         * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。
718         * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。
719         *
720         * @param   chBackClr 背景色
721         * @see         java.awt.Color#BLACK
722         */
723        public void setChartBackColor( final String chBackClr ) {
724                chartBackColor = nval( getRequestParameter( chBackClr ),chartBackColor );
725        }
726
727        /**
728         * 【TAG】チャートの描画領域の色を指定します。
729         *
730         * @og.tag
731         * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。
732         * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
733         * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。
734         * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。
735         *
736         * @param   plBackClr 描画領域色
737         * @see         java.awt.Color#BLACK
738         */
739        public void setPlotBackColor( final String plBackClr ) {
740                plotBackColor = nval( getRequestParameter( plBackClr ),plotBackColor );
741        }
742
743        /**
744         * 【TAG】チャートのカテゴリーラベルの方向を指定します(初期値は、3:60度)。
745         *
746         * @og.tag
747         * 方向は、上方向に対して、(PI / 指示数) で求まる値に設定します。
748         * この指示数に相当する値を設定します。
749         * 1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・
750         * マイナスは、下方向に回転させます。
751         * 0 を指定した場合は、何も設定しません。
752         * 初期値は、3:60度です。
753         *
754         * @param       rttLabel        ラベルの方向 (例:1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・)
755         */
756        public void setRotationLabel( final String rttLabel ) {
757                rotationLabel = nval( getRequestParameter( rttLabel ),rotationLabel );
758        }
759
760        /**
761         * 【TAG】ラベルの表示向きを縦にするかどうか[false/true]を指定します(初期値:false[横書き])。
762         *
763         * @og.tag
764         * ChartCreate の rotationLabel は、角度を指定できましたが、NumberAxis,DateAxis では、
765         * 縦にするかどうかの指定しかできません。
766         * ここでは、true を指定するとラベルは、縦書きになります。
767         * 初期値は、false(横書き)です。
768         *
769         * @og.rev 5.6.4.3 (2013/05/24)) 新規追加
770         *
771         * @param       useVLavels      ラベルの表示向き [false:横書き/true:縦書き]
772         */
773        public void setUseVerticalLabels( final String useVLavels ) {
774                useVerticalLabels = nval( getRequestParameter( useVLavels ),useVerticalLabels );
775        }
776
777        /**
778         * 【TAG】チャートの横軸の値(ドメイン)に合致する位置にマーカーラインを設定します。
779         *
780         * @og.tag
781         * この属性には、マーカーラインを設定する値を記述します。
782         *
783         * @param   marker 横軸マーカーライン
784         */
785        public void setDomainMarker( final String marker ) {
786                domainMarker = nval( getRequestParameter( marker ),domainMarker );
787        }
788
789        /**
790         * 【TAG】横軸ラベルのラベルを表示するかどうか[true/false]を指定します(初期値:true)。
791         *
792         * @og.tag
793         * ドメイン(横軸)が、多数存在する場合、ドメインラベルが見えにくくなります。
794         * そのようなケースで、横軸のラベルそのものを表示しない場合に、false を
795         * 設定します。
796         * 初期値は、表示する(true)です。
797         *
798         * @param   flag 横軸ラベルの表示有無 [true:表示する/false:表示しない]
799         */
800        public void setUseDomainLabel( final String flag ) {
801                useDomainLabel = nval( getRequestParameter( flag ),useDomainLabel );
802        }
803
804        /**
805         * 【TAG】マーカーラインに、その設定値を表示するかどうか[true/false]を指定します(初期値:true)。
806         *
807         * @og.tag
808         * ドメイン(横軸)が、多数存在する場合、ドメインラベルが見えない場合があります。
809         * そのようなケースで、見たい値にマーカーラインを設定し、その横に、ドメインラベル
810         * を表示する事で、ピックアップしている軸の値を容易に知ることが可能です。
811         * 初期値は、表示する(true)です。
812         *
813         * @param   flag 設定値表示 [true:する/false:しない]
814         */
815        public void setUseMarkerLabel( final String flag ) {
816                useMarkerLabel = nval( getRequestParameter( flag ),useMarkerLabel );
817        }
818
819        /**
820         * 【TAG】JFreeChartで作成されたイメージタグをキャッシュするかどうか[true/false]を指定します(初期値:false)。
821         *
822         * @og.tag
823         * useCache="true" を設定すると、session に、HybsSystem.JF_CHART_CACHE_KEY
824         * キーで、Mapが、キャッシュされます。そのMap に、画面ID + masterKey 単位にキャッシュされます。
825         * 6.0.2.0 (2014/09/19) 以降は、イメージタグのみキャッシュしますので、
826         * domainMarker 属性と、seriesPikup 属性を再設定する場合は、画像を再作成する
827         * 必要がありますので、masterKey を変更する必要があります。
828         * (または、seriesPikup 属性をmasterKeyに含めてください。)
829         *
830         * 初期値は、キャッシュしない(false)です。
831         *
832         * @param   flag キャッシュ可否 [true:する/false:しない]
833         * @see     #setDomainMarker( String )
834         * @see     #setSeriesPikup( String )
835         * @see         #setCacheTime( String )
836         */
837        public void setUseCache( final String flag ) {
838                useCache = nval( getRequestParameter( flag ),useCache );
839        }
840
841        /**
842         * 【TAG】キャッシュ時の制限時間を、秒で指定します
843         *              (初期値:CHART_CACHE_TIME[={@og.value SystemData#CHART_CACHE_TIME}])。
844         *
845         * @og.tag
846         * useCache="true" に設定した場合、キャッシュを使用します。
847         * この場合、cacheTime で指定した時間は、キャッシュが使用されます。
848         * 制限時間を超えたキャッシュは破棄され、新しいキャッシュにセットされます。
849         * 
850         * 初期値:システム定数のCHART_CACHE_TIME[={@og.value SystemData#CHART_CACHE_TIME}])。
851         *
852         * @og.rev 6.0.2.0 (2014/09/19) 新規追加
853         *
854         * @param       ccTime  キャッシュ時の制限時間(秒)
855         * @see         #setMasterKey( String )
856         * @see         #setUseCache( String )
857         */
858        public void setCacheTime( final String ccTime ) {
859                cacheTime = nval( getRequestParameter( ccTime ),cacheTime );
860        }
861
862        /**
863         * 【TAG】useCache="true" 時のキャッシュの保存先scopeを指定します(初期値:session)。
864         *
865         * @og.tag
866         * 通常のグラフのキャッシュは、ユーザー単位に行う(session)スコープに保管されます。
867         * 現状の JFreeChart でのグラフは、作成毎に、実イメージファイルを作成し、それを
868         * 返すため、ほとんど書き換えが無く、多くにユーザーがアクセスする様なケース・・例えば、
869         * トップメニューに月次損益のグラフを表示するなどの場合、無駄にファイルが作成されます。
870         * そこで、ユーザー間も共有する様なグラフには、cacheScope="application" とすることで、
871         * 全ユーザー共通のキャッシュにすることができます。
872         * 一応、スコープとしては、"request","page","session","application" が指定できます。
873         *
874         * @og.rev 6.3.5.1 (2015/08/16) キャッシュ処理のロジックを整理します。新規追加。
875     *
876         * @param  scp スコープ [request/page/session/application]
877         * @see         #getScope()
878         */
879        public void setCacheScope( final String scp ) {
880                setScope( scp );
881        }
882
883        /**
884         * 【TAG】キャッシュ用マスタキーを指定します(初期値:imgTag)。
885         *
886         * @og.tag
887         * useCache="true" に設定した場合、このキーを用いて、キャッシュします。
888         * 実際のキャッシュは、画面ID + masterKey になります。
889         *
890         * ※ 6.0.2.0 (2014/09/19) 以降は、イメージタグのみキャッシュしますので、
891         * 従来の様に、seriesPikup 違いに応じた処理は行いません。
892         * よって、useCache="true"  で、seriesPikup 違いの場合は、再検索させる
893         * 必要がありますので、masterKey を変更する必要があります。
894         * (または、seriesPikup 属性をmasterKeyに含めてください。)
895         * なお、キャッシュ保持時間は、#setCacheTime( String ) で指定できます。
896         *
897         * @og.rev 6.3.5.1 (2015/08/16) masterKey に、初期値指定。
898         *
899         * @param       mkey    キャッシュ用マスタキー
900         * @see         #setUseCache( String )
901         * @see         #setCacheTime( String )
902         */
903        public void setMasterKey( final String mkey ) {
904                masterKey = nval( getRequestParameter( mkey ),masterKey );
905        }
906
907        /**
908         * 【TAG】複数シリーズのピックアップを行う場合のシリーズ番号を指定します。
909         *
910         * @og.tag
911         * 複数シリーズ(検索時に複数項目を同時に検索する場合)では、チャート上に
912         * 複数のグラフが表示されますが、その中の一つをピックアップする場合に、
913         * シリーズ番号を指定します。
914         * シリーズ番号は、0 から始まる数字です。
915         * ここでは、ピックアップされたシリーズは、赤色で表示されます。
916         * それ以外は、グレー色での表示になります。
917         * seriesPikup を使用すると、chartDataset タグの useValueVisible 属性が
918         * 影響を受けます。この属性は、データの値(itemText)を表示しますが、
919         * seriesPikup が指定された場合は、そのシリーズのみにラベル表示します。
920         *
921         * @param       pikup   シリーズ番号
922         */
923        public void setSeriesPikup( final String pikup ) {
924                seriesPikup = nval( getRequestParameter( pikup ),seriesPikup );
925        }
926
927        /**
928         * 【TAG】クリッカブル・マップ用URLを指定します。
929         *
930         * @og.tag
931         * 画像に、クリッカブル・マップを作成する場合の、URL を指定します。
932         * これは、画像上にエリア指定でリンク引数を作成することが可能です。
933         * URL 自身は、? 付きで固定値の引数を連結することが可能です。
934         * クリックしたエリアのカテゴリやインデックスの値(引数)は、自動的に
935         * 設定されます。(指定しない場合はチャートによって異なります)
936         * <pre>
937         * ・Pie      :category、pieIndex
938         * ・XY       :series、item
939         * ・Category :series、category
940         * </pre>
941         * この引数の URL の名称を変更したい場合は、URL に続けて、カンマ(,) で、
942         * 名称を記述してください。
943         * 例:link.jsp,BLOCK
944         *
945         * @param       imap    クリッカブル・マップ用URL
946         * @see #setImageMapTarget( String )
947         */
948        public void setImageMapUrl( final String imap ) {
949                imageMapUrl = nval( getRequestParameter( imap ),imageMapUrl );
950        }
951
952        /**
953         * 【TAG】クリッカブル・マップ用TARGETを指定します。
954         *
955         * @og.tag
956         * 画像に、クリッカブル・マップを作成する場合の、TARGET を指定します。
957         * これは、画像上にエリア指定でリンクを作成する場合のフレーム指定です。
958         *
959         * @param       target  クリッカブル・マップ用TARGET
960         * @see #setImageMapUrl( String )
961         */
962        public void setImageMapTarget( final String target ) {
963                imageMapTarget = nval( getRequestParameter( target ),imageMapTarget );
964        }
965
966        /**
967         * 【TAG】カテゴリマージン(0.0~1.0)を指定します(初期値:null 自動調整)。
968         *
969         * @og.tag
970         * カテゴリ(グラフの横軸に相当)の表示間隔(マージン)の比率を指定します。
971         * この比率は、% ではなく、数字(double)での設定になります。
972         * 何も指定しない場合は、デフォルトで自動調整されます。
973         *
974         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
975         *
976         * @param       margin  カテゴリマージン(0.0~1.0)
977         */
978        public void setCategoryMargin( final String margin ) {
979                categoryMargin = nval( getRequestParameter( margin ),categoryMargin );
980        }
981
982        /**
983         * 【TAG】下方マージン(0.0~1.0)を指定します(初期値:null 自動調整)。
984         *
985         * @og.tag
986         * カテゴリ(グラフの横軸に相当)の下方側(左側)のマージンの比率を指定します。
987         * この比率は、% ではなく、数字(double)での設定になります。
988         * 何も指定しない場合は、デフォルトで自動調整されます。
989         *
990         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
991         *
992         * @param       margin  下方マージン(0.0~1.0)
993         */
994        public void setLowerMargin( final String margin ) {
995                lowerMargin = nval( getRequestParameter( margin ),lowerMargin );
996        }
997
998        /**
999         * 【TAG】上方マージン(0.0~1.0)を指定します(初期値:null 自動調整)。
1000         *
1001         * @og.tag
1002         * カテゴリ(グラフの横軸に相当)の上方側(右側)のマージンの比率を指定します。
1003         * この比率は、% ではなく、数字(double)での設定になります。
1004         * 何も指定しない場合は、デフォルトで自動調整されます。
1005         *
1006         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
1007         *
1008         * @param       margin  上方マージン(0.0~1.0)
1009         */
1010        public void setUpperMargin( final String margin ) {
1011                upperMargin = nval( getRequestParameter( margin ),upperMargin );
1012        }
1013
1014        /**
1015         * 【TAG】横軸のグリッド表示有無(垂直線)を指定します(初期値:false)。
1016         *
1017         * @og.tag
1018         * ドメイン(横軸)に対する、グリッドライン(垂直線)を表示するかどうか指定します。
1019         *
1020         * 何も指定しない場合は、表示しません。(false)
1021         *
1022         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
1023         *
1024         * @param       useLine 横軸のグリッド表示有無 [true:する/false:しない]
1025         */
1026        public void setUseDomainLine( final String useLine ) {
1027                useDomainLine = nval( getRequestParameter( useLine ),useDomainLine );
1028        }
1029
1030        /**
1031         * 【TAG】横軸のグリッド線の色を指定します。
1032         *
1033         * @og.tag
1034         * ドメイン(横軸)に対する、グリッドラインの表示色を指定します。
1035         * 何も指定しない場合は、デフォルトで自動設定されます。
1036         *
1037         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
1038         *
1039         * @param       color   横軸のグリッド線の色
1040         */
1041        public void setDomainLineColor( final String color ) {
1042                domainLineColor = nval( getRequestParameter( color ),domainLineColor );
1043        }
1044
1045        /**
1046         * 【TAG】横軸ラベルをスキップする間隔を指定します(初期値:1 すべて表示)。
1047         *
1048         * @og.tag
1049         * 横軸ラベル(カテゴリラベル表示)する際に、スキップする間隔を指定します。
1050         * "1" (初期値)では、1つづつ表示(つまり、すべて表示する)します。
1051         * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。
1052         * 初期値は、"1" (すべて表示)です。
1053         * なお、先頭から表示を開始します。
1054         *
1055         * 注意:これとは別に、ラベル先頭に "_" を付けた場合は、ラベルを表示しません。
1056         * また、categoryCutNo が指定された場合は、categorySkip は使用されません。
1057         *
1058         * @param       step    スキップする間隔
1059         * @see         #setCategoryCutNo( String )
1060         */
1061        public void setCategorySkip( final String step ) {
1062                categorySkip = nval( getRequestParameter( step ),categorySkip );
1063        }
1064
1065        /**
1066         * 【TAG】横軸ラベルの文字位置指定のカット文字数を指定します(初期値:-1 すべて表示)。
1067         *
1068         * @og.tag
1069         * 横軸ラベル(カテゴリラベル表示)する際に、ラベルの先頭から、この指定文字数だけ
1070         * カットして、表示します。
1071         * その際、前回作成したカットラベルと、同一ラベルの場合は、表示しません。
1072         * 例えば、データは、年月日で、年と月のみ(先頭6文字)を指定すると、
1073         * 日のデータは、ラベルが表示されません。
1074         * 指定される数字は、1以上の整数としてください。
1075         * 初期値は、すべて表示です。
1076         *
1077         * 注意:これとは別に、ラベル先頭に "_" を付けた場合は、ラベルを表示しません。
1078         *
1079         * @og.rev 4.1.1.0 (2008/02/04) 新規追加
1080         *
1081         * @param       cutNo   カット文字数位置
1082         * @see         #setCategorySkip( String )
1083         */
1084        public void setCategoryCutNo( final String cutNo ) {
1085                categoryCutNo = nval( getRequestParameter( cutNo ),categoryCutNo );
1086        }
1087
1088        /**
1089         * 【TAG】横軸のグリッド(垂直線)の書き出し位置[START/MIDDLE/END]を指定します(初期値:null)。
1090         *
1091         * @og.tag
1092         * 横軸のグリッド(垂直線)を、グラフのどの位置に記述するかを指定します。
1093         * 具体的な値は、CategoryAnchor オブジェクトの値になります。
1094         * ここでは、文字列で(START,MIDDLE,END)を指定します。(先頭一文字で判定)
1095         * 何も指定しない場合は、デフォルト(MIDDLE)です。
1096         *
1097         * @og.rev 4.1.1.0 (2008/02/14) 新規追加
1098         *
1099         * @param       anchor  書き出し位置 [START/MIDDLE/END]
1100         */
1101        public void setCategoryAnchor( final String anchor ) {
1102                categoryAnchor = nval( getRequestParameter( anchor ),categoryAnchor );
1103
1104                if( categoryAnchor != null && categoryAnchor.length() > 0 ) {
1105                        if( ! "START".equals( categoryAnchor )  &&
1106                                ! "MIDDLE".equals( categoryAnchor ) &&
1107                                ! "END".equals( categoryAnchor ) ) {
1108                                        final String errMsg = "指定のAnchorは適用できません。[" + anchor + "]"
1109                                                        + CR
1110                                                        + "START,MIDDLE,END の中から、指定してください。" ;
1111                                        throw new HybsSystemException( errMsg );
1112                        }
1113                }
1114        }
1115
1116        /**
1117         * 【TAG】縦軸のグリッド表示有無(水平線)を指定します(初期値:true)。
1118         *
1119         * @og.tag
1120         * レンジ(縦軸)に対する、グリッドライン(垂直線)を表示するかどうか指定します。
1121         *
1122         * 何も指定しない場合は、表示しません。(false)
1123         *
1124         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
1125         *
1126         * @param       useLine グリッド表示有無 [true:する/false:しない]
1127         */
1128        public void setUseRangeLine( final String useLine ) {
1129                useRangeLine = nval( getRequestParameter( useLine ),useRangeLine );
1130        }
1131
1132        /**
1133         * 【TAG】縦軸のグリッド線(水平線)の色を指定します(初期値:null 自動設定)。
1134         *
1135         * @og.tag
1136         * レンジ(縦軸)に対する、グリッドラインの表示色を指定します。
1137         * 何も指定しない場合は、デフォルトで自動設定されます。
1138         *
1139         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
1140         *
1141         * @param       color   縦軸のグリッド線(水平線)の色
1142         */
1143        public void setRangeLineColor( final String color ) {
1144                rangeLineColor = nval( getRequestParameter( color ),rangeLineColor );
1145        }
1146
1147        /**
1148         * 【TAG】縦軸のグリッド線(水平線)をスキップする間隔を指定します(初期値:-1)。
1149         *
1150         * @og.tag
1151         * 縦軸のグリッド線(水平線)を表示する際に、スキップする間隔を指定します。
1152         * 通常は、ラベルと同じだけのグリッド線が掛かれますが、ラベルよりも
1153         * 少ない数のグリッド線(例えば、2つおき)を出す場合に、値を設定します。
1154         * "1" (初期値)では、1つづつ表示(つまり、すべて表示する)します。
1155         * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。
1156         * なお、先頭から表示を開始します。
1157         *
1158         * 6.0.2.0 (2014/09/19) 前回の JFreeChart のVerUpで、グリッド線の表示が
1159         * 5個おきに変わったようです。設定する値を マイナスにすると、初期設定の値を
1160         * 使用するように変更します。微調整は、個々にお願いします。
1161         *
1162         * 初期値は、"-1" (設定しない)です。
1163         *
1164         * @og.rev 4.1.1.0 (2008/02/04) 新規追加
1165         * @og.rev 6.0.2.0 (2014/09/19) rangeSkip 属性 の初期値を、-1(設定なし)に変更
1166         *
1167         * @param       rngSkip 縦軸のグリッド線(水平線)をスキップする間隔
1168         */
1169        public void setRangeSkip( final String rngSkip ) {
1170                rangeSkip = nval( getRequestParameter( rngSkip ),rangeSkip );
1171        }
1172
1173        /**
1174         * 【TAG】ツールチップスの使用可否[true:利用する/false:利用しない]を指定します(初期値:false)。
1175         *
1176         * @og.tag
1177         * ラベルを利用する際に、ラベルと図面、隣のラベル同士が重なることがあります。
1178         * この場合、ツールチップスの利用をお勧めします。
1179         * 初期値は'false'です。
1180         *
1181         * @og.rev 4.3.1.0 (2008/08/09) 新規追加
1182         *
1183         * @param   toolTip ツールチップス [true:利用/false:利用しない]
1184         */
1185        public void setUseToolTip( final String toolTip ) {
1186                useToolTip = nval( getRequestParameter( toolTip ), useToolTip );
1187        }
1188
1189        /**
1190         * 【TAG】Time,XYTime Polt関係の時間軸を表す場合のフォーマットを指定します(初期値:MM/dd)。
1191         *
1192         * @og.tag
1193         * TimeSeries 関連のデータを扱う場合の横軸の日付フォーマットを指定します。
1194         * 日付フォーマットは、java.text.SimpleDateFormat で使われる yyyy/MM/dd HH:mm:ss 表記です。
1195         * 
1196         * 初期値は、"MM/dd" です。
1197         *
1198         * @og.rev 5.6.1.0 (2013/02/01) 新規追加
1199         *
1200         * @param       dtFormat        時間軸を表すフォーマット
1201         */
1202        public void setDateAxisFormat( final String dtFormat ) {
1203                dateAxisFormat = nval( getRequestParameter( dtFormat ), dateAxisFormat );
1204        }
1205
1206        /**
1207         * 【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのsegment size を、分単位で指定します。
1208         *
1209         * @og.tag
1210         * 日単位を指定する場合は、24*60 = 1440 を指定します。
1211         * 0 または、何も指定しない場合は、SegmentedTimeline を使用しません。
1212         * <pre>
1213         *   start time
1214         *     |
1215         *     v
1216         *     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 ...
1217         *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+...
1218         *   |  |  |  |  |  |EE|EE|  |  |  |  |  |EE|EE|  |  |  |  |  |EE|EE|
1219         *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+...
1220         *   [_____________] [___]            [_]
1221         *          |          |               |
1222         *       included   excluded        segment
1223         *       segments   segments         size
1224         *   [___________________]
1225         *              |
1226         *         segment group
1227         * </pre>
1228         *
1229         * @og.rev 6.7.3.0 (2017/01/27) 新規追加
1230         *
1231         * @param       segSize SegmentedTimelineのsegment size を、分単位で指定
1232         */
1233        public void setDateSegSize( final String segSize ) {
1234                dateSegSize = nval( getRequestParameter( segSize ), dateSegSize );
1235        }
1236
1237        /**
1238         * 【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのincluded segments(スペース)を数値で指定します。
1239         *
1240         * @og.tag
1241         * segment group内で、スペース(空ける) になる segment数 を指定します。
1242         * この値は、dateSegSize を指定しない限り、使用されません。
1243         *
1244         * @og.rev 6.7.3.0 (2017/01/27) 新規追加
1245         *
1246         * @param       segIncluded     SegmentedTimelineのincluded segments(スペース)を数値で指定
1247         * @see         #setDateSegSize( String )
1248         */
1249        public void setDateSegIncluded( final String segIncluded ) {
1250                dateSegIncluded = nval( getRequestParameter( segIncluded ), dateSegIncluded );
1251        }
1252
1253        /**
1254         * 【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのexcluded segments(EE)を数値で指定します。
1255         *
1256         * @og.tag
1257         * segment group内で、excluded する segment数 を指定します。
1258         * この値は、dateSegSize を指定しない限り、使用されません。
1259         *
1260         * @og.rev 6.7.3.0 (2017/01/27) 新規追加
1261         *
1262         * @param       segExcluded     SegmentedTimelineのexcluded segments(EE)を数値で指定
1263         * @see         #setDateSegSize( String )
1264         */
1265        public void setDateSegExcluded( final String segExcluded ) {
1266                dateSegExcluded = nval( getRequestParameter( segExcluded ), dateSegExcluded );
1267        }
1268
1269        /**
1270         * 【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのStartTime(segment groupの開始位置) を、yyyyMMddHHmmss形式で指定します。
1271         *
1272         * @og.tag
1273         * TimeSeries 関連のデータを扱う場合の横軸に、SegmentedTimelineを指定します。
1274         * 日付フォーマットは、yyyyMMddHHmmss形式で指定します。
1275         * 
1276         * この値は、dateSegSize を指定しない限り、使用されません。
1277         * 初期値は、null(自動設定) です。
1278         *
1279         * @og.rev 6.7.3.0 (2017/01/27) 新規追加
1280         *
1281         * @param       startTime       SegmentedTimelineのStartTime(segment groupの開始位置)
1282         * @see         #setDateSegSize( String )
1283         */
1284        public void setDateStartTime( final String startTime ) {
1285                dateStartTime = nval( getRequestParameter( startTime ), dateStartTime );
1286        }
1287
1288        /**
1289         * 【TAG】チャートの画像ファイル名を指定します(初期値:自動)。
1290         *
1291         * @og.tag
1292         * チャートは、png 形式のファイルとして作成されます。そのファイル名を指定します。
1293         * ファイルは、CHART_TEMP_DIR 以下に、作成されます。
1294         * 原仕様では、作成するフォルダを指定できません。
1295         * 何も指定しない場合は、JFreeXXXXX.png 形式のテンポラリファイル名で作成されます。
1296         * この場合は、File#deleteOnExit() を付与するので、Tomcat停止時に自動的に削除されます。
1297         * chartFile 属性で指定した場合は、自動削除されませんので、ご注意ください。
1298         * 
1299         * 初期値は、自動( File.createTempFile( "JFree",".png" , CHART_TEMP_DIR ) ) です。
1300         *      (CHART_TEMP_DIR[={@og.value SystemData#CHART_TEMP_DIR}])。
1301         *
1302         * @og.rev 6.3.5.0 (2015/08/08) チャートの画像ファイル名指定に対応。
1303         *
1304         * @param       file    時間軸を表すフォーマット
1305         */
1306        public void setChartFile( final String file ) {
1307                chartFile = nval( getRequestParameter( file ), chartFile );
1308        }
1309
1310        /**
1311         * 【TAG】処理時間を表示する TimeView を表示するかどうか[true:する/false:しない]を指定します
1312         *              (初期値:VIEW_USE_TIMEBAR[={@og.value SystemData#VIEW_USE_TIMEBAR}])。
1313         *
1314         * @og.tag
1315         * true に設定すると、処理時間を表示するバーイメージが表示されます。
1316         * これは、DB検索、APサーバー処理、画面表示の各処理時間をバーイメージで
1317         * 表示させる機能です。処理時間の目安になります。
1318         * (初期値:VIEW_USE_TIMEBAR[={@og.value SystemData#VIEW_USE_TIMEBAR}])。
1319         *
1320         * @og.rev 6.3.6.0 (2015/08/16) useTimeView の初期値を、VIEW_USE_TIMEBAR にする。
1321         *
1322         * @param       flag    処理時間を表示 [true:する/false:しない]
1323         */
1324        public void setUseTimeView( final String flag ) {
1325                useTimeView = nval( getRequestParameter( flag ),useTimeView );
1326        }
1327
1328        /**
1329         * BODY要素に記述した、chartDataset タグの属性設定クラスをListに追加します。
1330         *
1331         * BODY部に記述された、chartDataset タグの属性は、チャートのデータ取得Queryや、
1332         * チャートの種類などの情報を管理しています。
1333         * チャートの種類(Category系)によっては、チャートを合成して表示させることが可能です。
1334         * それらの複数のチャートの指定が、chartDataset タグ で行われます。
1335         *
1336         * @param       chDataset       chartDatasetタグの属性設定クラス
1337         */
1338        protected void addChartDataset( final ChartDataset chDataset ) {
1339                if( chartDataset == null ) { chartDataset = new ArrayList<>(); }
1340                chartDataset.add( chDataset );
1341        }
1342
1343        /**
1344         * このオブジェクトの文字列表現を返します。
1345         * 基本的にデバッグ目的に使用します。
1346         *
1347         * @return このクラスの文字列表現
1348         * @og.rtnNotNull
1349         */
1350        @Override
1351        public String toString() {
1352
1353                // 6.0.2.5 (2014/10/31) char を append する。
1354                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE )
1355                        .append( '[' ).append( this.getClass().getName() ).append( ']' ).append( CR )
1356                        .append( "title           [" ).append( title           ).append( ']' ).append( CR )
1357                        .append( "width           [" ).append( width           ).append( ']' ).append( CR )
1358                        .append( "height          [" ).append( height          ).append( ']' ).append( CR )
1359                        .append( "domainLabel     [" ).append( domainLabel     ).append( ']' ).append( CR )
1360                        .append( "showLegend      [" ).append( showLegend      ).append( ']' ).append( CR )
1361                        .append( "rectangleEdge   [" ).append( rectangleEdge   ).append( ']' ).append( CR )
1362                        .append( "plotOrientation [" ).append( plotOrientation ).append( ']' ).append( CR )
1363                        .append( "chartBackColor  [" ).append( chartBackColor  ).append( ']' ).append( CR )
1364                        .append( "plotBackColor   [" ).append( plotBackColor   ).append( ']' ).append( CR );
1365
1366                return rtn.toString();
1367        }
1368
1369        /**
1370         * 6.0.2.0 (2014/09/19) キャッシュ時間の外部設定、キャッシュ対象の変更
1371         * 
1372         * イメージタグをキャッシュするクラスです。
1373         * キャッシュの保持時間は、コンストラクタで指定します。
1374         * 従来は、JFreeChart と、画像ファイルのキャッシュを行っていましたが
1375         * JFreeChart オブジェクトをキャッシュするメリットがあまりない為、
1376         * イメージタグのキャッシュのみに変更しました。
1377         * キャッシュの有効期間の初期値は、システムリソースの CHART_CACHE_TIME で定義します。
1378         *
1379         * @og.rev 6.0.2.0 (2014/09/19) キャッシュは、イメージタグのみ
1380         * @og.rev 6.3.5.1 (2015/08/16) キャッシュ処理のロジックを整理します。
1381         */
1382        private static final class ChartCache {
1383
1384                // 6.0.2.0 (2014/09/19) イメージタグのみのキャッシュなので、seriesPikup は関係なくなった。
1385                private final   String          imgTag  ;               // キャッシュのキーをタグそのものに変更
1386                private final   long            createLimitTime ;
1387
1388                /**
1389                 * コンストラクター
1390                 * JFreeChartで作成sれたイメージタグをキャッシュするキーを指定します。
1391                 * 内部的には、このキー(mkey)で、比較や hashCode が計算されています。
1392                 * キャッシュの有効期間は、ccTime (秒) で定義します。
1393                 * イメージタグの作成時間が、それを超える場合は、キャッシュを初期化します。
1394                 *
1395                 * @og.rev 6.0.2.0 (2014/09/19) キャッシュ時の制限時間対応
1396                 * @og.rev 6.3.5.1 (2015/08/16) コンストラクターで、イメージタグの設定と有効時間の算出を行います。
1397                 *
1398                 * @param       imgTag  イメージタグ
1399                 * @param       ccTime  キャッシュの制限時間(秒)
1400                 */
1401                public ChartCache( final String imgTag,final int ccTime ) {
1402                        this.imgTag     = imgTag;
1403                        createLimitTime = System.currentTimeMillis() + ccTime * 1000L;
1404                }
1405
1406                /**
1407                 * イメージタグを返します。
1408                 * キャッシュされていれば、そのキャッシュを、そうでなければ、null を
1409                 * 返します。
1410                 *
1411                 * @og.rev 6.3.5.1 (2015/08/16) メソッド名を変更します。
1412                 *
1413                 * @return   イメージタグ
1414                 */
1415                public String getImageTag() {
1416                        return imgTag ;
1417                }
1418
1419                /**
1420                 * キャッシュが、有効かどうかを返します。(有効:true)
1421                 * キャッシュは、コンストラクタ引数で指定された時間が経過すると、
1422                 * 無効と判断されます。
1423                 * 有効であれば、true を返します。
1424                 *
1425                 * @return      有効かどうか[有効:true/無効:false]
1426                 */
1427                public boolean isAvailable() {
1428                        return System.currentTimeMillis() < createLimitTime ;
1429                }
1430
1431        }
1432}