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.html;
017
018 import org.opengion.hayabusa.common.HybsSystem;
019 import org.opengion.hayabusa.db.DBTableModel;
020 import org.opengion.hayabusa.db.DBColumn;
021 import org.opengion.fukurou.util.StringUtil;
022 import org.opengion.fukurou.util.Attributes;
023 import org.opengion.fukurou.model.Formatter;
024
025 import java.util.Map;
026 import java.util.HashMap;
027 import java.util.List;
028 import java.util.ArrayList;
029 import java.util.Arrays ;
030
031 /**
032 * ViewMarker インターフェース の実?ブジェクトです?
033 * これ?共通?スーパ?クラスとして ?表示フォー?例:HTML表示?に使?す?
034 *
035 * こ?クラスは、setter/getterメソ?の?ォルト実?提供して?す?
036 * ?表示フォー?対応したサブクラス上で, create() をオーバ?ライドして下さ??
037 *
038 * @og.group 画面表示
039 *
040 * @version 4.0
041 * @author Kazuhiko Hasegawa
042 * @since JDK5.0,
043 */
044 public class ViewMarker_MARKER implements ViewMarker {
045
046 private List<Attributes> markData = null; // 4.0.0 (2005/08/31)
047 // private Map<Integer,int[]> formMap_c = new HashMap<Integer,int[]>(); // 3.5.6.1 (2004/06/25)
048 // private Map<Integer,String[]> formMap_f = new HashMap<Integer,String[]>(); // 3.5.6.1 (2004/06/25)
049 private Map<Integer,Formatter> formMap = new HashMap<Integer,Formatter>();
050 private DBTableModel table = null;
051 private int[] markCmlNo = null;
052 private int[] isMark = null;
053 private static final int MARK_NULL = -1; // マ?カー未設?
054 private static final int MARK_TRUE = 1; // マ?カー作?
055 private static final int MARK_FALSE = 0; // マ?カー作?せず
056 // 3.5.2.0 (2003/10/20)
057 private String[] markKey = null;
058 private String[] markLists = null;
059 private String[] instrVals = null; // 3.8.8.1 (2007/01/06)
060 private int[] markListNo = null;
061 private boolean[] useFmtDeco = null; // 5.6.3.0 (2013/04/01) [$XXXX],[#XXXX]機?を有効にするかど?(true:有効)
062
063 private Map<Integer,List<Integer>> clmMap = new HashMap<Integer,List<Integer>>(); // 4.0.0 (2005/08/31)
064
065 /**
066 * ?をクリア(初期?します?
067 *
068 * @og.rev 3.1.1.0 (2003/03/28) 同期メソ?(synchronized付き)を非同期に変更する?
069 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属?を追?
070 * @og.rev 3.5.6.1 (2004/06/25) formMap属?を追?
071 * @og.rev 3.8.8.1 (2007/01/06) instrVals属?を追?
072 * @og.rev 5.6.3.0 (2013/04/01) useFmtDeco属?を追?
073 *
074 */
075 public void clear() {
076 markData = null; // 4.0.0 (2005/08/31)
077 // formMap_c = new HashMap<Integer,int[]>(); // 3.5.6.1 (2004/06/25)
078 // formMap_f = new HashMap<Integer,String[]>(); // 3.5.6.1 (2004/06/25)
079 formMap = new HashMap<Integer,Formatter>();
080 table = null;
081 isMark = null;
082 markKey = null;
083 markLists = null;
084 instrVals = null; // 3.8.8.1 (2007/01/06)
085 markListNo = null;
086 clmMap = new HashMap<Integer,List<Integer>>(); // 4.0.0 (2005/08/31)
087 useFmtDeco = null; // 5.6.3.0 (2013/04/01) [$XXXX],[#XXXX]機?を有効にするかど?(true:有効)
088 }
089
090 /**
091 * カラ?対するマ?カーアトリビュートをセ?します?
092 *
093 * @og.rev 3.1.0.0 (2003/03/20) Hashtable を使用して??で?同期でも構わな??を?HashMap に置換え?
094 * @og.rev 3.1.1.0 (2003/03/28) 同期メソ?(synchronized付き)を非同期に変更する?
095 *
096 * @param attri アトリビュー?
097 */
098 public void addAttribute( final Attributes attri ) {
099 if( markData == null ) { markData = new ArrayList<Attributes>(); }
100 markData.add( attri );
101 }
102
103 /**
104 * ?に DBTableModel をセ?します?
105 *
106 * @og.rev 3.1.1.0 (2003/03/28) 同期メソ?(synchronized付き)を非同期に変更する?
107 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属?を追?
108 * @og.rev 3.5.6.1 (2004/06/25) DBTableModel の再設定に対応?
109 * @og.rev 3.8.8.1 (2007/01/06) instrVals属?を追?
110 * @og.rev 5.6.3.0 (2013/04/01) useFmtDeco属?を追?
111 *
112 * @param tbl DBTableModelオブジェク?
113 */
114 public void setDBTableModel( final DBTableModel tbl ) {
115 table = tbl;
116 int count = markData.size(); // 4.0.0 (2005/08/31)
117
118 isMark = new int[ count ];
119 markKey = new String[ count ];
120 markCmlNo = new int[ count ];
121 markLists = new String[ count ];
122 instrVals = new String[ count ];
123 markListNo = new int[ count ];
124 useFmtDeco = new boolean[ count ]; // 5.6.3.0 (2013/04/01) [$XXXX],[#XXXX]機?を有効にするかど?(true:有効)
125
126 Arrays.fill( isMark,MARK_FALSE ); // マ?カーの表示可否
127 Arrays.fill( markCmlNo,-1 ); // マ?カーの可否を判断するカラ?号
128 Arrays.fill( useFmtDeco,false ); // [$XXXX],[#XXXX]機?を無効にする?互換性のため)
129
130 for( int intKey=0; intKey<count; intKey++ ) {
131 Attributes attri = markData.get( intKey );
132
133 String column = attri.get( "column" );
134 int clm = table.getColumnNo( column );
135 List<Integer> list = clmMap.get( clm );
136 if( list == null ) { list = new ArrayList<Integer>(); }
137 list.add( intKey );
138 clmMap.put( clm,list );
139
140 String body = attri.get( "body" );
141 // makeFormat( intKey,body );
142 Formatter formatter = new Formatter( table );
143 formatter.setFormat( body );
144 formMap.put( intKey, formatter );
145
146 makeOnMarkFormat( intKey,attri );
147
148 useFmtDeco[intKey] = "true".equalsIgnoreCase( attri.get( "useFormatDeco" ) ); // 5.6.3.0 (2013/04/01)
149 }
150 }
151
152 /**
153 * ??行?に対するマ?カー??を返します?
154 * こ?値は,すでにマ?カー??処?れて?為, RendererValue で
155 * 変換する??ありません?
156 * 引数の value はそ?カラ??値として利用されます?こ?値は、修飾済みの
157 * 値を与えることが可能です?
158 *
159 * @og.rev 3.5.6.1 (2004/06/25) formMap属?を使用します?
160 * @og.rev 3.8.8.1 (2007/01/06) instrVals属?を追?
161 * @og.rev 5.3.9.0 (2011/09/01) カラ?の先?に'$'を付加した場合に、URLEncodeされた?を返すように対?
162 * @og.rev 5.6.3.0 (2013/04/01) useFmtDeco属?を追?[$XXXX],[#XXXX]機?を有効にするかど?)
163 *
164 * @param row ???
165 * @param clm ???
166 * @param value カラ??値
167 *
168 * @return row行,colum?のマ?カー??
169 */
170 public String getMarkerString( final int row,final int clm,final String value ) {
171 int intKey = isOnMark(row,clm) ;
172 if( intKey < 0 ) { return value; }
173
174 Formatter formatter = formMap.get( intKey );
175 int[] clmNo = formatter.getClmNos();
176 String[] format = formatter.getFormat();
177
178 char[] types = formatter.getType();
179
180 // int[] clmNo = formMap_c.get( intKey );
181 // String[] format = formMap_f.get( intKey );
182
183 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_LARGE );
184 int j=0;
185 String val ;
186 for( ; j<clmNo.length; j++ ) {
187 if( clm == clmNo[j] ) {
188 val = value;
189 }
190 else {
191 // val = table.getValue(row,clmNo[j]);
192 val = formatter.getValue(row,clmNo[j]);
193 }
194
195 // 5.6.3.0 (2013/04/01) useFmtDeco属?を追?trueの場合?、[$XXXX],[#XXXX]機?を有効にする)
196 if( useFmtDeco[intKey] ) {
197 DBColumn dbClm = table.getDBColumn( clmNo[j] );
198 if( types[j] == '$' ) {
199 val = dbClm.getRendererValue( row,val );
200 }
201 else if( types[j] == '#' ) {
202 val = dbClm.getLabel();
203 }
204 }
205 // false が以前と同じ処?互換処?た?、view などのフォーマット??は異なる?
206 else {
207 // 5.3.9.0 (2011/09/01) カラ?の先?に'$'を付加した場?RLEncodeされた?を返すように対?
208 if( types[j] == '$' ) {
209 val = StringUtil.urlEncode( val );
210 }
211 }
212
213 buf.append( format[j] );
214 buf.append( val );
215 }
216 if( j < format.length ) { buf.append( format[j] ); }
217 String rtn = StringUtil.replace( buf.toString(),"{I}",String.valueOf( row ) );
218
219 // 3.8.8.1 (2007/01/06) instrVals属?を追?
220 if( instrVals[intKey] != null ) {
221 String[] vals = StringUtil.csv2Array( instrVals[intKey],' ' );
222 for( int i=0; i<vals.length; i++ ) {
223 String css = "<span class=\"instr" + i + "\">" + vals[i] + "</span>";
224 rtn = StringUtil.replace( rtn,vals[i],css );
225 }
226 }
227 return rtn ;
228 }
229
230 /**
231 * マ?カーフォーマットを作?します?
232 *
233 * @og.rev 3.5.6.1 (2004/06/25) formMap属?を使用します?
234 * @og.rev 3.8.8.1 (2007/01/06) countTokensの方法を見直します?
235 *
236 * @param intKey カラ?ーのカラ?号
237 * @param fmt マ?カーフォーマッ?
238 */
239 // private void makeFormat( final int intKey,final String fmt ) {
240 // int start = 0;
241 // int index = fmt.indexOf( '[' );
242 // List<String> clmNoList = new ArrayList<String>();
243 // List<String> formatList = new ArrayList<String>();
244 // while( index >= 0 ) {
245 // int end = fmt.indexOf( ']',index );
246 // if( end < 0 ) {
247 // String errMsg = "[ と ] との対応関係がずれて?す?" + HybsSystem.CR
248 // + "format=[" + fmt + "] : index=" + index ;
249 // throw new HybsSystemException( errMsg );
250 // }
251 //
252 // // [ より前方の??は、formatList へ
253 // if( index > 0 ) { formatList.add( fmt.substring( start,index ) ); }
254 // else { formatList.add( "" ); }
255 //
256 // // [XXXX] の XXXX部?処?
257 // clmNoList.add( fmt.substring( index+1,end ) );
258 //
259 // start = end+1 ;
260 // index = fmt.indexOf( '[',start );
261 // }
262 // // ] の後方部??、formatList へ
263 // formatList.add( fmt.substring( start ) );
264 //
265 // String[] format = formatList.toArray( new String[formatList.size()] );
266 // String[] clmNm = clmNoList.toArray( new String[clmNoList.size()] );
267 //
268 // int size = clmNm.length ;
269 // int[] clmNo = new int[ size ];
270 // for( int i=0; i<size; i++ ) {
271 // clmNo[i] = table.getColumnNo( clmNm[i] );
272 // }
273 //
274 // formMap_c.put( intKey, clmNo );
275 // formMap_f.put( intKey, format );
276 // }
277
278 /**
279 * マ?カーを作?する/作?しな???カラ?号を求めます?
280 * また?int[列番号] isMark を?期化します?
281 *
282 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属?を追?
283 * @og.rev 3.8.8.1 (2007/01/06) instrVals属?を追?
284 *
285 * @param intKey カラ?ーの番号
286 * @param attri アトリビュー?
287 */
288 private void makeOnMarkFormat( final int intKey,final Attributes attri ) {
289 String onMark = attri.get( "onMark" );
290 String markList = attri.get( "markList" );
291 instrVals[intKey] = attri.get( "instrVals" ); // 3.8.8.1 (2007/01/06)
292
293 // 3.5.6.0 (2004/06/18) nullポインタの参?外しバグの対?
294 // こ?ロジ?で値が設定済みであれば、以下?処??不要である?
295 isMark[intKey] = MARK_NULL;
296 if( onMark == null || onMark.length() == 0 ||
297 markList == null || markList.length() == 0 ) {
298 isMark[intKey] = MARK_FALSE;
299 return ; // 3.5.6.0 (2004/06/18)
300 }
301 else if( onMark.charAt( 0 ) != '[' && markList.charAt( 0 ) != '[' ) {
302 isMark[intKey] = ( markList.indexOf( onMark ) >= 0 ) ? MARK_TRUE : MARK_FALSE;
303 return ; // 3.5.6.0 (2004/06/18)
304 }
305
306 if( onMark.charAt( 0 ) == '[' ) {
307 markCmlNo[intKey] = table.getColumnNo( onMark.substring( 1,onMark.length()-1 ));
308 }
309 else {
310 markCmlNo[intKey] = -1;
311 markKey[intKey] = onMark ;
312 }
313
314 if( markList.charAt( 0 ) == '[' ) {
315 markListNo[intKey] = table.getColumnNo( markList.substring( 1,markList.length()-1 ));
316 }
317 else {
318 markListNo[intKey] = -1;
319 markLists[intKey] = markList;
320 }
321 }
322
323 /**
324 * マ?カーを作?するかど?を判断します?
325 * int[列番号] isMark には?未設?FALSE TRUE の状態を持っており?
326 * 列でマ?カーを作?する状態が固定?場?例えば,onMark属?がデフォル?"true" の場?
327 * カラ?関係なく?同じ値を返すときに、使用します?
328 *
329 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属?を追?
330 * @og.rev 3.5.4.0 (2003/11/25) onMark ,markList ?null(また?ゼロストリング)の場合?、false とする?
331 * @og.rev 4.0.0.0 (2005/08/31) 同?ラ???登録を許可します?
332 *
333 * @param row 列番号
334 * @param clm カラ?ーの名称
335 *
336 * @return 処?るリスト番号?1 の場合?、該当な?
337 */
338 private int isOnMark( final int row,final int clm ) {
339 List<Integer> list = clmMap.get( clm );
340 if( list == null ) { return -1; }
341
342 for( int i=0; i<list.size(); i++ ) {
343 int intKey = list.get( i );
344 if( isMark[intKey] != MARK_NULL ) {
345 if( isMark[intKey] == MARK_TRUE ) { return intKey; }
346 else { continue; }
347 }
348
349 final String onMark ;
350 if( markCmlNo[intKey] < 0 ) { onMark = markKey[intKey] ; }
351 else { onMark = table.getValue( row,markCmlNo[intKey] ); }
352
353 // 3.5.4.0 (2003/11/25) 追?
354 if( onMark == null || onMark.length() == 0 ) { continue; }
355
356 final String markList ;
357 if( markListNo[intKey] < 0 ) { markList = markLists[intKey] ; }
358 else { markList = table.getValue( row,markListNo[intKey] ); }
359
360 // 3.5.4.0 (2003/11/25) 修正
361 if( markList == null || markList.length() == 0 ) { continue; }
362
363 if( markList.indexOf( onMark ) >= 0 ) { return intKey; }
364 }
365 return -1;
366 }
367
368 /**
369 * マ?カーされたカラ?号の配?を返します?
370 *
371 * これは特殊??、Edit機?で、カラ??をキャ?ュして?ときに?
372 * JSPのソース等?変更時に、変更が反?れな?応を行う場合?
373 * 通常の ViewFormのサブクラスから、Edit専用の ViewForm_HTMLSeqClmTable で
374 * 制御する場合?ViewMarkerのEditMarkerでは??常非表示?検索の場合)ですが
375 * Editのポップア??画面に、表示されてしま??を避けるため、noDisplay に
376 * 強制?するカラ?号が?です?
377 * あくまで、暫定?置です?Edit機?を改修するときに、この機?は削除します?
378 *
379 * ※ こ?処??、EditMarkerでのみ有効にします?
380 *
381 * @og.rev?.8??.0(2015/04/03) 6.0.3.0の移?
382 *
383 * @return マ?カーされたカラ?号の配?
384 */
385 public int[] getColumnNos() {
386 int[] rtn = new int[clmMap.size()];
387 int i=0;
388 for( final Integer obj : clmMap.keySet() ) {
389 rtn[i++] = obj.intValue();
390 }
391
392 return rtn;
393 }
394 }