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 */ 016package org.opengion.hayabusa.taglib; 017 018import 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 * ●形式:<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" /> 処理A </og:case> 047 * <og:case match="B" /> 処理B </og:case> 048 * <og:case match="C" /> 処理C </og:case> 049 * <og:case isDefault="true" /> 処理X </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" /> 処理A </og:case> 067 * <og:case match="[12]" isBreak="false" /> 処理B </og:case> 068 * <og:case match="[123]" isBreak="false" /> 処理C </og:case> 069 * <og:case isNull="true" /> 処理X </og:case> 070 * <og:case isDefault="true" /> 処理Y </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 */ 084public 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}