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 = "6.9.7.0 (2018/05/14)" ;
230        private static final long serialVersionUID = 697020180514L ;
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                        }
405                        catch( final IOException ex ) {
406                                final String errMsg = "ファイル I/O が実行できませんでした。"
407                                        + CR + file + CR
408                                                + ex.getMessage();
409                                throw new HybsSystemException( errMsg,ex );
410                        }
411
412                        jspPrint( imgTag );
413
414                        // キャッシュ時にセーブする。
415                        if( useCache ) {
416                                final ChartCache cache = new ChartCache( imgTag,cacheTime );
417                                final String cacheKey = getGUIInfoAttri( "KEY" ) + masterKey ;
418                                chrtMap.put( cacheKey,cache );                                          // 6.4.3.1 (2016/02/12) 変数名も変えておきます。
419                                setObject( CHART_CACHE_KEY,chrtMap );                           // 6.4.3.1 (2016/02/12) 変数名も変えておきます。
420                        }
421                }
422                // イメージタグのキャッシュがあれば、それを返す。
423                else {
424                        jspPrint( imgTag );
425                }
426
427                // 6.3.5.1 (2015/08/16) 
428                // ③ 直後の実行結果を、{&#064;CHART.TAG} 変数で取得できます。(requestスコープ)
429                setRequestAttribute( "CHART.TAG" , imgTag );
430
431                // 3.5.4.7 (2004/02/06)
432                if( useTimeView ) {             // 6.3.6.0 (2015/08/16)
433                        final long dyEnd = System.currentTimeMillis();
434                        jspPrint( "<div id=\"viewTime\" value=\"" + (dyEnd-queryEnd) + "\"></div>" );   // 6.3.6.0 (2015/08/16)
435                }
436                return EVAL_PAGE;
437        }
438
439        /**
440         * タグリブオブジェクトをリリースします。
441         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
442         *
443         * @og.rev 4.0.1.0 (2007/12/13) categoryMargin、lowerMargin、upperMargin 属性を追加
444         * @og.rev 4.1.1.0 (2008/02/04) categoryCutNo , categoryAnchor , rangeSkip 属性を追加
445         * @og.rev 5.6.1.0 (2013/02/01) dateAxisFormat 属性を追加
446         * @og.rev 5.6.4.3 (2013/05/24) useVerticalLabels 属性を追加
447         * @og.rev 6.0.2.0 (2014/09/19) rangeSkip 属性 の初期値を、-1(設定なし)に変更
448         * @og.rev 6.0.2.0 (2014/09/19) cacheTime 属性 の追加
449         * @og.rev 6.3.5.0 (2015/08/08) チャートの画像ファイル名指定に対応。
450         * @og.rev 6.3.5.1 (2015/08/16) cache は、ローカル変数とする。masterKey に、初期値指定。
451         * @og.rev 6.3.6.0 (2015/08/16) useTimeView の初期値を、VIEW_USE_TIMEBAR にする。
452         * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。変数名も変えておきます。
453         * @og.rev 6.7.3.0 (2017/01/27) 日付軸(dateAxis)の指定で、dateSegSize,dateSegIncluded,dateSegExcluded,dateStartTime を追加します。
454         * @og.rev 6.9.7.0 (2018/05/14) stopZero,notfoundMsg 属性追加
455         */
456        @Override
457        protected void release2() {
458                super.release2();
459                chartDataset    = null;
460                title                   = null;
461                width                   = 200;
462                height                  = 200;
463                domainLabel             = null;
464                showLegend              = true;
465                rectangleEdge   = "BOTTOM";
466                plotOrientation = "VERTICAL";
467                chartBackColor  = null;                 // 背景色の設定
468                plotBackColor   = null;                 // 描画領域の設定
469                rotationLabel   = 3;                    // 横軸ラベルの傾き(1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・ )
470                useVerticalLabels = false;              // 5.6.4.3 (2013/05/24) 横軸ラベルの表示向き(横書き:false/縦書き:true) 
471                domainMarker    = null;                 // 横軸のマーカーライン
472                useDomainLabel  = true;                 // 横軸ラベルの表示有無
473                useMarkerLabel  = true;                 // マーカーライン時の文字有無
474                useCache                = false;                // キャッシュするかどうか
475                seriesPikup             = -1;                   // ピックアップするシリーズ番号
476                masterKey               = "imgTag";             // キャッシュ用マスタキー                  // 6.3.5.1 (2015/08/16) 初期値指定
477                cacheTime               = HybsSystem.sysInt( "CHART_CACHE_TIME" );                      // 6.0.2.0 (2014/09/19) キャッシュ時の制限時間を、秒で指定
478                chrtMap                 = null;                 // キャッシュ用マップ                            // 6.4.3.1 (2016/02/12) 変数名も変えておきます。
479                imgTag                  = null;                 // キャッシュ用イメージタグ
480                imageMapUrl             = null;                 // クリッカブル・マップ
481                imageMapTarget  = null;                 // クリッカブル・マップ用TARGET
482                categoryMargin  = null;                 // 4.0.2.0 (2007/12/20) カテゴリマージン(0.0~1.0)
483                lowerMargin             = null;                 // 4.0.2.0 (2007/12/20) 下方マージン(0.0~1.0)
484                upperMargin             = null;                 // 4.0.2.0 (2007/12/20) 上方マージン(0.0~1.0)
485                useDomainLine   = false;                // 4.0.3.0 (2008/01/07) 横軸のグリッド表示有無(垂直線)
486                domainLineColor = null;                 // 4.0.3.0 (2008/01/07) 横軸のグリッド線の色
487                useRangeLine    = true;                 // 4.0.3.0 (2008/01/07) 縦軸のグリッド表示有無(水平線)
488                rangeLineColor  = null;                 // 4.0.3.0 (2008/01/07) 縦軸のグリッド線の色
489                categorySkip    = 1;                    // 4.0.3.0 (2008/01/07) 横軸ラベルをスキップする間隔
490                categoryCutNo   = -1;                   // 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のカット文字数
491                categoryAnchor  = null;                 // 4.1.1.0 (2008/02/14) 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END)
492                rangeSkip               = -1;                   // 4.1.1.0 (2008/02/04) 縦軸のグリッドをスキップする間隔(初期値:-1)
493                dateAxisFormat  = "MM/dd";              // 5.6.1.0 (2013/02/01) Time,XYTime Polt関係の時間軸を表す場合のフォーマット
494                dateSegSize             = 0;                    // 6.7.3.0 (2017/01/27) SegmentedTimelineのsegment size を、分単位で指定します。
495                dateSegIncluded = 0;                    // 6.7.3.0 (2017/01/27) SegmentedTimelineのincluded segments(スペース)を数値で指定します。
496                dateSegExcluded = 0;                    // 6.7.3.0 (2017/01/27) SegmentedTimelineのexcluded segments(EE)を数値で指定します。
497                dateStartTime   = null;                 // 6.7.3.0 (2017/01/27) SegmentedTimelineのStartTime(segment groupの開始位置) を、yyyyMMddHHmmss形式で指定します。 
498                chartFile               = null;                 // 6.3.5.0 (2015/08/08) チャートの画像ファイル名
499                useTimeView             = HybsSystem.sysBool( "VIEW_USE_TIMEBAR" );     // 6.3.6.0 (2015/08/16)
500                stopZero                = false;                // 6.9.7.0 (2018/05/14)
501                notfoundMsg             = "MSG0077";    // 6.9.7.0 (2018/05/14) 対象データはありませんでした。
502        }
503
504        /**
505         * チャートを表示するためのタグを作成します。
506         *
507         * @param       filename        画像ファイル
508         * @param       keyword         クリッカブル・マップの対応づける為のキーワード
509         *
510         * @return      タグ文字列
511         * @og.rtnNotNull
512         */
513        private String makeTag2( final String filename,final String keyword ) {
514                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE )
515                        .append( "<img" );
516
517                if( keyword != null ) {
518                        rtn.append( " usemap=\"#").append( keyword ).append( '"');              // 6.0.2.5 (2014/10/31) char を append する。
519                }
520                rtn.append( " width=\""  ).append( width  )
521                        .append( "px\" height=\"" ).append( height  )
522                        .append( "px\" src=\""    ).append( filename )
523                        .append( "\" /> ");
524
525                return rtn.toString();
526        }
527
528        /**
529         * ChartCreate のオブジェクトを生成します。
530         *
531         * @og.rev 4.1.1.0 (2008/02/04) categoryCutNo , categoryAnchor 属性を追加
532         * @og.rev 5.6.1.0 (2013/02/01) dateAxisFormat 属性を追加
533         * @og.rev 5.6.1.0 (2013/02/01) useVerticalLabels 属性を追加
534         * @og.rev 6.7.3.0 (2017/01/27) 日付軸(dateAxis)の指定で、dateSegSize,dateSegIncluded,dateSegExcluded,dateStartTime を追加します。
535         *
536         * @return  ChartCreateオブジェクト
537         * @og.rtnNotNull
538         */
539        private ChartCreate create() {
540                final ChartCreate tempCreate = new ChartCreate();
541
542                tempCreate.setTitle( title );
543                tempCreate.setDomainLabel( domainLabel );
544                tempCreate.setShowLegend( showLegend );
545                tempCreate.setRectangleEdge( rectangleEdge );
546                tempCreate.setPlotOrientation( plotOrientation );
547                tempCreate.setChartBackColor( chartBackColor );                 // 背景色の設定
548                tempCreate.setPlotBackColor( plotBackColor );                   // 描画領域の設定
549                tempCreate.setRotationLabel( rotationLabel );                   // 横軸ラベルの傾き
550                tempCreate.setUseVerticalLabels( useVerticalLabels );   // 5.6.4.3 (2013/05/24)) ラベルの表示向き
551                tempCreate.setDomainMarker( domainMarker );                             // ドメインマーカー
552                tempCreate.setUseDomainLabel( useDomainLabel );                 // 横軸ラベルの表示有無
553                tempCreate.setUseMarkerLabel( useMarkerLabel );                 // マーカーの設定値表示
554                tempCreate.setSeriesPikup( seriesPikup );                               // ピックアップするシリーズ番号
555                tempCreate.setImageMapUrl( imageMapUrl );                               // クリッカブル・マップ用URL
556                tempCreate.setCategoryMargin( categoryMargin );                 // 4.0.2.0 (2007/12/20) カテゴリマージン(0.0~1.0)
557                tempCreate.setLowerMargin( lowerMargin );                               // 4.0.2.0 (2007/12/20) 下方マージン(0.0~1.0)
558                tempCreate.setUpperMargin( upperMargin );                               // 4.0.2.0 (2007/12/20) 上方マージン(0.0~1.0)
559                tempCreate.setUseDomainLine( useDomainLine );                   // 4.0.3.0 (2008/01/07) 横軸のグリッド表示有無(垂直線)
560                tempCreate.setDomainLineColor( domainLineColor );               // 4.0.3.0 (2008/01/07) 横軸のグリッド線の色
561                tempCreate.setUseRangeLine( useRangeLine );                             // 4.0.3.0 (2008/01/07) 縦軸のグリッド表示有無(水平線)
562                tempCreate.setRangeLineColor( rangeLineColor );                 // 4.0.3.0 (2008/01/07) 縦軸のグリッド線の色
563                tempCreate.setCategorySkip( categorySkip );                             // 4.0.3.0 (2008/01/07) 横軸ラベルをスキップする間隔
564                tempCreate.setCategoryCutNo( categoryCutNo );                   // 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のカット文字数
565                tempCreate.setCategoryAnchor( categoryAnchor );                 // 4.1.1.0 (2008/02/04) 横軸のグリッド(垂直線)の書き出し位置
566                tempCreate.setRangeSkip( rangeSkip );                                   // 4.1.1.0 (2008/02/04) 縦軸のグリッド線(水平線)をスキップする間隔
567                tempCreate.setUseToolTip( useToolTip );                                 // 4.3.1.0 (2008/08/09) ツールチップスの利用
568                tempCreate.setDateAxisFormat( dateAxisFormat );                 // 5.6.1.0 (2013/02/01) Time,XYTime Polt関係の時間軸を表す場合のフォーマット指定
569                tempCreate.setSegmentedTimelineInfo( dateSegSize,dateSegIncluded,dateSegExcluded,dateStartTime );       // 6.7.3.0 (2017/01/27) SegmentedTimeline 関係
570
571                if( isDebug() ) { tempCreate.setDebug( true );  }               // 4.0.2.0 (2007/12/20)
572
573                tempCreate.setDatasetList( chartDataset );
574
575                return tempCreate ;
576        }
577
578        /**
579         * テンポラリFile を取得します。
580         *
581         * ここでは、一般的なファイル出力を考慮した テンポラリFile を作成します。
582         *
583         * ※ 6.3.5.0 (2015/08/08) で、chartFile属性を指定する事で、任意のファイルで
584         * 画像を作成できるようになりました。ただし、出力先フォルダは、CHART_TEMP_DIR
585         * です。
586         *      (CHART_TEMP_DIR[={@og.value SystemData#CHART_TEMP_DIR}])。
587         *
588         * @og.rev 6.3.5.0 (2015/08/08) チャートの画像ファイル名指定に対応。
589         *
590         * @param       fileURL ファイルを作成するディレクトリ
591         *
592         * @return      テンポラリFile
593         * @og.rtnNotNull
594         */
595        private File getTempFile( final String fileURL ) {
596
597                final String directory = HybsSystem.url2dir( fileURL );
598                final File dir = new File( directory );
599                if( ! dir.exists() && ! dir.mkdirs() ) {
600                        final String errMsg = "ディレクトリの作成に失敗しました。[" + directory + "]";
601                        throw new HybsSystemException( errMsg );
602                }
603
604                final File file ;
605                try {
606                        // 6.3.5.0 (2015/08/08) チャートの画像ファイル名指定に対応。
607                        // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
608                        if( chartFile == null ) {
609                                file = File.createTempFile( "JFree",".png",dir );
610                                file.deleteOnExit();
611                        }
612                        else {
613                                file = new File( dir , chartFile );
614                        }
615
616                }
617                catch( final IOException ex ) {
618                        final String errMsg = "ファイル名がオープン出来ませんでした。"
619                                + CR
620                                        + "Url:" + fileURL ;
621                        throw new HybsSystemException( errMsg,ex );
622                }
623
624                return file ;
625        }
626
627        /**
628         * 【TAG】チャートのタイトルをセットします。
629         *
630         * @og.tag チャートのタイトルをセットします。
631         *
632         * @param   ttl タイトル
633         */
634        public void setTitle( final String ttl ) {
635                title = nval( getRequestParameter( ttl ),title );
636        }
637
638        /**
639         * 【TAG】チャートの横幅をセットします(初期値:200)。
640         *
641         * @og.tag
642         * タイトルや凡例も含んだ大きさです。データ領域は自動計算されます。
643         *
644         * @og.rev 4.0.1.0 (2007/12/13) 引数に "px" を使用できるようにする。
645         *
646         * @param   wd 横幅
647         */
648        public void setWidth( final String wd ) {
649                // 引数に、"px" が使用されていた場合は、それを取り除く。
650                if( wd != null && wd.length() >= 3 && wd.endsWith( "px" ) ) {
651                        width = Integer.parseInt( wd.substring( 0,wd.length()-2 ) );            // 6.0.2.4 (2014/10/17) メソッド間違い
652                }
653                else {
654                        width = nval( getRequestParameter( wd ),width );
655                }
656        }
657
658        /**
659         * 【TAG】チャートの縦幅をセットします(初期値:200)。
660         *
661         * @og.tag
662         * タイトルや凡例も含んだ大きさです。データ領域は自動計算されます。
663         *
664         * @og.rev 4.0.1.0 (2007/12/13) 引数に "px" を使用できるようにする。
665         *
666         * @param   ht 縦幅
667         */
668        public void setHeight( final String ht ) {
669                // 引数に、"px" が使用されていた場合は、それを取り除く。
670                if( ht != null && ht.length() >= 3 && ht.endsWith( "px" ) ) {
671                        height = Integer.parseInt( ht.substring( 0,ht.length()-2 ) );           // 6.0.2.4 (2014/10/17) メソッド間違い
672                }
673                else {
674                        height = nval( getRequestParameter( ht ),height );
675                }
676        }
677
678        /**
679         * 【TAG】チャートのドメインラベルを指定します。
680         *
681         * @og.tag
682         * チャートのドメインラベルを指定します。
683         *
684         * @param   dmLbl ドメインラベル
685         */
686        public void setDomainLabel( final String dmLbl ) {
687                domainLabel = nval( getRequestParameter( dmLbl ),domainLabel );
688        }
689
690        /**
691         * 【TAG】チャートの凡例の表示可否[true/false]をセットします(初期値:true[表示する])。
692         *
693         * @og.tag
694         * 初期値は、表示する(true) です。
695         *
696         * @param   swLegend 凡例の表示可否 [true:表示する/それ以外:しない]
697         */
698        public void setShowLegend( final String swLegend ) {
699                showLegend = nval( getRequestParameter( swLegend ),showLegend );
700        }
701
702        /**
703         * 【TAG】チャートの表示箇所を、[TOP/BOTTOM/RIGHT/LEFT]で指定します(初期値:BOTTOM)。
704         *
705         * @og.tag
706         * 表示箇所は、org.jfree.ui.RectangleEdge クラスの設定値を使用します。
707         * 指定できるのは、TOP、BOTTOM、RIGHT、LEFT で、各文字の頭一文字で
708         * 判定してます。つまり、T,B,R,L で、判定を行い、それ以外はエラーになります。
709         * 初期値は、BOTTOM です。
710         *
711         * @param   rectEdge 凡例表示方向 [TOP/BOTTOM/RIGHT/LEFT]
712         */
713        public void setRectangleEdge( final String rectEdge ) {
714                rectangleEdge = nval( getRequestParameter( rectEdge ),rectangleEdge );
715        }
716
717        /**
718         * 【TAG】チャートのプロット(Plot)表示方向を、[VERTICAL(or V)/HORIZONTAL(or H)]で指定します(初期値:VERTICAL)。
719         *
720         * @og.tag
721         * 軸表示方向は、org.jfree.chart.plot.PlotOrientation クラスの設定値を使用します。
722         * 指定できるのは、VERTICAL、HORIZONTALで、各文字の頭一文字で
723         * 判定してます。つまり、V,H で、判定を行い、それ以外はエラーになります。
724         * 初期値は、VERTICAL です。
725         *
726         * @param   orientation 表示方向 [VERTICAL(or V)/HORIZONTAL(or H)]
727         */
728        public void setPlotOrientation( final String orientation ) {
729                plotOrientation = nval( getRequestParameter( orientation ),plotOrientation );
730        }
731
732        /**
733         * 【TAG】チャートの背景色を指定します。
734         *
735         * @og.tag
736         * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。
737         * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
738         * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。
739         * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。
740         *
741         * @param   chBackClr 背景色
742         * @see         java.awt.Color#BLACK
743         */
744        public void setChartBackColor( final String chBackClr ) {
745                chartBackColor = nval( getRequestParameter( chBackClr ),chartBackColor );
746        }
747
748        /**
749         * 【TAG】チャートの描画領域の色を指定します。
750         *
751         * @og.tag
752         * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。
753         * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
754         * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。
755         * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。
756         *
757         * @param   plBackClr 描画領域色
758         * @see         java.awt.Color#BLACK
759         */
760        public void setPlotBackColor( final String plBackClr ) {
761                plotBackColor = nval( getRequestParameter( plBackClr ),plotBackColor );
762        }
763
764        /**
765         * 【TAG】チャートのカテゴリーラベルの方向を指定します(初期値は、3:60度)。
766         *
767         * @og.tag
768         * 方向は、上方向に対して、(PI / 指示数) で求まる値に設定します。
769         * この指示数に相当する値を設定します。
770         * 1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・
771         * マイナスは、下方向に回転させます。
772         * 0 を指定した場合は、何も設定しません。
773         * 初期値は、3:60度です。
774         *
775         * @param       rttLabel        ラベルの方向 (例:1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・)
776         */
777        public void setRotationLabel( final String rttLabel ) {
778                rotationLabel = nval( getRequestParameter( rttLabel ),rotationLabel );
779        }
780
781        /**
782         * 【TAG】ラベルの表示向きを縦にするかどうか[false/true]を指定します(初期値:false[横書き])。
783         *
784         * @og.tag
785         * ChartCreate の rotationLabel は、角度を指定できましたが、NumberAxis,DateAxis では、
786         * 縦にするかどうかの指定しかできません。
787         * ここでは、true を指定するとラベルは、縦書きになります。
788         * 初期値は、false(横書き)です。
789         *
790         * @og.rev 5.6.4.3 (2013/05/24)) 新規追加
791         *
792         * @param       useVLavels      ラベルの表示向き [false:横書き/true:縦書き]
793         */
794        public void setUseVerticalLabels( final String useVLavels ) {
795                useVerticalLabels = nval( getRequestParameter( useVLavels ),useVerticalLabels );
796        }
797
798        /**
799         * 【TAG】チャートの横軸の値(ドメイン)に合致する位置にマーカーラインを設定します。
800         *
801         * @og.tag
802         * この属性には、マーカーラインを設定する値を記述します。
803         *
804         * @param   marker 横軸マーカーライン
805         */
806        public void setDomainMarker( final String marker ) {
807                domainMarker = nval( getRequestParameter( marker ),domainMarker );
808        }
809
810        /**
811         * 【TAG】横軸ラベルのラベルを表示するかどうか[true/false]を指定します(初期値:true)。
812         *
813         * @og.tag
814         * ドメイン(横軸)が、多数存在する場合、ドメインラベルが見えにくくなります。
815         * そのようなケースで、横軸のラベルそのものを表示しない場合に、false を
816         * 設定します。
817         * 初期値は、表示する(true)です。
818         *
819         * @param   flag 横軸ラベルの表示有無 [true:表示する/false:表示しない]
820         */
821        public void setUseDomainLabel( final String flag ) {
822                useDomainLabel = nval( getRequestParameter( flag ),useDomainLabel );
823        }
824
825        /**
826         * 【TAG】マーカーラインに、その設定値を表示するかどうか[true/false]を指定します(初期値:true)。
827         *
828         * @og.tag
829         * ドメイン(横軸)が、多数存在する場合、ドメインラベルが見えない場合があります。
830         * そのようなケースで、見たい値にマーカーラインを設定し、その横に、ドメインラベル
831         * を表示する事で、ピックアップしている軸の値を容易に知ることが可能です。
832         * 初期値は、表示する(true)です。
833         *
834         * @param   flag 設定値表示 [true:する/false:しない]
835         */
836        public void setUseMarkerLabel( final String flag ) {
837                useMarkerLabel = nval( getRequestParameter( flag ),useMarkerLabel );
838        }
839
840        /**
841         * 【TAG】JFreeChartで作成されたイメージタグをキャッシュするかどうか[true/false]を指定します(初期値:false)。
842         *
843         * @og.tag
844         * useCache="true" を設定すると、session に、HybsSystem.JF_CHART_CACHE_KEY
845         * キーで、Mapが、キャッシュされます。そのMap に、画面ID + masterKey 単位にキャッシュされます。
846         * 6.0.2.0 (2014/09/19) 以降は、イメージタグのみキャッシュしますので、
847         * domainMarker 属性と、seriesPikup 属性を再設定する場合は、画像を再作成する
848         * 必要がありますので、masterKey を変更する必要があります。
849         * (または、seriesPikup 属性をmasterKeyに含めてください。)
850         *
851         * 初期値は、キャッシュしない(false)です。
852         *
853         * @param   flag キャッシュ可否 [true:する/false:しない]
854         * @see     #setDomainMarker( String )
855         * @see     #setSeriesPikup( String )
856         * @see         #setCacheTime( String )
857         */
858        public void setUseCache( final String flag ) {
859                useCache = nval( getRequestParameter( flag ),useCache );
860        }
861
862        /**
863         * 【TAG】キャッシュ時の制限時間を、秒で指定します
864         *              (初期値:CHART_CACHE_TIME[={@og.value SystemData#CHART_CACHE_TIME}])。
865         *
866         * @og.tag
867         * useCache="true" に設定した場合、キャッシュを使用します。
868         * この場合、cacheTime で指定した時間は、キャッシュが使用されます。
869         * 制限時間を超えたキャッシュは破棄され、新しいキャッシュにセットされます。
870         * 
871         * 初期値:システム定数のCHART_CACHE_TIME[={@og.value SystemData#CHART_CACHE_TIME}])。
872         *
873         * @og.rev 6.0.2.0 (2014/09/19) 新規追加
874         *
875         * @param       ccTime  キャッシュ時の制限時間(秒)
876         * @see         #setMasterKey( String )
877         * @see         #setUseCache( String )
878         */
879        public void setCacheTime( final String ccTime ) {
880                cacheTime = nval( getRequestParameter( ccTime ),cacheTime );
881        }
882
883        /**
884         * 【TAG】useCache="true" 時のキャッシュの保存先scopeを指定します(初期値:session)。
885         *
886         * @og.tag
887         * 通常のグラフのキャッシュは、ユーザー単位に行う(session)スコープに保管されます。
888         * 現状の JFreeChart でのグラフは、作成毎に、実イメージファイルを作成し、それを
889         * 返すため、ほとんど書き換えが無く、多くにユーザーがアクセスする様なケース・・例えば、
890         * トップメニューに月次損益のグラフを表示するなどの場合、無駄にファイルが作成されます。
891         * そこで、ユーザー間も共有する様なグラフには、cacheScope="application" とすることで、
892         * 全ユーザー共通のキャッシュにすることができます。
893         * 一応、スコープとしては、"request","page","session","application" が指定できます。
894         *
895         * @og.rev 6.3.5.1 (2015/08/16) キャッシュ処理のロジックを整理します。新規追加。
896     *
897         * @param  scp スコープ [request/page/session/application]
898         * @see         #getScope()
899         */
900        public void setCacheScope( final String scp ) {
901                setScope( scp );
902        }
903
904        /**
905         * 【TAG】キャッシュ用マスタキーを指定します(初期値:imgTag)。
906         *
907         * @og.tag
908         * useCache="true" に設定した場合、このキーを用いて、キャッシュします。
909         * 実際のキャッシュは、画面ID + masterKey になります。
910         *
911         * ※ 6.0.2.0 (2014/09/19) 以降は、イメージタグのみキャッシュしますので、
912         * 従来の様に、seriesPikup 違いに応じた処理は行いません。
913         * よって、useCache="true"  で、seriesPikup 違いの場合は、再検索させる
914         * 必要がありますので、masterKey を変更する必要があります。
915         * (または、seriesPikup 属性をmasterKeyに含めてください。)
916         * なお、キャッシュ保持時間は、#setCacheTime( String ) で指定できます。
917         *
918         * @og.rev 6.3.5.1 (2015/08/16) masterKey に、初期値指定。
919         *
920         * @param       mkey    キャッシュ用マスタキー
921         * @see         #setUseCache( String )
922         * @see         #setCacheTime( String )
923         */
924        public void setMasterKey( final String mkey ) {
925                masterKey = nval( getRequestParameter( mkey ),masterKey );
926        }
927
928        /**
929         * 【TAG】複数シリーズのピックアップを行う場合のシリーズ番号を指定します。
930         *
931         * @og.tag
932         * 複数シリーズ(検索時に複数項目を同時に検索する場合)では、チャート上に
933         * 複数のグラフが表示されますが、その中の一つをピックアップする場合に、
934         * シリーズ番号を指定します。
935         * シリーズ番号は、0 から始まる数字です。
936         * ここでは、ピックアップされたシリーズは、赤色で表示されます。
937         * それ以外は、グレー色での表示になります。
938         * seriesPikup を使用すると、chartDataset タグの useValueVisible 属性が
939         * 影響を受けます。この属性は、データの値(itemText)を表示しますが、
940         * seriesPikup が指定された場合は、そのシリーズのみにラベル表示します。
941         *
942         * @param       pikup   シリーズ番号
943         */
944        public void setSeriesPikup( final String pikup ) {
945                seriesPikup = nval( getRequestParameter( pikup ),seriesPikup );
946        }
947
948        /**
949         * 【TAG】クリッカブル・マップ用URLを指定します。
950         *
951         * @og.tag
952         * 画像に、クリッカブル・マップを作成する場合の、URL を指定します。
953         * これは、画像上にエリア指定でリンク引数を作成することが可能です。
954         * URL 自身は、? 付きで固定値の引数を連結することが可能です。
955         * クリックしたエリアのカテゴリやインデックスの値(引数)は、自動的に
956         * 設定されます。(指定しない場合はチャートによって異なります)
957         * <pre>
958         * ・Pie      :category、pieIndex
959         * ・XY       :series、item
960         * ・Category :series、category
961         * </pre>
962         * この引数の URL の名称を変更したい場合は、URL に続けて、カンマ(,) で、
963         * 名称を記述してください。
964         * 例:link.jsp,BLOCK
965         *
966         * @param       imap    クリッカブル・マップ用URL
967         * @see #setImageMapTarget( String )
968         */
969        public void setImageMapUrl( final String imap ) {
970                imageMapUrl = nval( getRequestParameter( imap ),imageMapUrl );
971        }
972
973        /**
974         * 【TAG】クリッカブル・マップ用TARGETを指定します。
975         *
976         * @og.tag
977         * 画像に、クリッカブル・マップを作成する場合の、TARGET を指定します。
978         * これは、画像上にエリア指定でリンクを作成する場合のフレーム指定です。
979         *
980         * @param       target  クリッカブル・マップ用TARGET
981         * @see #setImageMapUrl( String )
982         */
983        public void setImageMapTarget( final String target ) {
984                imageMapTarget = nval( getRequestParameter( target ),imageMapTarget );
985        }
986
987        /**
988         * 【TAG】カテゴリマージン(0.0~1.0)を指定します(初期値:null 自動調整)。
989         *
990         * @og.tag
991         * カテゴリ(グラフの横軸に相当)の表示間隔(マージン)の比率を指定します。
992         * この比率は、% ではなく、数字(double)での設定になります。
993         * 何も指定しない場合は、デフォルトで自動調整されます。
994         *
995         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
996         *
997         * @param       margin  カテゴリマージン(0.0~1.0)
998         */
999        public void setCategoryMargin( final String margin ) {
1000                categoryMargin = nval( getRequestParameter( margin ),categoryMargin );
1001        }
1002
1003        /**
1004         * 【TAG】下方マージン(0.0~1.0)を指定します(初期値:null 自動調整)。
1005         *
1006         * @og.tag
1007         * カテゴリ(グラフの横軸に相当)の下方側(左側)のマージンの比率を指定します。
1008         * この比率は、% ではなく、数字(double)での設定になります。
1009         * 何も指定しない場合は、デフォルトで自動調整されます。
1010         *
1011         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
1012         *
1013         * @param       margin  下方マージン(0.0~1.0)
1014         */
1015        public void setLowerMargin( final String margin ) {
1016                lowerMargin = nval( getRequestParameter( margin ),lowerMargin );
1017        }
1018
1019        /**
1020         * 【TAG】上方マージン(0.0~1.0)を指定します(初期値:null 自動調整)。
1021         *
1022         * @og.tag
1023         * カテゴリ(グラフの横軸に相当)の上方側(右側)のマージンの比率を指定します。
1024         * この比率は、% ではなく、数字(double)での設定になります。
1025         * 何も指定しない場合は、デフォルトで自動調整されます。
1026         *
1027         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
1028         *
1029         * @param       margin  上方マージン(0.0~1.0)
1030         */
1031        public void setUpperMargin( final String margin ) {
1032                upperMargin = nval( getRequestParameter( margin ),upperMargin );
1033        }
1034
1035        /**
1036         * 【TAG】横軸のグリッド表示有無(垂直線)を指定します(初期値:false)。
1037         *
1038         * @og.tag
1039         * ドメイン(横軸)に対する、グリッドライン(垂直線)を表示するかどうか指定します。
1040         *
1041         * 何も指定しない場合は、表示しません。(false)
1042         *
1043         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
1044         *
1045         * @param       useLine 横軸のグリッド表示有無 [true:する/false:しない]
1046         */
1047        public void setUseDomainLine( final String useLine ) {
1048                useDomainLine = nval( getRequestParameter( useLine ),useDomainLine );
1049        }
1050
1051        /**
1052         * 【TAG】横軸のグリッド線の色を指定します。
1053         *
1054         * @og.tag
1055         * ドメイン(横軸)に対する、グリッドラインの表示色を指定します。
1056         * 何も指定しない場合は、デフォルトで自動設定されます。
1057         *
1058         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
1059         *
1060         * @param       color   横軸のグリッド線の色
1061         */
1062        public void setDomainLineColor( final String color ) {
1063                domainLineColor = nval( getRequestParameter( color ),domainLineColor );
1064        }
1065
1066        /**
1067         * 【TAG】横軸ラベルをスキップする間隔を指定します(初期値:1 すべて表示)。
1068         *
1069         * @og.tag
1070         * 横軸ラベル(カテゴリラベル表示)する際に、スキップする間隔を指定します。
1071         * "1" (初期値)では、1つづつ表示(つまり、すべて表示する)します。
1072         * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。
1073         * 初期値は、"1" (すべて表示)です。
1074         * なお、先頭から表示を開始します。
1075         *
1076         * 注意:これとは別に、ラベル先頭に "_" を付けた場合は、ラベルを表示しません。
1077         * また、categoryCutNo が指定された場合は、categorySkip は使用されません。
1078         *
1079         * @param       step    スキップする間隔
1080         * @see         #setCategoryCutNo( String )
1081         */
1082        public void setCategorySkip( final String step ) {
1083                categorySkip = nval( getRequestParameter( step ),categorySkip );
1084        }
1085
1086        /**
1087         * 【TAG】横軸ラベルの文字位置指定のカット文字数を指定します(初期値:-1 すべて表示)。
1088         *
1089         * @og.tag
1090         * 横軸ラベル(カテゴリラベル表示)する際に、ラベルの先頭から、この指定文字数だけ
1091         * カットして、表示します。
1092         * その際、前回作成したカットラベルと、同一ラベルの場合は、表示しません。
1093         * 例えば、データは、年月日で、年と月のみ(先頭6文字)を指定すると、
1094         * 日のデータは、ラベルが表示されません。
1095         * 指定される数字は、1以上の整数としてください。
1096         * 初期値は、すべて表示です。
1097         *
1098         * 注意:これとは別に、ラベル先頭に "_" を付けた場合は、ラベルを表示しません。
1099         *
1100         * @og.rev 4.1.1.0 (2008/02/04) 新規追加
1101         *
1102         * @param       cutNo   カット文字数位置
1103         * @see         #setCategorySkip( String )
1104         */
1105        public void setCategoryCutNo( final String cutNo ) {
1106                categoryCutNo = nval( getRequestParameter( cutNo ),categoryCutNo );
1107        }
1108
1109        /**
1110         * 【TAG】横軸のグリッド(垂直線)の書き出し位置[START/MIDDLE/END]を指定します(初期値:null)。
1111         *
1112         * @og.tag
1113         * 横軸のグリッド(垂直線)を、グラフのどの位置に記述するかを指定します。
1114         * 具体的な値は、CategoryAnchor オブジェクトの値になります。
1115         * ここでは、文字列で(START,MIDDLE,END)を指定します。(先頭一文字で判定)
1116         * 何も指定しない場合は、デフォルト(MIDDLE)です。
1117         *
1118         * @og.rev 4.1.1.0 (2008/02/14) 新規追加
1119         *
1120         * @param       anchor  書き出し位置 [START/MIDDLE/END]
1121         */
1122        public void setCategoryAnchor( final String anchor ) {
1123                categoryAnchor = nval( getRequestParameter( anchor ),categoryAnchor );
1124
1125                // 6.9.7.0 (2018/05/14) PMD These nested if statements could be combined
1126//              if( categoryAnchor != null && categoryAnchor.length() > 0 ) {
1127//                      if( ! "START".equals( categoryAnchor )  &&
1128                if( categoryAnchor != null && categoryAnchor.length() > 0 &&
1129                                ! "START".equals( categoryAnchor )  &&
1130                                ! "MIDDLE".equals( categoryAnchor ) &&
1131                                ! "END".equals( categoryAnchor ) ) {
1132                                        final String errMsg = "指定のAnchorは適用できません。[" + anchor + "]"
1133                                                        + CR
1134                                                        + "START,MIDDLE,END の中から、指定してください。" ;
1135                                        throw new HybsSystemException( errMsg );
1136//                      }
1137                }
1138        }
1139
1140        /**
1141         * 【TAG】縦軸のグリッド表示有無(水平線)を指定します(初期値:true)。
1142         *
1143         * @og.tag
1144         * レンジ(縦軸)に対する、グリッドライン(垂直線)を表示するかどうか指定します。
1145         *
1146         * 何も指定しない場合は、表示しません。(false)
1147         *
1148         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
1149         *
1150         * @param       useLine グリッド表示有無 [true:する/false:しない]
1151         */
1152        public void setUseRangeLine( final String useLine ) {
1153                useRangeLine = nval( getRequestParameter( useLine ),useRangeLine );
1154        }
1155
1156        /**
1157         * 【TAG】縦軸のグリッド線(水平線)の色を指定します(初期値:null 自動設定)。
1158         *
1159         * @og.tag
1160         * レンジ(縦軸)に対する、グリッドラインの表示色を指定します。
1161         * 何も指定しない場合は、デフォルトで自動設定されます。
1162         *
1163         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
1164         *
1165         * @param       color   縦軸のグリッド線(水平線)の色
1166         */
1167        public void setRangeLineColor( final String color ) {
1168                rangeLineColor = nval( getRequestParameter( color ),rangeLineColor );
1169        }
1170
1171        /**
1172         * 【TAG】縦軸のグリッド線(水平線)をスキップする間隔を指定します(初期値:-1)。
1173         *
1174         * @og.tag
1175         * 縦軸のグリッド線(水平線)を表示する際に、スキップする間隔を指定します。
1176         * 通常は、ラベルと同じだけのグリッド線が掛かれますが、ラベルよりも
1177         * 少ない数のグリッド線(例えば、2つおき)を出す場合に、値を設定します。
1178         * "1" (初期値)では、1つづつ表示(つまり、すべて表示する)します。
1179         * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。
1180         * なお、先頭から表示を開始します。
1181         *
1182         * 6.0.2.0 (2014/09/19) 前回の JFreeChart のVerUpで、グリッド線の表示が
1183         * 5個おきに変わったようです。設定する値を マイナスにすると、初期設定の値を
1184         * 使用するように変更します。微調整は、個々にお願いします。
1185         *
1186         * 初期値は、"-1" (設定しない)です。
1187         *
1188         * @og.rev 4.1.1.0 (2008/02/04) 新規追加
1189         * @og.rev 6.0.2.0 (2014/09/19) rangeSkip 属性 の初期値を、-1(設定なし)に変更
1190         *
1191         * @param       rngSkip 縦軸のグリッド線(水平線)をスキップする間隔
1192         */
1193        public void setRangeSkip( final String rngSkip ) {
1194                rangeSkip = nval( getRequestParameter( rngSkip ),rangeSkip );
1195        }
1196
1197        /**
1198         * 【TAG】ツールチップスの使用可否[true:利用する/false:利用しない]を指定します(初期値:false)。
1199         *
1200         * @og.tag
1201         * ラベルを利用する際に、ラベルと図面、隣のラベル同士が重なることがあります。
1202         * この場合、ツールチップスの利用をお勧めします。
1203         * 初期値は'false'です。
1204         *
1205         * @og.rev 4.3.1.0 (2008/08/09) 新規追加
1206         *
1207         * @param   toolTip ツールチップス [true:利用/false:利用しない]
1208         */
1209        public void setUseToolTip( final String toolTip ) {
1210                useToolTip = nval( getRequestParameter( toolTip ), useToolTip );
1211        }
1212
1213        /**
1214         * 【TAG】Time,XYTime Polt関係の時間軸を表す場合のフォーマットを指定します(初期値:MM/dd)。
1215         *
1216         * @og.tag
1217         * TimeSeries 関連のデータを扱う場合の横軸の日付フォーマットを指定します。
1218         * 日付フォーマットは、java.text.SimpleDateFormat で使われる yyyy/MM/dd HH:mm:ss 表記です。
1219         * 
1220         * 初期値は、"MM/dd" です。
1221         *
1222         * @og.rev 5.6.1.0 (2013/02/01) 新規追加
1223         *
1224         * @param       dtFormat        時間軸を表すフォーマット
1225         */
1226        public void setDateAxisFormat( final String dtFormat ) {
1227                dateAxisFormat = nval( getRequestParameter( dtFormat ), dateAxisFormat );
1228        }
1229
1230        /**
1231         * 【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのsegment size を、分単位で指定します。
1232         *
1233         * @og.tag
1234         * 日単位を指定する場合は、24*60 = 1440 を指定します。
1235         * 0 または、何も指定しない場合は、SegmentedTimeline を使用しません。
1236         * <pre>
1237         *   start time
1238         *     |
1239         *     v
1240         *     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 ...
1241         *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+...
1242         *   |  |  |  |  |  |EE|EE|  |  |  |  |  |EE|EE|  |  |  |  |  |EE|EE|
1243         *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+...
1244         *   [_____________] [___]            [_]
1245         *          |          |               |
1246         *       included   excluded        segment
1247         *       segments   segments         size
1248         *   [___________________]
1249         *              |
1250         *         segment group
1251         * </pre>
1252         *
1253         * @og.rev 6.7.3.0 (2017/01/27) 新規追加
1254         *
1255         * @param       segSize SegmentedTimelineのsegment size を、分単位で指定
1256         */
1257        public void setDateSegSize( final String segSize ) {
1258                dateSegSize = nval( getRequestParameter( segSize ), dateSegSize );
1259        }
1260
1261        /**
1262         * 【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのincluded segments(スペース)を数値で指定します。
1263         *
1264         * @og.tag
1265         * segment group内で、スペース(空ける) になる segment数 を指定します。
1266         * この値は、dateSegSize を指定しない限り、使用されません。
1267         *
1268         * @og.rev 6.7.3.0 (2017/01/27) 新規追加
1269         *
1270         * @param       segIncluded     SegmentedTimelineのincluded segments(スペース)を数値で指定
1271         * @see         #setDateSegSize( String )
1272         */
1273        public void setDateSegIncluded( final String segIncluded ) {
1274                dateSegIncluded = nval( getRequestParameter( segIncluded ), dateSegIncluded );
1275        }
1276
1277        /**
1278         * 【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのexcluded segments(EE)を数値で指定します。
1279         *
1280         * @og.tag
1281         * segment group内で、excluded する segment数 を指定します。
1282         * この値は、dateSegSize を指定しない限り、使用されません。
1283         *
1284         * @og.rev 6.7.3.0 (2017/01/27) 新規追加
1285         *
1286         * @param       segExcluded     SegmentedTimelineのexcluded segments(EE)を数値で指定
1287         * @see         #setDateSegSize( String )
1288         */
1289        public void setDateSegExcluded( final String segExcluded ) {
1290                dateSegExcluded = nval( getRequestParameter( segExcluded ), dateSegExcluded );
1291        }
1292
1293        /**
1294         * 【TAG】Time,XYTime Polt関係の時間軸で、SegmentedTimelineのStartTime(segment groupの開始位置) を、yyyyMMddHHmmss形式で指定します。
1295         *
1296         * @og.tag
1297         * TimeSeries 関連のデータを扱う場合の横軸に、SegmentedTimelineを指定します。
1298         * 日付フォーマットは、yyyyMMddHHmmss形式で指定します。
1299         * 
1300         * この値は、dateSegSize を指定しない限り、使用されません。
1301         * 初期値は、null(自動設定) です。
1302         *
1303         * @og.rev 6.7.3.0 (2017/01/27) 新規追加
1304         *
1305         * @param       startTime       SegmentedTimelineのStartTime(segment groupの開始位置)
1306         * @see         #setDateSegSize( String )
1307         */
1308        public void setDateStartTime( final String startTime ) {
1309                dateStartTime = nval( getRequestParameter( startTime ), dateStartTime );
1310        }
1311
1312        /**
1313         * 【TAG】チャートの画像ファイル名を指定します(初期値:自動)。
1314         *
1315         * @og.tag
1316         * チャートは、png 形式のファイルとして作成されます。そのファイル名を指定します。
1317         * ファイルは、CHART_TEMP_DIR 以下に、作成されます。
1318         * 原仕様では、作成するフォルダを指定できません。
1319         * 何も指定しない場合は、JFreeXXXXX.png 形式のテンポラリファイル名で作成されます。
1320         * この場合は、File#deleteOnExit() を付与するので、Tomcat停止時に自動的に削除されます。
1321         * chartFile 属性で指定した場合は、自動削除されませんので、ご注意ください。
1322         * 
1323         * 初期値は、自動( File.createTempFile( "JFree",".png" , CHART_TEMP_DIR ) ) です。
1324         *      (CHART_TEMP_DIR[={@og.value SystemData#CHART_TEMP_DIR}])。
1325         *
1326         * @og.rev 6.3.5.0 (2015/08/08) チャートの画像ファイル名指定に対応。
1327         *
1328         * @param       file    時間軸を表すフォーマット
1329         */
1330        public void setChartFile( final String file ) {
1331                chartFile = nval( getRequestParameter( file ), chartFile );
1332        }
1333
1334        /**
1335         * 【TAG】処理時間を表示する TimeView を表示するかどうか[true:する/false:しない]を指定します
1336         *              (初期値:VIEW_USE_TIMEBAR[={@og.value SystemData#VIEW_USE_TIMEBAR}])。
1337         *
1338         * @og.tag
1339         * true に設定すると、処理時間を表示するバーイメージが表示されます。
1340         * これは、DB検索、APサーバー処理、画面表示の各処理時間をバーイメージで
1341         * 表示させる機能です。処理時間の目安になります。
1342         * (初期値:VIEW_USE_TIMEBAR[={@og.value SystemData#VIEW_USE_TIMEBAR}])。
1343         *
1344         * @og.rev 6.3.6.0 (2015/08/16) useTimeView の初期値を、VIEW_USE_TIMEBAR にする。
1345         *
1346         * @param       flag    処理時間を表示 [true:する/false:しない]
1347         */
1348        public void setUseTimeView( final String flag ) {
1349                useTimeView = nval( getRequestParameter( flag ),useTimeView );
1350        }
1351
1352        /**
1353         * 【TAG】検索結果が0件のとき処理を停止するかどうか[true/false]を指定します(初期値:false[続行する])。
1354         *
1355         * @og.tag
1356         * ChartDatasetTag のデータが、0件の場合、すぐに、処理を中断します。
1357         * この場合は、上位の
1358         * その際、検索結果が、0件のとき処理を停止するかどうかを決定します。
1359         * useTableData="true" の場合は、 query タグで、stopZero 属性を、設定してください。
1360         * 初期値は、false(続行する)です。
1361         *
1362         * @og.rev 6.9.7.0 (2018/05/14) stopZero,notfoundMsg 属性追加
1363         *
1364         * @param  cmd 0件時停止可否 [true:処理を中止する/false:続行する]
1365         */
1366        public void setStopZero( final String cmd ) {
1367                stopZero = nval( getRequestParameter( cmd ),stopZero );
1368        }
1369
1370        /**
1371         * 【TAG】検索結果がゼロ件の場合に表示するメッセージリソースIDを指定します(初期値:MSG0077[対象データはありませんでした])。
1372         *
1373         * @og.tag
1374         * ここでは、検索結果がゼロ件の場合のみ、特別なメッセージを表示させます。
1375         * 従来は、displayMsg と兼用で、『0 件検索しました』という表示でしたが、
1376         * displayMsg の初期表示は、OFF になりましたので、ゼロ件の場合のみ別に表示させます。
1377         * 表示させたくない場合は, notfoundMsg = "" をセットしてください。
1378         * 初期値は、MSG0077[対象データはありませんでした]です。
1379         *
1380         * @og.rev 6.9.7.0 (2018/05/14) stopZero,notfoundMsg 属性追加
1381         *
1382         * @param       id ゼロ件メッセージID
1383         */
1384        public void setNotfoundMsg( final String id ) {
1385                final String ids = getRequestParameter( id );
1386                if( ids != null ) { notfoundMsg = ids; }
1387        }
1388
1389        /**
1390         * BODY要素に記述した、chartDataset タグの属性設定クラスをListに追加します。
1391         *
1392         * BODY部に記述された、chartDataset タグの属性は、チャートのデータ取得Queryや、
1393         * チャートの種類などの情報を管理しています。
1394         * チャートの種類(Category系)によっては、チャートを合成して表示させることが可能です。
1395         * それらの複数のチャートの指定が、chartDataset タグ で行われます。
1396         *
1397         * ※ 6.9.7.0 (2018/05/14) chDataset が、null や、件数が0件の場合は、List に追加しません。
1398         *
1399         * @og.rev 6.9.7.0 (2018/05/14) stopZero,notfoundMsg 属性追加
1400         *
1401         * @param       chDataset       chartDatasetタグの属性設定クラス
1402         */
1403        protected void addChartDataset( final ChartDataset chDataset ) {
1404                if( chartDataset == null ) { chartDataset = new ArrayList<>(); }
1405
1406                if( chDataset != null && chDataset.getRowCount() > 0 ) {                // 6.9.7.0 (2018/05/14)
1407                        chartDataset.add( chDataset );
1408                }
1409        }
1410
1411        /**
1412         * このオブジェクトの文字列表現を返します。
1413         * 基本的にデバッグ目的に使用します。
1414         *
1415         * @return このクラスの文字列表現
1416         * @og.rtnNotNull
1417         */
1418        @Override
1419        public String toString() {
1420
1421                // 6.0.2.5 (2014/10/31) char を append する。
1422                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE )
1423                        .append( '[' ).append( this.getClass().getName() ).append( ']' ).append( CR )
1424                        .append( "title           [" ).append( title           ).append( ']' ).append( CR )
1425                        .append( "width           [" ).append( width           ).append( ']' ).append( CR )
1426                        .append( "height          [" ).append( height          ).append( ']' ).append( CR )
1427                        .append( "domainLabel     [" ).append( domainLabel     ).append( ']' ).append( CR )
1428                        .append( "showLegend      [" ).append( showLegend      ).append( ']' ).append( CR )
1429                        .append( "rectangleEdge   [" ).append( rectangleEdge   ).append( ']' ).append( CR )
1430                        .append( "plotOrientation [" ).append( plotOrientation ).append( ']' ).append( CR )
1431                        .append( "chartBackColor  [" ).append( chartBackColor  ).append( ']' ).append( CR )
1432                        .append( "plotBackColor   [" ).append( plotBackColor   ).append( ']' ).append( CR );
1433
1434                return rtn.toString();
1435        }
1436
1437        /**
1438         * 6.0.2.0 (2014/09/19) キャッシュ時間の外部設定、キャッシュ対象の変更
1439         * 
1440         * イメージタグをキャッシュするクラスです。
1441         * キャッシュの保持時間は、コンストラクタで指定します。
1442         * 従来は、JFreeChart と、画像ファイルのキャッシュを行っていましたが
1443         * JFreeChart オブジェクトをキャッシュするメリットがあまりない為、
1444         * イメージタグのキャッシュのみに変更しました。
1445         * キャッシュの有効期間の初期値は、システムリソースの CHART_CACHE_TIME で定義します。
1446         *
1447         * @og.rev 6.0.2.0 (2014/09/19) キャッシュは、イメージタグのみ
1448         * @og.rev 6.3.5.1 (2015/08/16) キャッシュ処理のロジックを整理します。
1449         */
1450        private static final class ChartCache {
1451
1452                // 6.0.2.0 (2014/09/19) イメージタグのみのキャッシュなので、seriesPikup は関係なくなった。
1453                private final   String          imgTag  ;               // キャッシュのキーをタグそのものに変更
1454                private final   long            createLimitTime ;
1455
1456                /**
1457                 * コンストラクター
1458                 * JFreeChartで作成sれたイメージタグをキャッシュするキーを指定します。
1459                 * 内部的には、このキー(mkey)で、比較や hashCode が計算されています。
1460                 * キャッシュの有効期間は、ccTime (秒) で定義します。
1461                 * イメージタグの作成時間が、それを超える場合は、キャッシュを初期化します。
1462                 *
1463                 * @og.rev 6.0.2.0 (2014/09/19) キャッシュ時の制限時間対応
1464                 * @og.rev 6.3.5.1 (2015/08/16) コンストラクターで、イメージタグの設定と有効時間の算出を行います。
1465                 *
1466                 * @param       imgTag  イメージタグ
1467                 * @param       ccTime  キャッシュの制限時間(秒)
1468                 */
1469                public ChartCache( final String imgTag,final int ccTime ) {
1470                        this.imgTag     = imgTag;
1471                        createLimitTime = System.currentTimeMillis() + ccTime * 1000L;
1472                }
1473
1474                /**
1475                 * イメージタグを返します。
1476                 * キャッシュされていれば、そのキャッシュを、そうでなければ、null を
1477                 * 返します。
1478                 *
1479                 * @og.rev 6.3.5.1 (2015/08/16) メソッド名を変更します。
1480                 *
1481                 * @return   イメージタグ
1482                 */
1483                public String getImageTag() {
1484                        return imgTag ;
1485                }
1486
1487                /**
1488                 * キャッシュが、有効かどうかを返します。(有効:true)
1489                 * キャッシュは、コンストラクタ引数で指定された時間が経過すると、
1490                 * 無効と判断されます。
1491                 * 有効であれば、true を返します。
1492                 *
1493                 * @return      有効かどうか[有効:true/無効:false]
1494                 */
1495                public boolean isAvailable() {
1496                        return System.currentTimeMillis() < createLimitTime ;
1497                }
1498
1499        }
1500}