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