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 }