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.TagBuffer;
020import org.opengion.fukurou.util.XHTMLTag;
021import org.opengion.hayabusa.common.HybsSystem;
022import org.opengion.hayabusa.common.HybsSystemException;
023import org.opengion.hayabusa.db.AbstractEditor;
024import org.opengion.hayabusa.db.CellEditor;
025import org.opengion.hayabusa.db.DBColumn;
026import org.opengion.hayabusa.db.SelectionCellEditor;                                    // 6.2.2.0 (2015/03/27)
027import org.opengion.hayabusa.db.Selection;
028import org.opengion.hayabusa.db.SelectionFactory;
029import org.opengion.fukurou.util.StringFormat;
030
031/**
032 * DBRADIO エディターは、カラムの編集パラメーターのSQL文の実行結果より、動的にラジオボタンを
033 * 作成して編集する場合に使用するエディタークラスです。
034 *
035 * 編集パラメータには、ラジオボタンを作成するための、SQL文を記述します。
036 * このSQL文は、select KEY,LABEL from xx ・・・ という構文で、KEY部分とLABEL部分が
037 * 選択されます。各カラムの意味は次のようになります。
038 *  第1カラム(必須) : ラジオボタンのキー(値)
039 *  第2カラム       : ラベル(指定されない場合は、ラベルリソースの短縮ラベルを使用します)
040 *  第3カラム       : クラス そのオプションに色づけなどを行う為の指定します。
041 *                     NULL(または、ゼロ文字列)の場合は、適用されません。
042 *  第4カラム       : この値は'false'又は'0'である場合にそのラジオボタンを選択不可にします。
043 *                     NULL(または、ゼロ文字列)の場合は、選択可能になります。
044 *
045 * 各カラムの値(value値)に、AAA:BBB:CCC:DDD という値を設定できます。これは、
046 * $1,$2,$3,$4 に割り当てなおして、QUERYを実行します。また、$1 は、本来の値として、
047 * メニューの初期値設定等に使用します。上記の例では、AAA が値で、それ以降は、
048 * 引数になります。
049 * 又、$Cには自分自身のカラム名を割り当てます。
050 * この機能を使用すれば、動的メニューを行ごとに条件を変えて作成することが
051 * 可能になります。
052 * 例:select KEY,LABEL from xx where KUBUN='$2' and CDK='$3'
053 * さらに、元の文字列"AAA:BBB:CCC:DDD"は、$0 に割り当てられます。割り当てがない
054 * 変数は、""(ゼロ文字列)として、扱われます。
055 *
056 * このエディタはeventColumnに対応していません。
057 *
058 *  カラムの表示に必要な属性は、DBColumn オブジェクト より取り出します。
059 * このクラスは、DBColumn オブジェクト毎に1つ作成されます。
060 *
061 * @og.rev 4.3.3.6 (2008/11/15) 新規作成
062 * @og.rev 6.2.2.0 (2015/03/27) SelectionCellEditor I/Fを追加
063 * @og.group データ編集
064 *
065 * @version  4.0
066 * @author       Hiroki Nakamura
067 * @since    JDK5.0,
068 */
069// 8.5.5.1 (2024/02/29) spotbugs CT_CONSTRUCTOR_THROW(コンストラクタで、Excweptionを出さない) class を final にすれば、警告は消える。
070// public class Editor_DBRADIO extends AbstractEditor implements SelectionCellEditor {
071public final class Editor_DBRADIO extends AbstractEditor implements SelectionCellEditor {
072        /** このプログラムのVERSION文字列を設定します。   {@value} */
073        private static final String VERSION = "7.0.5.1 (2019/09/27)" ;
074
075        private final String query ;
076        private final String dbid ;
077        private final String lang;
078        private final boolean writable ;
079
080        /**
081         * デフォルトコンストラクター。
082         * このコンストラクターで、基本オブジェクトを作成します。
083         *
084         */
085        public Editor_DBRADIO() {
086                super();                // 6.4.1.1 (2016/01/16) PMD refactoring. It is a good practice to call super() in a constructor
087                // 4.3.4.4 (2009/01/01)
088                query   = null;
089                dbid    = null;
090                lang    = null;
091                writable  = false;
092        }
093
094        /**
095         * DBColumnオブジェクトを指定したprivateコンストラクター。
096         *
097         * @og.rev 6.0.4.0 (2014/11/28) optionAttributes は、コンストラクタで設定します。
098         * @og.rev 6.4.4.2 (2016/04/01) nameのfinal化
099         * @og.rev 7.0.5.1 (2019/09/27) optionAttributes が二重に設定されていたため、削除
100         *
101         * @param       clm     DBColumnオブジェクト
102         */
103        private Editor_DBRADIO( final DBColumn clm ) {
104        //      super();                // 6.4.1.1 (2016/01/16) PMD refactoring. It is a good practice to call super() in a constructor
105                super( clm );   // 6.4.4.2 (2016/04/01) nameのfinal化
106        //      name  = clm.getName();
107                dbid = clm.getDbid();
108                lang = clm.getLang();
109
110                query = clm.getEditorParam();
111                if( query == null || query.isEmpty() ) {
112                        final String errMsg = "DBRADIO Editor では、編集パラメータは必須です。"
113                                        + " name=[" + name + "]" + CR ;
114                        throw new HybsSystemException( errMsg );
115                }
116
117                writable = clm.isWritable();
118
119                // 6.1.1.0 (2015/01/17) Attributesの連結記述
120                attributes = new Attributes()
121                                        .set( clm.getEditorAttributes() )                               // #addAttributes( Attributes ) の代替え
122                                        .add( "class","RADIO" );
123
124                // 6.1.1.0 (2015/01/17) TagBufferの連結記述
125                // 7.0.5.1 (2019/09/27) optionAttributes が二重に設定されていたため、削除
126                tagBuffer.add( XHTMLTag.inputAttri( attributes ) );
127//                               .add( attributes.get( "optionAttributes" ) );          // 6.0.4.0 (2014/11/28)
128        }
129
130        /**
131         * 各オブジェクトから自分のインスタンスを返します。
132         * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に
133         * まかされます。
134         *
135         * @param       clm     DBColumnオブジェクト
136         *
137         * @return      CellEditorオブジェクト
138         * @og.rtnNotNull
139         */
140        public CellEditor newInstance( final DBColumn clm ) {
141                return new Editor_DBRADIO( clm );
142        }
143
144        /**
145         * データの編集用文字列を返します。
146         *
147         * ここでは、AAA:BBB:CCC:DDD という値を、$1,$2,$3,$4 に割り当てなおして、
148         * QUERYを実行します。また、$1 は、本来の値として、メニューの初期値設定等に
149         * 使用します。上記の例では、AAA が値で、それ以降は、引数になります。
150         * さらに、元の文字列"AAA:BBB:CCC:DDD"は、$0 に割り当てられます。割り当てがない
151         * 変数は、""(ゼロ文字列)として、扱われます。
152         * 又、$Cには自分自身のカラム名を割り当てます。
153         *
154         * @og.rev 4.3.4.0 (2008/12/01) $Cのカラム名置換えを追加
155         * @og.rev 6.2.2.4 (2015/04/24) getRadio廃止。getOption として、引数違いとして用意する。
156         *
157         * @param       value 入力値
158         *
159         * @return      データの編集用文字列
160         * @og.rtnNotNull
161         */
162        @Override
163        public String getValue( final String value ) {
164                // StringFormat format = new StringFormat( query,value);
165                final StringFormat format = new StringFormat( query, value, name ); // 4.3.4.0 (2008/12/01)
166                final String newQuery = format.format();
167                final String newValue = format.getValue();
168                final Selection selection = SelectionFactory.newDBRadioSelection( newQuery,dbid,lang );
169
170                final String radio ;
171                if( writable ) {
172                        radio = selection.getOption( name,newValue,true );              // 6.2.2.4 (2015/04/24)
173                }
174                else {
175                        radio = selection.getValueLabel( newValue );
176                }
177
178                // 6.1.1.0 (2015/01/17) TagBufferの連結記述
179                return new TagBuffer( "pre" )
180                                        .add( tagBuffer.makeTag() )
181                                        .addBody( radio )
182                                        .makeTag();
183        }
184
185        /**
186         * name属性を変えた、データ表示/編集用のHTML文字列を作成します。
187         * テーブル上の name に 行番号を付加して、名前_行番号 で登録するキーを作成し、
188         * リクエスト情報を1つ毎のフィールドで処理できます。
189         *
190         * ここでは、AAA:BBB:CCC:DDD という値を、$1,$2,$3,$4 に割り当てなおして、
191         * QUERYを実行します。また、$1 は、本来の値として、メニューの初期値設定等に
192         * 使用します。上記の例では、AAA が値で、それ以降は、引数になります。
193         * さらに、元の文字列"AAA:BBB:CCC:DDD"は、$0 に割り当てられます。割り当てがない
194         * 変数は、""(ゼロ文字列)として、扱われます。
195         * 又、$Cには自分自身のカラム名を割り当てます。
196         *
197         * @og.rev 4.3.4.0 (2008/12/01) $Cのカラム名置換えを追加
198         * @og.rev 6.2.2.4 (2015/04/24) getRadio廃止。getOption として、引数違いとして用意する。
199         * @og.rev 6.4.5.3 (2016/05/13) value は、コロン区切りの先頭だけ分離する。
200         *
201         * @param       row   行番号
202         * @param       value 入力値
203         *
204         * @return      データ表示/編集用の文字列
205         * @og.rtnNotNull
206         */
207        @Override
208        public String getValue( final int row,final String value ) {
209                // StringFormat format = new StringFormat( query,value);
210                final StringFormat format = new StringFormat( query, value, name ); // 4.3.4.0 (2008/12/01)
211                final String newQuery = format.format();
212                final String newValue = format.getValue();
213                final Selection selection = SelectionFactory.newDBRadioSelection( newQuery,dbid,lang );
214
215                final String radio ;
216                if( writable ) {
217                        radio = selection.getOption( name + HybsSystem.JOINT_STRING + row,newValue,true );
218                }
219                else {
220                        radio = selection.getValueLabel( newValue );            // 6.2.2.4 (2015/04/24)
221                }
222
223                // 6.1.1.0 (2015/01/17) TagBufferの連結記述
224                return new TagBuffer( "pre" )
225                                        .add( tagBuffer.makeTag() )
226                                        .addBody( radio )
227                                        .makeTag( row,newValue );                                       // 6.4.5.3 (2016/05/13)
228        }
229}