    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.plugin.table;
    017
    018import org.opengion.hayabusa.db.AbstractTableFilter;
    019import org.opengion.hayabusa.db.DBTableModel;
    020
    021import org.opengion.hayabusa.resource.ResourceFactory;
    022import org.opengion.hayabusa.resource.ResourceManager;
    023
    024import org.opengion.fukurou.util.ErrorMessage;
    025import org.opengion.fukurou.util.StringUtil;
    026
    027/**
    028 * TableFilter_LABEL は、TableFilter インターフェースを継承した、DBTableModel 処理用の
    029 * 実装クラスです。
    030 *
    031 * ここでは、キーのCLM,LBL と、LANG より、ラベルリソースに変換した値を設定します。
    032 * ラベルの設定は、設定先の値が NULL/空文字か、カラム名と同じ(無変換セット)の場合のみセットされます。
    033 *
    034 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか、BODY 部にCSS形式で記述します。
    035 * 【パラメータ】
    036 *  {
    037 *       SYSTEM_ID  : ラベルリソースの作成システムIDを指定します。無指定時は、ログイン時のリソースになります。
    038 *       LANG       : ラベルリソースの言語を指定します。無指定時は、日本語になります。
    039 *       CLM        : ラベルリソースのキーとなる値が設定されているカラム名を指定します。
    040 *       LBL        : CLMで指定されたカラム名から値を取り出し、ラベルリソースに変換した結果をセットします。
    041 *       LLBL       : 同上（ラベル長）                                  7.2.9.0 (2020/10/12)
    042 *       SLBL       : 同上（ラベル短）                                  7.2.9.0 (2020/10/12)
    043 *       DISC       : 同上（概要）                                            7.2.9.0 (2020/10/12)
    044 *       LRAW       : 同上（長生ラベル）                         7.2.9.0 (2020/10/12)
    045 *       SRAW       : 同上（短生ラベル）                         7.2.9.0 (2020/10/12)
    046 *       MSG        : 同上（引数付きラベル）                       7.2.9.1 (2020/10/23)
    047 *  }
    048 *
    049 * 5.7.8.0 (2014/07/04) 解除
    050 * CLM と LBL に同じカラムを指定すると、このフィルターを通過するたびに、変換後のラベルが
    051 * 再びキーとして変換しようと試みることになります。不測の事態に陥る可能性があるため、
    052 * その様な設定は出来なくなっています。
    053 *
    054 * 5.7.8.0 (2014/07/04) CLM と LBL に同じカラムを指定する事ができます。
    055 *
    056 * また、CLM または LBL で指定したカラムが DBTableModel に存在しない場合は、処理そのものを
    057 * 無視します。その場合は、警告も出力されませんので、ご注意ください。
    058 *
    059 * 7.2.9.0 (2020/10/12) LLBL,SLBL,DISC,RLBL 属性追加。
    060 *
    061 * 7.2.9.1 (2020/10/23) MSG 属性追加。
    062 *   引数付きなので、VALS 指定時に、セットするカラム名に引数として渡したいパラメータをスペースで繋げます。
    063 *   パラメータは、@カラム名 か、そのままの値で指定します。
    064 *
    065 * @og.formSample
    066 * ●形式：
    067 *      ① &lt;og:tableFilter classId="LABEL" keys="CLM,LBL" vals="COLUMN,LABEL_CLM" /&gt;
    068 *
    069 *      ② &lt;og:tableFilter classId="LABEL" &gt;
    070 *               {
    071 *                      SYSTEM_ID  : GF ;
    072 *                      LANG       : ja ;
    073 *                      CLM        : COLUMN ;
    074 *                      LBL        : LABEL_CLM ;
    075 *               }
    076 *         &lt;/og:tableFilter&gt;
    077 *
    078 * @og.rev 5.6.6.0 (2013/07/05) keys の整合性チェックを追加
    079 *
    080 * @version  0.9.0  2000/10/17
    081 * @author   Kazuhiko Hasegawa
    082 * @since    JDK1.1,
    083 */
    084public class TableFilter_LABEL extends AbstractTableFilter {
    085        /** このプログラムのVERSION文字列を設定します。   {@value} */
    086        private static final String VERSION = "7.2.9.1 (2020/10/23)" ;
    087
    088        /**
    089         * デフォルトコンストラクター
    090         *
    091         * @og.rev 6.4.1.1 (2016/01/16) keysMap を、サブクラスから設定させるように変更。
    092         */
    093        public TableFilter_LABEL() {
    094                super();
    095                initSet( "SYSTEM_ID"    , "システムIDを指定します(初期値:ログイン時のリソース)"                );
    096                initSet( "LANG"                 , "言語を指定(初期値:日本語)"                                                              );
    097                initSet( "CLM"                  , "キーとなる値が設定されているカラム名を指定"                               );
    098                initSet( "LBL"                  , "ラベルリソースに変換した結果をセットするカラム名を指定" );
    099                initSet( "LLBL"                 , "同上（ラベル長）"                                                                            );              // 7.2.9.0 (2020/10/12)
    100                initSet( "SLBL"                 , "同上（ラベル短）"                                                                            );              // 7.2.9.0 (2020/10/12)
    101                initSet( "DISC"                 , "同上（概要）       "                                                                                       );              // 7.2.9.0 (2020/10/12)
    102                initSet( "LRAW"                 , "同上（長生ラベル）"                                                                           );              // 7.2.9.0 (2020/10/12)
    103                initSet( "SRAW"                 , "同上（短生ラベル）"                                                                           );              // 7.2.9.0 (2020/10/12)
    104                initSet( "MSG"                  , "同上（引数付きラベル）"                                                                 );              // 7.2.9.1 (2020/10/23)
    105        }
    106
    107        /**
    108         * DBTableModel処理を実行します。
    109         *
    110         * @og.rev 5.5.2.2 (2012/05/09) SYSTEM_ID を受け取るように変更
    111         * @og.rev 5.5.2.6 (2012/05/25) protected変数を、private化したため、getterメソッドで取得するように変更
    112         * @og.rev 5.7.8.0 (2014/07/04) CLM と LBL に同じカラムを指定できるように変更
    113         * @og.rev 6.4.0.5 (2016/01/09) LBLが、nullか、または、CLMと同じ場合は、ﾘｿｰｽから、そうでない場合は、LBLの値を使用します。
    114         * @og.rev 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。
    115         * @og.rev 7.2.9.0 (2020/10/12) LLBL,SLBL,DISC,RLBL 属性追加
    116         * @og.rev 7.2.9.1 (2020/10/23) MSG 属性追加
    117         *
    118         * @return 処理結果のDBTableModel
    119         */
    120        public DBTableModel execute() {
    121                final DBTableModel table = getDBTableModel();                   // 5.5.2.6 (2012/05/25) インターフェースにgetterメソッド追加
    122
    123                if( table == null ) { return table; }                                   // 6.4.0.5 (2016/01/09)
    124
    125                final String systemId   = getValue( "SYSTEM_ID" );              // 5.5.2.2 (2012/05/09)
    126                final String lang               = getValue( "LANG" );
    127                final ResourceManager resource = ResourceFactory.newInstance( systemId,lang,false );            // 5.5.2.2 (2012/05/09)
    128
    129                final String clm  = getValue( "CLM" );
    130                final String lbl  = getValue( "LBL" );
    131                final String llbl = getValue( "LLBL" );                                         // 7.2.9.0 (2020/10/12)
    132                final String slbl = getValue( "SLBL" );                                         // 7.2.9.0 (2020/10/12)
    133                final String disc = getValue( "DISC" );                                         // 7.2.9.0 (2020/10/12)
    134                final String lraw = getValue( "LRAW" );                                         // 7.2.9.0 (2020/10/12)
    135                final String sraw = getValue( "SRAW" );                                         // 7.2.9.0 (2020/10/12)
    136
    137                final int clmNo   = table.getColumnNo( clm,false );                     // 存在しない場合は、-1 を返す。
    138                final int lblNo   = table.getColumnNo( lbl,false );
    139                final int llblNo  = table.getColumnNo( llbl,false );            // 7.2.9.0 (2020/10/12)
    140                final int slblNo  = table.getColumnNo( slbl,false );            // 7.2.9.0 (2020/10/12)
    141                final int discNo  = table.getColumnNo( disc,false );            // 7.2.9.0 (2020/10/12)
    142                final int lrawNo  = table.getColumnNo( lraw,false );            // 7.2.9.0 (2020/10/12)
    143                final int srawNo  = table.getColumnNo( sraw,false );            // 7.2.9.0 (2020/10/12)
    144
    145                // 7.2.9.1 (2020/10/23) MSGの値は、セットするカラム名の後ろに、パラメータをスペースで繋げています。
    146                final String msg_prm = getValue( "MSG" );
    147                final int   msgNo ;
    148                final int[] prmNo ;
    149                final String[] prmVal ;
    150
    151                if( msg_prm != null ) {
    152                        final String[] msgs = msg_prm.split( "[\\s]+" );                // 連続スペース、タブを区切り文字にする。
    153                        msgNo = table.getColumnNo( msgs[0],false );
    154                        prmNo  = new int[msgs.length-1];
    155                        prmVal = new String[msgs.length-1];
    156                        for( int i=1; i<msgs.length; i++ ) {
    157                                prmVal[i-1] = msgs[i];                                                          // 元の引数をそのまま使う可能性があるので、セットしておく。
    158
    159                                if( '@' == msgs[i].charAt(0) ) {                                        // ｶﾗﾑ指定の意味
    160                                        prmNo[i-1] = table.getColumnNo( msgs[i].substring(1),false );
    161                                }
    162                                else {
    163                                        prmNo[i-1] = -1;
    164                                }
    165                        }
    166                }
    167                else {
    168                        msgNo  = -1;
    169                        prmNo  = null;
    170                        prmVal = null;
    171                }
    172
    173                // 5.7.8.0 (2014/07/04) CLM と LBL に同じカラムを指定できるように変更
    174//              if( clmNo >= 0 && lblNo >= 0 ) {
    175//              if( clmNo >= 0 && ( lblNo >= 0 || llblNo >= 0 || slblNo >= 0 || discNo >= 0 || lrawNo >= 0 || srawNo >= 0 ) ) {                                 // 7.2.9.0 (2020/10/12)
    176                if( clmNo >= 0 && ( lblNo >= 0 || llblNo >= 0 || slblNo >= 0 || discNo >= 0 || lrawNo >= 0 || srawNo >= 0 || msgNo >= 0 ) ) {   // 7.2.9.1 (2020/10/23)
    177                        String[] data  = null;
    178                        final int rowCnt = table.getRowCount();
    179                        for( int row=0; row<rowCnt; row++ ) {
    180                                String clmVal = null;
    181                                try {
    182                                        data   = table.getValues( row );
    183                                        clmVal = data[clmNo];           // 変換する元のカラム名
    184
    185                                        if( lblNo >= 0 ) {
    186                                                final String lblVal = data[lblNo];              // 変換する元のラベル            6.4.0.5 (2016/01/09)
    187                                                // 6.4.0.5 (2016/01/09) LBLが、nullか、または、CLMと同じ場合は、ﾘｿｰｽから、そうでない場合は、LBLの値を使用します。
    188                                                // つまり、上記の条件が成立した場合は、LBLを書き換えないということです。
    189                                                if( StringUtil.isNull( lblVal ) || lblVal.equals( clmVal ) ) {
    190                                                        data[lblNo] = resource.getLabel( clmVal ) ;
    191                                                }
    192                                        }
    193
    194                                        // 7.2.9.0 (2020/10/12) LLBL,SLBL,DISC,RLBL 属性追加
    195                                        if( llblNo >= 0 ) {
    196                                                final String llblVal = data[llblNo];            // 変換する元のラベル            6.4.0.5 (2016/01/09)
    197                                                if( StringUtil.isNull( llblVal ) || llblVal.equals( clmVal ) ) {
    198                                                        data[llblNo] = resource.getLongLabel( clmVal ) ;
    199                                                }
    200                                        }
    201
    202                                        if( slblNo >= 0 ) {
    203                                                final String slblVal = data[slblNo];            // 変換する元のラベル            6.4.0.5 (2016/01/09)
    204                                                if( StringUtil.isNull( slblVal ) || slblVal.equals( clmVal ) ) {
    205                                                        data[slblNo] = resource.getShortLabel( clmVal ) ;
    206                                                }
    207                                        }
    208
    209                                        // 7.2.9.0 (2020/10/12) SLBL,DISC,RLBL 属性追加
    210                                        if( discNo >= 0 ) {
    211                                                final String discVal = data[discNo];            // 変換する元のラベル            6.4.0.5 (2016/01/09)
    212                                                if( StringUtil.isNull( discVal ) || discVal.equals( clmVal ) ) {
    213                                                        data[discNo] = resource.getDescription( clmVal ) ;
    214                                                }
    215                                        }
    216
    217                                        // 7.2.9.0 (2020/10/12) SLBL,DISC,RLBL 属性追加
    218                                        if( lrawNo >= 0 ) {
    219                                                final String lrawVal = data[lrawNo];            // 変換する元のラベル            6.4.0.5 (2016/01/09)
    220                                                if( StringUtil.isNull( lrawVal ) || lrawVal.equals( clmVal ) ) {
    221                                                        final String val = resource.getRawLongLabel( clmVal ) ;
    222                                                        data[lrawNo] = val == null || val.equals( clmVal ) ? "" : val ;         // null時はkeyが返ってくるので 空文字 を返す。
    223                                                }
    224                                        }
    225
    226                                        // 7.2.9.0 (2020/10/12) SLBL,DISC,RLBL 属性追加
    227                                        if( srawNo >= 0 ) {
    228                                                final String srawVal = data[srawNo];            // 変換する元のラベル            6.4.0.5 (2016/01/09)
    229                                                if( StringUtil.isNull( srawVal ) || srawVal.equals( clmVal ) ) {
    230                                                        final String val = resource.getRawShortLabel( clmVal,false ) ;          // null時は 空文字 を返す。
    231                                                        data[srawNo] = val == null || val.equals( clmVal ) ? "" : val;          // null時は 空文字 を返す。
    232
    233//                                                      data[srawNo] = resource.getRawShortLabel( clmVal,false ) ;                      // null時は 空文字 を返す。
    234                                                }
    235                                        }
    236
    237                                        // 7.2.9.1 (2020/10/23) MSG 属性追加
    238                                        if( msgNo >= 0 ) {
    239                                                final String msgVal = data[msgNo];
    240                                                if( StringUtil.isNull( msgVal ) || msgVal.equals( clmVal ) ) {
    241                                                        final String[] prmVals = new String[prmNo.length];
    242                                                        for( int i=0; i<prmNo.length; i++ ) {
    243                                                                if( prmNo[i] >= 0 ) {
    244                                                                        prmVals[i] = StringUtil.nval( data[prmNo[i]] , "" );
    245                                                                }
    246                                                                else {
    247                                                                        prmVals[i] = prmVal[i];
    248                                                                }
    249                                                        }
    250
    251                                                        data[msgNo] = resource.getLabel( clmVal,prmVals ) ;
    252                                                }
    253                                        }
    254                                }
    255                                catch( final RuntimeException ex ) {
    256                                        // 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。
    257                                        makeErrorMessage( "TableFilter_LABEL Error",ErrorMessage.NG )
    258                                                .addMessage( row+1,ErrorMessage.NG,"LABEL"
    259                                                        , "CLM=[" + clm + "],VAL=[" + clmVal + "]"
    260                                                        , StringUtil.array2csv( data )
    261                                                )
    262                                                .addMessage( ex );
    263                                }
    264                        }
    265                }
    266
    267                return table;
    268        }
    269}