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