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                                    String errMsg = "<b>" + getTagName() + "タグは、WriteTableTagのå†??(要ç´?に記述してくださいã€?/b>";
169                                    throw new HybsSystemException( errMsg );
170                            }
171    
172                            writeTable.addParam( new HybsEntry( key,value ) );
173                    }
174                    return(EVAL_PAGE);
175            }
176    
177            /**
178             * タグリブオブジェクトをリリースしますã?
179             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
180             *
181             */
182            @Override
183            protected void release2() {
184                    super.release2();               // 3.5.6.0 (2004/06/18) 追åŠ?抜けてã�?�Ÿ)
185                    key             = null;         // KEY_LIST のどれか
186                    value   = null ;        // 実行するSQLæ–?­—å?
187            }
188    
189            /**
190             * 【TAG】パラメータとして渡すキーæƒ??([First|Last|MergeSql||TableName|Size|JsonName|LowerCase])を指定しまã€?
191             *
192             * @og.tag
193             * WriteTable に渡すパラメータのキーæƒ??ですã?
194             * writerClass によって、使用できるキーが異なりますã?
195             * writerClass="XML"
196             * ã€??TableName ?šXML 形式ã? ROWSET の table 属æ?になりますã?
197             * ã€??First     ?š最初に記載して、å?期å?ç�?ãƒ??タクリアç­?を実行させる、EXEC_SQL æƒ??になりますã?
198             * ã€??Last      ?š最後に記載してã€??目の設å®?整合æ?登録)を行う、EXEC_SQL æƒ??になりますã?
199             * ã€??MergeSql  ?šこのSQLæ–?�§ UPDATEして、結果が0件ならINSERTを行う、MERGE_SQL æƒ??になりますã?
200             * writerClass="JSON"
201             * ã€??JsonName  ?šJSON形式でã€??列をオブジェクトとしてまとめる場合に使ã�?�¾すã?
202             * ã€??LowerCase ?šカラãƒ?��(=パラメータå�?を小文字にする場合ã?true をセãƒ?ƒˆしまã�?初期値:false)ã€?
203             * writerClass="CalcDef"
204             * ã€??Size ?šレコードã?ãƒ??タ件数(初期値:25)
205             *
206             * 値は、value 属æ?でæŒ?®šするか、なければ BODY 部に記述しますã?
207             *
208             * @param   prmKey パラメータとして渡すキーæƒ??([First|Last|MergeSql||TableName|Size|JsonName|LowerCase])
209             */
210            public void setKey( final String prmKey ) {
211                    key = nval( getRequestParameter( prmKey ),key );
212                    if( ! check( key, KEY_LIST ) ) {
213                            String errMsg = "æŒ?®šã?値は、セãƒ?ƒˆできません。key=[" + key + "]" + HybsSystem.CR
214                                            + "次の中からæŒ?®šしてくださいã€?" + StringUtil.array2csv( KEY_LIST ) + ")" ;
215                            throw new HybsSystemException( errMsg );
216                    }
217            }
218    
219            /**
220             * 【TAG】パラメータとして渡す設定å?を指定しまã�?初期値:null)ã€?
221             *
222             * @og.tag
223             * WriteTable に渡すパラメータの設定å?ですã?
224             * First と Last を指定したå?合ã?、XML 形式で出力すã‚?EXEC_SQL æƒ??になりますã?
225             * TableName の場合ã?、XML 形式ã? ROWSET の table 属æ?になりますã?
226             * 値は、value 属æ?でæŒ?®šするか、なければ BODY 部に記述しますã?
227             * BODY 部に記述されたå?合ã?、文字å?ã‚?trim() しますã?
228             * 設定å?は、value 属æ?が優先ですã?ここの値がã?null の場合ã?ã€?
229             * BODY 要ç´?‚’値として使用しますã?
230             *
231             * @param   val パラメータとして渡す設定å?
232             */
233            public void setValue( final String val ) {
234                    value = nval( getRequestParameter( val ),value );
235            }
236    
237            /**
238             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
239             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
240             *
241             * @return こã?クラスのæ–?­—å?表現
242             */
243            @Override
244            public String toString() {
245                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
246                                    .println( "VERSION"             ,VERSION        )
247                                    .println( "key"                 ,key            )
248                                    .println( "value"               ,value          )
249                                    .println( "KEY_LIST"    ,KEY_LIST       )
250                                    .println( "Other..."    ,getAttributes().getAttribute() )
251                                    .fixForm().toString() ;
252            }
253    }