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