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.filter;
017    
018    import org.opengion.fukurou.util.StringUtil;
019    import org.opengion.fukurou.util.FileUtil;
020    
021    import java.util.regex.Pattern ;
022    import java.util.regex.Matcher ;
023    import java.util.Set ;
024    import java.util.HashSet ;
025    import java.io.File;
026    
027    /**
028     * FileFilter で使用する、紙芝å±?”¨HTMLファイル作æ?時にå†?ƒ¨æ–?­—å?を変換するクラスですã?
029     *
030     * @og.group フィルター処ç�?
031     *
032     * @version  4.0
033     * @author   Kazuhiko Hasegawa
034     * @since    JDK5.0,
035     */
036    public class FileResponseTransform {
037            private static final ChangeData[] data = new ChangeData[] {
038    //               new ChangeData( null,"=\"/[^/]*/jsp/","=\"../" )                                                       // 5.5.7.2 (2012/10/09) å»?­¢
039    //              ,new ChangeData( null,"='/[^/]*/jsp/","='../" )                                                         // 5.5.7.2 (2012/10/09) å»?­¢
040                     new ChangeData( null,"\"/[^/]*/jsp/","\"../" )                                                         // 5.5.7.2 (2012/10/09) マッチ条件をåº?�’ã‚?
041                    ,new ChangeData( null,"'/[^/]*/jsp/","'../" )                                                           // 5.5.7.2 (2012/10/09) マッチ条件をåº?�’ã‚?
042                    ,new ChangeData( null,"=\"/[^/]*/[^/]*/ChartTemp/","=\"../ChartTemp/" )         // 5.5.2.5 (2012/05/21) JfreeChart関係ã?画像ã?アドレス変換
043                    ,new ChangeData( null,"='/[^/]*/[^/]*/ChartTemp/","='../ChartTemp/" )           // 5.5.2.5 (2012/05/21) JfreeChart関係ã?画像ã?アドレス変換
044                    ,new ChangeData( null,"=\"/[^/]*/help/","=\"../help/" )                                         // 5.5.2.5 (2012/05/21) help関係ã?画像ã?アドレス変換
045                    ,new ChangeData( null,"='/[^/]*/help/","='../help/" )                                           // 5.5.2.5 (2012/05/21) help関係ã?画像ã?アドレス変換
046    //              ,new ChangeData( "multiMenu.htm","=\"../../../mr/jsp/","=\"../" )
047                    ,new ChangeData( null,"\\.jsp" ,".htm" )
048                    ,new ChangeData( "forward.htm" ,"type=\"submit\"","type=\"button\"" )
049                    ,new ChangeData( "forward.htm" ,"frame src=\"result","frame src=\"forward" )                                                    // 5.6.3.4 (2013/04/26) result.jsp にフレーãƒ?‚’使ã�?ƒ‘ターン(?“ã?イン)
050                    ,new ChangeData( "reset.htm"   ,"frame src=\"result","frame src=\"forward" )                                                    // 5.6.4.2 (2013/05/17) reset.htm で、フレーãƒ?‚’使ã�?ƒ‘ターン(?“ã?イン)
051                    ,new ChangeData( "index.htm"   ,"frame src=\"forward.htm","frame src=\"../common/dummy.html" )
052                    ,new ChangeData( "index.htm"   ,"frame src=\"entry.htm"  ,"frame src=\"../common/dummy.html" )                  // 5.6.3.4 (2013/04/26) ENTRY系の特殊対å¿?
053                    ,new ChangeData( "indexRNW.htm","frame src=\"forward.htm","frame src=\"renew.htm" )
054                    ,new ChangeData( "indexNW.htm" ,"frame src=\"query.htm"  ,"frame src=\"queryNW.htm" )
055                    ,new ChangeData( "indexNW.htm" ,"frame src=\"entry.htm"  ,"frame src=\"../common/dummy.html" )                  // 5.6.3.4 (2013/04/26) ENTRY系の特殊対å¿?
056    //              ,new ChangeData( "forward.htm" ,"onSubmit=\"return oneClick\\(\\);\"","onSubmit=\"return false;\"" )    // 5.5.7.2 (2012/10/09) å»?­¢
057                    ,new ChangeData( null ,"onSubmit=\"return oneClick\\(\\);\"","onSubmit=\"return false;\"" )                             // 5.5.7.2 (2012/10/09) 変更は、すべて行うã€?
058                    ,new ChangeData( null ,"onSubmit=\"\""                                          ,"onSubmit=\"return false;\"" )                         // 5.6.3.4 (2013/04/26) onSubmit 引数のなã�?‚±ースへの対å¿?
059                    ,new ChangeData( null ,"src=\"\\.\\./common/option/ajaxSubmit\\.js\\?v=[^\"]+\"","" )                                   // 5.6.3.4 (2013/04/26) ajaxSubmit.js を削除
060                    // 4.3.3.0 (2008/10/01) 戻るリンクの対å¿?
061                    ,new ChangeData( "queryNW.htm" ,"=\"http://.*jsp/+?","=\"../" )
062                    ,new ChangeData( "query.htm"   ,"renew\\('query.htm'","renew\\('queryNW.htm'" )                                                 // 5.6.4.2 (2013/05/17) renew('query.htm' 変換
063    // 4.3.3.0 (2008/10/01) Matrixメニュー対応をä¸?®?‰€にé›?‚�ますã?
064    //              ,new ChangeData( "matrixMenu.htm" ,"result\\.htm\\?.*GAMENID=","" ) // マトリクスメニュー対å¿?
065    //              ,new ChangeData( "matrixMenu.htm" ,"&","/index.htm?" ) // マトリクスメニュー対å¿?
066                     // 漢字ã?ボタンでは、後ろにショートカãƒ?ƒˆæ–?­—が入る為、前方ä¸??で挿入するã€?
067            //      ,new ChangeData( "forward.htm","value=\"追åŠ?,"onClick=\"location.href='insert.htm'\" value=\"追åŠ? )
068            //      ,new ChangeData( "forward.htm","value=\"�?","onClick=\"location.href='copy.htm'\"   value=\"�?" )
069            //      ,new ChangeData( "forward.htm","value=\"変更","onClick=\"location.href='modify.htm'\" value=\"変更" )
070            //      ,new ChangeData( "forward.htm","value=\"削除","onClick=\"location.href='delete.htm'\" value=\"削除" )
071    //              ,new ChangeData( null           ,"value=\"登録","onClick=\"location.href='entry.htm'\"  value=\"登録" )
072            //      ,new ChangeData( "query.htm","index.htm\\?command=RENEW"        ,"indexRNW.htm?command=RENEW" )
073            //      ,new ChangeData( null           ,"index.htm\\?command=NEW"              ,"indexNW.htm?command=NEW" )
074                    ,new IndexMatrixMenuData()              // 4.3.3.0 (2008/10/01) マトリクスメニュー対å¿?
075                    ,new IndexChangeData()
076                    ,new HrefChangeData()
077                    ,new NoTranHrefChangeData()                     // 5.6.3.4 (2013/04/26) entry.htm に "noTransitionUrl" が存在するときã?処ç�??
078                    ,new FileDownloadChangeData()           // 5.6.4.2 (2013/05/17) fileDownload.htm 対å¿?
079            };
080    
081            private static final Set<String> TARGET_CHANGE_SET = new HashSet<String>();
082    
083    //      private final ChangeData entryChange = new ChangeData( "query.htm" ,"action=\"forward.htm\"","action=\"entry.htm\"" );
084    
085            /**
086             * 変換を行いますã?
087             * 実際には、各å†?ƒ¨クラスのメソãƒ?ƒ‰で処ç�?‚’行いますã?
088             *
089             * @og.rev 5.6.4.2 (2013/05/17) JFreeChart の画像ファイル(ChartTempフォルãƒ? のコピã?
090             *
091             * @param       file    対象ファイルå�?
092             * @param       inStr   対象ãƒ??タ
093             *
094             * @return      変換後データ
095             */
096            public String replace( final String file,final String inStr ) {
097                    String rtnStr = inStr;
098    
099                    // query 画面で、登録コマンドが発行された場合ã?特殊å?ç�?
100                    if( file.indexOf( "query.htm" ) >= 0 && inStr.indexOf( "name=\"command\" value=\"登録" ) >= 0 ) {
101                            rtnStr = inStr.replace( "forward.jsp","entry.htm" );
102                    }
103    
104                    // 5.6.4.2 (2013/05/17) JFreeChart の画像ファイル(ChartTempフォルãƒ? のコピã?
105                    if( inStr.indexOf( "/ChartTemp/" ) >= 0 ) {
106                            chartTempFileCopy( file,inStr );
107                    }
108    
109                    for( int i=0; i<data.length; i++ ) {
110                            rtnStr = data[i].replace( file,rtnStr );
111                    }
112                    return rtnStr;
113            }
114    
115            // 5.6.4.2 (2013/05/17) JFreeChart の画像ファイル(ChartTempフォルãƒ? のコピã?関係ã?固定å?
116            private static final String CHART_KEY = "/ChartTemp/" ;
117            private static final int    KEY_LEN   = CHART_KEY.length();
118    
119            /**
120             * JFreeChart の画像ファイル(ChartTempフォルãƒ? のコピã?を行いますã?
121             * これは、Tomcatを停止させずに、ChartTempフォルãƒ?を人手てコピã?する予定でしたがã?
122             * ä¸?¸??停止させると、ファイルがè?動削除されるためã?自動コピã?機è?をå?れておきますã?
123             *
124             * ここの処ç�??、対象ãƒ??タ(inStr) のæ–?­—å?変換ではなくã?画像ファイルを見つけてã€?
125             * コピã?するとã�?�†処ç�?‚’行いますã?非常に特殊な処ç�?�§すã?
126             *
127             * @og.rev 5.6.4.2 (2013/05/17) 新規追åŠ?
128             *
129             * @param       file    対象ファイルå�?
130             * @param       inStr   対象ãƒ??タ
131             */
132            private void chartTempFileCopy( final String file,final String inStr ) {
133                    // 以下ã?決め打ちしますã?本当ã? saveDir ã‚??ChartTemp をパラメータから取得すべã�?
134                    // 大前提として、fromDir = filetemp/ChartTemp/
135                    //               toDir   = filetemp/DIR/ChartTemp/
136    
137                    int adrs = file.indexOf( "filetemp/DIR" );                      // jsp ファイルの出力å?なので、DIR を含んでã�?�¾すã?
138                    File fromDir = new File( file.substring( 0,adrs ) + "filetemp/ChartTemp/" );
139                    File toDir   = new File( file.substring( 0,adrs ) + "filetemp/DIR/ChartTemp/" );
140    
141                    // コピã?先ディレクトリが存在しなければ・・・
142                    if( !toDir.exists() ) {
143                            // ãƒ?‚£レクトリを作æ?する
144                            if( !toDir.mkdirs() ) {
145                                    System.err.println( toDir + " の ãƒ?‚£レクトリ作æ?に失敗しましたã€? );
146                                    return ;
147                            }
148                    }
149    
150                    // 画像ファイル名を求めますã?
151                    int st = inStr.indexOf( CHART_KEY ) ;
152                    while( st >= 0 ) {
153                            int ed = inStr.indexOf( ".png" ,st + KEY_LEN ) ;                        // 検索開始位置は、CHART_KEYの発見å?æ‰?¼‹文字数
154                            String fname = inStr.substring( st + KEY_LEN , ed + 4 );        // + 4 はã€?.png" のåˆ?
155    
156                            FileUtil.copy( new File( fromDir,fname ) , new File( toDir,fname ) );
157    
158                            st = inStr.indexOf( CHART_KEY , ed + 4 ) ;
159                    }
160            }
161    
162            /**
163             * 個ã?の変換ãƒ??タを管ç�?�—てã�?‚‹、データクラス
164             * こã?クラスは、不変クラスのため、ã?ルチスレãƒ?ƒ‰での同時使用に対して、安å?ですã?
165             *
166             */
167            private static class ChangeData {
168                    private final String filename ;
169                    private final String org ;
170                    private final String rep ;
171    
172                    /**
173                     * ãƒ?ƒ•ォルトコンストラクター
174                     * サブクラス作æ?用に用意された、コンストラクタ。このクラス自身には不要ã?
175                     */
176                    public ChangeData() {
177                            this( null,null,null );
178                    }
179    
180                    /**
181                     * コンストラクター
182                     * 初期設定を行いますã?
183                     * 対象ファイル名ã?、å?ç�?‚’実行するかどã�?�‹の判定に使用しますã?
184                     * æŒ?®šã?æ–?­—å?が含まれてã�?‚‹かどã�?�‹で判定しますã?
185                     * null の場合ã?、すべてのファイルを対象にしますã?
186                     *
187                     * @param       filename        対象ファイルå�?
188                     * @param       org     変換å…?ƒ‡ータ
189                     * @param       rep     変換後データ
190                     */
191                    public ChangeData( final String filename,final String org,final String rep ) {
192                            this.filename = filename;
193                            this.org = org;
194                            this.rep = rep;
195                    }
196    
197                    /**
198                     * 実際に変換を行うメソãƒ?ƒ‰
199                     * å†?ƒ¨çš?�«は、å?力文字å?.replaceAll( 変換å…?変換å¾?) メソãƒ?ƒ‰を実行しますã?
200                     *
201                     * @param       file    対象ファイルå�?
202                     * @param       inStr   対象ãƒ??タ
203                     * @return      変換後データ
204                     */
205                    public String replace( final String file,final String inStr ) {
206                            String rtnStr = inStr;
207                            if( filename == null || file.indexOf( filename ) >= 0 ) {
208                                    rtnStr = inStr.replaceAll( org,rep );
209                            }
210                            return rtnStr;
211                    }
212    
213                    /**
214                     * こã?オブジェクトã?æ–?­—å?表現
215                     * "ChangeData( " + filename + " , " + org + " , " + rep + " )" を返しますã?
216                     *
217                     * @return      æ–?­—å?表現
218                     */
219                    public String toString() {
220                            return "ChangeData( " + filename + " , " + org + " , " + rep + " )" ;
221                    }
222            }
223    
224            /**
225             * マトリクスメニュー対応ã?ãƒ??タ置き換えクラスですã?
226             * jsp/ は、å?にã€?./ に変換済みなので、その "../" からの検索条件で判断しますã?
227             * multiMenu と、matrixMenu は、標準ã?、menu フォルãƒ?�§すが、å?合によっては、custom フォルãƒ?�«存在する
228             * 場合があるため、menu/ は検索条件に含めませんã€?
229             * ③と④は、変換処ç�??無ã�??ずなので、ロジãƒ?‚¯は記述してã�?�¾せんã€?
230             *
231             *   matrixMenu対å¿?
232             *                 URIåˆ?›¢          URIåˆ?›¢           request取å?
233             *              â‘?gamenId="jsp"  + index.jsp       + GAMENID=XXXX  â‡?saveDir + "jsp/indexXXXX.htm"         Matrixメニューからの画面呼出しã?
234             *              ② gamenId="jsp"  + result.jsp      + GAMENID=XXXX  â‡?saveDir + "jsp/indexXXXX.htm"         画面QUERYのヘッãƒ??メニュー
235             *              ③ gamenId="menu" + multiMenu.jsp   + group=YYYY    â‡?saveDir + "menu/menuYYYY.htm"         通常メニューのグループ選æŠ?
236             *              ④ gamenId="menu" + matrixMenu.jsp  + group=YYYY    â‡?saveDir + "menu/matrixMenuYYYY.htm"   Matrixメニューのグループ選æŠ?
237             *
238             * こã?クラスは、不変クラスのため、ã?ルチスレãƒ?ƒ‰での同時使用に対して、安å?ですã?
239             *
240             * @og.rev 4.3.3.0 (2008/10/01) Matrixメニュー対å¿?
241             * @og.rev 5.5.2.5 (2012/05/21) TopMenuTag の ONELEVEL メニューリンク対å¿?
242             * @og.rev 5.6.4.2 (2013/05/17) 正規表現修正、判定条件変更
243             */
244            private static final class IndexMatrixMenuData extends ChangeData {
245                    public String replace( final String file,final String inStr ) {
246                            String rtnStr = inStr;
247    
248                            // 5.6.4.2 (2013/05/17) 正規表現修正、判定条件変更
249                            // â‘?gamenId="jsp"  + index.jsp       + GAMENID=XXXX  â‡?saveDir + "jsp/indexXXXX.htm"         Matrixメニューからの画面呼出しã?
250                            // ④ gamenId="menu" + matrixMenu.jsp  + group=YYYY    â‡?saveDir + "menu/matrixMenuYYYY.htm"   Matrixメニューのグループ選æŠ?
251                            if( file.indexOf( "matrixMenu" ) >= 0 ) {
252                                    rtnStr = rtnStr.replaceAll( "../index.htm\\?[^\"]*GAMENID=([^&\"]*)[^\"]*\"","../jsp/index$1.htm\"" );      // â‘?
253                                    rtnStr = rtnStr.replaceAll( "matrixMenu.htm\\?[^\"]*group=([^&\"]*)[^\"]*\"","matrixMenu$1.htm\"" );        // ④
254                                    rtnStr = rtnStr.replaceAll( "=\"../../../mr/jsp/","=\"../" );
255                            }
256                            // ② gamenId="jsp"  + result.jsp      + GAMENID=XXXX  â‡?saveDir + "XXXX/index.htm"            画面QUERYのヘッãƒ??メニュー
257                            else if( file.indexOf( "query" ) >= 0 ) {
258                                    rtnStr = rtnStr.replaceAll( "../result.htm\\?[^\"]*GAMENID=([^&\"]*)[^\"]*\"","../jsp/index$1.htm\"" );     // ②
259                            }
260                            // ③ gamenId="menu" + multiMenu.jsp   + group=YYYY    â‡?saveDir + "jsp/menuYYYY.htm"          通常メニューのグループ選æŠ?
261                            else if( file.indexOf( "multiMenu" ) >= 0 || file.indexOf( "menu" ) >= 0 || file.indexOf( "normalMenu" ) >= 0 ) {
262                                    rtnStr = rtnStr.replaceAll( "multiMenu.htm\\?[^\"]*group=([^&\"]*)[^\"]*\"","menu$1.htm\"" );                       // ③
263                            }
264                            return rtnStr;
265    
266                            // 5.6.4.2 (2013/05/17) 正規表現修正、判定条件変更
267    //                      if( file.indexOf( "matrixMenu" ) >= 0 ) {
268    ////                            rtnStr = inStr.replaceAll( "../index.htm\\?[^>]*GAMENID=([^&]*)&","../jsp/index$1.htm?" );
269    //                              rtnStr = inStr.replaceAll( "../index.htm\\?[^>]*GAMENID=([^&]*)&","../$1/index.htm?" );
270    //                              rtnStr = rtnStr.replaceAll( "=\"../../../mr/jsp/","=\"../" );
271    //                              rtnStr = rtnStr.replaceAll( "matrixMenu.htm\\?[^>]*group=([^&]*)&","matrixMenu$1.htm?" );
272    //                      }
273    //                      else if( file.indexOf( "jsp/index" ) >= 0 ) {
274    //                              rtnStr = inStr.replaceAll( "menu/multiMenu.htm\\?[^>]*GAMENID=([^&]*)&","../jsp/menu$1.htm?" );
275    //                      }
276    //                      else if( file.indexOf( "jsp/menu" ) >= 0 ) {
277    //                              rtnStr = inStr.replaceAll( "matrixMenu.htm","../menu/matrixMenu.htm" );
278    //                      }
279    //                      // 5.5.2.5 (2012/05/21) TopMenuTag の ONELEVEL メニューリンク対å¿?
280    //                      else if( file.indexOf( "query" ) >= 0 ) {
281    //                              rtnStr = inStr.replaceAll( "../result.htm\\?GAMENID=([^\"]*)\"","../$1/index.htm\"" );
282    //                      }
283    //                      return rtnStr;
284                    }
285    
286                    /**
287                     * こã?オブジェクトã?æ–?­—å?表現
288                     * "IndexMatrixMenuData()" を返しますã?
289                     *
290                     * @return      æ–?­—å?表現
291                     */
292                    public String toString() {
293                            return "IndexMatrixMenuData()" ;
294                    }
295            }
296    
297            /**
298             * index.htm のコマンド単位ã?ファイル名ã?置き換えクラスですã?
299             * こã?クラスは、不変クラスのため、ã?ルチスレãƒ?ƒ‰での同時使用に対して、安å?ですã?
300             *
301             */
302            private static final class IndexChangeData extends ChangeData {
303                    // <a href="aaaa/index.htm?command=RENEW&GAMENID=bbbb 形式とマッチし、index.htm 部åˆ?‚’前方参ç?しますã?
304                    private static final Pattern PTN1 = Pattern.compile( "index.htm\\?[^\"]*command=(NEW|RENEW)" );
305    
306                    public String replace( final String file,final String inStr ) {
307                            String rtnStr = inStr;
308            //              if( file.indexOf( "query" ) >= 0 ) {         // query の場å�?
309                                    Matcher mch = PTN1.matcher( rtnStr );
310                                    int adrs = 0;
311                                    while( mch.find( adrs ) ) {
312                                            int indx = mch.start() ;
313                                            String cmd = mch.group(1);              // command=(NEW|RENEW) 部åˆ??()å†?–‡字å?
314                                            // index.htm æ–?­—å?部に、NW またã? RNW を追åŠ?�—、indexNW.html を作æ?するã€?
315                                            if( "NEW".equalsIgnoreCase( cmd ) ) {
316                                                    rtnStr = rtnStr.substring(0,indx+5) + "NW" + rtnStr.substring(indx+5) ;
317                                            }
318                                            else if( "RENEW".equalsIgnoreCase( cmd ) ) {
319                                                    rtnStr = rtnStr.substring(0,indx+5) + "RNW" + rtnStr.substring(indx+5) ;
320                                            }
321                                            adrs = mch.end() ;
322                                            mch.reset( rtnStr );
323                                    }
324            //              }
325                            return rtnStr;
326                    }
327    
328                    /**
329                     * こã?オブジェクトã?æ–?­—å?表現
330                     * "IndexChangeData()" を返しますã?
331                     *
332                     * @return      æ–?­—å?表現
333                     */
334                    public String toString() {
335                            return "IndexChangeData()" ;
336                    }
337            }
338    
339            /**
340             * コマンド転送å?をã?onClick="location.href=XXX" でæŒ?®šするよã�?�«、変換しますã?
341             * <input type="hidden" name="hX_è¤??(C)" value="copy.htm" /> を見つけã?
342             * 前方参ç?で、è¤??(C) と、copy.htm を取りå?しますã?
343             * そã?後ã?<input name="command" value="è¤??(C)" とã�?�†æ–?­—å?をキーにã€?
344             * <input name="command" onClick="location.href='copy.htm'" value="è¤??(C)" とã�?�†
345             * æ–?­—å?に置き換えますã?
346             * これにより、ã?タンを押したときに、ã?タンごとに異なる画面に遷移しますã?
347             * 前提条件として、下記ã?é ?›®をæº?�Ÿしておくå¿?¦�があるã€?
348             *   ・form には、onSubmit="return false;" を記述しã?フォーãƒ?‚’無効化しておくã€?
349             *   ・input タグの type="submit" をã?type="button" にしておくã€?ボタンイベンãƒ?
350             *   ・query.htm 以外ã?ファイルのみ適用。location.href では、フレーãƒ??targetæŒ?®?
351             *     まで行ってã�?�ªã�??
352             *   ・上と同意で、query.htm の登録時å?ç�??、別に行うã€?
353             *
354             * @og.rev 5.5.2.5 (2012/05/21) update.jsp に出力されるファイルをã?コマンド名.htm に出力するよã�?�«機è?追åŠ?
355             * @og.rev 5.6.4.2 (2013/05/17) ?“ã?イン、エントリなど、特殊な画面にフラグを付けますã?(TARGET_CHANGE_SET)
356             */
357            private static final class HrefChangeData extends ChangeData {
358                    private static final String PTN1 = "<input type=\"hidden\" name=\"hX_([^\"]*)\" value=\"([^\"]*.htm)" ;
359    //              private static final Pattern ptn = Pattern.compile( PTN1 );
360                    private static final Pattern ptnObj1 = Pattern.compile( PTN1 );
361    
362    //              private static final String PTN2 = "<input name=\"command\"" ;
363    //              private static final String PTN3 = "<input name=\"command\" onClick=\"location.href='" ;
364    //              private static final String PTN4 = "<input name=\"command\" onClick=\"parent.location.href='" ;
365    
366                    // 5.5.7.2 (2012/10/09) 定数名ã?変更
367                    private static final String ORG  = "<input name=\"command\"" ;
368                    private static final String SELF = "<input name=\"command\" onClick=\"location.href='" ;
369                    private static final String PRNT = "<input name=\"command\" onClick=\"parent.location.href='" ;
370                    private static final String TOP  = "<input name=\"command\" onClick=\"top.location.href='" ;
371    
372                    // 5.5.7.2 (2012/10/09) formのtargetを取得ã?location.href に利用するã€?
373                    private static final String PTN2 = "<form .*target=\"([^\"]*)\"" ;
374                    private static final Pattern ptnObj2 = Pattern.compile( PTN2 );
375    
376                    /**
377                     * コマンド転送å?をã?onClick="location.href=XXX" でæŒ?®šするよã�?�«、変換しますã?
378                     * <input type="hidden" name="hX_è¤??(C)" value="copy.htm" /> を見つけã?
379                     * 前方参ç?で、è¤??(C) と、copy.htm を取りå?しますã?
380                     * そã?後ã?<input name="command" value="è¤??(C)" とã�?�†æ–?­—å?をキーにã€?
381                     * <input name="command" onClick="location.href='copy.htm'" value="è¤??(C)" とã�?�†
382                     * æ–?­—å?に置き換えますã?
383                     *
384                     * @og.rev 5.5.2.5 (2012/05/21) update.jsp に出力されるファイルをã?コマンド名.htm に出力するよã�?�«機è?追åŠ?
385                     * @og.rev 5.5.7.2 (2012/10/09) 定数名ã?変更。formのtargetを加味した、location.href を作æ?するã€?
386                     * @og.rev 5.6.4.2 (2013/05/17) ?“ã?イン、エントリなど、特殊な画面にフラグを付けますã?(TARGET_CHANGE_SET)
387                     *
388                     * @param       file    対象ファイルå�?
389                     * @param       inStr   対象ãƒ??タ
390                     * @return      変換後データ
391                     */
392                    public String replace( final String file,final String inStr ) {
393                            String rtnStr = inStr;
394                            if( file.indexOf( "query.htm" ) < 0 ) {              // query.htm 以外ã?場å�?
395                                    // 5.5.7.2 (2012/10/09) formのtargetを加味した、location.href を作æ?するã€?
396                                    Matcher mch2 = ptnObj2.matcher( rtnStr );
397                                    String ptnHref = SELF;                  // 標準ã?、location.href
398                                    if( mch2.find() ) {
399                                            // 5.6.4.2 (2013/05/17) ?“ã?イン、エントリなど、特殊な画面にフラグを付けますã?(TARGET_CHANGE_SET)
400                                            int indx = file.lastIndexOf( '/' );
401                                            String fileKey = file.substring( 0,indx );
402    
403                                            String frmTgt = mch2.group(1);
404                                            if( "CONTENTS".equals( frmTgt ) )  { ptnHref = PRNT; }
405                                            else if( "_top".equals( frmTgt ) ) { ptnHref = TOP;  }
406                                            else if( !"RESULT".equals( frmTgt ) && frmTgt != null ) {
407                                                    ptnHref = "<input name=\"command\" onClick=\"parent." + frmTgt + ".location.href='" ;
408                                                    // 5.6.4.2 (2013/05/17) ある画面で、特殊なターゲãƒ?ƒˆ(INPUT,BUTTOMなど)を使用してã�?‚‹場合に記æ?
409                                                    TARGET_CHANGE_SET.add( fileKey );               // 別のファイルをå?ç�?�™るときに参ç?するã€?
410                                            }
411                                            else {
412                                                    // 5.6.4.2 (2013/05/17) ある画面で、特殊なターゲãƒ?ƒˆ(INPUT,BUTTOMなど)を使用してã�?‚‹場合ã?チェãƒ?‚¯
413                                                    if( TARGET_CHANGE_SET.contains( fileKey ) ) {
414                                                            ptnHref = PRNT ;
415                                                    }
416                                            }
417                                    }
418    
419    //                              Matcher mch = ptn.matcher( rtnStr );
420                                    Matcher mch = ptnObj1.matcher( rtnStr );
421                                    int adrs = 0;
422                                    while( mch.find( adrs ) ) {
423                                            String cmd = mch.group(1);
424                                            if( !cmd.endsWith( "CMD" ) ) {
425                                                    String val = mch.group(2);
426    //                                              String str1 = PTN2 + " value=\"" + cmd ;
427                                                    String str1 = ORG + " value=\"" + cmd ;
428                                                    String str2 ;
429    
430                                                    if( val != null && val.startsWith( "../" ) ) {
431    //                                                      str2 = PTN4 + val + "'\" value=\"" + cmd ;
432                                                            str2 = PRNT + val + "'\" value=\"" + cmd ;
433                                                    }
434                                                    // 5.5.2.5 (2012/05/21) update.jsp に出力されるファイルをã?コマンド名.htm に出力するよã�?�«機è?追åŠ?
435                                                    else if( val != null && val.startsWith( "update" ) ) {
436    //                                                      str2 = PTN3 + cmd + ".htm'\" value=\"" + cmd ;
437                                                            str2 = ptnHref + cmd + ".htm'\" value=\"" + cmd ;
438                                                    }
439                                                    else {
440    //                                                      str2 = PTN3 + val + "'\" value=\"" + cmd ;
441                                                            str2 = ptnHref + val + "'\" value=\"" + cmd ;
442                                                    }
443                                                    rtnStr = rtnStr.replace( str1,str2 );
444                                            }
445                                            adrs = mch.end();
446                                            mch.reset( rtnStr );
447                                    }
448                            }
449                            return rtnStr;
450                    }
451    
452                    /**
453                     * こã?オブジェクトã?æ–?­—å?表現
454                     * "HrefChangeData()" を返しますã?
455                     *
456                     * @return      æ–?­—å?表現
457                     */
458                    public String toString() {
459                            return "HrefChangeData()" ;
460                    }
461            }
462    
463            /**
464             * 雛形自動作æ? で、useAjaxSubmit="true" の対ç­?
465             *
466             * update.jsp で、useAjaxSubmit="true" の場合ã?entry.htm は、update.jsp の 
467             * JavaScriptでforward されるためã?雛形には、HTMLの結果は出力されませんã€?
468             * (result.jsp に出力されますã?)
469             * そこでã€?››形作æ?時には、entry.htm にJavaScriptをå?れて、forward させますã?
470             * こã?クラスは、不変クラスのため、ã?ルチスレãƒ?ƒ‰での同時使用に対して、安å?ですã?
471             * 挿入するのは、BODYタグのæœ?¾Œですã?BODYタグがなければ、最後に追åŠ?�—ますã?
472             *
473             * @og.rev 5.6.3.4 (2013/04/26) entry.htm に "noTransitionUrl" が存在するときã?処ç�??
474             */
475            private static final class NoTranHrefChangeData extends ChangeData {
476                    private static final String BODY_END   = "</body>" ;
477                    private static final String APPEND_JS  = "<script type=\"text/javascript\" src=\"../common/option/noTranHref.js\" ><!-- --></script>" ;
478    
479                    public String replace( final String file,final String inStr ) {
480                            String rtnStr = inStr;
481                            // entry.jsp で、かつ noTransitionUrl æ–?­—å?を含ã‚??合ã?み
482                            if( file.indexOf( "entry" ) >= 0 && inStr.indexOf( "noTransitionUrl" ) >= 0 ) {
483                                    int adrs = inStr.indexOf( BODY_END );
484                                    if( adrs > 0 ) {             // </body> タグが存在した場合ã?、その直前に挿入するã€?
485                                            rtnStr = inStr.substring( 0,adrs ) + APPEND_JS + inStr.substring( adrs ) ;
486                                    }
487                                    else {                                  // 存在しなã�??合ã?、最後に挿入するã€?
488                                            rtnStr = inStr + APPEND_JS ;
489                                    }
490                            }
491                            return rtnStr;
492                    }
493    
494                    /**
495                     * こã?オブジェクトã?æ–?­—å?表現
496                     * "NoTranHrefChangeData()" を返しますã?
497                     *
498                     * @return      æ–?­—å?表現
499                     */
500                    public String toString() {
501                            return "NoTranHrefChangeData()" ;
502                    }
503            }
504    
505            /**
506             * 雛形自動作æ? で、fileDownload の日本語名対å¿?
507             *
508             * 標準的な、fileDownload 処ç�?�§はã€?./common/fileDownload.jsp?・・・・GAMENID=XXXX&filename=YYYY" と
509             * なっており、filename 部åˆ??、日本語にも対応できるように urlEncode されてã�?�¾すã?
510             * これをã?å…?�«戻さなã�?�¨ã�?�¾くダウンロードできませんでしたã€?
511             *
512             * ※ 参è?æƒ??
513             *  1.urlEncode のままで、ファイル名を取得するå?合ã?、下記ã?標準系で対応可能ですã?
514             *              ,new ChangeData( null ,"../common/fileDownload.htm\\?[^\"]*filename=([^&\"]*)[^\"]*\"","$1\"" )
515             *  2.ファイル名を、fileDownload.xls 固定にする場合ã?、下記ã?標準系で対応可能ですã?
516             *              ,new ChangeData( null ,"../common/fileDownload.htm\\?[^\"]*\"","fileDownload.xls\"" )
517             *
518             * @og.rev 5.6.4.2 (2013/05/17) 新規追åŠ?
519             */
520            private static final class FileDownloadChangeData extends ChangeData {
521                    private static final String PTN1 = "../common/fileDownload.htm\\?[^\"]*filename=([^&\"]*)[^\"]*\"" ;
522                    private static final Pattern ptnObj1 = Pattern.compile( PTN1 );
523    
524                    public String replace( final String file,final String inStr ) {
525                            String rtnStr = inStr;
526                            // entry.jsp で、かつ noTransitionUrl æ–?­—å?を含ã‚??合ã?み
527                            if( rtnStr.indexOf( "../common/fileDownload.htm" ) >= 0 ) {
528                                    Matcher mch = ptnObj1.matcher( rtnStr );
529                                    int adrs = 0;
530                                    while( mch.find( adrs ) ) {
531                                            String fname = mch.group(1);
532                                            fname = StringUtil.urlDecode( fname );          // ãƒ?‚³ードしてã�?�¾すã?
533    
534                                            int indx = mch.start() ;
535                                            adrs = mch.end();
536                                            rtnStr = rtnStr.substring( 0,indx ) + fname + "\"" + rtnStr.substring( adrs ) ;
537    
538                                            mch.reset( rtnStr );
539                                    }
540                            }
541                            return rtnStr;
542                    }
543    
544                    /**
545                     * こã?オブジェクトã?æ–?­—å?表現
546                     * "FileDownloadChangeData()" を返しますã?
547                     *
548                     * @return      æ–?­—å?表現
549                     */
550                    public String toString() {
551                            return "FileDownloadChangeData()" ;
552                    }
553            }
554    }