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.HybsSystemException;
019 import static org.opengion.fukurou.util.StringUtil.nval ;
020
021 /**
022 * case タグは、上位? switch タグの key とマッチした?合に、??行います?
023 *
024 * case タグの以下?属?につ?、説明します?
025 * match ??switch_key.match( case_match ) でマッチした?合?、BODY が??れます?
026 * isDefault??trueに設定すると、どのcase にも??しなかった?合に処?れま?初期値:false)
027 * isBreak ??通常、最初にマッチした段階で、switch 処?抜けま?初期値:true)
028 * isNull ??trueに設定すると、switchのkeyが?null(また?ゼロ??)の場合?マッチしま?初期値:false)
029 *
030 * @og.formSample
031 * ●形式?lt;og:switch key="???" />
032 * <og:case match="A" /> ??? </og:case>
033 * <og:case match="B" /> ??? </og:case>
034 * <og:case match="C" /> ??? </og:case>
035 * <og:case isDefault="true" /> ??? </og:case>
036 * </og:switch>
037 * ●body?あ?EVAL_BODY_INCLUDE:BODYをインクルードし、{@XXXX} は解析しません)
038 *
039 * ●Tag定義??
040 * <og:case
041 * match 【TAG】switch-case のマッチ条件(case_match)を指定しま?
042 * isDefault 【TAG】どのcase にも??しなかった?合に処??case ?ど?を指定しま?初期値:false)
043 * isBreak 【TAG】??した以降に継続??行わな?ブレイクする)かど?を指?初期値:true)
044 * isNull 【TAG】switchのkeyが?null(また?ゼロ??)の場合?マッチするかど?[true/false]を設定しま?初期値:false)
045 * debug 【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false)
046 * > ... Body ...
047 * </og:case>
048 *
049 * ●使用?
050 * <og:switch key="{@PARAM}" />
051 * <og:case match="A" /> 処? </og:case>
052 * <og:case match="B" /> 処? </og:case>
053 * <og:case match="C" /> 処? </og:case>
054 * <og:case isDefault="true" /> 処? </og:case>
055 * </og:switch>
056 *
057 * ・switch の key に対して、case の match に?された値が?マッ?switch_key.match( case_match ))
058 * した場合に、case の BODY 部?処?れます?
059 * マッチしなければ、BODY部は、スキ??されます?
060 * ・isDefault="true" の場合?、どれと?マッチしなかった?合に、実行されます?
061 * ・Javaの switch-case ??、最初に処?れた case 以降を処?ます?通常は、break を?れて
062 * 後続??実行されな??して?す?
063 * こ?、switch-case タグは、caseタグの isBreak 属?で制御します?初期値?isBreak="true" に?
064 * なって?ため??常は、どれかの case が実行された段階で、switchの処??、終?れます?
065 * isBreak="false" にすると、switchから抜けずに、継続して case との match を実行します?
066 * こ?場合?Java等と異なる?は、直後?case?実行されるのではなく?あくまで match 作業?
067 * 継続されると?ことです?つまり??の case で処?行いたい場合?、isBreak="false" に
068 * すると同時に、match 条件もそれぞれで、??するように設定する?があります?
069 *
070 * <og:switch key="{@PARAM}" />
071 * <og:case match="[1]" isBreak="false" /> 処? </og:case>
072 * <og:case match="[12]" isBreak="false" /> 処? </og:case>
073 * <og:case match="[123]" isBreak="false" /> 処? </og:case>
074 * <og:case isNull="true" /> 処? </og:case>
075 * <og:case isDefault="true" /> 処? </og:case>
076 * </og:switch>
077 *
078 * ・上記指定では、isBreak="false" が指定されて?ため、??した後も継続して判定??実施されます?
079 * ・上記例で?と、PARAM ?"1" の場合?上記3つともにマッチします?
080 * ・isNull="true" は、switch の key ?null の場合に成立します?(null とは、ゼロ??も含?
081 *
082 * @og.group 画面制御
083 * @og.rev 5.2.3.0 (2010/12/01) 新規追?
084 *
085 * @version 5.2.3.0 (2010/12/01)
086 * @author Kazuhiko Hasegawa
087 * @since JDK1.6,
088 */
089 public class CaseTag extends CommonTagSupport {
090 //* こ?プログラ??VERSION??を設定します? {@value} */
091 private static final String VERSION = "5.2.3.0 (2010/12/01)" ;
092
093 private static final long serialVersionUID = 523020101201L ;
094
095 private String caseMatch = null ; // switch_key.match( case_match ) でマッチした?合?、BODY が??れます?
096 private boolean isDefault = false; // trueに設定すると、どのcase にも??しなかった?合に処?れま?初期値:false)
097 private boolean isBreak = true ; // 通常、最初にマッチした段階で、switch 処?抜けま?初期値:true)
098 private boolean isNull = false; // trueに設定すると、switchのkeyが?null(また?ゼロ??)の場合?マッチしま?初期値:false)
099
100 /**
101 * Taglibの開始タグが見つかったときに処??doStartTag() ?オーバ?ライドします?
102 *
103 * @return 後続????
104 */
105 @Override
106 public int doStartTag() {
107 SwitchTag switchTag = (SwitchTag)findAncestorWithClass( this,SwitchTag.class );
108 if( switchTag == null ) {
109 // String errMsg = "<b>こ?タグは、switch タグの?におく?があります?</b>";
110 String errMsg = "<b>" + getTagName() + "タグは、switch タグの?におく?があります?</b>";
111 throw new HybsSystemException( errMsg );
112 }
113
114 boolean rtn = false;
115 if( switchTag.isMatch() ) {
116 String key = switchTag.getKey();
117 rtn = ( key != null && caseMatch != null && key.matches( caseMatch ) ) ||
118 ( isNull && key == null ) || ( isDefault ) ;
119
120 if( rtn && isBreak ) { switchTag.setBreak(); }
121 }
122
123 if( rtn ) { return( EVAL_BODY_INCLUDE ); }
124 else { return( SKIP_BODY ); }
125 }
126
127 /**
128 * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
129 *
130 * @return 後続????
131 */
132 @Override
133 public int doEndTag() {
134 debugPrint(); // 4.0.0 (2005/02/28)
135
136 return(EVAL_PAGE);
137 }
138
139 /**
140 * タグリブオブジェクトをリリースします?
141 * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
142 *
143 */
144 @Override
145 protected void release2() {
146 super.release2();
147 caseMatch = null ; // switch_key.match( case_match ) でマッチした?合?、BODY が??れます?
148 isDefault = false; // trueに設定すると、どのcase にも??しなかった?合に処?れま?初期値:false)
149 isBreak = true ; // 通常、最初にマッチした段階で、switch 処?抜けま?初期値:true)
150 isNull = false; // trueに設定すると、switchのkeyが?null(また?ゼロ??)の場合?マッチしま?初期値:false)
151 }
152
153 /**
154 * 【TAG】switch-case のマッチ条件(case_match)を指定します?
155 *
156 * @og.tag
157 * switch_key.match( case_match ) でマッチした?合?、BODY が??れます?
158 *
159 * @param mkey マッチ条件
160 */
161 public void setMatch( final String mkey ) {
162 caseMatch = nval( getRequestParameter( mkey ),caseMatch );
163 }
164
165 /**
166 * 【TAG】どのcase にも??しなかった?合に処??case ?ど?を指定しま?初期値:false)?
167 *
168 * @og.tag
169 * trueに設定すると、どのcase にも??しなかった?合に処?れま?
170 * こ?タグそ?も?がなにも?力しません?つまり条件から消えます?)
171 * BODY 部に記述することが可能です?そ?場合?、value 属?になにも設定できません?
172 * 初期値は、false?default case ?はな?です?
173 *
174 * @param flag マッチしなかった?合に処??case ?ど?[true/false]
175 */
176 public void setIsDefault( final String flag ) {
177 isDefault = nval( getRequestParameter( flag ),isDefault );
178 }
179
180 /**
181 * 【TAG】??した以降に継続??行わな?ブレイクする)かど?を指?初期値:true)?
182 *
183 * @og.tag
184 * true に設定すると、??した段階で、ブレイクします?
185 * Javaの switch-case ??、最初に処?れた case 以降を処?ます?通常は、break を?れて
186 * 後続??実行されな??して?す?
187 * こ?、switch-case タグは、caseタグの break 属?で制御します?初期値?break="true" に?
188 * なって?ため??常は、どれかの case が実行された段階で、switchの処??、終?れます?
189 * break="false" にすると、switchから抜けずに、継続して case との match を実行します?
190 * こ?場合?Java等と異なる?は、直後?case?実行されるのではなく?あくまで match 作業?
191 * 継続されると?ことです?つまり??の case で処?行いたい場合?、break="false" に
192 * すると同時に、match 条件もそれぞれで、??するように設定する?があります?
193 * 初期値は、true?ブレイクする です?
194 *
195 * @param flag 継続??行わな?ど?[true:行わな?ブレイクする/false:継続??行う]
196 */
197 public void setIsBreak( final String flag ) {
198 isBreak = nval( getRequestParameter( flag ),isBreak );
199 }
200
201 /**
202 * 【TAG】switchのkeyが?null(また?ゼロ??)の場合?マッチするかど?[true/false]を設定しま?初期値:false)?
203 *
204 * @og.tag
205 * trueに設定すると、switchのkeyが?null(また?ゼロ??)の場合?マッチします?
206 * 初期値のfalse にすると、キー?null でな??合だけ?マッチ??実行します?
207 * case の条件判定で使用されます?
208 * 初期値は?false (null でな? です?
209 *
210 * @param flag nullマッチ判定[true/false]
211 */
212 public void setIsNull( final String flag ) {
213 isNull = nval( getRequestParameter( flag ),isNull );
214 }
215
216 /**
217 * こ?オブジェクト???表現を返します?
218 * 基本???目?使用します?
219 *
220 * @return こ?クラスの??表現
221 */
222 @Override
223 public String toString() {
224 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
225 .println( "VERSION" ,VERSION )
226 .println( "caseMatch" ,caseMatch )
227 .println( "isDefault" ,isDefault )
228 .println( "isBreak" ,isBreak )
229 .println( "isNull" ,isNull )
230 .println( "Other..." ,getAttributes().getAttribute() )
231 .fixForm().toString() ;
232 }
233 }