    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 *    ③ 直後の実行結果を、{&#064;CHART.TAG} 変数で取得できます。(requestスコープ)
    065 *
    066 * 各属性は、{&#064;XXXX} 変数が使用できます。
    067 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に割り当てます。
    068 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。
    069 *
    070 * @og.formSample
    071 * ●形式：&lt;og:chartCreate title="…" … /&gt;
    072 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    073 *
    074 * ●Tag定義：
    075 *   &lt;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】検索結果が０件のとき処理を続行するかどうか[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 *   &gt;   ... Body ...
    126 *   &lt;/og:chartCreate&gt;
    127 *
    128 * ●使用例
    129 *      &lt;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       = "{&#064;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 *       &gt;
    162 *              &lt;og:chartDataset
    163 *                  chartType   = "{&#064;chartType}"
    164 *                  valueLabel  = "{&#064;valueLabel}"
    165 *                  lowerBound  = "{&#064;lowerBound}"
    166 *                  upperBound  = "{&#064;upperBound}"
    167 *                  markValues  = "{&#064;markValues}"
    168 *                  markColors  = "{&#064;markColors}"
    169 *                  useGradient   = "{&#064;useGradient}"
    170 *                  shapesVisible = "{&#064;shapesVisible}"
    171 *                  useDottedLine = "{&#064;useDottedLine}"
    172 *                  seriesColors  = "{&#064;seriesColors}"
    173 *                  valueLabelsVisible = "[true|false]"
    174 *                  valueMarksVisible  = "[true|false]"
    175 *              &gt;
    176 *                         {&#064;SQL}
    177 *              &lt;/og:chartDataset&gt;
    178 *      &lt;/og:chartCreate&gt;
    179 *
    180 *    複数のグラフを重ね合わせる場合は、chartDataset タグを chartCreate のBODY部に
    181 *    複数記述します。
    182 *      &lt;og:chartCreate
    183 *          title       = "{&#064;title}"
    184 *          domainLabel = "{&#064;domainLabel}"
    185 *          width       = "{&#064;width}"
    186 *          height      = "{&#064;height}" &gt;
    187 *              &lt;og:chartDataset
    188 *                  chartType   = "{&#064;chartType1}"
    189 *                  valueLabel  = "{&#064;valueLabel1}"
    190 *                  lowerBound  = "{&#064;lowerBound1}"
    191 *                  upperBound  = "{&#064;upperBound1}"
    192 *                  markValues  = "{&#064;markValues1}"
    193 *                  markColors  = "{&#064;markColors1}"
    194 *              &gt;
    195 *                         {&#064;SQL1}
    196 *              &lt;/og:chartDataset&gt;
    197 *              &lt;og:chartDataset
    198 *                  chartType   = "{&#064;chartType2}"
    199 *                  valueLabel  = "{&#064;valueLabel2}"
    200 *                  lowerBound  = "{&#064;lowerBound2}"
    201 *                  upperBound  = "{&#064;upperBound2}"
    202 *                  markValues  = "{&#064;markValues2}"
    203 *                  markColors  = "{&#064;markColors2}"
    204 *              &gt;
    205 *                         {&#064;SQL2}
    206 *              &lt;/og:chartDataset&gt;
    207 *      &lt;/og:chartCreate&gt;
    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) ０件対応
    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" (初期値)では、１つづつ表示(つまり、すべて表示する)します。
    1073         * "2" とすると、１つおきに、"3" とすると、２つおきに表示します。
    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         * 例えば、データは、年月日で、年と月のみ(先頭６文字)を指定すると、
    1095         * 日のデータは、ラベルが表示されません。
    1096         * 指定される数字は、１以上の整数としてください。
    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         * 少ない数のグリッド線(例えば、２つおき)を出す場合に、値を設定します。
    1179         * "1" (初期値)では、１つづつ表示(つまり、すべて表示する)します。
    1180         * "2" とすると、１つおきに、"3" とすると、２つおきに表示します。
    1181         * なお、先頭から表示を開始します。
    1182         *
    1183         * 6.0.2.0 (2014/09/19) 前回の JFreeChart のVerUpで、グリッド線の表示が
    1184         * ５個おきに変わったようです。設定する値を マイナスにすると、初期設定の値を
    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】検索結果が０件のとき処理を停止するかどうか[true/false]を指定します(初期値:false[続行する])。
    1355         *
    1356         * @og.tag
    1357         * ChartDatasetTag のデータが、０件の場合、すぐに、処理を中断します。
    1358         * この場合は、上位の
    1359         * その際、検索結果が、０件のとき処理を停止するかどうかを決定します。
    1360         * useTableData="true" の場合は、 query タグで、stopZero 属性を、設定してください。
    1361         * 初期値は、false(続行する)です。
    1362         *
    1363         * @og.rev 6.9.7.0 (2018/05/14) stopZero,notfoundMsg 属性追加
    1364         *
    1365         * @param  cmd ０件時停止可否 [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 や、件数が０件の場合は、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}