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.db.DBTableModel;
021    import org.opengion.fukurou.util.ErrorMessage;
022    import org.opengion.fukurou.util.XHTMLTag;
023    import org.opengion.fukurou.util.StringUtil;
024    
025    import static org.opengion.fukurou.util.StringUtil.nval ;
026    
027    import javax.servlet.http.HttpServletRequest;
028    import javax.servlet.http.HttpServletResponse;
029    import javax.servlet.http.HttpSession;
030    import javax.servlet.ServletException;
031    import java.io.IOException;
032    import java.io.ObjectInputStream;
033    import java.io.ObjectOutputStream;
034    import java.util.Enumeration;
035    import java.util.Map;
036    import java.util.HashMap;
037    
038    /**
039     * submitタグを用ã�?�¦ペã?ジ転送するタグでã�?forward.jsp で使用)ã€?
040     *
041     * 通常、forward は、ã?ージå†?»¢é€?サーバã?å†?ƒ¨での転é€?のため、別画面への遷移には
042     * 使用できません。これã?、別画面では、index.jsp 等でフレーãƒ??割する際ã?基準フォルãƒ??ã€?
043     * forward の場合ã?クライアントã?ç�?§£してã�?�ªã�?�Ÿめã?もうä¸?º¦先ã?フォルãƒ?�«対する
044     * フレーãƒ??割を行おã�?�¨するためですã?
045     * (よく、index.jsp の frame タグに、src="../XXXX/query.jsp" などと、è?åˆ??身のフォルãƒ?��ã‚?
046     * 記述したペã?ジを見かけますが、これã?、フォルãƒ?‚’またがる転送に、forward を使用する
047     * 為の悪ã�?¯¾策ですã?)
048     * 実際は、forward ではなくã?redirect を使ã�?�¹きですã?redirect は、指定ã?アドレス要求をã€?
049     * ä¸?—¦クライアントに投げてそこから再度要求しなおしてもらã�?–¹式ã?ため、このようにフォルãƒ?‚’
050     * またがる転送も正常に処ç�?�§きますã?
051     * こã?、commonForward タグでは、画面遷移の条件に応じて、forward ã�?redirect の自å‹?
052     * 判定を行いã€?�©åˆ?�«処ç�?�—てã�?�¾すã?
053     * 判定条件は、拡張子やã€?�¸択件数などを加味して以下ã?判定をé ?¬¡ãƒ?‚¹トしますã?
054     *
055     *   FORWARD :
056     *       アドレスがã? null(自åˆ??身) かã?.jsp を含みã€?/" がå?ってã�?�ªã�??å�?
057     *   REDIRECT:
058     *       アドレスがã?.jsp を含まなã�?�‹ã€?
059     *       それ以å¤?.jsp を含みã€?/" も含ã‚?でã€?�¸択数が1件のみの場å�?
060     *       もしくã?useRedirectCheck="false"の場å�?
061     *   COUNT_0 :
062     *       それ以外でã€?�¸択数が0件の場å�?
063     *   COUNT_N :
064     *       それ以外でã€?�¸択数が1件以上ã?場合ã?またã?、その他ã?
065     *
066     * ここで、COUNT_0 の場合ã?、未選択エラー、COUNT_N は、è¤?•°選択エラーをè?動的に返しますã?
067     *
068     * @og.formSample
069     * ●形式ï¼?lt;og:commonForward />
070     * ●body?šなã�?
071     *
072     * ●Tag定義??
073     *   <og:commonForward
074     *       dbkeys             【TAG】DBキーをCSV 形式でセãƒ?ƒˆしまã�?
075     *       tableId            【TAGã€?通常使ã�?�¾せん)sessionからæ‰?¾—すã‚?DBTableModelオブジェクトã? ID
076     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
077     *       useRedirectCheck   【TAG】非選択状態ã?場合にforwardを許可するかどã�?�‹[true/false]を指定しまã�?初期値:true)
078     *   />
079     *
080     * ●使用ä¾?
081     *     フォワードキャãƒ?‚·ュによりペã?ジ転送しますã?
082     *     <og:commonForward dbkeys="{@dbkeys}" />
083     *
084     * @og.group 画面制御
085     *
086     * @version  4.0
087     * @author       Masaharu Endo
088     * @since    JDK5.0,
089     */
090    public class CommonForwardTag extends CommonTagSupport {
091            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
092            private static final String VERSION = "5.3.6.0 (2011/06/01)" ;
093    
094            private static final long serialVersionUID = 536020110601L ;    // 5.3.6.0 (2011/06/01)
095    
096            // 3.5.5.3 (2004/04/09) 共通アドレスでæŒ?®šすることで、クライアントキャãƒ?‚·ュを有効利用するã€?
097            private static final String DUMMY_HTML  = "/" + HybsSystem.getContextName() + "/jsp/common/dummy.html";
098    
099            // 3.8.5.1 (2006/04/28) dbkeys ã�?null の場合に全件取得するかどã�?�‹ã‚?COMMON_FORWARD_DBKEYS_NULL_ALL でæŒ?®šしますã?
100    
101            private static final int FORWARD  = 0;
102            private static final int REDIRECT = 1;
103            private static final int COUNT_0  = 2;
104            private static final int COUNT_N  = 3;
105    
106            // 3.5.5.2 (2004/04/02) 選択行がã€?¼‘行ã?みかã?そうでなã�?�‹
107            private int rowCount = -1;
108    
109            // 3.5.5.2 (2004/04/02) 選択行ã? DBTableModel ãƒ??タを引数に使用するかどã�?�‹ã€?
110    //      private boolean useTableData = HybsSystem.sysBool( "COMMON_FORWARD_USE_TABLE_DATA" );
111    //      private String  tableId          = HybsSystem.TBL_MDL_KEY;
112            private int             rowNo            = -1;
113    
114            // 3.5.5.5 (2004/04/23) URLに連結するDBTableModelのカラãƒ?‚’CSV形式でæŒ?®šしますã?
115            private String  dbkeys          = null;
116    
117            // 3.5.5.8 (2004/05/20) submitタグの keys,vals を扱ã�?仮想リクエスãƒ?ap
118    //      private String  useTableTemp    = null;
119            private String  tableIdTemp             = null;
120            private String  dbkeysTemp              = null;
121            private transient Map<String,String>      submitRequestMap        = new HashMap<String,String>();   // 3.5.6.2 (2004/07/05)
122            private transient Map<String,String>      submitTableMap          = new HashMap<String,String>();   // 3.8.5.1 (2006/04/28)
123    
124            // 4.0.0.0 (2007/11/09) 非選択状態でのforwardのための属æ?追åŠ?
125            private boolean isRedirectCheck         = true;
126    
127            /**
128             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
129             *
130             * @og.rev 3.3.1.1 (2003/07/03) ?µ?²?¬にリクエスト情報をU?²?¬エンコードして追åŠ?�—ますã?
131             * @og.rev 3.5.5.2 (2004/04/02) フォルãƒ?¤–転送時はã€?¼‘行以外選択ã?、エラーとしますã?
132             * @og.rev 3.5.5.3 (2004/04/09) ãƒ?ƒ�ãƒ?‚°時ã?、転送しなã�?‚ˆã�?�«しますã?
133             * @og.rev 3.8.0.4 (2005/08/08) requestUrlEncode å»?­¢
134             * @og.rev 3.8.0.8 (2005/10/03) dbkeys ã�?null の場合に全件取得してã�?�Ÿ処ç�?‚’復活しますã?
135             * @og.rev 4.0.0.0 (2007/11/09) 非選択状態からã?遷移を許可するフラグを追åŠ?11/12に振りå?けå?ç�?‚’selectResponseMethodに移å‹?
136             * @og.rev 5.0.0.2 (2009/09/15) XSS対応â�çチェãƒ?‚¯する
137             * @og.rev 5.3.6.0 (2011/06/01) エラーメãƒ?‚»ージ変更(URLの振りå?けå?ç�?™‚に...のメãƒ?‚»ージは出力しなã�?
138             *
139             * @return      後続å?ç�??æŒ?¤º
140             */
141            @Override
142            public int doEndTag() {
143                    debugPrint();           // 4.0.0 (2005/02/28)
144    
145                    // useXssCheck( false ); // 5.0.0.2 (2009/09/15)
146    
147                    HttpServletRequest request  = ((HttpServletRequest)getRequest());
148                    HttpSession session = pageContext.getSession();
149                    String page = getForwardURI( request, session );
150    
151                    // 3.5.5.8 (2004/05/20) å†?ƒ¨仮想リクエスãƒ?ap より値を取å¾?
152    //              useTableData = nval( getSubmitRequestParameter( useTableTemp ),useTableData );
153    //              tableId          = nval( getSubmitRequestParameter( tableIdTemp  ),tableId );
154                    dbkeys           = nval( getSubmitRequestParameter( dbkeysTemp   ),dbkeys );
155    
156                    HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();
157    
158                    String errMsgKey = null;
159                    try {
160                            // 3.5.5.2 (2004/04/02) 振りå?け条件を判定するメソãƒ?ƒ‰をé?しますã?
161                            // こã?メソãƒ?ƒ‰により、useTableData がå?設定されますã?処ç�??に注æ„?
162                            int flag = selectResponseMethod( page );
163    
164                            // 3.8.0.8 (2005/10/03) dbkeys ã�?null の場合に全件取得してã�?�Ÿ処ç�?‚’復活しますã?
165    //                      if( rowCount == 1 && useTableData ) {
166                            if( rowCount == 1 && dbkeys != null ) {
167                                    page = XHTMLTag.addUrlEncode( page,getTableUrlData() );
168                            }
169    
170                            String url = response.encodeRedirectURL( page );
171                            // 3.8.0.8 (2005/10/03) GET時ã? URL の長さ制限チェãƒ?‚¯(æœ?¤§æ–?­—数は 2,083 æ–?­?
172                            if( url != null && url.length() >= HybsSystem.MAX_GET_LENGTH ) {
173                                    String errMsg = "GET時ã? URL の長さã?,æœ?¤§2,083 æ–?­—ですã?"
174                                                            + " URL.length=" + url.length() + " , MAX_LENGTH=" + HybsSystem.MAX_GET_LENGTH ;
175                                    throw new HybsSystemException( errMsg );
176                            }
177    
178                            switch( flag ) {
179                                    case FORWARD:   if( isDebug() ) { jspPrint( "FORWARD URL = [" + url + "]" ); }
180                                                                    else { pageContext.forward( url ); }
181                                                                    break;
182                                    case REDIRECT:  // url = requestUrlEncode( url );               // 3.8.0.4 (2005/08/08)
183                                                                    if( isDebug() ) { jspPrint( "REDIRECT URL = [" + url + "]" ); }
184                                                                    else { response.sendRedirect( url ); }
185                                                                    break;
186                                    case COUNT_0:
187    //                                                              if( isDebug() ) {
188    //                                                                      jspPrint( "RedirectCheck = [" + isRedirectCheck + "]" );
189    //                                                                      jspPrint( "FORWARD URL = [" + url + "]" );
190    //                                                                      }
191    //                                                              if( isRedirectCheck ) { errMsgKey = "ERR0028" ; } // 選択されてã�?�¾せん。もã�?¸?º¦ã€?�¸択しなおして下さã�??
192    //                                                              else{ response.sendRedirect( url );}    // 4.0.0.0 (2007/11/09) 非選択状態é?移フラグ追åŠ?
193                                                                    errMsgKey = "ERR0028" ;  // 選択されてã�?�¾せん。もã�?¸?º¦ã€?�¸択しなおして下さã�??
194                                                                    break;
195                                    default: errMsgKey = "ERR0029" ;        // è¤?•°選択されました。1件のみ選択しなおして下さã�??
196                                                                    break;
197                            }
198    
199                    } catch ( IOException ex ) {
200                            // 5.3.6.0 (2011/06/01) エラーメãƒ?‚»ージ表示変更
201    //                      String errMsg = "URLの振りå?けå?ç�?™‚に IOException が発生しましたã€?" + HybsSystem.CR
202    //                                              + ex.getMessage();                                      // 5.1.8.0 (2010/07/01) errMsg 修正
203                            String errMsg = ex.getMessage();                                        // 5.1.8.0 (2010/07/01) errMsg 修正
204                            throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並びé ?¤‰更
205                    } catch ( ServletException ex ) {
206                            // 5.3.6.0 (2011/06/01) エラーメãƒ?‚»ージ表示変更
207    //                      String errMsg = "URLの振りå?けå?ç�?™‚に ServletException が発生しましたã€?" + HybsSystem.CR
208    //                                              + ex.getMessage();                                      // 5.1.8.0 (2010/07/01) errMsg 修正
209                            String errMsg = ex.getMessage();                                        // 5.1.8.0 (2010/07/01) errMsg 修正
210                            throw new HybsSystemException( errMsg,ex );             // 3.5.5.4 (2004/04/15) 引数の並びé ?¤‰更
211                    }
212    
213                    // 3.5.5.2 (2004/04/02) フォルãƒ?¤–転送時はã€?¼‘行以外選択ã?、エラーとしますã?
214                    if( errMsgKey != null ) {
215                            ErrorMessage errMsg = new ErrorMessage( "Row Count Error Maximal Error!" );
216                            errMsg.addMessage( 0,ErrorMessage.NG,errMsgKey );
217    
218                            jspPrint( TaglibUtil.makeHTMLErrorTable( errMsg,getResource() ) );
219                    }
220    
221                    return( SKIP_PAGE );            // ペã?ジの残りの処ç�?‚’行わなã�??
222            }
223    
224            /**
225             * タグリブオブジェクトをリリースしますã?
226             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
227             *
228             * @og.rev 3.5.5.2 (2004/04/02) 新規追åŠ?rowCount,useTableData)
229             * @og.rev 3.5.5.5 (2004/04/23) URLに連結するDBTableModelのカラãƒ?‚’CSV形式でæŒ?®šしますã?
230             * @og.rev 3.8.5.1 (2006/04/28) URLに連結するDBTableModelのカラãƒ?‚’[カラãƒ?形式でæŒ?®šしますã?
231             *
232             */
233            @Override
234            protected void release2() {
235                    super.release2();
236                    rowCount     = -1;
237    //              useTableData = HybsSystem.sysBool( "COMMON_FORWARD_USE_TABLE_DATA" );
238    //              tableId          = HybsSystem.TBL_MDL_KEY;
239                    rowNo            = -1;
240                    dbkeys           = null;                // 3.5.5.5 (2004/04/23)
241                    submitRequestMap        = new HashMap<String,String>();           // 3.5.5.8 (2004/05/20)
242                    submitTableMap          = new HashMap<String,String>();           // 3.8.5.1 (2006/04/28)
243    //              useTableTemp            = null;         // 3.5.5.8 (2004/05/20)
244                    tableIdTemp                     = null;         // 3.5.5.8 (2004/05/20)
245                    dbkeysTemp                      = null;         // 3.5.5.8 (2004/05/20)
246                    isRedirectCheck         = true;         // 4.0.0.0 (2007/11/12)
247            }
248    
249            /**
250             * フォワードå?URIを取得しますã?
251             *
252             * @og.rev 3.1.2.0 (2003/04/07) ソースコード中の固定å?をã?定義ファイルを使用するように変更するã€?
253             * @og.rev 3.1.4.1 (2003/04/21) request.getQueryString() をaddUrlEncodeしてã�?‚‹ç®?‰€を削除ã€?
254             * @og.rev 3.1.7.0 (2003/05/02) コマンãƒ?RENEW で、forward した場合に、result.jsp に遷移するように修正ã€?
255             * @og.rev 3.1.7.0 (2003/05/02) 画面?©?¤のセãƒ?ƒˆで、è?画面をã?BACK_GAMENID ã€?£›ã?先を、GAMENID にするã€?
256             * @og.rev 3.1.8.0 (2003/05/16) SubmitData クラスを利用するように変更ã€?
257             * @og.rev 3.3.1.1 (2003/07/03) ForwardManager クラスのå»?­¢。飛ã?先ã?キャãƒ?‚·ュをå»?­¢しますã?
258             * @og.rev 3.5.5.2 (2004/04/02) 選択行ã?件数を設定しておきますã?
259             * @og.rev 3.5.5.3 (2004/04/09) dummy.html ã‚?static final で絶対パスæŒ?®šしますã?
260             * @og.rev 3.5.5.4 (2004/04/15) メソãƒ?ƒ‰å†?�§使用してã�?�ªã�??gamenId,jspID 変数を削除しますã?
261             * @og.rev 3.5.5.5 (2004/04/23) 余計なボタン関連æƒ??を転送しなã�?‚ºに、キーを変更しますã?
262             * @og.rev 3.5.5.5 (2004/04/23) SubmitTag の keys,vals 属æ?でæŒ?®šしたå?のみ、転送しますã?
263             * @og.rev 3.5.5.8 (2004/05/20) SubmitTag の keys,vals 属æ?でæŒ?®šしたå?をã?å†?ƒ¨仮想リクエスãƒ?Mapにセãƒ?ƒˆしますã?
264             * @og.rev 3.7.0.1 (2005/01/31) リクエスト変数に選択された件数を追åŠ?
265             * @og.rev 3.7.0.3 (2005/03/01) æŒ?®šã?行番号まで画面をスクロールさせる機è?を追åŠ??
266             * @og.rev 3.8.0.8 (2005/10/03) BACK_GAMENID があれã? BACK_ROW を追åŠ?�™るã?
267             * @og.rev 3.8.5.1 (2006/04/28) vals="[カラãƒ?��]" とã�?�†引数をå?ç�?�§きる機è?を追åŠ??
268             * @og.rev 5.1.8.0 (2010/07/01) VIEWの場合も、直前ã?JSPに遷移するã€?
269             *
270             * @param       request HttpServletRequestオブジェクãƒ?
271             * @param       session HttpSessionオブジェクãƒ?
272             *
273             * @return      フォワードå?URI
274             */
275            private String getForwardURI( final HttpServletRequest request,
276                                                                      final HttpSession        session ) {
277    
278    //              String   cmd    = request.getParameter( "command" );
279                    String[] rows   = request.getParameterValues( HybsSystem.ROW_SEL_KEY );
280    
281                    // 4.0.0 (2007/05/16) query.jsp でè¤?•°command 時ã?処ç�?¿®正
282                    String   cmd  = request.getParameter( "command" );
283                    String[] cmds = request.getParameterValues( "command" );
284                    if( cmds != null && cmds.length > 1 ) {
285                            for( int i=0; i<cmds.length; i++ ) {
286                                    if( ! "NEW".equals( cmds[i] ) ) {
287                                            cmd = cmds[i]; break;   // NEW でなã�??æœ??のä¸?�¤
288                                    }
289                            }
290                            // すべてã�?NEW の場合ã?、単ä½?getParameter) ã�?NEW なのでç´??りでよいã€?
291                    }
292    
293                    // 3.5.5.2 (2004/04/02) 選択行ã?件数
294                    if( rows != null ) {
295                            rowCount = rows.length;
296                            rowNo = Integer.parseInt( rows[0] );
297                    }
298                    else {
299                            rowCount = 0;
300                     }
301                    // 3.7.0.1 (2005/01/31) リクエスト変数に選択された件数を追åŠ?
302                    setRequestAttribute( "ROW_COUNT",String.valueOf( rowCount ) );
303    
304                    if( cmd == null || cmd.length() == 0 ) { cmd = "INIT"; }
305    //              String forwardPage = "result.jsp" ;
306                    final String forwardPage;
307    
308                    String backPage = (String)session.getAttribute( HybsSystem.FORWARD_PAGE_KEY );
309                    String command  = cmd;          // 3.5.5.5 (2004/04/23)
310                    int    pagePlus = 0;
311    
312                    // コマンドパラメータにより振åˆ?�‘
313                    // 5.1.8.0 (2010/07/01) VIEWの場合も、直前ã?JSPに遷移するã€?
314    //              if( "FIRST,PREV,NEXT,LAST".indexOf( cmd ) >= 0 ) {
315                    if( "FIRST,PREV,NEXT,LAST,VIEW".indexOf( cmd ) >= 0 ) {
316                            forwardPage = backPage;
317    //              } else if( "NEW,VIEW,RENEW".indexOf( cmd ) >= 0 ) {
318                    } else if( "NEW,RENEW".indexOf( cmd ) >= 0 ) {
319                            // 初期値
320                            forwardPage = "result.jsp";
321                    } else if( "INIT".equals( cmd ) ) {
322                            forwardPage = DUMMY_HTML;                       // 3.5.5.3 (2004/04/09)
323                    } else {
324                            // 共有オブジェクト検索
325    
326                            // リンクå…?‚³マンド名取å¾?
327                            // 3.5.5.5 (2004/04/23) 余計なボタン関連æƒ??を転送しなã�?‚ºに、キーを変更しますã?
328                            command = request.getParameter( HybsSystem.NO_XFER_KEY + cmd + "CMD" );
329    
330                            // 3.7.0.3 (2005/03/01) æŒ?®šã?行番号まで画面をスクロールさせる機è?を追åŠ??
331                            if( rows != null && "ENTRY".equals( command ) ) {
332                                    setRequestCacheData( "SEL_ROW",String.valueOf( rowNo ) );
333                            }
334    
335                            if( "RESET".equals( command ) ) { // RESET æ™?
336                                    forwardPage = "result.jsp";
337                            }
338                            else {
339                                    // リンク先取å¾?
340                                    forwardPage = request.getParameter( HybsSystem.NO_XFER_KEY + cmd );
341                                    // INSERTとCOPYの場合ã?み
342                                    if( "INSERT".equals( command ) || "COPY".equals( command ) ) {
343                                            if( rows != null ) { pagePlus = rows.length; }
344                                    }
345                            }
346    
347    //                      // リンク先取å¾?
348    //                      forwardPage = request.getParameter( HybsSystem.NO_XFER_KEY + cmd );
349    //
350    //                      // INSERTとCOPYの場合ã?み
351    //                      if( "INSERT".equals( command ) || "COPY".equals( command ) ) {
352    //                              if( rows != null ) { pagePlus = rows.length; }
353    //                      }
354    //                      else if( "RESET".equals( command ) ) { // RESET æ™?
355    //                              forwardPage = "result.jsp";
356    //                      }
357                    }
358    
359                    if( ! forwardPage.equals( backPage ) ) {
360                            session.setAttribute( HybsSystem.REVIEW_PAGE_KEY , backPage );
361                    }
362                    session.setAttribute( HybsSystem.FORWARD_PAGE_KEY, forwardPage );
363    
364                    // 3.5.5.5 (2004/04/23) SubmitTag の keys,vals 属æ?でæŒ?®šしたå?のみ、転送しますã?
365                    StringBuilder strURL = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
366                    strURL.append( "&" ).append( "command" ).append( "=" ).append( command );
367                    strURL.append( "&" ).append( "pagePlus" ).append( "=" ).append( String.valueOf( pagePlus ) );
368    
369                    String btnKey = HybsSystem.NO_XFER_KEY + cmd + "KEY_" ;
370                    int    keylen = btnKey.length() ;
371    
372                    Enumeration<?> enm = getParameterNames();         // 4.3.3.6 (2008/11/15) Generics警告対å¿?
373    
374                    while( enm.hasMoreElements() ) {
375                            String key = (String)( enm.nextElement() );
376                            // 3.5.5.5 (2004/04/23) 余計なæƒ??を転送しなã�?§˜に、キーを選別しますã?
377                            if( key != null && key.startsWith( btnKey ) ) {
378                                    // 3.5.5.8 (2004/05/20) å†?ƒ¨の仮想リクエスãƒ?Map に設定しますã?
379                                    String kk = key.substring( keylen ) ;
380                                    String vv = getRequestValue(key) ;
381                                    // 3.8.5.1 (2006/04/28) vals="[カラãƒ?��]" とã�?�†引数をå?ç�?�§きる機è?を追åŠ??
382                                    if( vv != null && vv.length() > 2 && vv.charAt(0) == '[' && vv.charAt(vv.length()-1) == ']' ) {
383                                            submitTableMap.put( kk,vv.substring( 1,vv.length()-1 ));
384                                    }
385            //                      else if( "dbkeys".equals( kk ) ) {
386            //                              submitRequestMap.put( kk,vv );
387            //                      }
388                                    else {
389                                            submitRequestMap.put( kk,vv );
390                                            strURL.append( "&" );
391                                            strURL.append( kk ).append( "=" );
392                                            strURL.append( StringUtil.urlEncode( vv ) );
393                                    }
394    
395                                    // 3.8.0.8 (2005/10/03) BACK_GAMENID があれã? BACK_ROW を追åŠ?�™るã?
396                                    if( "BACK_GAMENID".equalsIgnoreCase( kk ) && rowNo >= 0 ) {
397                                            strURL.append( "&BACK_ROW=" );
398                                            strURL.append( rowNo );
399                                    }
400                            }
401                    }
402    
403                    return XHTMLTag.addUrlEncode( forwardPage,strURL.toString() );
404            }
405    
406            /**
407             * ペã?ジã‚?リãƒ?‚¤レクトかフォワードか選択しますã?
408             * 判定条件は、拡張子やã€?�¸択件数などを加味して以下ã?判定をé ?¬¡ãƒ?‚¹トしますã?
409             *
410             *   FORWARD :
411             *       アドレスがã? null かã?.jsp を含みã€?/" がå?ってã�?�ªã�??å�?
412             *   REDIRECT:
413             *       アドレスがã?.jsp を含まなã�?�‹、それ以å¤?.jsp を含みã€?/" も含ã‚?でã€?�¸択数が1件のみの場å�?
414             *   COUNT_0 :
415             *       それ以外でã€?�¸択数が0件の場å�?
416             *   COUNT_N :
417             *       それ以外でã€?�¸択数が1件以上ã?場合ã?またã?、その他ã?
418             *
419             * @og.rev 3.5.5.2 (2004/04/02) 新規作æ??šisJspPrefix( String page ) の代用ですã?
420             * @og.rev 4.0.0.0 (2007/05/23) useTableData の書き換えを中止しますã?
421             * @og.rev 4.0.0.0 (2007/11/12) 非選択状態でもリãƒ?‚¤レクト可能なフラグ(isRedirectCheck)を追åŠ?
422             *
423             * @param   page        判定する転送å?アドレス
424             *
425             * @return  FORWARD,REDIRECT,COUNT_0,COUNT_N のã�?�¡、どれか
426             */
427            private int selectResponseMethod( final String page ) {
428                    if( page == null ) { return FORWARD; }
429    
430                    int adrs = page.indexOf( ".jsp" );
431    
432                    if( adrs >= 0 && page.lastIndexOf( '/',adrs ) < 0 ) {
433    //                      useTableData = false;           // 現時点での forward では、使用できませんã€?
434                            return FORWARD;
435                    }
436    //              else if( adrs < 0 || !useTableData ) {
437    //              else if( adrs < 0 ) {
438                    else if( adrs < 0 || !isRedirectCheck ) { // 4.0.0.0 (2007/11/12) 非選択リãƒ?‚¤レクト許可フラグ追åŠ?
439    //                      useTableData = false;           //      jsp 以外では、使用できませんã€?
440                            return REDIRECT;
441                    }
442                    else if( rowCount == 1 ) {
443                            return REDIRECT;
444                    }
445                    else if( rowCount == 0 ) {
446                            return COUNT_0;
447                    }
448                    else {
449                            return COUNT_N;
450                    }
451            }
452    
453            /**
454             * 【TAG】選択行データをã?URL 引数に追åŠ?�™ã‚?true)かどã�?�‹を指定しまã�?初期値:false)ã€?
455             *
456             * @og.tag
457             * 選択された DBTableModel の 行データをそのまま、URL の 引数に追åŠ?�—て
458             *      転送するかどã�?�‹を指定できるフラグ、useTableData 属æ?を追åŠ?�—ますã?
459             *      初期値は、false (互換性の為)ですã?
460             *      なおã?SubmitTag(サブミãƒ?ƒˆボタンタグ)で、gamenIdが指定された場合ã?
461             *      つまりã?他ã?フォルãƒ?�«リクエストされた場合ã?み、有効になりますã?
462             *      自åˆ??身のフォルãƒ??では、forward が使用されるためã?使えませんã€?
463             *
464             * @og.rev 3.5.5.2 (2004/04/02) 新規追åŠ?
465             * @og.rev 3.5.5.8 (2004/05/20) å†?ƒ¨仮想リクエスãƒ?Map を参照できるようにするã€?
466             *
467             * @param       flag 選択行データを使用する(true)/しなã�?false)
468             */
469    //      public void setUseTableData( final String flag ) {
470    //              useTableTemp = nval( getRequestParameter( flag ),useTableTemp );
471    //      }
472    
473            /**
474             * 【TAGã€?通常使ã�?�¾せん)sessionからæ‰?¾—すã‚?DBTableModelオブジェクトã? ID
475             *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
476             *
477             * @og.tag
478             * 表示処ç�?¾Œに??å†?ƒ¨ポインタを書き換えた)DBTableModelオブジェクトを
479             * 同じキーで、sessionに登録しますã?
480             *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
481             *
482             * @og.rev 3.5.5.2 (2004/04/02) 新規追åŠ?
483             * @og.rev 3.5.5.8 (2004/05/20) å†?ƒ¨仮想リクエスãƒ?Map を参照できるようにするã€?
484             *
485             * @param       id sessionからæ‰?¾—する時の ID
486             */
487            public void setTableId( final String id ) {
488                    // 注æ„?引数のリクエスト変数が無ければ、è?åˆ??身({@XXX}形å¼?をå?セãƒ?ƒˆするã€?
489                    tableIdTemp   = nval( getRequestParameter( id ),id );
490            }
491    
492            /**
493             * æŒ?®šã?スコープã?å†?ƒ¨キャãƒ?‚·ュæƒ??に、DBTableModel の選択された値を登録しますã?
494             *
495             * è¤?•°選択行が存在する場合ã?、å?頭行を処ç�?�—ますã?ただしã?action="APPEND"の
496             * 場合ã?、separator属æ?でæŒ?®šされたæ–?­—を使用してã€??結しますã?
497             *
498             * @og.rev 3.5.5.2 (2004/04/02) 新規作æ?
499             * @og.rev 3.5.5.5 (2004/04/23) URLに連結するDBTableModelのカラãƒ?‚’CSV形式でæŒ?®šしますã?
500             * @og.rev 3.8.0.4 (2005/08/08) dbkeys ã�?null の場合に全件取得してã�?�Ÿ処ç�?‚’中止しますã?
501             * @og.rev 3.8.0.8 (2005/10/03) dbkeys ã�?null の場合に全件取得してã�?�Ÿ処ç�?‚’復活しますã?
502             * @og.rev 3.8.5.1 (2006/04/28) vals="[カラãƒ?��]" とã�?�†引数をå?ç�?�§きる機è?を追åŠ??
503             * @og.rev 3.8.5.1 (2006/04/28) dbkeys ã�?null の場合に全件取得するかどã�?�‹ã‚?COMMON_FORWARD_DBKEYS_NULL_ALL でæŒ?®šしますã?
504             * @og.rev 4.0.0.0 (2007/05/23) tableId をこのメソãƒ?ƒ‰å†?�§求めますã?
505             *
506             * @return      DBTableModelの選択された値のæ–?­—å?
507             */
508            private String getTableUrlData() {
509                    String tableId = nval( getSubmitRequestParameter( tableIdTemp ),HybsSystem.TBL_MDL_KEY );
510    
511                    DBTableModel table = (DBTableModel)getSessionAttribute( tableId );
512    
513                    String dbkeysUrl  = "";
514                    String tblkeysUrl = "";
515    
516                    if( table != null ) {
517                            String[] keys = null;
518                            String[] vals = null;
519                            if( dbkeys != null ) {
520                                    keys = StringUtil.csv2Array( dbkeys );
521                                    vals = new String[keys.length];
522                                    for( int i=0; i<keys.length; i++ ) {
523                                            int clmNo = table.getColumnNo( keys[i] );
524                                            vals[i] = table.getValue(rowNo,clmNo);
525                                    }
526                            }
527    
528                            dbkeysUrl = XHTMLTag.urlEncode( keys, vals );
529    
530                            // 3.8.5.1 (2006/04/28) vals="[カラãƒ?��]" とã�?�†引数をå?ç�?�§きる機è?を追åŠ??
531                            int size = submitTableMap.size();
532                            if( size > 0 ) {
533                                    @SuppressWarnings("rawtypes")
534                                    Map.Entry[] entry = submitTableMap.entrySet().toArray( new Map.Entry[size] );
535    
536                                    String[] tblkeys = new String[size];
537                                    String[] tblvals = new String[size];
538    
539                                    for( int i=0; i<size; i++ ) {
540                                            tblkeys[i]  = (String)entry[i].getKey();
541                                            String temp = (String)entry[i].getValue();
542                                            int clmNo = table.getColumnNo( temp );
543                                            tblvals[i] = table.getValue( rowNo,clmNo );
544                                    }
545                                    tblkeysUrl = XHTMLTag.urlEncode( tblkeys, tblvals );
546                            }
547                    }
548    
549                    String rtn = dbkeysUrl;
550    
551                    if( tblkeysUrl.length() > 0 ) {
552                            if( rtn.length() > 0 ) {
553                                    rtn += "&" + tblkeysUrl;
554                            }
555                            else {
556                                    rtn = tblkeysUrl ;
557                            }
558                    }
559                    return rtn ;
560            }
561    
562            /**
563             * 【TAG】DBキーをCSV 形式でセãƒ?ƒˆしますã?
564             *
565             * @og.tag
566             * URI の引数にセãƒ?ƒˆするキーã‚?CSV 形式でセãƒ?ƒˆしますã?
567             * ここのæŒ?®šã?,DBTableModel 上ã?ãƒ??タを取り込みますã?
568             *
569             * @og.rev 3.5.5.5 (2004/04/23) URLに連結するDBTableModelのカラãƒ?‚’CSV形式でæŒ?®šしますã?
570             * @og.rev 3.5.5.8 (2004/05/20) å†?ƒ¨仮想リクエスãƒ?Map を参照できるようにするã€?
571             *
572             * @param       key DBキー(CSV 形å¼?
573             */
574            public void setDbkeys( final String key ) {
575                    // 注æ„?引数のリクエスト変数が無ければ、è?åˆ??身({@XXX}形å¼?をå?セãƒ?ƒˆするã€?
576                    dbkeysTemp = nval( getRequestParameter( key ),key ) ;
577            }
578    
579            /**
580             * å†?ƒ¨の仮想リクエスãƒ?Map より、リクエストパラメータより値を設定しますã?
581             *
582             * submitタグの keys,vals より送信されたリクエストå?は、このクラスで
583             * 処ç�?�•れã?å†?ƒ¨の仮想リクエスãƒ?Map に保存されますã?
584             * 通常のリクエスト設定時点では、この値は取り出すことがå?来なã�?‚ºã€?
585             * Map に保å­?getForwardURI 処ç�?�§設å®?された後に、引き出しますã?
586             *
587             * @og.rev 3.5.5.8 (2004/05/20) 新規作æ?
588             *
589             * @param       key        DBキー(CSV 形å¼?
590             *
591             * @return      仮想リクエスãƒ?Map を反æ˜?�•せた、リクエストå?
592             */
593            private String getSubmitRequestParameter( final String key ) {
594                    String rtn = key;
595    
596                    // 変数ã�?"{@XXXX}" の場合ã?み対å¿?
597                    if( key != null && key.startsWith( "{@" ) && key.charAt(key.length()-1) == '}' ) {
598                            rtn = submitRequestMap.get( key.substring( 2,key.length()-1 ) );
599                    }
600    
601                    return rtn;
602            }
603    
604            /**
605             * 【TAG】非選択状態ã?場合にforwardを許可するかどã�?�‹[true/false]を指定しまã�?初期値:true)ã€?
606             *
607             * @og.tag
608             * 初期値はtrueが設定されてã�?�¾ã�?
609             * falseにすると許可されまã�?
610             *
611             * @og.rev 4.0.0.0 (2007/11/09) 新規作æ?
612             *
613             * @param       flag    非選択状態ã?forwardを許可 [true:不許可/false:許可]
614             */
615            public void setUseRedirectCheck(final String flag) {
616                    isRedirectCheck = nval( getRequestParameter( flag ),isRedirectCheck );
617            }
618    
619    //      private boolean isUseRedirectCheck() {
620    //              return isRedirectCheck;
621    //      }
622    
623            /**
624             * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
625             *
626             * @og.rev 4.3.1.1 (2008/08/23) 新規追åŠ?
627             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
628             *
629             * @param       strm    ObjectOutputStreamオブジェクãƒ?
630             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
631             */
632            private void writeObject( final ObjectOutputStream strm ) throws IOException {
633                    strm.defaultWriteObject();
634            }
635    
636            /**
637             * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
638             *
639             * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
640             *
641             * @og.rev 4.3.1.1 (2008/08/23) 新規追åŠ?
642             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
643             *
644             * @param       strm    ObjectInputStreamオブジェクãƒ?
645             * @see #release2()
646             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
647             * @throws ClassNotFoundException       クラスを見つけることができなかったå?å�?
648             */
649            private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
650                    strm.defaultReadObject();
651                    submitRequestMap        = new HashMap<String,String>();
652                    submitTableMap          = new HashMap<String,String>();
653            }
654    
655            /**
656             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
657             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
658             *
659             * @return こã?クラスのæ–?­—å?表現
660             */
661            @Override
662            public String toString() {
663                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
664                                    .println( "VERSION"                     ,VERSION                )
665                                    .println( "rowCount"            ,rowCount               )
666    //                              .println( "useTableData"        ,useTableData   )
667    //                              .println( "tableId"                     ,tableId                )
668                                    .println( "rowNo"                       ,rowNo                  )
669                                    .println( "dbkeys"                      ,dbkeys                 )
670    //                              .println( "useTableTemp"        ,useTableTemp   )
671                                    .println( "tableIdTemp"         ,tableIdTemp    )
672                                    .println( "dbkeysTemp"          ,dbkeysTemp             )
673                                    .println( "Other..."            ,getAttributes().getAttribute() )
674                                    .fixForm().toString() ;
675            }
676    }