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