    001package org.opengion.hayabusa.taglib;
    002
    003import org.opengion.hayabusa.common.HybsSystemException;
    004import org.opengion.hayabusa.io.JsChartData;
    005
    006import java.util.Set;                                                                                   // 6.4.3.4 (2016/03/11)
    007import org.opengion.fukurou.util.ArraySet;                                              // 6.4.3.4 (2016/03/11)
    008import org.opengion.fukurou.util.ToString;
    009import org.opengion.fukurou.util.ColorMap;                                              // 6.7.7.0 (2017/03/31)
    010import static org.opengion.fukurou.util.StringUtil.nval ;
    011
    012/**
    013 * 設定された値をJsChartDataに設定し、
    014 * JsChartTagのJsChartDataリストに追加するタグです。
    015 *
    016 * @og.formSample
    017 * ●形式：&lt;og:jsChartData chartColumn="…" … /&gt;
    018 * ●body:なし
    019 *
    020 * ●Tag定義：
    021 * &lt;og:jsChartData
    022 *      chartColumn     ○【TAG】ﾁｬｰﾄのｶﾗﾑ名を指定します(必須)。
    023 *      label             【TAG】凡例の値を指定します。
    024 *      fill              【TAG】線下を塗りつぶすかどうか[true/false]を指定します(初期値:false)。
    025 *      tension           【TAG】線の伸張を指定します。0で直線になります(初期値:0.4)。
    026 *      borderColor       【TAG】線の色を指定します。
    027 *      colorNo           【TAG】線の色(borderColor)をColorMapの色番号で指定します。
    028 *      borderWidth       【TAG】線の幅を指定します。
    029 *      backgroundColor   【TAG】ﾃﾞｰﾀの背景色を指定します。
    030 *      pointStyle        【TAG】点のスタイル(circle,triangle,rect,rectRot,cross,crossRot,star,line,dash)を指定します。 // 6.8.5.0 (2018/01/09)
    031 *      pointRadius       【TAG】点の大きさを指定します。                                                                                                                             // 6.8.5.0 (2018/01/09)
    032 *      showLine          【TAG】ラインを表示するかどうか[true/false]を指定します(初期値:null)。                                                // 6.8.5.0 (2018/01/09)
    033 *      optionAttributes  【TAG】その他ｵﾌﾟｼｮﾝを指定します。
    034 *      caseKey           【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    035 *      caseVal           【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    036 *      caseNN            【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
    037 *      caseNull          【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
    038 *      caseIf            【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    039 *  &gt; />
    040 *
    041 * ●使用例
    042 * &lt;og:jsChart...&gt;
    043 *     &lt;og:jsChartData
    044 *         chartColumn ="CLM1"
    045 *         label       ="ラベル"
    046 *         fill        ="true"
    047 *         tension     ="0"
    048 *         borderColor ="rbga(150,150,150,0.7)"
    049 *         borderWidth ="2"
    050 *     /&gt;>
    051 * &lt/og:jsChart&gt;
    052 *
    053 * @og.group 画面表示
    054 *
    055 * @version     5.9.17.2                2017/02/08
    056 * @author      T.OTA
    057 * @since       JDK7.0
    058 *
    059 */
    060public class JsChartDataTag extends CommonTagSupport {
    061        //* このプログラムのVERSION文字列を設定します。{@VALUE} */
    062        private static final String VERSION = "6.9.9.2 (2018/09/18)" ;
    063        private static final long serialVersionUID = 699220180918L ;
    064
    065        private static final Set<String> TYPE_BOOLEAN = new ArraySet<>( "true", "false" );
    066
    067        // 変数宣言
    068        private String  chartColumn                     ;
    069        private String  label                           ;
    070        private String  fill                            = "false";
    071        private String  tension                         = "0.4";
    072        private String  borderColor                     ;
    073        private String  borderWidth                     ;
    074        private String  backgroundColor         ;
    075        private String  pointStyle                      ;       // 6.8.5.0 (2018/01/09) 点のスタイル
    076        private String  pointRadius                     ;       // 6.8.5.0 (2018/01/09) 点の大きさ
    077        private String  showLine                        ;       // 6.8.5.0 (2018/01/09) ラインを表示するかどうか
    078        private String  optionAttributes        ;
    079
    080        /**
    081         * デフォルトコンストラクター
    082         *
    083         * @og.rev 6.9.7.0 (2018/05/14) PMD Each class should declare at least one constructor
    084         */
    085        public JsChartDataTag() { super(); }            // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    086
    087        /**
    088         * Taglibの終了タグが見つかった時に処理する doEndTag() を オーバーライドします。
    089         *
    090         * @og.rev 6.7.6.0 (2017/03/17) タグの使用を決める共通属性の追加
    091         * @og.rev 6.7.7.0 (2017/03/31) backgroundColor が未設定の場合は、borderColor を使用します。
    092         * @og.rev 6.8.5.0 (2018/01/09) pointStyle , pointRadius , showLine 属性の追加。
    093         *
    094         * @return 後続処理の指示
    095         */
    096        @Override
    097        public int doEndTag() {
    098                debugPrint();
    099                if( !useTag() ) { return EVAL_PAGE ; }                  // 6.7.6.0 (2017/03/17)
    100
    101                final JsChartTag jsChartTag = (JsChartTag) findAncestorWithClass( this, JsChartTag.class );
    102
    103                if( jsChartTag == null ) {
    104                        final String errMsg = "jsChart タグが見つかりませんでした。";
    105                        throw new HybsSystemException( errMsg );
    106                }
    107
    108                // 6.7.7.0 (2017/03/31) 各種初期設定を行います。
    109                if( borderColor == null || borderColor.isEmpty() ) {
    110                        final int size = jsChartTag.getJsChartDataSize();       // 登録順に色番号を設定します。
    111                        final String[] cols = ColorMap.getColorKeys();
    112                        borderColor = cols[size % cols.length];
    113                }
    114                if( backgroundColor == null || backgroundColor.isEmpty() ) {
    115                        backgroundColor = borderColor;
    116                }
    117
    118                final JsChartData jsData = new JsChartData();   // 6.7.7.0 (2017/03/31) ローカル変数化
    119                jsData.setChartColumn(          chartColumn                     );
    120                jsData.setLabel(                        label                           );
    121                jsData.setFill(                         fill                            );
    122                jsData.setTension(                      tension                         );
    123                jsData.setBorderColor(          borderColor                     );
    124                jsData.setBorderWidth(          borderWidth                     );
    125                jsData.setBackgroundColor(      backgroundColor         );
    126                jsData.setPointStyle(           pointStyle                      );      // 6.8.5.0 (2018/01/09)
    127                jsData.setPointRadius(          pointRadius                     );      // 6.8.5.0 (2018/01/09)
    128                jsData.setShowLine(                     showLine                        );      // 6.8.5.0 (2018/01/09)
    129                jsData.setOptionAttributes(     optionAttributes        );
    130
    131                jsChartTag.addJsChartData( jsData );
    132
    133                return EVAL_PAGE;
    134        }
    135
    136        /**
    137         * タグリブオブジェクトをリリースします。
    138         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    139         *
    140         * @og.rev 6.7.7.0 (2017/03/31) jsDataのローカル変数化。
    141         * @og.rev 6.8.5.0 (2018/01/09) pointStyle , pointRadius , showLine 属性の追加。
    142         */
    143        @Override
    144        protected void release2() {
    145                super.release2();
    146                chartColumn                     = null;
    147                label                           = null;
    148                fill                            = "false";
    149                tension                         = "0.4";
    150                borderColor                     = null;
    151                borderWidth                     = null;
    152                backgroundColor         = null;
    153                pointStyle                      = null;         // 6.8.5.0 (2018/01/09) 点のスタイル
    154                pointRadius                     = null;         // 6.8.5.0 (2018/01/09) 点のスタイル
    155                showLine                        = null;         // 6.8.5.0 (2018/01/09) ラインを表示するかどうか
    156                optionAttributes        = null;
    157        }
    158
    159        /**
    160         * 【TAG】ﾁｬｰﾄのｶﾗﾑ名を指定します(必須)。
    161         *
    162         * @og.tag
    163         *
    164         * @param clm ﾁｬｰﾄのｶﾗﾑ名
    165         */
    166        public void setChartColumn( final String clm ) {
    167                chartColumn = nval( getRequestParameter( clm ),chartColumn );
    168        }
    169
    170        /**
    171         * 【TAG】凡例の値を指定します。
    172         *
    173         * @og.tag
    174         *
    175         * @param lbl 凡例
    176         */
    177        public void setLabel( final String lbl ) {
    178                label = nval( getRequestParameter( lbl ),label );
    179        }
    180
    181        /**
    182         * 【TAG】線下を塗りつぶすかどうか[true/false]を指定します(初期値:false)。
    183         *
    184         * @og.tag
    185         * フィル(線より下の塗りつぶし) を設定します。
    186         *
    187         * @param fill 塗りつぶすかどうか [true/false]
    188         */
    189        public void setFill( final String fill ) {
    190                this.fill = nval( getRequestParameter( fill ) , this.fill );
    191
    192                checkPara( this.fill, TYPE_BOOLEAN, "fill" );
    193        }
    194
    195        /**
    196         * 【TAG】線の伸張を指定します。0で直線になります(初期値:0.4)。
    197         *
    198         * @og.tag
    199         * 伸張 を設定します。
    200         *
    201         * @param tension 線の伸張
    202         */
    203        public void setTension( final String tension ) {
    204                this.tension = nval( getRequestParameter( tension ),this.tension );
    205        }
    206
    207        /**
    208         * 【TAG】線の色を指定します。
    209         *
    210         * @og.tag
    211         * borderColor = "BLUE" とすると、すべての線の色を指定できます。
    212         * 配列で指定すると、データの順番に適用されます。
    213         * 例：borderColor = "['#ffaaaa','#ffffaa','#aaffaa','#aaaaff','#aaaaff']"
    214         *
    215         * 色の代わりに、ColorMapの色番号を指定した場合でも、borderColor が優先されます。
    216         * どちらも指定しない場合は、JsChartTagに登録した順番に色コードで指定されます。
    217         *
    218         * @param color 線の色
    219         * @see         #setColorNo(String)
    220         */
    221        public void setBorderColor( final String color ) {
    222                borderColor = nval( getRequestParameter( color ),borderColor );
    223        }
    224
    225        /**
    226         * 【TAG】線の色(borderColor)をColorMapの色番号で指定します。
    227         *
    228         * @og.tag
    229         * 色の代わりに、ColorMapの色番号を指定した場合でも、borderColor が優先されます。
    230         * この引数は、色に変換後、borderColor に設定されます。
    231         *
    232         * @og.rev 6.7.7.0 (2017/03/31) ColorMapの色番号で指定
    233         *
    234         * @param colorNo 線の色の番号
    235         * @see         ColorMap#getColorKeys()
    236         */
    237        public void setColorNo( final String colorNo ) {
    238                if( borderColor == null ) {             // borderColor が、未設定の場合のみ、色番号を利用する。
    239                        final String colNo = nval( getRequestParameter( colorNo ),null );
    240                        if( colNo != null ) {
    241                                try {
    242                                        final int no = Integer.parseInt( colNo );
    243                                        final String[] cols = ColorMap.getColorKeys();
    244                                        borderColor = cols[no % cols.length];
    245                                }
    246                                catch( final NumberFormatException ex ) {
    247                                        final String errMsg = "colorNo を数値に変換できません。colorNo=" + colNo ;
    248                                        throw new HybsSystemException( errMsg,ex );
    249                                }
    250                        }
    251                }
    252        }
    253
    254        /**
    255         * 【TAG】線の幅を指定します。
    256         *
    257         * @og.tag
    258         *
    259         * @param width 線の幅
    260         */
    261        public void setBorderWidth( final String width ) {
    262                borderWidth = nval( getRequestParameter( width ),borderWidth );
    263        }
    264
    265        /**
    266         * 【TAG】ﾃﾞｰﾀの背景色を指定します。
    267         *
    268         * @og.tag
    269         * backgroundColor = "BLUE" とすると、すべての背景色を指定できます。
    270         * 配列で指定すると、データの順番に適用されます。
    271         * 例：backgroundColor = "['#ffaaaa','#ffffaa','#aaffaa','#aaaaff','#aaaaff']"
    272         *
    273         * 特殊ｷｰﾜｰﾄﾞとして、"PASTEL" を指定することで、パステルカラーの色ｺｰﾄﾞを指定できます。
    274         *
    275         * 背景色を指定しない場合、線の色(borderColor)を使用します。
    276         *
    277         * @og.rev 6.9.9.2 (2018/09/18) パステルカラーの色文字列のｶﾝﾏ区切り文字列
    278         *
    279         * @param bgColor 背景色
    280         * @see         #setBorderColor(String)
    281         */
    282        public void setBackgroundColor( final String bgColor ) {
    283                backgroundColor = nval( getRequestParameter( bgColor ),backgroundColor );
    284
    285                if( "PASTEL".equalsIgnoreCase( backgroundColor ) ) {
    286                        // ※ 処理速度はともかく、簡単で判り易いので、こちらの方法で、CSV文字列を、作成します。
    287                        backgroundColor = "['" + String.join( "','", ColorMap.getPastelColorKeys() ) + "']";
    288
    289        //              6.9.9.2 (2018/09/18) パステルカラーの色文字列のｶﾝﾏ区切り文字列
    290        //              final String[] PSTL_KEYS = ColorMap.getPastelColorKeys();
    291        //              final StringJoiner sj = new StringJoiner( "','", "['", "']" );
    292        //              for( int i=0; i<PSTL_KEYS.length; i++ ) {
    293        //                      sj.add( PSTL_KEYS[i] );
    294        //              }
    295        //              backgroundColor = sj.toString();                                // パステルカラーを存在する分だけ CSV文字列で返す。
    296                }
    297        }
    298
    299        /**
    300         * 【TAG】点のスタイルを指定します。
    301         *
    302         * @og.tag
    303         * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。
    304         * 点のスタイルは、circle,triangle,rect,rectRot,cross,crossRot,star,line,dash が、
    305         *
    306         * @og.rev 6.8.5.0 (2018/01/09) 新規追加
    307         *
    308         * @param ptStyle 点のスタイルを指定します。
    309         */
    310        public void setPointStyle( final String ptStyle ) {
    311                pointStyle = nval( getRequestParameter( ptStyle ),pointStyle );
    312        }
    313
    314        /**
    315         * 【TAG】点の大きさを指定します。
    316         *
    317         * @og.tag
    318         * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。
    319         *
    320         * @og.rev 6.8.5.0 (2018/01/09) 新規追加
    321         *
    322         * @param ptRadius 点の大きさを指定します。
    323         */
    324        public void setPointRadius( final String ptRadius ) {
    325                pointRadius = nval( getRequestParameter( ptRadius ),pointRadius );
    326        }
    327
    328        /**
    329         * 【TAG】ラインを表示するかどうか[true/false]を指定します(初期値:null)。
    330         *
    331         * @og.tag
    332         * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。
    333         * 初期値(null)は、showLine 属性を設定しませんが、chartJS 自体の初期値が true
    334         * なので、表示されます。
    335         *
    336         * @og.rev 6.8.5.0 (2018/01/09) 新規追加
    337         *
    338         * @param show ラインを表示するかどうか [true:表示する/false:表示しない]
    339         */
    340        public void setShowLine( final String show ) {
    341                showLine = nval( getRequestParameter( show ),showLine );
    342        }
    343
    344        /**
    345         * 【TAG】その他ｵﾌﾟｼｮﾝを指定します。
    346         *
    347         * @og.tag
    348         *
    349         * @param attri その他ｵﾌﾟｼｮﾝ
    350         */
    351        public void setOptionAttributes( final String attri ) {
    352                optionAttributes = nval( getRequestParameter( attri ),optionAttributes );
    353        }
    354
    355        /**
    356         * ﾊﾟﾗﾒｰﾀﾁｪｯｸ用ﾒｿｯﾄﾞ。
    357         *
    358         * @param trg チェック対象
    359         * @param set 設定可能なリスト
    360         * @param trgStr チェック対象の文字列(ｴﾗｰ表示用)
    361         */
    362        private void checkPara( final String trg, final Set<String> set, final String trgStr ) {
    363                if( trg != null && trg.length() > 0 && !check( trg, set ) ) {
    364                        final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE )
    365                                .append( "指定の" ).append( trgStr ).append( "は指定できません。" )
    366                                .append( CR )
    367                                .append( trgStr ).append( "=[" ).append( trg ).append( ']' )
    368                                .append( CR );
    369                        for( final String lst : set ) {
    370                                errMsg.append( " | " )
    371                                        .append( lst );
    372                        }
    373                        throw new HybsSystemException( errMsg.toString() );
    374                }
    375        }
    376
    377        /**
    378         * このオブジェクトの文字列表現を返します。
    379         * 基本的にデバッグ目的に使用します。
    380         *
    381         * @return このクラスの文字列表現
    382         */
    383        @Override
    384        public String toString() {
    385                return ToString.title( this.getClass().getName() )
    386                        .println( "VERSIION"                    , VERSION                       )
    387                        .println( "chartColumn"                 , chartColumn           )
    388                        .println( "label"                               , label                         )
    389                        .println( "fill"                                , fill                          )
    390                        .println( "tension"                             , tension                       )
    391                        .println( "borderColor"                 , borderColor           )
    392                        .println( "borderWidth"                 , borderWidth           )
    393                        .println( "backgroundColor"             , backgroundColor       )
    394                        .println( "optionAttributes"    , optionAttributes      )
    395                        .fixForm().toString();
    396        }
    397}