    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 = "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) ０件対応
    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" (初期値)では、１つづつ表示(つまり、すべて表示する)します。
    1072         * "2" とすると、１つおきに、"3" とすると、２つおきに表示します。
    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         * 例えば、データは、年月日で、年と月のみ(先頭６文字)を指定すると、
    1094         * 日のデータは、ラベルが表示されません。
    1095         * 指定される数字は、１以上の整数としてください。
    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         * 少ない数のグリッド線(例えば、２つおき)を出す場合に、値を設定します。
    1178         * "1" (初期値)では、１つづつ表示(つまり、すべて表示する)します。
    1179         * "2" とすると、１つおきに、"3" とすると、２つおきに表示します。
    1180         * なお、先頭から表示を開始します。
    1181         *
    1182         * 6.0.2.0 (2014/09/19) 前回の JFreeChart のVerUpで、グリッド線の表示が
    1183         * ５個おきに変わったようです。設定する値を マイナスにすると、初期設定の値を
    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】検索結果が０件のとき処理を停止するかどうか[true/false]を指定します(初期値:false[続行する])。
    1354         *
    1355         * @og.tag
    1356         * ChartDatasetTag のデータが、０件の場合、すぐに、処理を中断します。
    1357         * この場合は、上位の
    1358         * その際、検索結果が、０件のとき処理を停止するかどうかを決定します。
    1359         * useTableData="true" の場合は、 query タグで、stopZero 属性を、設定してください。
    1360         * 初期値は、false(続行する)です。
    1361         *
    1362         * @og.rev 6.9.7.0 (2018/05/14) stopZero,notfoundMsg 属性追加
    1363         *
    1364         * @param  cmd ０件時停止可否 [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 や、件数が０件の場合は、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}