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 = "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 );  // 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             * @og.rev 5.6.8.1 (2013/09/13) UserInfo に、request æƒ??を渡してキャãƒ?‚·ュ対象æƒ??をセãƒ?ƒˆしますã?
159             *
160             * @param       command アクションコマンãƒ?public static final 宣è¨?�•れてã�?‚‹æ–?­—å?)
161             * @param       request リクエストオブジェクãƒ?
162             */
163            @SuppressWarnings(value={"unchecked"})
164            private void commandExec( final String command,final ServletRequest request ) {
165                    String key = CACHE_KEY + cacheKey ;
166                    HttpSession session = pageContext.getSession();
167                    String msg = null;      // 3.8.6.3 (2006/11/30)
168    
169                    if( CMD_NEW.equals( command ) ) {
170                            Map<String,String[]> map = new HashMap<String,String[]>( request.getParameterMap() );
171                            map = actionCacheData( map );
172                            session.setAttribute( key,map );
173    
174                            // 5.6.8.1 (2013/09/13) UserInfo に、request æƒ??を渡してキャãƒ?‚·ュ対象æƒ??をセãƒ?ƒˆしますã?
175                            getUser().setLastRequestMap( map );
176                            msg = "command=[NEW] CACHE=[Set]" ;
177                    }
178                    else if( cacheKey.length() > 0 &&
179                                            ( CMD_RENEW.equals( command ) || CMD_RESET.equals( command ) ) ) {
180                            Map<String,String[]> map = (Map<String,String[]>)session.getAttribute( key );
181                            if( map != null ) {
182                                    map = actionCacheData( map );
183                                    session.setAttribute( CACHE_KEY,map );          // 共有キャãƒ?‚·ュにセãƒ?ƒˆ
184                                    msg = "command=[" + command + "] CACHE=[Load]" ;
185                            }
186                    }
187                    else if( CMD_INIT.equals( command ) || command == null || command.length() == 0 ) {
188                            session.removeAttribute( key );
189                            msg = "command=[" + command + "] CACHE=[remove]" ;
190                    }
191    
192                    // 3.8.6.3 (2006/11/30)
193                    if( isDebug() ) {
194                            jspPrint( msg + "<br />" );
195                    }
196            }
197    
198            /**
199             * キャãƒ?‚·ュãƒ??タに対して、追記ã?削除を行いますã?
200             *
201             * @og.rev 3.8.8.0 (2006/12/22) 新規追åŠ?
202             *
203             * @param       map     キャãƒ?‚·ュãƒ??タ
204             *
205             * @return      追記ã?削除のキャãƒ?‚·ュãƒ??タのマッãƒ?入力ã?Mapと同ä¸?
206             */
207            private Map<String,String[]> actionCacheData( final Map<String,String[]> map ) {
208                    if( action != null && map != null && keys != null && vals != null ) {
209                            if( ACT_SET.equalsIgnoreCase( action ) ) {
210                                    for( int i=0; i<keys.length; i++ ) {
211                                            String[] val = new String[] { vals[i] } ;
212                                            map.put( keys[i],val );
213                                    }
214                            }
215                            else if( ACT_DELETE.equalsIgnoreCase( action ) ) {
216                                    for( int i=0; i<keys.length; i++ ) {
217                                            map.remove( keys[i] );
218                                    }
219                            }
220                    }
221    
222                    return map ;
223            }
224    
225            /**
226             * BACK_GAMENID のキャãƒ?‚·ュの設定å?を変更しますã?
227             *
228             * @og.rev 3.1.8.0 (2003/05/16) BACK_GAMENID のキャãƒ?‚·ュの設定å?を変更するã€?
229             * @og.rev 3.5.1.0 (2003/10/03) BACK_GAMENID のリクエストがNULLのときã?処ç�?バグ)訂正ã€?
230             * @og.rev 3.7.0.3 (2005/03/01) BACK_ROW æƒ??を取得し、backGamenIdSetメソãƒ?ƒ‰に渡すよã�?�«変更ã€?
231             * @og.rev 3.8.6.3 (2006/11/30) debug 処ç�?‚’追åŠ?
232             * @og.rev 4.0.1.0 (2007/12/17) BACK_ADDRESSを追åŠ?
233             *
234             * @param       command アクションコマンãƒ?public static final 宣è¨?�•れてã�?‚‹æ–?­—å?)
235             * @param       backGamenId     リクエストから取得したã?BACK_GAMENID
236             * @param       gamenId 画面ID
237             * @param   backRow Stringリクエストから取得したã?BACK_ROW æƒ??
238             * @param   backAdrs Stringリクエストから取得したã?BACK_ADDRESS æƒ??
239             */
240            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)
241                    HttpSession session = pageContext.getSession();
242    
243                    // こã?画面自身の?©?¤
244                    GUIInfo guiInfo = (GUIInfo)session.getAttribute( HybsSystem.GUIINFO_KEY );
245                    String guiId = guiInfo.getAttribute( "KEY" );
246    
247                    String guikey = HybsSystem.BACK_GAMENID_KEY + guiId ;
248                    String rowkey = HybsSystem.BACK_ROW_KEY + guiId ;               // 3.7.0.3 (2005/03/01)
249                    String msg = null;      // 3.8.6.3 (2006/11/30)
250                    String adrskey = HybsSystem.BACK_ADDRESS_KEY + guiId;   // 4.0.1.0 (2007/12/17)
251                    if( CMD_NEW.equals( command ) && backGamenId != null && ! backGamenId.equals( guiId ) ) {
252                            session.setAttribute( guikey,backGamenId );
253                            session.setAttribute( rowkey,backRow );                 // 3.7.0.3 (2005/03/01)
254                            session.setAttribute( adrskey,backAdrs );               // 4.0.1.0 (2007/12/17)
255                            msg = "command=[" + command + "] backGamenId=[Set]" ;
256                    }
257                    else if( CMD_INIT.equals( command ) || command == null || command.length() == 0 ) {
258                            session.removeAttribute( guikey );
259                            session.removeAttribute( rowkey );              // 3.7.0.3 (2005/03/01)
260                            msg = "command=[" + command + "] backGamenId=[command Remove]" ;
261                            session.removeAttribute( adrskey );             // 4.0.1.0 (2007/12/17)
262                    }
263                    // 以ä¸?追åŠ?3.5.1.0 (2003/10/03)
264                    // 変更 4.0.1.0 (2007/12/17)
265                    else if( ( gamenId == null || gamenId.length() == 0 ) &&
266                                     ( backGamenId == null || backGamenId.length() == 0 ) &&
267                                     ( backAdrs == null || backAdrs.length() == 0 )) {
268                                            session.removeAttribute(guikey );
269                                            session.removeAttribute( rowkey );              // 3.7.0.3 (2005/03/01)
270                                            msg = "command=[" + command + "] backGamenId=[null Remove] " ;
271                                            session.removeAttribute( adrskey );             // 4.0.1.0 (2007/12/17)
272                    }
273    
274                    // 3.8.6.3 (2006/11/30)
275                    if( isDebug() ) {
276                            jspPrint( msg + "<br />" );
277                    }
278            }
279    
280            /**
281             * 【TAG】キャãƒ?‚·ュするサブキーを指定しまã�?初期値:"")ã€?
282             *
283             * @og.tag
284             * キャãƒ?‚·ュすべきå?をã?キー毎にæŒ?®šできるようにしますã?
285             * 例えば、これに、画面IDを追åŠ?�—ておけば、画面ごとに、è?åˆ??リクエスト情報ã‚?
286             * キャãƒ?‚·ュしておき、è?åˆ??画面が呼ばれたらã?再度使用することができる様になりますã?
287             * NEW でキャãƒ?‚·ュ登録を行い、RENEW でã€??常のキャãƒ?‚·ュキーに値を取りå?しますã?
288             *
289             * @og.rev 3.1.6.0 (2003/04/24) キャãƒ?‚·ュすべきå?をã?キー毎にæŒ?®šできるように、cacheKey 属æ?を追åŠ??
290             *
291             * @param       ck キャãƒ?‚·ュするサブキー
292             */
293            public void setCacheKey( final String ck ) {
294                    cacheKey = nval( getRequestParameter( ck ),cacheKey );
295            }
296    
297            /**
298             * 【TAG】アクション(SET,DELETE)をセãƒ?ƒˆしますã?
299             *
300             * @og.tag
301             * アクションは,HTMLから(get/post)æŒ?®šされますã?で,ACT_xxx で設定される
302             * フィールド定数値のã�?�¥れかをã?æŒ?®šできますã?
303             * 無æŒ?®šã?場合ã?、なにもしませんã€?
304             *
305             * <table border="1" frame="box" rules="all" >
306             *   <caption>アクションの説æ˜?/caption>
307             *   <tr><th>action </th><th>名称</th><th>機è?</th></tr>
308             *   <tr><td>SET     </td><td>登録</td><td>æŒ?®šã? keys のキーに vals のキャãƒ?‚·ュをセãƒ?ƒˆしますã?</td></tr>
309             *   <tr><td>DELETE  </td><td>削除</td><td>æŒ?®šã? keys のキャãƒ?‚·ュを削除しますã?                </td></tr>
310             * </table>
311             *
312             * @param       act アクション(public static final 宣è¨?�•れてã�?‚‹æ–?­—å?)
313             * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.RequestCacheTag.ACT_DELETE">アクション定数</a>
314             */
315            public void setAction( final String act ) {
316                    action = nval( getRequestParameter( act ),action );
317    
318                    if( action != null && !check( action, ACTION_LIST ) ) {
319                            String errMsg = "æŒ?®šã?アクションは実行できません。アクションエラー"
320                                                            + HybsSystem.CR
321                                                            + "action=[" + action + "] "
322                                                            + HybsSystem.CR
323                                                            + StringUtil.array2csv( ACTION_LIST ) ;
324                            throw new HybsSystemException( errMsg );
325                    }
326            }
327    
328            /**
329             * 【TAG】リンク先に渡すキーを指定しますã?
330             *
331             * @og.tag
332             * 戻る時に、検索時ã?キャãƒ?‚·ュにæŒ?®šした引数以外にæŒ?®šしたり、別の値に置き換えたã‚?
333             * する場合ã?キーを設定できますã?カンマ区åˆ?‚Šでè¤?•°æŒ?®šできますã?
334             * vals 属æ?には、キーに対応するå?をã?設定してくださいã€?
335             * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
336             * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
337             *
338             * @og.rev 3.8.8.0 (2006/12/22) 新規追åŠ?
339             *
340             * @param       key リンク先に渡すキー
341             */
342            public void setKeys( final String key ) {
343                    keys = getCSVParameter( key );
344            }
345    
346            /**
347             * 【TAG】keys属æ?に対応するå?をCSV形式でè¤?•°æŒ?®šしますã?
348             *
349             * @og.tag
350             * キーに設定したå?をã?カンマ区åˆ?‚Šæ–?­—でè¤?•°して出来ますã?
351             * æŒ?®šé?序ã?、キーと同じにしておいて下さã�??
352             * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
353             * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
354             *
355             * @og.rev 3.8.8.0 (2006/12/22) 新規追åŠ?
356             *
357             * @param       val keys属æ?に対応するå?
358             */
359            public void setVals( final String val ) {
360                    vals = getCSVParameter( val );
361            }
362    
363            /**
364             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
365             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
366             *
367             * @return こã?クラスのæ–?­—å?表現
368             */
369            @Override
370            public String toString() {
371                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
372                                    .println( "VERSION"             ,VERSION        )
373                                    .println( "cacheKey"    ,cacheKey       )
374                                    .println( "Other..."    ,getAttributes().getAttribute() )
375                                    .fixForm().toString() ;
376            }
377    }