    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.column;
    017
    018import org.opengion.fukurou.util.Attributes;
    019import org.opengion.fukurou.util.XHTMLTag;
    020
    021import org.opengion.hayabusa.common.HybsSystem;
    022import org.opengion.hayabusa.common.HybsSystemException;
    023
    024import org.opengion.hayabusa.db.AbstractEditor;
    025import org.opengion.hayabusa.db.CellEditor;
    026import org.opengion.hayabusa.db.DBColumn;
    027import org.opengion.hayabusa.db.DBColumnConfig;
    028import org.opengion.hayabusa.resource.ResourceFactory;
    029import org.opengion.hayabusa.resource.ResourceManager;
    030import org.opengion.hayabusa.resource.LabelData;
    031
    032import java.util.Locale ;
    033
    034/**
    035 * 動的カラムのEntryカラムを編集する場合に使用するエディタークラスです。
    036 *
    037 * Editor_ENTCLM は、Editor_EntryColumn の略で、Editor_COLUMN.java を
    038 * 強化した形で作成します。
    039 * これは、引数の値をキーに、DBColumn を動的に作成する機能になります。
    040 *
    041 * Editor_COLUMN との違いは、こちらは、行ではなく、Entry形式のカラムを
    042 * 作成するところです。つまり、行番号は、関係ありません。
    043 * 通常は、カラム名__行番号 をキーとするテキストフィールドなどを
    044 * 出力しますが、Editor_ENTCLM は、名前そのものをキーとする
    045 * テキストフィールドなどを出力します。
    046 * あと、カラム引数(:で区切られた値)が使えます。
    047 * 通常は、値(Value)に、カラム名のみをセットしますが、コロン(:)で、
    048 * 区切ってパラメータを渡せます。
    049 *
    050 * カラム名:値:must:Length:Label:Editor:DBType:EditParam の順番です。
    051 *
    052 * コロンの数だけ分離しますが、数は少なくても良いが並び順は、必須です。
    053 *
    054 * 通常、このままでは、リソースに存在することが前提ですが、
    055 * 編集パラメータに、SAVE=TRUE というキーワードをセットすると、
    056 * 個々に作成した値を元に、ResourceManager に、動的に作成した
    057 * LabelData を追加する機能を持たせます。
    058 * この、LabelData は、通常のLabelDataLoaderのプールではなく、
    059 * ResourceManagerで、個別に管理されるため、特殊な方法を使わないと
    060 * 値を取り出すことはできません。
    061 * このキャッシュされたラベルを用いることで、columnCheckのエラーメッセージ
    062 * のラベルを動的に書き換えたラベルで表示することができます。
    063 *
    064 * さらに、編集パラメータに、QUERY=・・・・ というキーワードを
    065 * セットすると、そのSQL分を実行して、コードリソースを作成します。
    066 * こちらは、SAVE=TRUE の場合のみ実行され、コードリソースのキャッシュに
    067 * セットされます。
    068 *
    069 * このエディタはeventColumnに対応していません。
    070 *
    071 * カラムの表示に必要な属性は, DBColumn オブジェクト より取り出します。
    072 * このクラスは、DBColumn オブジェクト毎に１つ作成されます。
    073 * @og.group データ編集
    074 *
    075 * @og.rev 5.4.2.2 (2011/12/14) 新規追加。
    076 *
    077 * @version  4.0
    078 * @author       Kazuhiko Hasegawa
    079 * @since    JDK5.0,
    080 */
    081public class Editor_ENTCLM extends AbstractEditor {
    082        /** このプログラムのVERSION文字列を設定します。   {@value} */
    083        private static final String VERSION = "6.4.5.2 (2016/05/06)" ;
    084
    085        private final String    lang ;
    086        private final boolean   isSave ;
    087        private final String    codeQuery ;
    088        private final boolean   addNoValue ;            // 5.4.2.3 (2011/12/22)
    089
    090        /**
    091         * デフォルトコンストラクター。
    092         * このコンストラクターで、基本オブジェクトを作成します。
    093         *
    094         * @og.rev 5.4.2.3 (2011/12/22) addNoValue 属性を追加します。
    095         */
    096        public Editor_ENTCLM() {
    097                super();                // 6.4.1.1 (2016/01/16) PMD refactoring. It is a good practice to call super() in a constructor
    098                lang            = null;
    099                isSave          = false;
    100                codeQuery       = null;
    101                addNoValue      = false;                // 5.4.2.3 (2011/12/22)
    102        }
    103
    104        /**
    105         * デフォルトコンストラクター。
    106         *
    107         * @og.rev 5.4.2.3 (2011/12/22) addNoValue 属性を追加します。
    108         * @og.rev 6.4.4.2 (2016/04/01) nameのfinal化
    109         *
    110         * @param       clm     DBColumnオブジェクト
    111         */
    112        private Editor_ENTCLM( final DBColumn clm ) {
    113        //      super();                // 6.4.1.1 (2016/01/16) PMD refactoring. It is a good practice to call super() in a constructor
    114                super( clm );   // 6.4.4.2 (2016/04/01) nameのfinal化
    115        //      name = clm.getName();           // ここでいう名前は、オリジナルなので、動的に作成するときには使用しない。
    116                lang = clm.getLang();
    117                addNoValue = clm.isAddNoValue() ;               // 5.4.2.3 (2011/12/22)
    118
    119                final String orgParam = clm.getEditorParam();
    120                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    121                if( orgParam == null ) {
    122                        isSave    = false;
    123                        codeQuery = null;
    124                }
    125                else {
    126                        final String upParam = orgParam.toUpperCase(Locale.JAPAN);
    127                        // 編集パラメータに、SAVE=TRUE というキーワードがあるかどうかのチェック
    128                        isSave = upParam.indexOf( "SAVE=TRUE" ) >= 0 ;
    129
    130                        // QUERY= のキーワードがあれば、コードリソースの検索用SQLとなる。(パラメータの残りすべて)
    131                        final int adrs = upParam.indexOf( "QUERY=" );
    132                        codeQuery = adrs >= 0 ? orgParam.substring( adrs+6,orgParam.length() ) : null;
    133                }
    134
    135        }
    136
    137        /**
    138         * 各オブジェクトから自分のインスタンスを返します。
    139         * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に
    140         * まかされます。
    141         *
    142         * @param       clm     DBColumnオブジェクト
    143         *
    144         * @return      CellEditorオブジェクト
    145         * @og.rtnNotNull
    146         */
    147        public CellEditor newInstance( final DBColumn clm ) {
    148                return new Editor_ENTCLM( clm );
    149        }
    150
    151        /**
    152         * データの編集用文字列を返します。
    153         *
    154         * 通常は、値(Value)に、カラム名のみをセットしますが、コロン(:)で、
    155         * 区切ってパラメータを渡せます。
    156         *
    157         * カラム名:値:must:Length:Label:Editor:DBType:EditParam の順番です。
    158         *
    159         * コロンの数だけ分離しますが、数は少なくても良いが並び順は、必須です。
    160         *
    161         * @og.rev 5.4.2.3 (2011/12/22) addNoValue 属性を追加します。
    162         * @og.rev 5.4.3.4 (2012/01/12) official フラグをセットします。パラメータにラベル追加
    163         * @og.rev 6.4.5.2 (2016/05/06) rendAttri,editAttri は、not null にします。
    164         *
    165         * @param       value 入力値
    166         *
    167         * @return      データの表示用文字列
    168         * @og.rtnNotNull
    169         */
    170        @Override
    171        public String getValue( final String value ) {
    172                // 先頭文字が コロン(:)の場合は、カラム名が省略されているので、エラー
    173                if( value == null || value.isEmpty() || value.charAt(0) == ':'  ) {             // or判定なので、StringUtil.startsChar は使えません。
    174                        final String errMsg = "指定のカラムの値が設定されていません。"
    175                                                + CR
    176                                                + "  name=[" + name + "]"
    177                                                + "  value=[" + value + "]";
    178                        throw new HybsSystemException( errMsg );
    179                }
    180
    181                final ResourceManager resource = ResourceFactory.newInstance( lang ) ;
    182                final String[] vals = value.split( ":" , 8 );                   // ８分割します。
    183
    184                final String key    = vals[0];                                                                  // 配列０は、カラム名
    185                final String val    = vals.length >= 2 ? vals[1] : null;                // 配列１は、値
    186                final String must   = vals.length >= 3 ? vals[2] : null;                // 配列２は、must
    187                final String len    = vals.length >= 4 ? vals[3] : null;                // 配列３は、Length
    188                final String lbl    = vals.length >= 5 ? vals[4] : null;                // 配列４は、Label
    189                final String edit   = vals.length >= 6 ? vals[5] : null;                // 配列５は、Editor
    190                final String dbtype = vals.length >= 7 ? vals[6] : null;                // 配列６は、DBType
    191                final String edPrm  = vals.length >= 8 ? vals[7] : null;                // 配列７は、EditParam
    192
    193                final boolean isMust = "1".equalsIgnoreCase( must ) || "true".equalsIgnoreCase( must ) ;        // mustが設定されているかどうか
    194                // キーに対応するDBColumnがなければ、null が返される。
    195                DBColumn dbColumn = resource.getDBColumn( key );
    196
    197                // DBColumnConfig で値のセット
    198                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..;
    199                final DBColumnConfig config = (dbColumn == null) ? new DBColumnConfig( key ) : dbColumn.getConfig();
    200
    201                // 5.4.3.4 (2012/01/12) official フラグをセットします。
    202                config.setOfficial( true );
    203
    204                // 5.4.2.3 (2011/12/22) addNoValue 属性を追加
    205                config.setAddNoValue( addNoValue );
    206
    207                String mstChStr = "";
    208                if( isMust ) {                  // 配列２は、must
    209                        final Attributes editAttri = config.getEditorAttributes();
    210                        editAttri.add( "class","must" );
    211                        config.setEditorAttributes( editAttri );
    212
    213                        // must 指定の場合に、チェック用のhidden を作成します。
    214                        mstChStr = XHTMLTag.hidden( HybsSystem.MUST_KEY + "must", key );
    215                }
    216                if( len != null && !len.isEmpty() ) {                   // 配列３は、Length
    217                        config.setMaxlength( len );
    218                }
    219                // 5.4.3.4 (2012/01/12) パラメータにラベル追加
    220                if( lbl != null && !lbl.isEmpty() ) {                   // 配列４は、Label
    221                        final LabelData labelData = resource.getLabelData( lbl ) ;
    222                        config.setLabelData( labelData );
    223                }
    224                if( edit != null && !edit.isEmpty() ) {                 // 配列５は、Editor
    225                        config.setEditor( edit );
    226                }
    227                if( dbtype != null && !dbtype.isEmpty() ) {             // 配列６は、DBType
    228                        config.setDbType( dbtype );
    229                }
    230                if( edPrm != null && !edPrm.isEmpty() ) {               // 配列７は、EditParam
    231                        config.setEditorParam( edPrm );
    232                }
    233
    234                // 動的なコードリソースの作成
    235                if( codeQuery != null && isSave ) {
    236                        config.setCodeData( resource.getCodeData( key,codeQuery ) );
    237                }
    238
    239                dbColumn = new DBColumn( config );
    240                if( isSave ) {  // isSave が true で、セーブする。
    241                        resource.setDBColumn( key,dbColumn );
    242                }
    243
    244                // val と must は、キャッシュされた DBColumn と別に、毎回異なるケースを想定します。
    245                return dbColumn.getEditorValue( val ) + mstChStr;
    246        }
    247
    248        /**
    249         * このクラスでは、Entry形式の編集用の文字列を作成します。
    250         * よって、行番号を付加しません。
    251         *
    252         * @param       row   行番号
    253         * @param       value 入力値
    254         *
    255         * @return      データ表示/編集用の文字列
    256         * @og.rtnNotNull
    257         */
    258        @Override
    259        public String getValue( final int row,final String value ) {
    260                return getValue( value );
    261        }
    262}