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.hayabusa.taglib; 017 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.hayabusa.common.HybsSystemException; 020import org.opengion.fukurou.util.HybsEntry; 021 022import org.opengion.fukurou.util.StringUtil ; 023import 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:の2番目に登録 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 */ 106public 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}