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    }