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 org.opengion.hayabusa.common.HybsSystemException; 019import org.opengion.hayabusa.html.TableFormatter; 020import org.opengion.hayabusa.html.FormatterType; 021 022import static org.opengion.fukurou.util.StringUtil.nval ; 023 024/** 025 * ヘッダ、フッター、ボディー部のフォーマットを汎用的に定義するタグです。 026 * 027 * thead,tfoot,tbody に代わる表示フォーマットをカスタマイズするときに使用する親クラスです。 028 * このクラス自身がタグとしては表に現れません。 029 * 030 * @og.formSample 031 * ●形式:(タグとしては使われません) 032 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します) 033 * 034 * @og.rev 3.5.4.0 (2003/11/25) 新規追加 035 * @og.rev 3.5.4.2 (2003/12/15) カスタムタグクラスから削除します。(abstract化) 036 * @og.rev 4.0.0.0 (2006/01/31) カスタムタグクラスに復活させます。(public化) 037 * @og.group 画面部品 038 * 039 * @version 4.0 040 * @author Kazuhiko Hasegawa 041 * @since JDK5.0, 042 */ 043public class TFormatTag extends CommonTagSupport { 044 //* このプログラムのVERSION文字列を設定します。 {@value} */ 045 private static final String VERSION = "5.7.6.3 (2014/05/23)" ; 046 047 private static final long serialVersionUID = 576320140523L ; 048 049 private String rowspan = "2"; 050 private String noClass = "false"; 051 private String usableKey = null; 052 private String usableList = "1" ; 053 private String itdBody = ""; // 3.5.6.0 (2004/06/18) 054 private String keyBreakClm = null; // 5.7.6.3 (2014/05/23) 055 private boolean useTrCut = true; // 5.5.0.3 (2012/03/13) 056 057 /** 058 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 059 * 060 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 061 * 062 * @return 後続処理の指示( EVAL_BODY_BUFFERED ) 063 */ 064 @Override 065 public int doStartTag() { 066 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 067 if( useTag() ) { 068 return EVAL_BODY_BUFFERED ; // Body を評価する。( extends BodyTagSupport 時) 069 } 070 return SKIP_BODY ; // Body を評価しない 071 } 072 073 /** 074 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 075 * 076 * @og.rev 3.5.6.0 (2004/06/18) setItdBody メソッドによる itdBody の登録処理追加 077 * @og.rev 5.1.7.0 (2010/06/01) フォーマットの{@XXXX}の値に[が含まれる場合は、サイニタイズ("\\]\\"に変換)する。 078 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 079 * @og.rev 5.7.6.3 (2014/05/23) useKeyBreak 属性の追加 080 * 081 * @return 後続処理の指示(EVAL_PAGE) 082 */ 083 @Override 084 public int doEndTag() { 085 debugPrint(); // 4.0.0 (2005/02/28) 086 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 087 if( useTag() ) { 088 ViewFormTag viewform = (ViewFormTag)findAncestorWithClass( this,ViewFormTag.class ); 089 if( viewform == null ) { 090 String errMsg = "<b>" + getTagName() + "タグは、ViewFormTagの内側(要素)に記述してください。</b>"; 091 throw new HybsSystemException( errMsg ); 092 } 093 // 5.1.7.0 (2010/06/01) フォーマットの{@XXXX}の値に[が含まれる場合は、サイニタイズ("\\]\\"に変換)する。 094 // String bodyFormat = getBodyString(); 095 String bodyFormat = getSanitizedBodyString(); 096 097 TableFormatter format = new TableFormatter(); 098 format.setFormatType( getType() ); 099 format.setFormat( bodyFormat, useTrCut ); // 5.5.0.3 (2012/03/13) 100 format.setRowspan( rowspan ); 101 format.setNoClass( noClass ); 102 format.setUsableKey( usableKey ); 103 format.setUsableList( usableList ); 104 format.setItdBody( itdBody ); // 3.5.6.0 (2004/06/18) 105 format.setKeyBreakClm( keyBreakClm ); // 5.7.6.3 (2014/05/23) 106 viewform.addFormatter( format ); 107 } 108 return EVAL_PAGE ; // ページの残りを評価する。 109 } 110 111 /** 112 * タグリブオブジェクトをリリースします。 113 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 114 * 115 * @og.rev 3.5.6.0 (2004/06/18) itdBody 属性の追加 116 * @og.rev 5.7.6.3 (2014/05/23) useTrCut,useKeyBreak 属性の追加 117 * 118 */ 119 @Override 120 protected void release2() { 121 super.release2(); 122 rowspan = "2"; 123 noClass = "false"; 124 usableKey = null; 125 usableList = "1" ; 126 itdBody = ""; // 3.5.6.0 (2004/06/18) 127 useTrCut = true; // 5.7.6.3 (2014/05/23) 128 keyBreakClm = null; // 5.7.6.3 (2014/05/23) 129 } 130 131 /** 132 * 【TAG】表示データを作成する場合のフォーマットの行数(rowspan)をセットします(初期値:2)。 133 * 134 * @og.tag 135 * 表示データを作成する場合のフォーマットの行数をセットします。 136 * 上位の viewFormタグより、こちらが優先されます。 137 * 138 * @param span フォーマットの行数 139 */ 140 public void setRowspan( final String span ) { 141 rowspan = span; 142 } 143 144 /** 145 * 【TAG】カラムのクラス名(VERCHAR2,NUMBER など)を使用するかどうか[true/false]を指定します(初期値:false)。 146 * 147 * @og.tag 148 * "true" で、クラス属性を設定しません。これは、CSSファイルに書かれている属性を 149 * 使用しないことを意味します。 150 * 初期値は、"false" です。 151 * 152 * @param flag クラス名使用の有無(true:使用しない/false:使用する。) 153 */ 154 public void setNoClass( final String flag ) { 155 this.noClass = flag; 156 } 157 158 /** 159 * このフォーマットのタイプを返します。 160 * 161 * タイプは、"head/body/foot" の中から、指定します。 162 * 163 * @og.rev 3.5.5.8 (2004/05/20) abstract します。 164 * 165 * @return このフォーマットのタイプを返します。 166 */ 167 protected FormatterType getType() { 168 String errMsg = "このメソッドは、THead/TBody/TFoot の各サブクラスで実装してください。"; 169 throw new UnsupportedOperationException( errMsg ); 170 } 171 172 /** 173 * 【TAG】フォーマットの使用可否を判断するキーとなるカラム名を指定します。 174 * 175 * @og.tag 176 * キーが、usableList に含まれる場合は、このフォームを使用できます。 177 * キー(カラム名)が指定されない場合は、常に使用されます。 178 * ※ 現時点では、BODYタイプのみ使用しています。 179 * ※ この属性は、リクエスト変数処理を行いません。 180 * 181 * @param key フォーマットの使用可否を判断するカラム名 182 */ 183 public void setUsableKey( final String key ) { 184 usableKey = key; 185 } 186 187 /** 188 * 【TAG】フォーマットの使用可否を判断する文字列リストを指定します(初期値:"1")。 189 * 190 * @og.tag 191 * キーが、この文字列リスト中に存在する場合は、このフォームを使用できます。 192 * この文字列リストは、固定な文字列です。{@XXXX}は使用できますが、[XXXX]は 193 * 使用できません。 194 * 初期値は、"1" です。 195 * ※ 現時点では、BODYタイプのみ使用しています。 196 * 197 * @param list フォーマットの使用可否を判断する文字列リスト 198 */ 199 public void setUsableList( final String list ) { 200 usableList = nval( getRequestParameter(list),usableList ); 201 } 202 203 /** 204 * itdフォーマット文字列を設定します。 205 * 206 * itd ボディ部の文字列を指定します。 207 * itd ボディは、繰り返し処理を行います。これを、上位のボディ文字列の中の 208 * HYBS_ITD_MARKER 文字列 と置き換えます。 209 * ※ この属性は、リクエスト変数処理を行いません。 210 * 211 * @og.rev 3.5.6.0 (2004/06/18) itdフォーマット文字列の取り込み 212 * 213 * @param itd itdフォーマットの文字列 214 */ 215 public void setItdBody( final String itd ) { 216 if( itd != null ) { 217 itdBody = itd; 218 } 219 } 220 221 /** 222 * 【TAG】ここで指定したカラムの値が、キーブレイクした場合、このタグを使用します(初期値:null)。 223 * 224 * @og.tag 225 * usableKey,usableList の様に、予め決められた値の時に、適用されるのではなく、 226 * キーブレイクで 使用可否を指定する為の機能です。 227 * この設定値は、usableKey,usableList とは、独立しているため、それぞれで 228 * 有効になれば、使用されると判断されます。 229 * キーブレイク判定では、最初の1件目は、必ず使用されると判断されます。 230 * 231 * @og.rev 5.7.6.3 (2014/05/23) 新規追加 232 * 233 * @param kclm キーブレイクをチェックするカラムID 234 */ 235 public void setKeyBreakClm( final String kclm ) { 236 keyBreakClm = nval( getRequestParameter( kclm ),keyBreakClm ); 237 } 238 239 /** 240 * 【TAG】 先頭trタグを削除するかどうか[true/false]を指定します(初期値:true)。 241 * 242 * @og.tag 243 * フォーマットの先頭がtrタグの場合は削除する処理がありますが、 244 * CustomDataのような場合では削除したくありません。 245 * falseを指定すると削除処理を行わないようになります。 246 * 247 * @og.rev 5.5.0.3 (2012/03/13) 新規追加 248 * 249 * @param useFlg 情報出力を指定 [true:有効/false:無効] 250 */ 251 public void setUseTrCut( final String useFlg ) { 252 useTrCut = nval( getRequestParameter( useFlg ),useTrCut ); 253 } 254 255 /** 256 * このオブジェクトの文字列表現を返します。 257 * 基本的にデバッグ目的に使用します。 258 * 259 * @return このクラスの文字列表現 260 */ 261 @Override 262 public String toString() { 263 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 264 // .println( "VERSION" ,VERSION ) 265 .println( "rowspan" ,rowspan ) 266 .println( "noClass" ,noClass ) 267 .println( "usableKey" ,usableKey ) 268 .println( "usableList" ,usableList ) 269 .println( "itdBody" ,itdBody ) 270 .println( "keyBreakClm" ,keyBreakClm) 271 .println( "Other..." ,getAttributes().getAttribute() ) 272 .fixForm().toString() ; 273 } 274}