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.hayabusa.resource.GUIInfo; 021import static org.opengion.fukurou.util.StringUtil.nval ; 022import org.opengion.fukurou.util.StringUtil ; 023 024import javax.servlet.ServletRequest ; 025import javax.servlet.http.HttpSession ; 026 027import java.util.Map; 028import java.util.HashMap; 029 030/** 031 * 戻るリンクで戻る場合に使用する、検索時の request 情報をキャッシュするタグです(通常はquery.jsp に組込み)。 032 * 033 * requestタグをキャッシュすることにより、 再検索時や、各画面遷移時の項目の持ち回りを行います。 034 * command = "NEW" で、キャッシュし、"RENEW" で、取り出します。 035 * 暫定的にこのタグは、共通JSPファイルに設定し、HTMLそのもののキャッシュ制御も 036 * 行うように設定しています。 037 * 038 * @og.formSample 039 * ●形式:<og:requestCache cacheKey="[・・・]" /> 040 * ●body:なし 041 * 042 * ●Tag定義: 043 * <og:requestCache 044 * cacheKey 【TAG】キャッシュするサブキーを指定します(初期値:"") 045 * action 【TAG】アクション(SET,DELETE)をセットします 046 * keys 【TAG】リンク先に渡すキーを指定します 047 * vals 【TAG】keys属性に対応する値をCSV形式で複数指定します 048 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 049 * /> 050 * 051 * ●使用例 052 * <og:requestCache 053 * cacheKey="{@GUI.KEY}" キャッシュするサブキーを指定します。 054 * /> 055 * 056 * @og.group 画面制御 057 * 058 * @version 4.0 059 * @author Kazuhiko Hasegawa 060 * @since JDK5.0, 061 */ 062public class RequestCacheTag extends CommonTagSupport { 063 //* このプログラムのVERSION文字列を設定します。 {@value} */ 064 private static final String VERSION = "5.6.8.1 (2013/09/13)" ; 065 066 private static final long serialVersionUID = 568120130913L ; 067 068 private static final String CACHE_KEY = HybsSystem.REQ_CACHE_KEY; 069 070 /** command 引数に渡す事の出来る アクションコマンド ニュー {@value} */ 071 public static final String CMD_NEW = "NEW" ; 072 /** command 引数に渡す事の出来る アクションコマンド レニュー {@value} */ 073 public static final String CMD_RENEW = "RENEW" ; 074 /** command 引数に渡す事の出来る アクションコマンド イニット {@value} */ 075 public static final String CMD_INIT = "INIT" ; 076 /** command 引数に渡す事の出来る アクションコマンド リセット {@value} */ 077 public static final String CMD_RESET = "RESET" ; // 3.5.5.0 (2004/03/12) 追加 078 079 // 3.8.8.0 (2006/12/22) 080 /** action 引数に渡す事の出来る アクション 設定 {@value} */ 081 public static final String ACT_SET = "SET" ; 082 /** action 引数に渡す事の出来る アクション 削除 {@value} */ 083 public static final String ACT_DELETE = "DELETE" ; 084 085 /** action 引数に渡す事の出来る アクション リスト */ 086 private static final String[] ACTION_LIST = new String[] { ACT_SET , ACT_DELETE }; 087 088 private String cacheKey = ""; 089 private String action = null; 090 private String[] keys = null; 091 private String[] vals = null; 092 093 /** 094 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 095 * 096 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 097 * @og.rev 3.1.1.2 (2003/04/04) 継承元を、CommonTagSupport から TagSupport に変更する。 098 * @og.rev 3.1.3.0 (2003/04/10) Cache-Control ヘッダーのセットを削除します。 099 * @og.rev 3.1.6.0 (2003/04/24) キャッシュすべき値を、キー毎に指定できるように、cacheKey 属性を追加。 100 * @og.rev 3.1.7.0 (2003/05/02) command=INIT または、null のときに、キャッシュを削除するように変更する。 101 * @og.rev 3.1.7.0 (2003/05/02) command=INIT または、null のときに、キャッシュを削除するように変更する。 102 * @og.rev 3.1.8.0 (2003/05/16) BACK_GAMENID のキャッシュの設定先を変更する。 103 * @og.rev 3.5.1.0 (2003/10/03) GAMENID 情報を取得し、backGamenIdSetメソッドに渡すように変更。 104 * @og.rev 3.7.0.3 (2005/03/01) BACK_ROW 情報を取得し、backGamenIdSetメソッドに渡すように変更。 105 * @og.rev 4.0.1.0 (2007/12/17) BackAddress対応 106 * 107 * @return 後続処理の指示 108 */ 109 @Override 110 public int doEndTag() { 111 debugPrint(); // 4.0.0 (2005/02/28) 112 // request をキャッシュするタグなので、直接取り込む。 113 ServletRequest request = pageContext.getRequest(); 114 String command = request.getParameter( "command" ); 115 String backGamenId = request.getParameter( "BACK_GAMENID" ); 116 String gamenId = request.getParameter( "GAMENID" ); // 3.5.1.0 (2003/10/03) 117 String backRow = request.getParameter( "BACK_ROW" ); // 3.7.0.3 (2005/03/01) 118 String backAdrs = request.getParameter( "BACK_ADDRESS" ); // 4.0.1.0 (2007/12/17) 119 120 commandExec( command,request ); 121 backGamenIdSet( command,backGamenId,gamenId,backRow,backAdrs ); // 4.0.1.0 (2007/12/17) 122 123 return EVAL_PAGE ; // ページの残りを評価する。 124 } 125 126 /** 127 * タグリブオブジェクトをリリースします。 128 * 129 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 130 * 131 * @og.rev 3.5.5.3 (2004/04/09) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 132 * @og.rev 3.8.8.0 (2006/12/22) action,keys,vals 追加 133 * 134 */ 135 @Override 136 protected void release2() { 137 super.release2(); 138 cacheKey = ""; 139 action = null; 140 keys = null; 141 vals = null; 142 } 143 144 /** 145 * アクションを実行します。 146 * アクションは,指定のアクションコマンドに対応する処理を入力データに 147 * 対して行います。 148 * 149 * @og.rev 3.1.1.2 (2003/04/04) 継承元を、CommonTagSupport から TagSupport に変更する。 150 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。HybsRequestWrapper 廃止。直接 Mapでキャッシュする。 151 * @og.rev 3.1.6.0 (2003/04/24) キャッシュすべき値を、キー毎に指定できるように、cacheKey 属性を追加。 152 * @og.rev 3.1.7.0 (2003/05/02) RENEW のときに、キャッシュを削除しないように変更する。 153 * @og.rev 3.1.7.0 (2003/05/02) command=INIT または、null のときに、キャッシュを削除するように変更する。 154 * @og.rev 3.5.5.0 (2004/03/12) command=RESET時にも、キャッシュを取り出すように変更する。 155 * @og.rev 3.8.6.3 (2006/11/30) debug 処理を追加 156 * @og.rev 3.8.8.0 (2006/12/22) actionCacheData 処理を追加 157 * @og.rev 5.6.8.1 (2013/09/13) UserInfo に、request 情報を渡してキャッシュ対象情報をセットします。 158 * 159 * @param command アクションコマンド(public static final 宣言されている文字列) 160 * @param request リクエストオブジェクト 161 */ 162 @SuppressWarnings(value={"unchecked"}) 163 private void commandExec( final String command,final ServletRequest request ) { 164 String key = CACHE_KEY + cacheKey ; 165 HttpSession session = pageContext.getSession(); 166 String msg = null; // 3.8.6.3 (2006/11/30) 167 168 if( CMD_NEW.equals( command ) ) { 169 Map<String,String[]> map = new HashMap<String,String[]>( request.getParameterMap() ); 170 map = actionCacheData( map ); 171 session.setAttribute( key,map ); 172 173 // 5.6.8.1 (2013/09/13) UserInfo に、request 情報を渡してキャッシュ対象情報をセットします。 174 getUser().setLastRequestMap( map ); 175 msg = "command=[NEW] CACHE=[Set]" ; 176 } 177 else if( cacheKey.length() > 0 && 178 ( CMD_RENEW.equals( command ) || CMD_RESET.equals( command ) ) ) { 179 Map<String,String[]> map = (Map<String,String[]>)session.getAttribute( key ); 180 if( map != null ) { 181 map = actionCacheData( map ); 182 session.setAttribute( CACHE_KEY,map ); // 共有キャッシュにセット 183 msg = "command=[" + command + "] CACHE=[Load]" ; 184 } 185 } 186 else if( CMD_INIT.equals( command ) || command == null || command.length() == 0 ) { 187 session.removeAttribute( key ); 188 msg = "command=[" + command + "] CACHE=[remove]" ; 189 } 190 191 // 3.8.6.3 (2006/11/30) 192 if( isDebug() ) { 193 jspPrint( msg + "<br />" ); 194 } 195 } 196 197 /** 198 * キャッシュデータに対して、追記、削除を行います。 199 * 200 * @og.rev 3.8.8.0 (2006/12/22) 新規追加 201 * 202 * @param map キャッシュデータ 203 * 204 * @return 追記、削除のキャッシュデータのマップ(入力のMapと同一) 205 */ 206 private Map<String,String[]> actionCacheData( final Map<String,String[]> map ) { 207 if( action != null && map != null && keys != null && vals != null ) { 208 if( ACT_SET.equalsIgnoreCase( action ) ) { 209 for( int i=0; i<keys.length; i++ ) { 210 String[] val = new String[] { vals[i] } ; 211 map.put( keys[i],val ); 212 } 213 } 214 else if( ACT_DELETE.equalsIgnoreCase( action ) ) { 215 for( int i=0; i<keys.length; i++ ) { 216 map.remove( keys[i] ); 217 } 218 } 219 } 220 221 return map ; 222 } 223 224 /** 225 * BACK_GAMENID のキャッシュの設定先を変更します。 226 * 227 * @og.rev 3.1.8.0 (2003/05/16) BACK_GAMENID のキャッシュの設定先を変更する。 228 * @og.rev 3.5.1.0 (2003/10/03) BACK_GAMENID のリクエストがNULLのときの処理(バグ)訂正。 229 * @og.rev 3.7.0.3 (2005/03/01) BACK_ROW 情報を取得し、backGamenIdSetメソッドに渡すように変更。 230 * @og.rev 3.8.6.3 (2006/11/30) debug 処理を追加 231 * @og.rev 4.0.1.0 (2007/12/17) BACK_ADDRESSを追加 232 * 233 * @param command アクションコマンド(public static final 宣言されている文字列) 234 * @param backGamenId リクエストから取得した、BACK_GAMENID 235 * @param gamenId 画面ID 236 * @param backRow Stringリクエストから取得した、BACK_ROW 情報 237 * @param backAdrs Stringリクエストから取得した、BACK_ADDRESS 情報 238 */ 239 private void backGamenIdSet( final String command,final String backGamenId,final String gamenId,final String backRow,final String backAdrs) { // 3.5.1.0 (2003/10/03) 240 HttpSession session = pageContext.getSession(); 241 242 // この画面自身のID 243 GUIInfo guiInfo = (GUIInfo)session.getAttribute( HybsSystem.GUIINFO_KEY ); 244 String guiId = guiInfo.getAttribute( "KEY" ); 245 246 String guikey = HybsSystem.BACK_GAMENID_KEY + guiId ; 247 String rowkey = HybsSystem.BACK_ROW_KEY + guiId ; // 3.7.0.3 (2005/03/01) 248 String msg = null; // 3.8.6.3 (2006/11/30) 249 String adrskey = HybsSystem.BACK_ADDRESS_KEY + guiId; // 4.0.1.0 (2007/12/17) 250 if( CMD_NEW.equals( command ) && backGamenId != null && ! backGamenId.equals( guiId ) ) { 251 session.setAttribute( guikey,backGamenId ); 252 session.setAttribute( rowkey,backRow ); // 3.7.0.3 (2005/03/01) 253 session.setAttribute( adrskey,backAdrs ); // 4.0.1.0 (2007/12/17) 254 msg = "command=[" + command + "] backGamenId=[Set]" ; 255 } 256 else if( CMD_INIT.equals( command ) || command == null || command.length() == 0 ) { 257 session.removeAttribute( guikey ); 258 session.removeAttribute( rowkey ); // 3.7.0.3 (2005/03/01) 259 msg = "command=[" + command + "] backGamenId=[command Remove]" ; 260 session.removeAttribute( adrskey ); // 4.0.1.0 (2007/12/17) 261 } 262 // 以下 追加 3.5.1.0 (2003/10/03) 263 // 変更 4.0.1.0 (2007/12/17) 264 else if( ( gamenId == null || gamenId.length() == 0 ) && 265 ( backGamenId == null || backGamenId.length() == 0 ) && 266 ( backAdrs == null || backAdrs.length() == 0 )) { 267 session.removeAttribute(guikey ); 268 session.removeAttribute( rowkey ); // 3.7.0.3 (2005/03/01) 269 msg = "command=[" + command + "] backGamenId=[null Remove] " ; 270 session.removeAttribute( adrskey ); // 4.0.1.0 (2007/12/17) 271 } 272 273 // 3.8.6.3 (2006/11/30) 274 if( isDebug() ) { 275 jspPrint( msg + "<br />" ); 276 } 277 } 278 279 /** 280 * 【TAG】キャッシュするサブキーを指定します(初期値:"")。 281 * 282 * @og.tag 283 * キャッシュすべき値を、キー毎に指定できるようにします。 284 * 例えば、これに、画面IDを追加しておけば、画面ごとに、自分のリクエスト情報を 285 * キャッシュしておき、自分の画面が呼ばれたら、再度使用することができる様になります。 286 * NEW でキャッシュ登録を行い、RENEW で、通常のキャッシュキーに値を取り出します。 287 * 288 * @og.rev 3.1.6.0 (2003/04/24) キャッシュすべき値を、キー毎に指定できるように、cacheKey 属性を追加。 289 * 290 * @param ck キャッシュするサブキー 291 */ 292 public void setCacheKey( final String ck ) { 293 cacheKey = nval( getRequestParameter( ck ),cacheKey ); 294 } 295 296 /** 297 * 【TAG】アクション(SET,DELETE)をセットします。 298 * 299 * @og.tag 300 * アクションは,HTMLから(get/post)指定されますので,ACT_xxx で設定される 301 * フィールド定数値のいづれかを、指定できます。 302 * 無指定の場合は、なにもしません。 303 * 304 * <table border="1" frame="box" rules="all" > 305 * <caption>アクションの説明</caption> 306 * <tr><th>action </th><th>名称</th><th>機能</th></tr> 307 * <tr><td>SET </td><td>登録</td><td>指定の keys のキーに vals のキャッシュをセットします。</td></tr> 308 * <tr><td>DELETE </td><td>削除</td><td>指定の keys のキャッシュを削除します。 </td></tr> 309 * </table> 310 * 311 * @param act アクション(public static final 宣言されている文字列) 312 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.RequestCacheTag.ACT_DELETE">アクション定数</a> 313 */ 314 public void setAction( final String act ) { 315 action = nval( getRequestParameter( act ),action ); 316 317 if( action != null && !check( action, ACTION_LIST ) ) { 318 String errMsg = "指定のアクションは実行できません。アクションエラー" 319 + HybsSystem.CR 320 + "action=[" + action + "] " 321 + HybsSystem.CR 322 + StringUtil.array2csv( ACTION_LIST ) ; 323 throw new HybsSystemException( errMsg ); 324 } 325 } 326 327 /** 328 * 【TAG】リンク先に渡すキーを指定します。 329 * 330 * @og.tag 331 * 戻る時に、検索時のキャッシュに指定した引数以外に指定したり、別の値に置き換えたり 332 * する場合のキーを設定できます。カンマ区切りで複数指定できます。 333 * vals 属性には、キーに対応する値を、設定してください。 334 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 335 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 336 * 337 * @og.rev 3.8.8.0 (2006/12/22) 新規追加 338 * 339 * @param key リンク先に渡すキー 340 */ 341 public void setKeys( final String key ) { 342 keys = getCSVParameter( key ); 343 } 344 345 /** 346 * 【TAG】keys属性に対応する値をCSV形式で複数指定します。 347 * 348 * @og.tag 349 * キーに設定した値を、カンマ区切り文字で複数して出来ます。 350 * 指定順序は、キーと同じにしておいて下さい。 351 * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。 352 * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。 353 * 354 * @og.rev 3.8.8.0 (2006/12/22) 新規追加 355 * 356 * @param val keys属性に対応する値 357 */ 358 public void setVals( final String val ) { 359 vals = getCSVParameter( val ); 360 } 361 362 /** 363 * このオブジェクトの文字列表現を返します。 364 * 基本的にデバッグ目的に使用します。 365 * 366 * @return このクラスの文字列表現 367 */ 368 @Override 369 public String toString() { 370 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 371 .println( "VERSION" ,VERSION ) 372 .println( "cacheKey" ,cacheKey ) 373 .println( "Other..." ,getAttributes().getAttribute() ) 374 .fixForm().toString() ; 375 } 376}