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?あ?
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                            throw new HybsSystemException( errMsg );
111                    }
112    
113                    boolean rtn = false;
114                    if( switchTag.isMatch() ) {
115                            String key = switchTag.getKey();
116                            rtn =   ( key != null && caseMatch != null && key.matches( caseMatch ) ) ||
117                                            ( isNull && key == null ) || ( isDefault ) ;
118    
119                            if( rtn && isBreak ) { switchTag.setBreak(); }
120                    }
121    
122                    if( rtn ) { return( EVAL_BODY_INCLUDE ); }
123                    else      { return( SKIP_BODY );         }
124            }
125    
126            /**
127             * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
128             *
129             * @return      後続????
130             */
131            @Override
132            public int doEndTag() {
133                    debugPrint();           // 4.0.0 (2005/02/28)
134    
135                    return(EVAL_PAGE);
136            }
137    
138            /**
139             * タグリブオブジェクトをリリースします?
140             * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
141             *
142             */
143            @Override
144            protected void release2() {
145                    super.release2();
146                    caseMatch       = null ;        // switch_key.match( case_match ) でマッチした?合?、BODY が??れます?
147                    isDefault       = false;        // trueに設定すると、どのcase にも??しなかった?合に処?れま?初期値:false)
148                    isBreak         = true ;        // 通常、最初にマッチした段階で、switch 処?抜けま?初期値:true)
149                    isNull          = false;        // trueに設定すると、switchのkeyが?null(また?ゼロ??)の場合?マッチしま?初期値:false)
150            }
151    
152            /**
153             * 【TAG】switch-case のマッチ条件(case_match)を指定します?
154             *
155             * @og.tag
156             * switch_key.match( case_match ) でマッチした?合?、BODY が??れます?
157             *
158             * @param       mkey マッチ条件
159             */
160            public void setMatch( final String mkey ) {
161                    caseMatch = nval( getRequestParameter( mkey ),caseMatch );
162            }
163    
164            /**
165             * 【TAG】どのcase にも??しなかった?合に処??case ?ど?を指定しま?初期値:false)?
166             *
167             * @og.tag
168             * trueに設定すると、どのcase にも??しなかった?合に処?れま?
169             * こ?タグそ?も?がなにも?力しません?つまり条件から消えます?)
170             * BODY 部に記述することが可能です?そ?場合?、value 属?になにも設定できません?
171             * 初期値は、false?default case ?はな?です?
172             *
173             * @param       flag マッチしなかった?合に処??case ?ど?[true/false]
174             */
175            public void setIsDefault( final String flag ) {
176                    isDefault = nval( getRequestParameter( flag ),isDefault );
177            }
178    
179            /**
180             * 【TAG】??した以降に継続??行わな?ブレイクする)かど?を指?初期値:true)?
181             *
182             * @og.tag
183             * true に設定すると、??した段階で、ブレイクします?
184             * Javaの switch-case ??、最初に処?れた case 以降を処?ます?通常は、break を?れて
185             * 後続??実行されな??して?す?
186             * こ?、switch-case タグは、caseタグの break 属?で制御します?初期値?break="true" に?
187             * なって?ため??常は、どれかの case が実行された段階で、switchの処??、終?れます?
188             * break="false" にすると、switchから抜けずに、継続して case との match を実行します?
189             * こ?場合?Java等と異なる?は、直後?case?実行されるのではなく?あくまで match 作業?
190             * 継続されると?ことです?つまり??の case で処?行いたい場合?、break="false" に
191             * すると同時に、match 条件もそれぞれで、??するように設定する?があります?
192             * 初期値は、true?ブレイクする です?
193             *
194             * @param       flag 継続??行わな?ど?[true:行わな?ブレイクする/false:継続??行う]
195             */
196            public void setIsBreak( final String flag ) {
197                    isBreak = nval( getRequestParameter( flag ),isBreak );
198            }
199    
200            /**
201             * 【TAG】switchのkeyが?null(また?ゼロ??)の場合?マッチするかど?[true/false]を設定しま?初期値:false)?
202             *
203             * @og.tag
204             * trueに設定すると、switchのkeyが?null(また?ゼロ??)の場合?マッチします?
205             * 初期値のfalse にすると、キー?null でな??合だけ?マッチ??実行します?
206             * case の条件判定で使用されます?
207             * 初期値は?false (null でな? です?
208             *
209             * @param       flag nullマッチ判定[true/false]
210             */
211            public void setIsNull( final String flag ) {
212                    isNull = nval( getRequestParameter( flag ),isNull );
213            }
214    
215            /**
216             * こ?オブジェクト???表現を返します?
217             * 基本???目?使用します?
218             *
219             * @return こ?クラスの??表現
220             */
221            @Override
222            public String toString() {
223                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
224                                    .println( "VERSION"                     ,VERSION        )
225                                    .println( "caseMatch"           ,caseMatch      )
226                                    .println( "isDefault"           ,isDefault      )
227                                    .println( "isBreak"                     ,isBreak        )
228                                    .println( "isNull"                      ,isNull         )
229                                    .println( "Other..."    ,getAttributes().getAttribute() )
230                                    .fixForm().toString() ;
231            }
232    }