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.Attributes; 020import org.opengion.fukurou.util.StringUtil; 021import org.opengion.fukurou.util.ToString; // 6.1.1.0 (2015/01/17) 022 023import static org.opengion.fukurou.util.StringUtil.nval ; 024 025/** 026 * 検索結果の DBTableModelオブジェクトのカラム値を操作(設定、変換、ADDなど)するタグです。 027 * 028 * entry タグの子タグとして使用します。entryタグと、このcolumnSetタグの command 029 * が同じ場合のみ、実行されます。 030 * 処理方法は、action で指定します。 031 * 032 * @og.formSample 033 * ●形式:<og:entry command="…"> 034 * <og:setColumn 035 * command ="…" : entryタグのcommandと一致する場合に実行 036 * columnId ="…" : 処理を行うカラムIDを指定(必須,複数指定可) 037 * action ="…" : 処理方法を指定 038 * value ="…" : 設定する値を指定(action="TBLSET"のみ[カラム名]使用可能) 039 * conditionKey ="…" : 条件判定するカラムIDを指定(初期値は columnId ) 040 * conditionList ="…" : 条件判定する値のリストを、"|"で区切って登録(初期値は、無条件) 041 * /> 042 * </og:entry> 043 * ●body:なし 044 * 045 * ●Tag定義: 046 * <og:columnSet 047 * command 【TAG】コマンド (INSERT/COPY/MODIFY/DELETE/ENTRY/CHANGE/RESET/ALLRESET/ALLACTION/RESETDATA/INSERTONE/REALDELETE/REQENTRY)を設定します 048 * columnId ○【TAG】カラムIDをセットします(複数指定時は、CSV形式で設定する)(必須)。 049 * value 【TAG】値をセットします 050 * action 【TAG】アクション(DEFAULT/CLEAR/ADD/SET/NULLSET/LOWER/UPPER/COPY/TBLSET/WRTCTRL/DBMENU/REQSET/SEQSET)をセットします 051 * conditionKey 【TAG】条件判定するカラムIDを指定します(初期値は columnId ) 052 * conditionList 【TAG】条件判定する値のリストを、"|"で区切って登録します(初期値:無条件) 053 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 5.7.7.2 (2014/06/20) 054 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 5.7.7.2 (2014/06/20) 055 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20) 056 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 5.7.7.2 (2014/06/20) 057 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 058 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 059 * /> 060 * 061 * ●使用例 062 * <og:entry command="{@command}" > 063 * <og:columnSet command="{@command}" columnId="ECNO" action="CLEAR" /> 064 * <og:columnSet command="{@command}" columnId="JYOKYO" action="SET" value="1" /> 065 * </og:entry> 066 * 067 * <og:entry command="MODIFY" rows="1" > 068 * <og:columnSet command="MODIFY" columnId="key" action="TBLSET" value ="[key][lang]"/> 069 * </og:entry> 070 * 071 * command属性 は、entryタグのcommand属性と同一の場合のみ、処理します。 072 * [command属性] 073 * INSERT 新規 074 * COPY 複写 075 * MODIFY 変更 076 * DELETE 削除 077 * ENTRY エントリー 078 * CHANGE チェンジ 079 * RESET リセット 080 * ALLRESET 全件リセット 081 * ALLACTION オールアクション 082 * RESETDATA リセットデータ 083 * INSERTONE 新規(1行のみ) 084 * REALDELETE 物理削除 085 * REQENTRY リクエスト変数設定 086 * 087 * [action属性] 088 * DEFAULT カラムリソースで定義した初期値をセットします。 089 * CLEAR 値をクリア(ゼロストリング "" )します。 090 * ADD 現在の値を +1 します。 0 ⇒ 1 , A ⇒ B , 9 ⇒ 10。value属性と併用すれば、指定の値を加算できます。 091 * SET value で設定した値を 新しい値として登録します。 092 * NULLSET 元の値が NULL の場合だけ、value で設定した新しい値を登録します。 093 * LOWER 小文字に変換します。 094 * UPPER 大文字に変換します。 095 * COPY value にコピー元のカラムIDをセットすれば、その値を代入します。 096 * TBLSET DBTableModel の内容を取り込んで指定の columnId カラムに設定します。 097 * [カラム名] で指定できます。 098 * また、これは文字列を解析して、 value を作成しますので,文字列連結等に使用できます。 099 * WRTCTRL writableControl を使用したカラムデータの先頭アンダーバーを削除します。 100 * DBMENU DBMENUでパラメータ設定(コロン連結文字)を使用したカラムデータの先頭データのみにします。 101 * REQSET valueで指定したカラムの値をキーに、リクエスト変数から値を取出し、セットします。 102 * SEQSET valueの初期値を利用して、1レコードごとに、+1した値をセットします。 103 * PREFIX valueの値を後ろから検索し、指定のカラム値の前半部分を取得します(記号は含みません)。 104 * SUFIX valueの値を後ろから検索し、指定のカラム値の後半部分を取得します(記号は含みません)。 105 * その他 カラムのDBType の valueAction メソッドを呼び出します。自由に設定可能です。 106 * 107 * @og.group 画面登録 108 * 109 * @version 4.0 110 * @author Kazuhiko Hasegawa 111 * @since JDK5.0, 112 */ 113public class ColumnSetTag extends CommonTagSupport { 114 /** このプログラムのVERSION文字列を設定します。 {@value} */ 115 private static final String VERSION = "6.7.4.1 (2017/02/17)" ; 116 private static final long serialVersionUID = 674120170217L ; 117 118 private String columnId ; 119 private String conditionKey ; 120 121 /** 122 * デフォルトコンストラクター 123 * 124 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 125 */ 126 public ColumnSetTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 127 128 /** 129 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 130 * 131 * @og.rev 3.6.0.6 (2004/10/22) columnNo に伴なう削除 132 * @og.rev 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加 133 * 134 * @return 後続処理の指示(SKIP_BODY) 135 */ 136 @Override 137 public int doStartTag() { 138 // 5.7.7.2 (2014/06/20) caseKey,caseVal,caseNN,caseNull 属性を追加 139 if( useTag() ) { 140 final EntryTag entry = (EntryTag)findAncestorWithClass( this,EntryTag.class ); 141 if( entry == null ) { 142 final String errMsg = "<b>" + getTagName() + "タグは、EntryTag のBODY部に記述される必要があります。</b>"; 143 throw new HybsSystemException( errMsg ); 144 } 145 146 final Attributes standardAttri = getAttributes(); 147 final String[] clms = StringUtil.csv2Array( columnId ); 148 for( int i=0; i<clms.length; i++ ) { 149 // 6.1.1.0 (2015/01/17) Attributesの連結記述 150 entry.setAttributes( 151 new Attributes( standardAttri ) 152 .set( "columnId" , clms[i] ) 153 .set( "conditionKey", nval( conditionKey,clms[i] ) ) // conditionKey が null の場合は、columnId が設定される。 154 ); 155 156 } 157 } 158 159 return SKIP_BODY ; 160 } 161 162 /** 163 * タグリブオブジェクトをリリースします。 164 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 165 * 166 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 167 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 168 * @og.rev 3.6.0.6 (2004/10/22) columnNo に伴なう変更 169 * 170 */ 171 @Override 172 protected void release2() { 173 super.release2(); 174 columnId = null; 175 conditionKey = null; 176 } 177 178 /** 179 * 【TAG】コマンド (INSERT,COPY,MODIFY,DELETE,ENTRY,CHANGE,RESET,ALLACTION)を設定します。 180 * 181 * @og.tag 182 * 上位の EntryTag のコマンドと一致した場合のみ、処理されます。 183 * ここでは、コマンド文字列の整合性チェックは行っていません。 184 * 185 * @param command コマンド 186 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.EntryTag.CMD_INSERT">コマンド定数</a> 187 */ 188 public void setCommand( final String command ) { 189 set( "command",getRequestParameter( command ) ); 190 } 191 192 /** 193 * 【TAG】値をセットします。 194 * 195 * @og.tag 196 * 設定する値をセットします。 197 * 曖昧検索可能フィールド(aimai)の影響で、パラメータに、"%" がくるので、前後の "%" を削除します。 198 * 今は、"%" を前後にセットする方法は、ありません(無条件削除のみ)。 199 * 200 * @og.rev 6.7.4.1 (2017/02/17) 曖昧検索可能フィールドで、"%" がそのままセットされてしまうため、削除します。 201 * 202 * @param value 値 203 */ 204 public void setValue( final String value ) { 205 206 String reqVal = getRequestParameter( value ); 207 208 if( reqVal != null ) { 209 int len = reqVal.length(); 210 if( len > 0 && reqVal.charAt(0) == '%' ) { 211 reqVal = reqVal.substring(1); // 先頭の "%" を削除 212 len-- ; 213 } 214 215 if( len > 0 && reqVal.charAt(len-1) == '%' ) { 216 reqVal = reqVal.substring( 0,len-1 ); // 末尾の "%" を削除 217 } 218 } 219 220 set( "value" , reqVal ); 221 } 222 223 /** 224 * 【TAG】アクション(DEFAULT/CLEAR/ADD/SET/NULLSET/LOWER/UPPER/COPY/TBLSET/WRTCTRL/DBMENU/REQSET/SEQSET/PREFIX/SUFIX)をセットします。 225 * 226 * @og.tag 227 * ここでは、アクション文字列の整合性チェックを行っておりません。 228 * 229 * DEFAULT カラムリソースで定義した初期値をセットします。 230 * CLEAR 値をクリア(ゼロストリング "" )します。 231 * ADD 現在の値を +1 します。 0 ⇒ 1 , A ⇒ B , 9 ⇒ 10。value属性と併用すれば、指定の値を加算できます。 232 * SET value で設定した値を 新しい値として登録します。 233 * NULLSET 元の値が NULL の場合だけ、value で設定した新しい値を登録します。 234 * LOWER 小文字に変換します。 235 * UPPER 大文字に変換します。 236 * COPY value にコピー元のカラムIDをセットすれば、その値を代入します。 237 * TBLSET DBTableModel の内容を取り込んで指定の columnId カラムに設定します。[カラム名] で指定できます。 238 * WRTCTRL writableControl を使用したカラムデータの先頭アンダーバーを削除します。 239 * DBMENU DBMENUでパラメータ設定(コロン連結文字)を使用したカラムデータの先頭データのみにします。 240 * REQSET valueで指定したカラムの値をキーに、リクエスト変数から値を取出し、セットします。 241 * SEQSET valueの初期値を利用して、1レコードごとに、+1した値をセットします。 242 * PREFIX valueの値を後ろから検索し、指定のカラム値の前半部分を取得します(記号は含みません)。 243 * SUFIX valueの値を後ろから検索し、指定のカラム値の後半部分を取得します(記号は含みません)。 244 * その他 カラムのDBType の valueAction メソッドを呼び出します。自由に設定可能です。 245 * 246 * @param action アクション文字列 247 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.EntryTag.ACT_DEFAULT">アクション定数</a> 248 */ 249 public void setAction( final String action ) { 250 set( "action",getRequestParameter( action ) ); 251 } 252 253 /** 254 * 【TAG】カラムIDをセットします(複数指定時は、CSV形式で設定する)。 255 * 256 * @og.tag 257 * 処理を適用するカラムIDを指定します。 258 * 全く同じ内容を設定する場合には、カラム名をCSV形式(CSV形式)で 259 * 複数指定することが可能です。 260 * 261 * @og.rev 3.6.0.6 (2004/10/22) columnNo に伴なう変更 262 * 263 * @param clmid カラムID 264 */ 265 public void setColumnId( final String clmid ) { 266 columnId = getRequestParameter( clmid ); 267 } 268 269 /** 270 * 【TAG】条件判定するカラムIDを指定します(初期値:null)。 271 * 272 * @og.tag 273 * 指定のカラムIDの値と、conditionList の値を比較して、 274 * 存在する場合は、action処理を実行します。 275 * 例えば、初期値設定(action="DEFAULT")で、値が "0" の場合だけ適用するような 276 * ケースに使用できます。 277 * 指定しない場合は、columnId と同じキーになります。 278 * 注意:columnId は、CSV形式で複数同時に指定できます。その場合は、 279 * conditionKey には、複数設定する機能はありませんので、全カラムに 280 * 同一カラムを使用する場合は、conditionKey に値を設定できます。 281 * 値を設定しない場合は、自動的に、columnId と同一になります。 282 * 283 * @og.rev 3.6.0.6 (2004/10/22) 新規追加 284 * 285 * @param key カラムID 286 * @see #setConditionList( String ) 287 */ 288 public void setConditionKey( final String key ) { 289 conditionKey = nval( getRequestParameter( key ),null ) ; 290 } 291 292 /** 293 * 【TAG】条件判定する値のリストを、"|"で区切って登録します(初期値:無条件)。 294 * 295 * @og.tag 296 * conditionKey とペアで指定します。ここには、カラムの設定値のリストを 297 * 指定することで、複数条件(OR結合)での比較を行い、リストにカラム値が 298 * 存在する場合のみ、action処理を実行します。 299 * 設定しない場合は、無条件に実行します。 300 * 301 * @og.rev 3.6.0.6 (2004/10/22) 新規追加 302 * 303 * @param list 条件判定する値("|"区切) 304 * @see #setConditionKey( String ) 305 */ 306 public void setConditionList( final String list ) { 307 set( "conditionList","|" + getRequestParameter( list ) + "|" ); 308 } 309 310 /** 311 * 【TAG】(通常は使いません)カラムIDが存在しないときに無視するかどうかを指定します(初期値:true)。 312 * 313 * @og.tag 314 * カラムセットする場合は、DBTableModel に存在するカラムに対してのみ、 315 * 処理を適用するべきで、通常存在しないカラムを使用した場合は、Exception が 316 * throw されます。(strictCheck="true" 初期値の動作です。) 317 * ところが、動的テーブル検索などでカラムが不特定な場合、DBTableModel に 318 * 存在しない場合に、無視したい場合があります。その場合は、strictCheck="false" 319 * に設定すると、カラムが存在しない場合は、エラーにせず、無視します。 320 * 初期値は、true:厳格に処理する です。 321 * 322 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 323 * 324 * @param strict 厳格処理 [true:厳格に処理する/false:エラーを無視する] 325 */ 326 public void setStrictCheck( final String strict ) { 327 set( "strictCheck",getRequestParameter( strict ) ); 328 } 329 330 /** 331 * このオブジェクトの文字列表現を返します。 332 * 基本的にデバッグ目的に使用します。 333 * 334 * @return このクラスの文字列表現 335 * @og.rtnNotNull 336 */ 337 @Override 338 public String toString() { 339 return ToString.title( this.getClass().getName() ) 340 .println( "VERSION" ,VERSION ) 341 .println( "columnId" ,columnId ) 342 .println( "conditionKey",conditionKey ) 343 .println( "Other..." ,getAttributes().getAttribute() ) 344 .fixForm().toString() ; 345 } 346}