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
018// import org.opengion.hayabusa.common.HybsSystem;
019import org.opengion.hayabusa.db.AbstractEditor;
020import org.opengion.hayabusa.db.CellEditor;
021import org.opengion.hayabusa.db.DBColumn;
022// import org.opengion.fukurou.util.StringFormat;
023import org.opengion.fukurou.util.XHTMLTag;
024// import org.opengion.fukurou.db.ApplicationInfo;
025// import org.opengion.fukurou.db.DBUtil;
026
027/**
028 * QUERY エディターは、編集パラメータで指定された SQL文の実行結果をテキストエリアに表示する
029 * クラスで、元のValue を、$1 として使用可能です。
030 * 又、$Cで自身のカラム名が使用可能です。
031 *
032 * ここでは、AAA:BBB:CCC:DDD という値を、$1,$2,$3,$4 に割り当てなおして、
033 * QUERYを実行します。また、$1 は、本来の値として、メニューの初期値設定等に
034 * 使用します。上記の例では、AAA が値で、それ以降は、引数になります。
035 * さらに、元の文字列"AAA:BBB:CCC:DDD"は、$0 に割り当てられます。割り当てがない
036 * 変数は、""(ゼロ文字列)として、扱われます。
037 * 又、$Cには自分自身のカラム名を割り当てます。
038 *
039 *  カラムの表示に必要な属性は、DBColumn オブジェクト より取り出します。
040 * このクラスは、DBColumn オブジェクト毎に1つ作成されます。
041 *
042 * @og.rev 4.0.0.0 (2006/04/01) 新規追加
043 * @og.rev 8.5.7.0 (2024/03/29) QueryFormat を使用して共通部分の処理を行う。
044 * @og.group データ編集
045 *
046 * @version  4.0
047 * @author       Kazuhiko Hasegawa
048 * @since    JDK5.0,
049 */
050public class Editor_QUERY extends AbstractEditor {
051        /** このプログラムのVERSION文字列を設定します。   {@value} */
052        private static final String VERSION = "8.5.7.0 (2024/03/29)" ;
053
054        // 8.5.7.0 (2024/03/29) QueryFormat を使用して共通部分の処理を行う。
055//      private final String query ;
056//      private final String dbid ;
057        private final QueryFormat queryFormat;          // 8.5.7.0 (2024/03/29)
058
059//      /** コネクションにアプリケーション情報を追記するかどうか指定 */
060//      public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
061
062//      /** 3.8.7.0 (2006/12/15) アクセスログ取得の為、ApplicationInfoオブジェクトを設定 */
063//      private final ApplicationInfo appInfo;
064//      private static final String SYSTEM_ID  = HybsSystem.sys( "SYSTEM_ID" ) ;
065
066        /**
067         * デフォルトコンストラクター。
068         * このコンストラクターで、基本オブジェクトを作成します。
069         *
070         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為、ApplicationInfoオブジェクトを設定
071         * @og.rev 6.4.4.2 (2016/04/01) nameのfinal化
072         * @og.rev 8.5.7.0 (2024/03/29) QueryFormat を使用して共通部分の処理を行う。
073         */
074        public Editor_QUERY() {
075                super();                // 6.4.1.1 (2016/01/16) PMD refactoring. It is a good practice to call super() in a constructor
076                queryFormat = new QueryFormat();                // 8.5.7.0 (2024/03/29)
077//              // 4.3.4.4 (2009/01/01)
078//              query   = null;
079//              dbid    = null;
080//              appInfo = makeApplicationInfo( null );
081        //      name    = null; // 4.3.4.0 (2008/12/01)
082        }
083
084        /**
085         * DBColumnオブジェクトを指定したprivateコンストラクター。
086         *
087         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為、ApplicationInfoオブジェクトを設定
088         * @og.rev 6.4.4.2 (2016/04/01) nameのfinal化
089         * @og.rev 8.5.7.0 (2024/03/29) QueryFormat を使用して共通部分の処理を行う。
090         *
091         * @param       clm     DBColumnオブジェクト
092         */
093        private Editor_QUERY( final DBColumn clm ) {
094                super( clm );
095                queryFormat = new QueryFormat( clm.getEditorParam(),clm.getDbid(),clm.getName() );
096//              query = clm.getEditorParam();
097//              dbid  = clm.getDbid();
098                tagBuffer.add( XHTMLTag.inputAttri( attributes ) );
099//              appInfo = makeApplicationInfo( clm.getName() );
100        //      name  = clm.getName(); //4.3.4.0 (2008/12/01)
101        }
102
103//      /**
104//       * アクセスログ取得の為、ApplicationInfoオブジェクトを作成します。
105//       *
106//       * @og.rev 3.8.7.0 (2006/12/15) 新規作成
107//       * @og.rev 8.5.7.0 (2024/03/29) QueryFormat を使用して共通部分の処理を行う。
108//       *
109//       * @param       name    オブジェクト
110//       *
111//       * @return ApplicationInfoオブジェクト
112//       */
113//      private ApplicationInfo makeApplicationInfo( final String name ) {
114//              // 6.3.9.1 (2015/11/27) Found 'DD'-anomaly for variable(PMD)
115//              final ApplicationInfo infoTemp ;
116//
117//              // 3.8.7.0 (2006/12/15) アクセスログ取得の為、ApplicationInfoオブジェクトを設定
118//              if( USE_DB_APPLICATION_INFO ) {
119//                      infoTemp = new ApplicationInfo();
120//                      // ユーザーID,IPアドレス,ホスト名
121//                      infoTemp.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
122//                      // 画面ID,操作,プログラムID
123//                      infoTemp.setModuleInfo( "Editor_QUERY",null,name );
124//              }
125//              else {
126//                      infoTemp = null;                                // 6.3.9.1 (2015/11/27)
127//              }
128//
129//              return infoTemp ;
130//      }
131
132        /**
133         * 各オブジェクトから自分のインスタンスを返します。
134         * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に
135         * まかされます。
136         *
137         * @param       clm     DBColumnオブジェクト
138         *
139         * @return      CellEditorオブジェクト
140         * @og.rtnNotNull
141         */
142        public CellEditor newInstance( final DBColumn clm ) {
143                return new Editor_QUERY( clm );
144        }
145
146        /**
147         * データの編集用文字列を返します。
148         *
149         * ここでは、AAA:BBB:CCC:DDD という値を、$1,$2,$3,$4 に割り当てなおして、
150         * QUERYを実行します。また、$1 は、本来の値として、メニューの初期値設定等に
151         * 使用します。上記の例では、AAA が値で、それ以降は、引数になります。
152         * さらに、元の文字列"AAA:BBB:CCC:DDD"は、$0 に割り当てられます。割り当てがない
153         * 変数は、""(ゼロ文字列)として、扱われます。
154         * 又、$Cには自分自身のカラム名を割り当てます。
155         *
156         * 8.5.6.1 (2024/03/29)
157         *  row は、DB検索には使用していないので、ソースを合成する。
158         *
159         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為、ApplicationInfoオブジェクトを設定
160         * @og.rev 4.3.4.0 (2008/12/01) $C対応
161         * @og.rev 5.7.9.0 (2014/08/08) DBUtil.dbExecute 実行時エラーを回避
162         * @og.rev 6.4.5.3 (2016/05/13) value は、コロン区切りの先頭だけ分離する。
163         * @og.rev 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD ソースの重複処理
164         * @og.rev 8.5.7.0 (2024/03/29) QueryFormat を使用して共通部分の処理を行う。
165         *
166         * @param       value 入力値
167         *
168         * @return      データの編集用文字列
169         */
170        @Override
171        public String getValue( final String value ) {
172                final String rtnVal = queryFormat.getValue( value );
173                return super.getValue( rtnVal );
174
175//              // StringFormat format = new StringFormat( query,value );
176//              final StringFormat format = new StringFormat( query,value, name ); // 4.3.4.0 (2008/12/01)
177//              final String str = format.format();
178//
179//              // 5.7.9.0 (2014/08/08) DBUtil.dbExecute 実行時エラーを回避
180//              // 8.5.6.1 (2024/03/29) 引数が null の場合は、""(ゼロ文字列)を返す。
181////            String rtnVal = value == null ? "" : StringFormat.getValue( value ) ;   // 6.4.5.3 (2016/05/13) 本来、QUERYで変換すべきだが、元の値を設定する。
182//              String rtnVal = StringFormat.getValue( value ) ;                                                // 6.4.5.3 (2016/05/13) 本来、QUERYで変換すべきだが、元の値を設定する。
183//              try {
184//                      final String[][] rtn = DBUtil.dbExecute( str,null,appInfo,dbid );
185//                      rtnVal = rtn == null || rtn[0] == null || rtn[0][0] == null ? "" : rtn[0][0];           // 6.4.2.1 (2016/02/05) PMD refactoring. Useless parentheses.
186//              }
187//              catch( final RuntimeException ex ) {
188//                      final String errMsg = "SQL文の処理に失敗しました。" + CR
189//                                                              + "query=" + query + " , inValue=" + value + " , name=" + name
190//                                                              + CR
191//                                                              + ex.getMessage() ;
192//                      System.err.println( errMsg );
193//              }
194//
195//              return super.getValue( rtnVal );
196        }
197
198        /**
199         * name属性を変えた、データ表示/編集用のHTML文字列を作成します。
200         * テーブル上の name に 行番号を付加して、名前_行番号 で登録するキーを作成し、
201         * リクエスト情報を1つ毎のフィールドで処理できます。
202         *
203         * ここでは、AAA:BBB:CCC:DDD という値を、$1,$2,$3,$4 に割り当てなおして、
204         * QUERYを実行します。また、$1 は、本来の値として、メニューの初期値設定等に
205         * 使用します。上記の例では、AAA が値で、それ以降は、引数になります。
206         * さらに、元の文字列"AAA:BBB:CCC:DDD"は、$0 に割り当てられます。割り当てがない
207         * 変数は、""(ゼロ文字列)として、扱われます。
208         * 又、$Cには自分自身のカラム名を割り当てます。
209         *
210         * 8.5.6.1 (2024/03/29)
211         *  row は、DB検索には使用していないので、ソースを合成する。
212         *
213         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為、ApplicationInfoオブジェクトを設定
214         * @og.rev 4.3.4.0 (2008/12/01) $C対応
215         * @og.rev 5.7.9.0 (2014/08/08) DBUtil.dbExecute 実行時エラーを回避
216         * @og.rev 6.4.5.3 (2016/05/13) value は、コロン区切りの先頭だけ分離する。
217         * @og.rev 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD ソースの重複処理
218         * @og.rev 8.5.7.0 (2024/03/29) QueryFormat を使用して共通部分の処理を行う。
219         *
220         * @param       row   行番号
221         * @param       value 入力値
222         *
223         * @return      データ表示/編集用の文字列
224         */
225        @Override
226        public String getValue( final int row,final String value ) {
227                final String rtnVal = queryFormat.getValue( value );
228                return super.getValue( row,rtnVal );
229
230//              // StringFormat format = new StringFormat( query,value );
231//              final StringFormat format = new StringFormat( query,value,name ); // 4.3.4.0 (2008/12/01)
232//              final String str = format.format();
233//
234//              // 5.7.9.0 (2014/08/08) DBUtil.dbExecute 実行時エラーを回避
235//              // 8.5.6.1 (2024/03/29) 引数が null の場合は、""(ゼロ文字列)を返す。
236////            String rtnVal = value == null ? "" : StringFormat.getValue( value ) ;   // 6.4.5.3 (2016/05/13) 本来、QUERYで変換すべきだが、元の値を設定する。
237//              String rtnVal = StringFormat.getValue( value ) ;                                                // 6.4.5.3 (2016/05/13) 本来、QUERYで変換すべきだが、元の値を設定する。
238//              try {
239//                      final String[][] rtn = DBUtil.dbExecute( str,null,appInfo,dbid );
240//                      rtnVal = rtn == null || rtn[0] == null || rtn[0][0] == null ? "" : rtn[0][0];           // 6.4.2.1 (2016/02/05) PMD refactoring. Useless parentheses.
241//              }
242//              catch( final RuntimeException ex ) {
243//                      final String errMsg = "SQL文の処理に失敗しました。" + CR
244//                                                              + "row=" + row + " , query=" + query + " , inValue=" + value + " , name=" + name
245//                                                              + CR
246//                                                              + ex.getMessage() ;
247//                      System.err.println( errMsg );
248//              }
249//
250//              // 8.5.6.1 (2024/03/29) row は、DB検索には使用していないので、ソースを合成する。
251//              return row < 0 ? super.getValue( rtnVal ) : super.getValue( row,rtnVal );
252////            return super.getValue( row,rtnVal );
253        }
254}