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 }