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.hayabusa.taglib;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.hayabusa.common.HybsSystemException;
020    import org.opengion.fukurou.util.HybsEntry;
021    
022    import org.opengion.fukurou.util.StringUtil ;
023    import static org.opengion.fukurou.util.StringUtil.nval ;
024    
025    /**
026     * WriteTableTag にパラメーターを渡す為のタグクラスです?
027     *
028     * writeTable タグに対して、EXEC_SQL ????tableName??を付加することができます?
029     * WriteTable の、writerClass によって、使用できるキーが異なります?
030     * writerClass="XML"
031     * ??TableName ?XML 形式? ROWSET の table 属?になります?
032     * ??First     ?最初に記載して、?期????タクリア?を実行させる、EXEC_SQL ??になります?
033     * ??Last      ?最後に記載して??目の設?整合?登録)を行う、EXEC_SQL ??になります?
034     * ??MergeSql  ?このSQL? UPDATEして、結果が0件ならINSERTを行う、MERGE_SQL ??になります?
035     * writerClass="JSON"
036     * ??JsonName  ?JSON形式で??列をオブジェクトとしてまとめる場合に使?す?
037     * ??LowerCase ?カラ?(=パラメータ?を小文字にする場合?true をセ?しま?初期値:false)?
038     * writerClass="CalcDef"
039     * ??Size ?レコード???タ件数(初期値:25)
040     *
041     * 値は、value 属?で?するか、なければ BODY 部に記述します?
042     *
043     * tableName??は、XMLファイルのROWSET属?にセ?することで、XMLファイルの登録??ブル名を
044     * ?することができます?
045     * EXEC_SQL ??とは、タブ区?ファイルやXML形式ファイルの先?(key="First")
046     * また?、最?key="Last")に、SQL?記述することで、ファイル取り込み時?
047     * 前???後??処?る為の??です?
048     * key="MergeSql" で、MERGE_SQL ??をセ?できます?MERGE_SQL を登録すると?
049     * そ?SQL?、UPDATEして、結果が0件ならINSERTを行います?
050     *
051     * こ???は、?件登録できるため??常の writeTable タグに属?を追?ると?
052     * ?になるため??登録できる用に、?部にタグを持てる構?にします?
053     *
054     * @og.formSample
055     * ●形式?
056     *     <og:writeTableParam key="[First|Last|TableName]" >
057     *          delete from GE12 where SYSTEM_ID='**' and KBSAKU='0'
058     *     </og:writeTableParam
059     *
060     * ●body?あ?
061     *
062     * ●Tag定義??
063     *   <og:writeTableParam
064     *       key              ○?TAG】パラメータとして渡すキー??([First|Last|MergeSql|TableName|Size|JsonName|LowerCase])を指定しま???)
065     *       value              【TAG】パラメータとして渡す設定?を指定しま?初期値:null)
066     *       caseKey            【TAG】このタグ自体を利用するかど?の条件キーを指定しま?初期値:null)
067     *       caseVal            【TAG】このタグ自体を利用するかど?の条件値を指定しま?初期値:null)
068     *       debug              【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false)
069     *   >   ... Body ...
070     *   </og:writeTableParam>
071     *
072     * ●使用?
073     *     <og:writeTable ????? >
074     *         <og:writeTableParam
075     *             key  = "Tablename"  value="GE12"
076     *         />
077     *         <og:writeTableParam
078     *             key  = "First"             First:??に登録
079     *         >
080     *                      insert into GE12bk
081     *                         select * from GE12
082     *                         where SYSTEM_ID='**'
083     *         </og:writeTableParam
084     *         <og:writeTableParam
085     *             key  = "First"             First:の?番目に登録
086     *         >
087     *              delete from GE12 where SYSTEM_ID='**' and KBSAKU='0'
088     *         </og:writeTableParam
089     *         <og:writeTableParam
090     *             key  = "Last"              Last:?に登録
091     *         >
092     *              update GE12 set XXXX='YYYY' where SYSTEM_ID='**' and KBSAKU='0'
093     *         </og:writeTableParam
094     *     </og:writeTableParam
095     *
096     * @og.rev 4.0.0.0 (2005/01/31) 新規作?
097     * @og.rev 5.6.6.1 (2013/07/12) MERGE_SQL 対?
098     * @og.group ファイル出?
099     *
100     * @version  4.0
101     * @author   Kazuhiko Hasegawa
102     * @since    JDK5.0,
103     */
104    public class WriteTableParamTag extends CommonTagSupport {
105            //* こ?プログラ??VERSION??を設定します?       {@value} */
106            private static final String VERSION = "5.6.6.1 (2013/07/12)" ;
107    
108            private static final long serialVersionUID = 566120130712L ;
109    
110    //      private static final String[] KEY_LIST = new String[] { "First","Last","TableName" };
111    //      private static final String[] KEY_LIST = new String[] { "First","Last","TableName","Size" }; // 5.1.6.0 (2010/05/01)
112    //      private static final String[] KEY_LIST = new String[] { "First","Last","TableName","Size","JsonName","LowerCase" }; // 5.6.0.3 (2012/01/24)
113            private static final String[] KEY_LIST = new String[] { "First","Last","MergeSql|","TableName","Size","JsonName","LowerCase" }; // 5.6.6.1 (2013/07/12)
114    
115            private String key              = null;         // "First","Last","MergeSql|","TableName","Size","JsonName","LowerCase" のどれか
116            private String value    = null ;        // 実行するSQL??
117    
118            /**
119             * Taglibの開始タグが見つかったときに処??doStartTag() ?オーバ?ライドします?
120             *
121             * @og.rev 5.6.6.1 (2013/07/12) caseKey 、caseVal 属?対?
122             *
123             * @return      後続????
124             */
125            @Override
126            public int doStartTag() {
127                    // 5.6.6.1 (2013/07/12) caseKey 、caseVal 属?対?
128                    if( useTag() ) {
129                            if( value == null ) { return( EVAL_BODY_BUFFERED ); }   // Body を評価する? extends BodyTagSupport ?
130    //                      if( value != null ) {
131    //                              return(SKIP_BODY);                              // Body を評価しな?
132    //                      }
133    //                      else {
134    //                              return( EVAL_BODY_BUFFERED );   // Body を評価する? extends BodyTagSupport ?
135    //                      }
136                    }
137                    return ( SKIP_BODY );                                   // Body を評価しな?
138            }
139    
140            /**
141             * Taglibのタグ本体を処??doAfterBody() ?オーバ?ライドします?
142             *
143             * @return      後続????(SKIP_BODY)
144             */
145            @Override
146            public int doAfterBody() {
147                    value = getBodyString().trim();
148                    return(SKIP_BODY);
149            }
150    
151            /**
152             * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
153             *
154             * @og.rev 5.6.6.1 (2013/07/12) caseKey 、caseVal 属?対?
155             *
156             * @return      後続????
157             */
158            @Override
159            public int doEndTag() {
160                    debugPrint();           // 4.0.0 (2005/02/28)
161                    // 5.6.6.1 (2013/07/12) caseKey 、caseVal 属?対?
162                    if( useTag() ) {
163                            WriteTableTag writeTable = (WriteTableTag)findAncestorWithClass( this,WriteTableTag.class );
164                            if( writeTable == null ) {
165                                    String errMsg = "<b>こ?タグは、WriteTableTagの??(要?に記述してください?/b>";
166                                    throw new HybsSystemException( errMsg );
167                            }
168    
169                            writeTable.addParam( new HybsEntry( key,value ) );
170                    }
171                    return(EVAL_PAGE);
172            }
173    
174            /**
175             * タグリブオブジェクトをリリースします?
176             * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
177             *
178             */
179            @Override
180            protected void release2() {
181                    super.release2();               // 3.5.6.0 (2004/06/18) 追?抜けて?)
182                    key             = null;         // KEY_LIST のどれか
183                    value   = null ;        // 実行するSQL??
184            }
185    
186            /**
187             * 【TAG】パラメータとして渡すキー??([First|Last|MergeSql||TableName|Size|JsonName|LowerCase])を指定しま?
188             *
189             * @og.tag
190             * WriteTable に渡すパラメータのキー??です?
191             * writerClass によって、使用できるキーが異なります?
192             * writerClass="XML"
193             * ??TableName ?XML 形式? ROWSET の table 属?になります?
194             * ??First     ?最初に記載して、?期????タクリア?を実行させる、EXEC_SQL ??になります?
195             * ??Last      ?最後に記載して??目の設?整合?登録)を行う、EXEC_SQL ??になります?
196             * ??MergeSql  ?このSQL? UPDATEして、結果が0件ならINSERTを行う、MERGE_SQL ??になります?
197             * writerClass="JSON"
198             * ??JsonName  ?JSON形式で??列をオブジェクトとしてまとめる場合に使?す?
199             * ??LowerCase ?カラ?(=パラメータ?を小文字にする場合?true をセ?しま?初期値:false)?
200             * writerClass="CalcDef"
201             * ??Size ?レコード???タ件数(初期値:25)
202             *
203             * 値は、value 属?で?するか、なければ BODY 部に記述します?
204             *
205             * @param   prmKey パラメータとして渡すキー??([First|Last|MergeSql||TableName|Size|JsonName|LowerCase])
206             */
207            public void setKey( final String prmKey ) {
208                    key = nval( getRequestParameter( prmKey ),key );
209                    if( ! check( key, KEY_LIST ) ) {
210                            String errMsg = "??値は、セ?できません。key=[" + key + "]" + HybsSystem.CR
211                                            + "次の中から?してください?" + StringUtil.array2csv( KEY_LIST ) + ")" ;
212                            throw new HybsSystemException( errMsg );
213                    }
214            }
215    
216            /**
217             * 【TAG】パラメータとして渡す設定?を指定しま?初期値:null)?
218             *
219             * @og.tag
220             * WriteTable に渡すパラメータの設定?です?
221             * First と Last を指定した?合?、XML 形式で出力す?EXEC_SQL ??になります?
222             * TableName の場合?、XML 形式? ROWSET の table 属?になります?
223             * 値は、value 属?で?するか、なければ BODY 部に記述します?
224             * BODY 部に記述された?合?、文字??trim() します?
225             * 設定?は、value 属?が優先です?ここの値が?null の場合??
226             * BODY 要?値として使用します?
227             *
228             * @param   val パラメータとして渡す設定?
229             */
230            public void setValue( final String val ) {
231                    value = nval( getRequestParameter( val ),value );
232            }
233    
234            /**
235             * こ?オブジェクト???表現を返します?
236             * 基本???目?使用します?
237             *
238             * @return こ?クラスの??表現
239             */
240            @Override
241            public String toString() {
242                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
243                                    .println( "VERSION"             ,VERSION        )
244                                    .println( "key"                 ,key            )
245                                    .println( "value"               ,value          )
246                                    .println( "KEY_LIST"    ,KEY_LIST       )
247                                    .println( "Other..."    ,getAttributes().getAttribute() )
248                                    .fixForm().toString() ;
249            }
250    }