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 */
016 package org.opengion.hayabusa.taglib;
017
018 import org.opengion.hayabusa.common.HybsSystem;
019 import org.opengion.hayabusa.common.HybsSystemException;
020 import org.opengion.hayabusa.resource.GUIInfo;
021 import static org.opengion.fukurou.util.StringUtil.nval ;
022 import org.opengion.fukurou.util.StringUtil ;
023
024 import javax.servlet.ServletRequest ;
025 import javax.servlet.http.HttpSession ;
026
027 import java.util.Map;
028 import 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 * ●形式?lt;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 */
062 public class RequestCacheTag extends CommonTagSupport {
063 //* こ?プログラ??VERSION??を設定します? {@value} */
064 private static final String VERSION = "4.0.1.0 (2007/12/17)" ;
065
066 private static final long serialVersionUID = 401020071217L ;
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 ); // 3.7.0.3 (2005/03/01)
122 backGamenIdSet( command,backGamenId,gamenId,backRow,backAdrs ); // 4.0.1.0 (2007/12/17)
123
124 return(EVAL_PAGE); // ペ?ジの残りを評価する?
125 }
126
127 /**
128 * タグリブオブジェクトをリリースします?
129 *
130 * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
131 *
132 * @og.rev 3.5.5.3 (2004/04/09) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
133 * @og.rev 3.8.8.0 (2006/12/22) action,keys,vals 追?
134 *
135 */
136 @Override
137 protected void release2() {
138 super.release2();
139 cacheKey = "";
140 action = null;
141 keys = null;
142 vals = null;
143 }
144
145 /**
146 * アクションを実行します?
147 * アクションは,??アクションコマンドに対応する??入力データに
148 * 対して行います?
149 *
150 * @og.rev 3.1.1.2 (2003/04/04) 継承?、CommonTagSupport から TagSupport に変更する?
151 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?HybsRequestWrapper ?。直接 Mapでキャ?ュする?
152 * @og.rev 3.1.6.0 (2003/04/24) キャ?ュすべき?を?キー毎に?できるように、cacheKey 属?を追??
153 * @og.rev 3.1.7.0 (2003/05/02) RENEW のときに、キャ?ュを削除しな??変更する?
154 * @og.rev 3.1.7.0 (2003/05/02) command=INIT また?、null のときに、キャ?ュを削除するように変更する?
155 * @og.rev 3.5.5.0 (2004/03/12) command=RESET時にも?キャ?ュを取り?すよ?変更する?
156 * @og.rev 3.8.6.3 (2006/11/30) debug 処?追?
157 * @og.rev 3.8.8.0 (2006/12/22) actionCacheData 処?追?
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 msg = "command=[NEW] CACHE=[Set]" ;
173 }
174 else if( cacheKey.length() > 0 &&
175 ( CMD_RENEW.equals( command ) || CMD_RESET.equals( command ) ) ) {
176 Map<String,String[]> map = (Map<String,String[]>)session.getAttribute( key );
177 if( map != null ) {
178 map = actionCacheData( map );
179 session.setAttribute( CACHE_KEY,map ); // 共有キャ?ュにセ?
180 msg = "command=[" + command + "] CACHE=[Load]" ;
181 }
182 }
183 else if( CMD_INIT.equals( command ) || command == null || command.length() == 0 ) {
184 session.removeAttribute( key );
185 msg = "command=[" + command + "] CACHE=[remove]" ;
186 }
187
188 // 3.8.6.3 (2006/11/30)
189 if( isDebug() ) {
190 jspPrint( msg + "<br />" );
191 }
192 }
193
194 /**
195 * キャ?ュ??タに対して、追記?削除を行います?
196 *
197 * @og.rev 3.8.8.0 (2006/12/22) 新規追?
198 *
199 * @param map キャ?ュ??タ
200 *
201 * @return 追記?削除のキャ?ュ??タのマッ?入力?Mapと同?
202 */
203 private Map<String,String[]> actionCacheData( final Map<String,String[]> map ) {
204 if( action != null && map != null && keys != null && vals != null ) {
205 if( ACT_SET.equalsIgnoreCase( action ) ) {
206 for( int i=0; i<keys.length; i++ ) {
207 String[] val = new String[] { vals[i] } ;
208 map.put( keys[i],val );
209 }
210 }
211 else if( ACT_DELETE.equalsIgnoreCase( action ) ) {
212 for( int i=0; i<keys.length; i++ ) {
213 map.remove( keys[i] );
214 }
215 }
216 }
217
218 return map ;
219 }
220
221 /**
222 * BACK_GAMENID のキャ?ュの設定?を変更します?
223 *
224 * @og.rev 3.1.8.0 (2003/05/16) BACK_GAMENID のキャ?ュの設定?を変更する?
225 * @og.rev 3.5.1.0 (2003/10/03) BACK_GAMENID のリクエストがNULLのとき?処?バグ)訂正?
226 * @og.rev 3.7.0.3 (2005/03/01) BACK_ROW ??を取得し、backGamenIdSetメソ?に渡すよ?変更?
227 * @og.rev 3.8.6.3 (2006/11/30) debug 処?追?
228 * @og.rev 4.0.1.0 (2007/12/17) BACK_ADDRESSを追?
229 *
230 * @param command アクションコマン?public static final 宣?れて???)
231 * @param backGamenId リクエストから取得した?BACK_GAMENID
232 * @param gamenId 画面ID
233 * @param backRow Stringリクエストから取得した?BACK_ROW ??
234 * @param backAdrs Stringリクエストから取得した?BACK_ADDRESS ??
235 */
236 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)
237 HttpSession session = pageContext.getSession();
238
239 // こ?画面自身の??
240 GUIInfo guiInfo = (GUIInfo)session.getAttribute( HybsSystem.GUIINFO_KEY );
241 String guiId = guiInfo.getAttribute( "KEY" );
242
243 String guikey = HybsSystem.BACK_GAMENID_KEY + guiId ;
244 String rowkey = HybsSystem.BACK_ROW_KEY + guiId ; // 3.7.0.3 (2005/03/01)
245 String msg = null; // 3.8.6.3 (2006/11/30)
246 String adrskey = HybsSystem.BACK_ADDRESS_KEY + guiId; // 4.0.1.0 (2007/12/17)
247 if( CMD_NEW.equals( command ) && backGamenId != null && ! backGamenId.equals( guiId ) ) {
248 session.setAttribute( guikey,backGamenId );
249 session.setAttribute( rowkey,backRow ); // 3.7.0.3 (2005/03/01)
250 session.setAttribute( adrskey,backAdrs ); // 4.0.1.0 (2007/12/17)
251 msg = "command=[" + command + "] backGamenId=[Set]" ;
252 }
253 else if( CMD_INIT.equals( command ) || command == null || command.length() == 0 ) {
254 session.removeAttribute( guikey );
255 session.removeAttribute( rowkey ); // 3.7.0.3 (2005/03/01)
256 msg = "command=[" + command + "] backGamenId=[command Remove]" ;
257 session.removeAttribute( adrskey ); // 4.0.1.0 (2007/12/17)
258 }
259 // 以?追?3.5.1.0 (2003/10/03)
260 // 変更 4.0.1.0 (2007/12/17)
261 else if( ( gamenId == null || gamenId.length() == 0 ) &&
262 ( backGamenId == null || backGamenId.length() == 0 ) &&
263 ( backAdrs == null || backAdrs.length() == 0 )) {
264 session.removeAttribute(guikey );
265 session.removeAttribute( rowkey ); // 3.7.0.3 (2005/03/01)
266 msg = "command=[" + command + "] backGamenId=[null Remove] " ;
267 session.removeAttribute( adrskey ); // 4.0.1.0 (2007/12/17)
268 }
269
270 // 3.8.6.3 (2006/11/30)
271 if( isDebug() ) {
272 jspPrint( msg + "<br />" );
273 }
274 }
275
276 /**
277 * 【TAG】キャ?ュするサブキーを指定しま?初期値:"")?
278 *
279 * @og.tag
280 * キャ?ュすべき?を?キー毎に?できるようにします?
281 * 例えば、これに、画面IDを追?ておけば、画面ごとに、???リクエスト情報?
282 * キャ?ュしておき、???画面が呼ばれたら?再度使用することができる様になります?
283 * NEW でキャ?ュ登録を行い、RENEW で??常のキャ?ュキーに値を取り?します?
284 *
285 * @og.rev 3.1.6.0 (2003/04/24) キャ?ュすべき?を?キー毎に?できるように、cacheKey 属?を追??
286 *
287 * @param ck キャ?ュするサブキー
288 */
289 public void setCacheKey( final String ck ) {
290 cacheKey = nval( getRequestParameter( ck ),cacheKey );
291 }
292
293 /**
294 * 【TAG】アクション(SET,DELETE)をセ?します?
295 *
296 * @og.tag
297 * アクションは,HTMLから(get/post)?されます?で,ACT_xxx で設定される
298 * フィールド定数値の?れかを??できます?
299 * 無??場合?、なにもしません?
300 *
301 * <table border="1" frame="box" rules="all" >
302 * <th><td>action </td><td>名称</td><td>機? </td></th>
303 * <tr><td>SET </td><td>登録</td><td>?? keys のキーに vals のキャ?ュをセ?します?</td></tr>
304 * <tr><td>DELETE </td><td>削除</td><td>?? keys のキャ?ュを削除します? </td></tr>
305 * </table>
306 *
307 * @param act アクション(public static final 宣?れて???)
308 * @see <a href="{@docRoot}/constant-values.html#org.opengion.hayabusa.taglib.RequestCacheTag.ACT_DELETE">アクション定数</a>
309 */
310 public void setAction( final String act ) {
311 action = nval( getRequestParameter( act ),action );
312
313 if( action != null && !check( action, ACTION_LIST ) ) {
314 String errMsg = "??アクションは実行できません。アクションエラー"
315 + HybsSystem.CR
316 + "action=[" + action + "] "
317 + HybsSystem.CR
318 + StringUtil.array2csv( ACTION_LIST ) ;
319 throw new HybsSystemException( errMsg );
320 }
321 }
322
323 /**
324 * 【TAG】リンク先に渡すキーを指定します?
325 *
326 * @og.tag
327 * 戻る時に、検索時?キャ?ュに?した引数以外に?したり、別の値に置き換えた?
328 * する場合?キーを設定できます?カンマ区?で??できます?
329 * vals 属?には、キーに対応する?を?設定してください?
330 * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
331 * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
332 *
333 * @og.rev 3.8.8.0 (2006/12/22) 新規追?
334 *
335 * @param key リンク先に渡すキー
336 */
337 public void setKeys( final String key ) {
338 keys = getCSVParameter( key );
339 }
340
341 /**
342 * 【TAG】keys属?に対応する?をCSV形式で??します?
343 *
344 * @og.tag
345 * キーに設定した?を?カンマ区??で?して出来ます?
346 * ??序?、キーと同じにしておいて下さ??
347 * ?方法?、CSV変数を?に?してから、getRequestParameter で値を取得します?
348 * こうしな???タ自身にカンマを持って?場合に?をミスる為です?
349 *
350 * @og.rev 3.8.8.0 (2006/12/22) 新規追?
351 *
352 * @param val keys属?に対応する?
353 */
354 public void setVals( final String val ) {
355 vals = getCSVParameter( val );
356 }
357
358 /**
359 * こ?オブジェクト???表現を返します?
360 * 基本???目?使用します?
361 *
362 * @return こ?クラスの??表現
363 */
364 @Override
365 public String toString() {
366 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
367 .println( "VERSION" ,VERSION )
368 .println( "cacheKey" ,cacheKey )
369 .println( "Other..." ,getAttributes().getAttribute() )
370 .fixForm().toString() ;
371 }
372 }