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","MergeSql|","TableName","Size","JsonName","LowerCase" }; // 5.6.6.1 (2013/07/12) 113 114 private String key = null; // "First","Last","MergeSql|","TableName","Size","JsonName","LowerCase" のどれか 115 private String value = null ; // 実行するSQL文字列 116 117 /** 118 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 119 * 120 * @og.rev 5.6.6.1 (2013/07/12) caseKey 、caseVal 属性対応 121 * 122 * @return 後続処理の指示 123 */ 124 @Override 125 public int doStartTag() { 126 // 5.6.6.1 (2013/07/12) caseKey 、caseVal 属性対応 127 // 6.0.0.1 (2014/04/25) These nested if statements could be combined 128 if( useTag() && value == null ) { return EVAL_BODY_BUFFERED ; } // Body を評価する。( extends BodyTagSupport 時) 129 130 return SKIP_BODY ; // Body を評価しない 131 } 132 133 /** 134 * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。 135 * 136 * @return 後続処理の指示(SKIP_BODY) 137 */ 138 @Override 139 public int doAfterBody() { 140 value = getBodyString().trim(); 141 return SKIP_BODY ; 142 } 143 144 /** 145 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 146 * 147 * @og.rev 5.6.6.1 (2013/07/12) caseKey 、caseVal 属性対応 148 * 149 * @return 後続処理の指示 150 */ 151 @Override 152 public int doEndTag() { 153 debugPrint(); // 4.0.0 (2005/02/28) 154 // 5.6.6.1 (2013/07/12) caseKey 、caseVal 属性対応 155 if( useTag() ) { 156 WriteTableTag writeTable = (WriteTableTag)findAncestorWithClass( this,WriteTableTag.class ); 157 if( writeTable == null ) { 158 String errMsg = "<b>" + getTagName() + "タグは、WriteTableTagの内側(要素)に記述してください。</b>"; 159 throw new HybsSystemException( errMsg ); 160 } 161 162 writeTable.addParam( new HybsEntry( key,value ) ); 163 } 164 return EVAL_PAGE ; 165 } 166 167 /** 168 * タグリブオブジェクトをリリースします。 169 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 170 * 171 */ 172 @Override 173 protected void release2() { 174 super.release2(); // 3.5.6.0 (2004/06/18) 追加(抜けていた) 175 key = null; // KEY_LIST のどれか 176 value = null ; // 実行するSQL文字列 177 } 178 179 /** 180 * 【TAG】パラメータとして渡すキー情報([First|Last|MergeSql||TableName|Size|JsonName|LowerCase])を指定しま。 181 * 182 * @og.tag 183 * WriteTable に渡すパラメータのキー情報です。 184 * writerClass によって、使用できるキーが異なります。 185 * writerClass="XML" 186 * TableName :XML 形式の ROWSET の table 属性になります。 187 * First :最初に記載して、初期処理(データクリア等)を実行させる、EXEC_SQL 情報になります。 188 * Last :最後に記載して、項目の設定(整合性登録)を行う、EXEC_SQL 情報になります。 189 * MergeSql :このSQL文で UPDATEして、結果が0件ならINSERTを行う、MERGE_SQL 情報になります。 190 * writerClass="JSON" 191 * JsonName :JSON形式で、配列をオブジェクトとしてまとめる場合に使います。 192 * LowerCase :カラム名(=パラメータ名)を小文字にする場合、true をセットします(初期値:false)。 193 * writerClass="CalcDef" 194 * Size :レコードのデータ件数(初期値:25) 195 * 196 * 値は、value 属性で指定するか、なければ BODY 部に記述します。 197 * 198 * @param prmKey パラメータとして渡すキー情報([First|Last|MergeSql||TableName|Size|JsonName|LowerCase]) 199 */ 200 public void setKey( final String prmKey ) { 201 key = nval( getRequestParameter( prmKey ),key ); 202 if( ! check( key, KEY_LIST ) ) { 203 String errMsg = "指定の値は、セットできません。key=[" + key + "]" + HybsSystem.CR 204 + "次の中から指定してください。(" + StringUtil.array2csv( KEY_LIST ) + ")" ; 205 throw new HybsSystemException( errMsg ); 206 } 207 } 208 209 /** 210 * 【TAG】パラメータとして渡す設定値を指定します(初期値:null)。 211 * 212 * @og.tag 213 * WriteTable に渡すパラメータの設定値です。 214 * First と Last を指定した場合は、XML 形式で出力する EXEC_SQL 情報になります。 215 * TableName の場合は、XML 形式の ROWSET の table 属性になります。 216 * 値は、value 属性で指定するか、なければ BODY 部に記述します。 217 * BODY 部に記述された場合は、文字列を trim() します。 218 * 設定値は、value 属性が優先です。ここの値が、null の場合は、 219 * BODY 要素を値として使用します。 220 * 221 * @param val パラメータとして渡す設定値 222 */ 223 public void setValue( final String val ) { 224 value = nval( getRequestParameter( val ),value ); 225 } 226 227 /** 228 * このオブジェクトの文字列表現を返します。 229 * 基本的にデバッグ目的に使用します。 230 * 231 * @return このクラスの文字列表現 232 */ 233 @Override 234 public String toString() { 235 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 236 .println( "VERSION" ,VERSION ) 237 .println( "key" ,key ) 238 .println( "value" ,value ) 239 .println( "KEY_LIST" ,KEY_LIST ) 240 .println( "Other..." ,getAttributes().getAttribute() ) 241 .fixForm().toString() ; 242 } 243}