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.fukurou.util.LogWriter;
021 import org.opengion.fukurou.util.FileString;
022
023 import javax.servlet.ServletRequest ;
024 import javax.servlet.http.HttpServletRequest ;
025
026 /**
027 * BODY部に記述されたエンジン固有???({@XXXX}など)を?
028 * ユーザー??のエンコー?ングに変換するタグです?
029 *
030 * XML形式で 日本語コード?パ?スが?JSPエンジン(Tomcat)でサポ??
031 * されるまでの、暫定的なタグです?
032 * なお?こ?タグの?に存在するカスタ?グは、?に実行されるため
033 * 漢字コード?、変換されません?
034 *
035 * @og.formSample
036 * ●形式?lt;og:text >???</og:text>
037 * ●body?あ?EVAL_BODY_BUFFERED:BODYを評価し?{@XXXX} を解析しま?
038 *
039 * ●Tag定義??
040 * <og:text
041 * value 【TAG】value 値に直接書かれた漢字コードをShift_JIS に変換しま?
042 * include 【TAG】動?ファイル?include しま?
043 * debug 【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false)
044 * > ... Body ...
045 * </og:text>
046 *
047 * ●使用?
048 * ・<og:text >
049 * <p>あいおえお?lt;input name="PN" value="{@PN}" /> </p>
050 * </og:text>
051 * ・<og:text value="あい?? />
052 *
053 * 動的にファイル?include することが?来ます?
054 * ・<og:text include="{@query}.txt" />
055 *
056 * @og.group 画面部?
057 *
058 * @version 4.0
059 * @author Kazuhiko Hasegawa
060 * @since JDK5.0,
061 */
062 public class TextTag extends CommonTagSupport {
063 //* こ?プログラ??VERSION??を設定します? {@value} */
064 private static final String VERSION = "4.0.0.0 (2007/11/30)" ;
065
066 private static final long serialVersionUID = 400020071130L ;
067
068 private String value = null;
069 private boolean useInclude = false;
070
071 /**
072 * Taglibの開始タグが見つかったときに処??doStartTag() ?オーバ?ライドします?
073 *
074 * @return 後続????( EVAL_BODY_BUFFERED )
075 */
076 @Override
077 public int doStartTag() {
078 return( EVAL_BODY_BUFFERED ); // Body を評価する? extends BodyTagSupport ?
079 }
080
081 /**
082 * Taglibのタグ本体を処??doAfterBody() ?オーバ?ライドします?
083 *
084 * @og.rev 2.2.0.0 (2002/12/17) 中国?国際化)対?エンコード?取得方法変更
085 * @og.rev 3.0.0.0 (2002/12/25) StringUtil#changeString ?
086 * @og.rev 3.1.1.0 (2003/03/28) ボディの?を取得する??、CommonTagSupport で行う?
087 * @og.rev 4.0.0.0 (2007/10/12) 処?にエラーを発生させな??しする?
088 *
089 * @return 後続????(SKIP_BODY)
090 */
091 @Override
092 public int doAfterBody() {
093 if( !useInclude && value == null ) {
094 // 4.0.0.0 (2007/10/12) 処?にエラーを発生させな?
095 try {
096 value = getBodyString();
097 }
098 catch( HybsSystemException ex ) { // 主に、UserInfo が見つからな???
099 value = getBodyContent().getString() ;
100 }
101
102 if( value != null && value.indexOf( "<og:" ) >= 0 ) {
103 String errMsg = "こ?タグの BODY部に opengion タグが記述されて?す?"
104 + "BODY部ではopengion タグは使用できません?;
105 throw new HybsSystemException( errMsg );
106 }
107 }
108
109 return(SKIP_BODY);
110 }
111
112 /**
113 * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
114 *
115 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
116 *
117 * @return 後続????
118 */
119 @Override
120 public int doEndTag() {
121 debugPrint(); // 4.0.0 (2005/02/28)
122 jspPrint( value );
123
124 return(EVAL_PAGE);
125 }
126
127 /**
128 * タグリブオブジェクトをリリースします?
129 * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
130 *
131 * @og.rev 2.0.0.4 (2002/09/27) カスタ?グの release() メソ?を?追?
132 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
133 *
134 */
135 @Override
136 protected void release2() {
137 super.release2();
138 value = null;
139 useInclude = false;
140 }
141
142 /**
143 * 【TAG】value 値に設定します?
144 *
145 * @og.tag
146 * ここで、value に設定した?合?、BODY 部は無視されます?
147 * なお?こ?タグでは、エラー発生時でも継続して処?続けられるよ?します?
148 * error.jsp などのエラー処?面で、このタグを使用するケースがある為です?
149 *
150 * <og:text value="あい?? />
151 *
152 * @og.rev 2.2.0.0 (2002/12/17) 中国?国際化)対?エンコード?取得方法変更
153 * @og.rev 3.0.0.0 (2002/12/25) StringUtil#changeString ?
154 * @og.rev 4.0.0.0 (2005/12/31) エラー発生時でも異常終?せずに処?続けます?
155 *
156 * @param val 設定?
157 */
158 public void setValue( final String val ) {
159 if( !useInclude ) {
160 try {
161 value = getRequestParameter( val );
162 }
163 catch( HybsSystemException ex ) {
164 value = val ;
165 LogWriter.log( "val=" + val + " [" + ex.getMessage() + "]" );
166 }
167 }
168 }
169
170 /**
171 * 【TAG】動?ファイル?include します?
172 *
173 * @og.tag
174 * ??ファイル名?、?身の?レクトリからの相対パスで表されます?
175 *
176 * @og.rev 4.0.0.0 (2007/05/25) 新規追?
177 *
178 * @param file ファイル?
179 */
180 public void setInclude( final String file ) {
181 useInclude = true;
182
183 String relativePath = getRequestParameter( file );
184 String resourcePath = getContextRelativePath(getRequest(), relativePath);
185 String realPath = HybsSystem.url2dir( resourcePath.substring(1) );
186
187 FileString fs = new FileString();
188 fs.setFilename( realPath );
189 value = fs.getValue();
190 }
191
192 /**
193 * こ?オブジェクト???表現を返します?
194 * 基本???目?使用します?
195 *
196 * @return こ?クラスの??表現
197 */
198 @Override
199 public String toString() {
200 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
201 .println( "VERSION" ,VERSION )
202 .println( "value" ,value )
203 .println( "Other..." ,getAttributes().getAttribute() )
204 .fixForm().toString() ;
205 }
206
207 /**
208 * 動的にファイル?include する為の、コン?ストパスを求めます?
209 *
210 * ??ファイル名?、?身の?レクトリからの相対パスで表されます?
211 *
212 * @og.rev 4.0.0.0 (2007/05/25) 新規追?
213 * @og.rev 4.0.0.0 (2007/11/30) if の評価方法を変更します?
214 *
215 * @param request ServletRequestオブジェク?
216 * @param relativePath ファイル?
217 *
218 * @return コン?ストパス
219 */
220 private String getContextRelativePath( final ServletRequest request,
221 final String relativePath) {
222 if(relativePath.startsWith("/")) {
223 return (relativePath);
224 }
225 if(!(request instanceof HttpServletRequest)) {
226 return (relativePath);
227 }
228 HttpServletRequest hrequest = (HttpServletRequest) request;
229 String uri = (String)request.getAttribute("javax.servlet.include.servlet_path");
230 // if(uri != null) {
231 // String pathInfo = (String)request.getAttribute("javax.servlet.include.path_info");
232 // if(pathInfo == null) {
233 // if(uri.lastIndexOf('/') >= 0) {
234 // uri = uri.substring(0, uri.lastIndexOf('/'));
235 // }
236 // }
237 // }
238 if( uri != null && uri.lastIndexOf('/') >= 0 ) {
239 String pathInfo = (String)request.getAttribute("javax.servlet.include.path_info");
240 if(pathInfo == null) {
241 uri = uri.substring(0, uri.lastIndexOf('/'));
242 }
243 }
244 else {
245 uri = hrequest.getServletPath();
246 if(uri.lastIndexOf('/') >= 0) {
247 uri = uri.substring(0, uri.lastIndexOf('/'));
248 }
249 }
250 return uri + '/' + relativePath;
251 }
252 }