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     */
016    package org.opengion.plugin.column;
017    
018    import org.opengion.fukurou.util.Attributes;
019    import org.opengion.fukurou.util.XHTMLTag;
020    
021    import org.opengion.hayabusa.common.HybsSystem;
022    import org.opengion.hayabusa.common.HybsSystemException;
023    
024    import org.opengion.hayabusa.db.AbstractEditor;
025    import org.opengion.hayabusa.db.CellEditor;
026    import org.opengion.hayabusa.db.DBColumn;
027    import org.opengion.hayabusa.db.DBColumnConfig;
028    import org.opengion.hayabusa.resource.ResourceFactory;
029    import org.opengion.hayabusa.resource.ResourceManager;
030    import org.opengion.hayabusa.resource.LabelData;
031    
032    import 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     */
081    public class Editor_ENTCLM extends AbstractEditor {
082            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
083            private static final String VERSION = "5.4.3.4 (2012/01/12)" ;
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();
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             *
109             * @param       clm     DBColumnオブジェクãƒ?
110             */
111            private Editor_ENTCLM( final DBColumn clm ) {
112            //      super( clm );
113                    name = clm.getName();           // ここでã�?�†名前は、オリジナルなので、動çš?�«作æ?するときには使用しなã�??
114                    lang = clm.getLang();
115                    addNoValue = clm.isAddNoValue() ;               // 5.4.2.3 (2011/12/22)
116    
117                    String orgParam = clm.getEditorParam();
118                    if( orgParam != null ) {
119                            String upParam = orgParam.toUpperCase(Locale.JAPAN);
120                            // 編é›?ƒ‘ラメータに、SAVE=TRUE とã�?�†キーワードがあるかどã�?�‹のチェãƒ?‚¯
121                            isSave = ( upParam.indexOf( "SAVE=TRUE" ) >= 0 );
122    
123                            // QUERY= のキーワードがあれば、コードリソースの検索用SQLとなるã?(パラメータの残りすべて)
124                            int adrs = upParam.indexOf( "QUERY=" );
125                            codeQuery = ( adrs >= 0 ) ? orgParam.substring( adrs+6,orgParam.length() ) : null;
126                    }
127                    else {
128                            isSave    = false;
129                            codeQuery = null;
130                    }
131            }
132    
133            /**
134             * å�?‚ªブジェクトからè?åˆ??インスタンスを返しますã?
135             * 自åˆ??身をキャãƒ?‚·ュするのかã?新たに作æ?するのかã?、各サブクラスの実è£?�«
136             * まかされますã?
137             *
138             * @param       clm     DBColumnオブジェクãƒ?
139             *
140             * @return      CellEditorオブジェクãƒ?
141             */
142            public CellEditor newInstance( final DBColumn clm ) {
143                    return new Editor_ENTCLM( clm );
144            }
145    
146            /**
147             * ãƒ??タの編é›?”¨æ–?­—å?を返しますã?
148             *
149             * 通常は、å?(Value)に、カラãƒ?��のみをセãƒ?ƒˆしますが、コロン(:)でã€?
150             * 区åˆ?�£てパラメータを渡せますã?
151             *
152             * カラãƒ?��:値:must:Length:Label:Editor:DBType:EditParam のé ?•ªですã?
153             *
154             * コロンの数ã�?�‘åˆ?›¢しますが、数は少なくても良ã�?�Œ並びé ??、å¿??ですã?
155             *
156             * @og.rev 5.4.2.3 (2011/12/22) addNoValue 属æ?を追åŠ?�—ますã?
157             * @og.rev 5.4.3.4 (2012/01/12) official フラグをセãƒ?ƒˆしますã?パラメータにラベル追åŠ?
158             *
159             * @param       value 入力å?
160             *
161             * @return      ãƒ??タの表示用æ–?­—å?
162             */
163            @Override
164            public String getValue( final String value ) {
165                    // 先é?æ–?­—が コロン(:)の場合ã?、カラãƒ?��が省略されてã�?‚‹ので、エラー
166                    if( value == null || value.isEmpty() || value.charAt(0) == ':'  ) {
167                            String errMsg = "æŒ?®šã?カラãƒ??値が設定されてã�?�¾せんã€?
168                                                    + HybsSystem.CR
169                                                    + "  name=[" + name + "]"
170                                                    + "  value=[" + value + "]";
171                            throw new HybsSystemException( errMsg );
172                    }
173    
174                    ResourceManager resource = ResourceFactory.newInstance( lang ) ;
175                    String[] vals = value.split( ":" , 8 );         // ?˜å?割しますã?
176    
177                    String key    = vals[0];                                                                        // 配å??�ã?、カラãƒ?��
178                    String val    = (vals.length >= 2) ? vals[1] : null;         // 配å??‘ã?、å?
179                    String must   = (vals.length >= 3) ? vals[2] : null;         // 配å??’ã?、must
180                    String len    = (vals.length >= 4) ? vals[3] : null;         // 配å??“ã?、Length
181                    String lbl    = (vals.length >= 5) ? vals[4] : null;         // 配å??”ã?、Label
182                    String edit   = (vals.length >= 6) ? vals[5] : null;         // 配å??•ã?、Editor
183                    String dbtype = (vals.length >= 7) ? vals[6] : null;         // 配å??–ã?、DBType
184                    String edPrm  = (vals.length >= 8) ? vals[7] : null;         // 配å??—ã?、EditParam
185    
186                    boolean isMust = "1".equalsIgnoreCase( must ) || "true".equalsIgnoreCase( must ) ;      // mustが設定されてã�?‚‹かどã�?�‹
187                    // キーに対応するDBColumnがなければ、null が返されるã€?
188                    DBColumn dbColumn = resource.getDBColumn( key );
189    
190                    // DBColumnConfig で値のセãƒ?ƒˆ
191                    DBColumnConfig config = (dbColumn != null) ? dbColumn.getConfig() : new DBColumnConfig( key );
192    
193                    // 5.4.3.4 (2012/01/12) official フラグをセãƒ?ƒˆしますã?
194                    config.setOfficial( true );
195    
196                    // 5.4.2.3 (2011/12/22) addNoValue 属æ?を追åŠ?
197                    config.setAddNoValue( addNoValue );
198    
199                    String mstChStr = "";
200                    if( isMust ) {                  // 配å??’ã?、must
201                            Attributes editAttri = config.getEditorAttributes();
202                            if( editAttri == null ) { editAttri = new Attributes(); }
203                            editAttri.add( "class","must" );
204                            config.setEditorAttributes( editAttri );
205    
206                            // must æŒ?®šã?場合に、チェãƒ?‚¯用のhidden を作æ?しますã?
207                            mstChStr = XHTMLTag.hidden( HybsSystem.MUST_KEY + "must", key );
208                    }
209                    if( len != null && !len.isEmpty() ) {                   // 配å??“ã?、Length
210                            config.setMaxlength( len );
211                    }
212                    // 5.4.3.4 (2012/01/12) パラメータにラベル追åŠ?
213                    if( lbl != null && !lbl.isEmpty() ) {                   // 配å??”ã?、Label
214                            LabelData labelData = resource.getLabelData( lbl ) ;
215                            config.setLabelData( labelData );
216    //                      if( isSave ) {  // isSave ã�?true で、セーブするã?
217    ////                    resource.setLabelData( key,labelData );
218    //                              resource.setLabel( key,lbl );
219    //                      }
220                    }
221                    if( edit != null && !edit.isEmpty() ) {                 // 配å??•ã?、Editor
222                            config.setEditor( edit );
223                    }
224                    if( dbtype != null && !dbtype.isEmpty() ) {             // 配å??–ã?、DBType
225                            config.setDbType( dbtype );
226                    }
227                    if( edPrm != null && !edPrm.isEmpty() ) {               // 配å??—ã?、EditParam
228                            config.setEditorParam( edPrm );
229                    }
230    
231                    // 動的なコードリソースの作æ?
232                    if( codeQuery != null && isSave ) {
233                            config.setCodeData( resource.getCodeData( key,codeQuery ) );
234                    }
235    
236                    dbColumn = new DBColumn( config );
237                    if( isSave ) {  // isSave ã�?true で、セーブするã?
238                            resource.setDBColumn( key,dbColumn );
239                    }
240    
241                    // val と must は、キャãƒ?‚·ュされã�?DBColumn と別に、毎回異なるケースを想定しますã?
242                    return dbColumn.getEditorValue( val ) + mstChStr;
243            }
244    
245            /**
246             * こã?クラスでは、Entry形式ã?編é›?”¨のæ–?­—å?を作æ?しますã?
247             * よって、行番号を付加しませんã€?
248             *
249             * @param       row   行番号
250             * @param       value 入力å?
251             *
252             * @return      ãƒ??タ表示/編é›?”¨のæ–?­—å?
253             */
254            @Override
255            public String getValue( final int row,final String value ) {
256                    return getValue( value );
257            }
258    }