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