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.html; 017 018import java.util.concurrent.ConcurrentMap; // 6.4.3.3 (2016/03/04) 019import java.util.concurrent.ConcurrentHashMap; // 6.4.3.1 (2016/02/12) refactoring 020import java.util.List; 021import java.util.ArrayList; 022import java.util.Arrays; 023 024import org.opengion.hayabusa.db.DBTableModel; 025import org.opengion.hayabusa.db.DBColumn; 026import org.opengion.fukurou.util.StringUtil; 027import org.opengion.fukurou.util.Attributes; 028import org.opengion.fukurou.model.Formatter; 029import static org.opengion.fukurou.system.HybsConst.BUFFER_LARGE; // 6.1.0.0 (2014/12/26) refactoring 030 031/** 032 * ViewMarker インターフェース の実装オブジェクトです。 033 * これを共通のスーパークラスとして 各種表示フォーム(例:HTML表示等)に使います。 034 * 035 * このクラスは、setter/getterメソッドのデフォルト実装を提供しています。 036 * 各種表示フォームに対応したサブクラス上で、 create() をオーバーライドして下さい。 037 * 038 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、private を protected に、一部修正します。 039 * @og.group 画面表示 040 * 041 * @version 4.0 042 * @author Kazuhiko Hasegawa 043 * @since JDK5.0, 044 */ 045public class ViewMarker_MARKER implements ViewMarker { 046 // 8.5.6.1 (2024/03/29) 継承で使えるように、private を protected に、一部修正します。 047 /** マーカー未設定 */ 048 protected static final int MARK_NULL = -1; // マーカー未設定 049 /** マーカー作成 */ 050 protected static final int MARK_TRUE = 1; // マーカー作成 051 /** マーカー作成せず */ 052 protected static final int MARK_FALSE = 0; // マーカー作成せず 053 054 /** マーカーのAttributesリスト */ 055 protected List<Attributes> markData ; // 4.0.0 (2005/08/31) 056 /** 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 */ 057 protected final ConcurrentMap<Integer,Formatter> formMap = new ConcurrentHashMap<>(); // 6.4.3.1 (2016/02/12) 058 059 /** 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 */ 060 protected final ConcurrentMap<Integer,List<Integer>> clmMap = new ConcurrentHashMap<>(); // 6.4.3.1 (2016/02/12) 061 062 /** DBTableModel */ 063 protected DBTableModel table ; 064 /** マークするカラム番号 */ 065 protected int[] markCmlNo ; 066// private int[] isMark ; 067 /** マークするかどうかの判定フラグ番号 */ 068 protected int[] fgMark ; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 069 // 3.5.2.0 (2003/10/20) 070 /** マークするキー */ 071 protected String[] markKey ; 072 /** マークするリスト配列 */ 073 protected String[] markLists ; 074 /** マークするリスト配列のカラム番号 */ 075 protected int[] markListNo ; 076 077 // ***** ViewMarker_MARKER のみに存在する変数 ***** 078 private String[] instrVals ; // 3.8.8.1 (2007/01/06) 079 private boolean[] useFmtDeco ; // 5.6.3.0 (2013/04/01) [$XXXX],[#XXXX]機能を有効にするかどうか(true:有効) 080 081 /** 082 * デフォルトコンストラクター 083 * 084 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 085 */ 086 public ViewMarker_MARKER() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 087 088 /** 089 * 内容をクリア(初期化)します。 090 * 091 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 092 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属性を追加 093 * @og.rev 3.5.6.1 (2004/06/25) formMap属性を追加 094 * @og.rev 3.8.8.1 (2007/01/06) instrVals属性を追加 095 * @og.rev 5.6.3.0 (2013/04/01) useFmtDeco属性を追加 096 * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 097 * 098 */ 099 @Override // ViewMarker 100 public void clear() { 101 markData = null; // 4.0.0 (2005/08/31) 102 formMap.clear(); // 6.4.3.3 (2016/03/04) 103 clmMap.clear(); // 6.4.3.3 (2016/03/04) 104 table = null; 105// isMark = null; 106 fgMark = null; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 107 markKey = null; 108 markLists = null; 109 markListNo = null; 110 // ***** ViewMarker_MARKER のみに存在する変数 ***** 111 instrVals = null; // 3.8.8.1 (2007/01/06) 112 useFmtDeco = null; // 5.6.3.0 (2013/04/01) [$XXXX],[#XXXX]機能を有効にするかどうか(true:有効) 113 } 114 115 /** 116 * カラムに対するマーカーアトリビュートをセットします。 117 * 118 * @og.rev 3.1.0.0 (2003/03/20) Hashtable を使用している箇所で、非同期でも構わない箇所を、HashMap に置換え。 119 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 120 * 121 * @param attri アトリビュート 122 */ 123 @Override // ViewMarker 124 public void addAttribute( final Attributes attri ) { 125 if( markData == null ) { markData = new ArrayList<>(); } 126 markData.add( attri ); 127 } 128 129 /** 130 * このマーカーが、初期化されているかどうかを判定します。 131 * 132 * 使用できる状態の場合は、true , 初期化が出来ていない場合は、false を返します。 133 * 134 * @og.rev 6.7.2.0 (2017/01/16) caseKey,caseVal等で未使用のときの対応。 135 * 136 * @return 初期化状況 [true:初期化済み/false:未初期化] 137 */ 138 @Override // ViewMarker 139 public boolean isUsable() { 140// return markData != null && markData.size() > 0 ; // 本当は、ゼロということは無いはず。 141 return markData != null && !markData.isEmpty() ; // 本当は、ゼロということは無いはず。 // 6.9.7.0 (2018/05/14) PMD 142 } 143 144 /** 145 * 内部に DBTableModel をセットします。 146 * 147 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 148 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属性を追加 149 * @og.rev 3.5.6.1 (2004/06/25) DBTableModel の再設定に対応。 150 * @og.rev 3.8.8.1 (2007/01/06) instrVals属性を追加 151 * @og.rev 5.6.3.0 (2013/04/01) useFmtDeco属性を追加 152 * @og.rev 6.4.3.3 (2016/03/04) Map#computeIfAbsent で対応する。 153 * @og.rev 6.4.3.4 (2016/03/11) Formatterに新しいコンストラクターを追加する。 154 * @og.rev 6.7.6.0 (2017/03/17) strictCheck 追加。 155 * @og.rev 8.5.3.0 (2023/09/08) DynamicAttributes対応 156 * 157 * @param tbl DBTableModelオブジェクト 158 */ 159 @Override // ViewMarker 160 public void setDBTableModel( final DBTableModel tbl ) { 161 table = tbl; 162 final int count = markData.size(); // 4.0.0 (2005/08/31) 163 164 // 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD 165 initParameter( count ); 166//// isMark = new int[count]; 167// fgMark = new int[count]; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 168// markKey = new String[count]; 169// markCmlNo = new int[count]; 170// markLists = new String[count]; 171// markListNo = new int[count]; 172// 173// instrVals = new String[count]; 174// useFmtDeco = new boolean[count]; // 5.6.3.0 (2013/04/01) [$XXXX],[#XXXX]機能を有効にするかどうか(true:有効) 175// 176//// Arrays.fill( isMark,MARK_FALSE ); // マーカーの表示可否 177// Arrays.fill( fgMark,MARK_FALSE ); // マーカーの表示可否 // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 178// Arrays.fill( markCmlNo,-1 ); // マーカーの可否を判断するカラム番号 179// 180// Arrays.fill( useFmtDeco,false ); // [$XXXX],[#XXXX]機能を無効にする。(互換性のため) 181 182 for( int intKey=0; intKey<count; intKey++ ) { 183 final Attributes attri = markData.get( intKey ); 184 final String column = attri.get( "p_column" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 185 186 // 6.7.6.0 (2017/03/17) カラムのDBTableModel存在チェック。初期値が true なので、attri に無い場合も、true になる。 187 final String strChk = attri.get( "p_strictCheck" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 188 final boolean strictCheck = ! "false".equalsIgnoreCase( strChk ); 189 190 // 6.4.3.1 (2016/02/12) ConcurrentMap 系は、key,val ともに not null 制限です。 191 final int clm = table.getColumnNo( column,strictCheck ); // 6.7.6.0 (2017/03/17) strictCheck で、true の場合は、clm番号が見つからないときは、Exception発生 192 if( clm < 0 ) { continue; } // 6.7.6.0 (2017/03/17) 存在しない場合、以下の処理を行わない。= clmMap に、カラムが登録されない。 193 194 // 6.4.3.3 (2016/03/04) Map#computeIfAbsent で対応する。 195 // Map#computeIfAbsent : 戻り値は、既存の、または計算された値。追加有り、置換なし、削除なし 196 clmMap.computeIfAbsent( clm,k -> new ArrayList<>() ).add( intKey ); 197 198 // 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD 199 initFormatter( attri, intKey ); 200// final String markFormat = attri.get( "body" ); 201// final Formatter formatter = new Formatter( table,markFormat ); // 6.4.3.4 (2016/03/11) 202// // 6.4.3.1 (2016/02/12) ConcurrentMap 系は、key,val ともに not null 制限です。 203// formMap.put( intKey, formatter ); 204 205 // 8.5.6.1 (2024/03/29) makeOnMarkFormat → makeOnFormat に変更 206// makeOnMarkFormat( intKey,attri ); 207 makeOnFormat( intKey,attri ); 208 209// useFmtDeco[intKey] = "true".equalsIgnoreCase( attri.get( "p_useFormatDeco" ) ); // 5.6.3.0 (2013/04/01) 8.5.3.0 (2023/09/08) 先頭に"p_"付与 210 } 211 } 212 213 /** 214 * setDBTableModel の ViewMarker_MARKER と、ViewLink_LINK の差異を吸収するためのメソッドです。 215 * 216 * それぞれのクラスで独自に設定している項目を、ここで設定します。 217 * ここでは、インスタンス変数の初期化を行っています。 218 * 219 * @og.rev 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD 新規追加 220 * 221 * @param count マーカーの数 222 */ 223 protected void initParameter( final int count ) { 224// isMark = new int[count]; 225 fgMark = new int[count]; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 226 markKey = new String[count]; 227 markCmlNo = new int[count]; 228 markLists = new String[count]; 229 markListNo = new int[count]; 230 231 instrVals = new String[count]; 232 useFmtDeco = new boolean[count]; // 5.6.3.0 (2013/04/01) [$XXXX],[#XXXX]機能を有効にするかどうか(true:有効) 233 234// Arrays.fill( isMark,MARK_FALSE ); // マーカーの表示可否 235 Arrays.fill( fgMark,MARK_FALSE ); // マーカーの表示可否 // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 236 Arrays.fill( markCmlNo,-1 ); // マーカーの可否を判断するカラム番号 237 238 Arrays.fill( useFmtDeco,false ); // [$XXXX],[#XXXX]機能を無効にする。(互換性のため) 239 } 240 241 /** 242 * setDBTableModel の ViewMarker_MARKER と、ViewLink_LINK の差異を吸収するためのメソッドです。 243 * 244 * それぞれのクラスで独自に設定している項目を、ここで設定します。 245 * ここでは、for ループ内の、繰り返し処理内の設定をメソッド化しています。 246 * 247 * @og.rev 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD 新規追加 248 * 249 * @param attri Attributesオブジェクト 250 * @param intKey 指定の列 251 */ 252 protected void initFormatter( final Attributes attri, final int intKey ) { 253 final String markFormat = attri.get( "body" ); 254 final Formatter formatter = new Formatter( table,markFormat ); // 6.4.3.4 (2016/03/11) 255 // 6.4.3.1 (2016/02/12) ConcurrentMap 系は、key,val ともに not null 制限です。 256 formMap.put( intKey, formatter ); 257 258 // 5.6.3.0 (2013/04/01) 8.5.3.0 (2023/09/08) 先頭に"p_"付与 259 useFmtDeco[intKey] = "true".equalsIgnoreCase( attri.get( "p_useFormatDeco" ) ); 260 } 261 262 /** 263 * 指定の行列に対するマーカー文字列を返します。 264 * この値は、すでにマーカー文字列処理されている為、RendererValue で 265 * 変換する必要はありません。 266 * 引数の value はそのカラムの値として利用されます。この値は、修飾済みの 267 * 値を与えることが可能です。 268 * 269 * @og.rev 3.5.6.1 (2004/06/25) formMap属性を使用します。 270 * @og.rev 3.8.8.1 (2007/01/06) instrVals属性を追加 271 * @og.rev 5.3.9.0 (2011/09/01) カラム名の先頭に'$'を付加した場合に、URLEncodeされた値を返すように対応 272 * @og.rev 5.6.3.0 (2013/04/01) useFmtDeco属性を追加([$XXXX],[#XXXX]機能を有効にするかどうか) 273 * @og.rev 6.2.4.0 (2015/05/15) useFmtDeco属性とは無関係に、[!XXXX](値)を対応します。 274 * @og.rev 6.8.3.1 (2017/12/01) [$XXXX param] で、RendererValueのパラメータを動的に変更できます。 275 * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable 対応 for 変数の外だししている j を、中に入れる。 276 * @og.rev 8.5.5.1 (2024/02/29) switch式の使用 277 * 278 * @param row 指定の行 279 * @param clm 指定の列 280 * @param value カラムの値(マーカー文字列処理済) 281 * 282 * @return row行、colum列 のマーカー文字列 283 */ 284 @Override // ViewMarker 285 public String getMarkerString( final int row,final int clm,final String value ) { 286// final int intKey = isOnMark(row,clm) ; 287 final int intKey = onMarkNo(row,clm) ; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 288 if( intKey < 0 ) { return value; } 289 290 final Formatter formatter = formMap.get( intKey ); 291 final int[] clmNo = formatter.getClmNos(); 292 final String[] format = formatter.getFormat(); 293 final char[] types = formatter.getType(); 294 295 final StringBuilder buf = new StringBuilder( BUFFER_LARGE ); 296 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable 対応 for 変数の外だししている j を、中に入れる。 297// int j=0; 298 String val ; 299// for( ; j<clmNo.length; j++ ) { 300 for( int j = 0; j<clmNo.length; j++ ) { 301 // 6.2.4.0 (2015/05/15) [!XXXX](値)を対応 302 if( clm == clmNo[j] && types[j] != '!' ) { 303 val = value; // 一致する場合の valueは、通常レンデラー 304 } 305 else { 306 val = formatter.getValue(row,clmNo[j]); // 生の値 307 } 308 309 // 5.6.3.0 (2013/04/01) useFmtDeco属性を追加(trueの場合は、[$XXXX],[#XXXX]機能を有効にする) 310 if( useFmtDeco[intKey] ) { 311 final DBColumn dbClm = table.getDBColumn( clmNo[j] ); 312 final String prm = formatter.getClmParam(j); // 6.8.3.1 (2017/12/01) 313 if( types[j] == '$' ) { // レンデラー 314 // 6.8.3.1 (2017/12/01) [$XXXX param] で、RendererValueのパラメータを動的に変更できます。 315 val = formatter.getValue(row,clmNo[j]); // ※ 互換性の関係で、useFmtDecoで、'$' のときのみ、生の値を再取得します。 316 val = prm == null || prm.isEmpty() 317 ? dbClm.getRendererValue( row,val ) 318 : dbClm.getRendererValue( row,val,prm ); 319 } 320 else if( types[j] == '#' ) { // ラベル 321 if( prm == null || prm.isEmpty() ) { 322 val = dbClm.getLabel(); 323 } 324 else { 325 // 6.8.3.1 (2017/12/01) [#XXXX param] で、RendererValueのパラメータを動的に変更できます。 326 // 8.5.5.1 (2024/02/29) switch式の使用 327// switch( prm.charAt(0) ) { // 先頭の文字(文字列のswitchでもよい) 328// case 'L': val = dbClm.getLabel(); break; 329// case 'S': val = dbClm.getShortLabel(); break; 330// case 'T': val = dbClm.getLongLabel(); break; 331// case 'D': val = dbClm.getDescription(); break; 332// default : val = dbClm.getLabel(); break; 333// } 334 val = switch( prm.charAt(0) ) { // 先頭の文字(文字列のswitchでもよい) 335 case 'L' -> dbClm.getLabel(); 336 case 'S' -> dbClm.getShortLabel(); 337 case 'T' -> dbClm.getLongLabel(); 338 case 'D' -> dbClm.getDescription(); 339 default -> dbClm.getLabel(); 340 }; 341 } 342 } 343 } 344 // false が以前と同じ処理(互換処理)ただし、view などのフォーマット処理とは異なる。 345 else { 346 // 5.3.9.0 (2011/09/01) カラム名の先頭に'$'を付加した場合URLEncodeされた値を返すように対応 347 if( types[j] == '$' ) { 348 val = StringUtil.urlEncode( val ); 349 } 350 } 351 352 buf.append( format[j] ).append( val ); 353 } 354// if( j < format.length ) { buf.append( format[j] ); } 355 if( clmNo.length < format.length ) { buf.append( format[clmNo.length] ); } // 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable 対応 356 String rtn = StringUtil.replace( buf.toString(),"{I}",String.valueOf( row ) ); 357 358 // 3.8.8.1 (2007/01/06) instrVals属性を追加 359 if( instrVals[intKey] != null ) { 360 final String[] vals = StringUtil.csv2Array( instrVals[intKey],' ' ); 361 for( int i=0; i<vals.length; i++ ) { 362 final String css = "<span class=\"instr" + i + "\">" + vals[i] + "</span>"; 363 rtn = StringUtil.replace( rtn,vals[i],css ); 364 } 365 } 366 return rtn ; 367 } 368 369 /** 370 * マーカーを作成する/作成しないの指定カラム番号を求めます。 371 * 372 * setDBTableModel から呼ばれますが、MARKER と、LINK で少しの差異 373 * あるため、それを吸収するためのメソッドです。 374 * 375 * @og.rev 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD 新規追加 376 * 377 * @param intKey カラムキーの番号 378 * @param attri アトリビュート 379 */ 380 protected void makeOnFormat( final int intKey,final Attributes attri ) { 381 instrVals[intKey] = attri.get( "p_instrVals" ); // 3.8.8.1 (2007/01/06) 8.5.3.0 (2023/09/08) 先頭に"p_"付与 382 final String onMark = attri.get( "p_onMark" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 383 makeOnFormat( intKey, attri, onMark ); 384 } 385 386 /** 387 * マーカーを作成する/作成しないの指定カラム番号を求めます。 388 * また、int[列番号] isMark ⇒ fgMark を初期化します。 389 * 390 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属性を追加 391 * @og.rev 3.8.8.1 (2007/01/06) instrVals属性を追加 392 * @og.rev 8.5.3.0 (2023/09/08) DynamicAttributes対応 393 * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 対応 isMark ⇒ fgMark 394 * @og.rev 8.5.6.1 (2024/03/29) makeOnMarkFormat → makeOnFormat に変更 395 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、private を protected に、一部修正します。 396 * 397 * @param intKey カラムキーの番号 398 * @param attri アトリビュート 399 * @param onMark マークする文字列 400 */ 401// private void makeOnMarkFormat( final int intKey,final Attributes attri ) { 402 protected void makeOnFormat( final int intKey,final Attributes attri, final String onMark ) { 403// final String onMark = attri.get( "p_onMark" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 404 final String markList = attri.get( "p_markList" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 405// instrVals[intKey] = attri.get( "p_instrVals" ); // 3.8.8.1 (2007/01/06) 8.5.3.0 (2023/09/08) 先頭に"p_"付与 406 407 // 3.5.6.0 (2004/06/18) nullポインタの参照外しバグの対応 408 // このロジックで値が設定済みであれば、以下の処理は不要である。 409// isMark[intKey] = MARK_NULL; 410 fgMark[intKey] = MARK_NULL; // 8.5.4.2 (2024/01/12) 411 if( onMark == null || onMark.isEmpty() || 412 markList == null || markList.isEmpty() ) { 413// isMark[intKey] = MARK_FALSE; 414 fgMark[intKey] = MARK_FALSE; // 8.5.4.2 (2024/01/12) 415 return ; // 3.5.6.0 (2004/06/18) 416 } 417 else if( onMark.charAt(0) != '[' && markList.charAt(0) != '[' ) { 418// isMark[intKey] = markList.indexOf( onMark ) >= 0 ? MARK_TRUE : MARK_FALSE; 419 fgMark[intKey] = markList.indexOf( onMark ) >= 0 ? MARK_TRUE : MARK_FALSE; // 8.5.4.2 (2024/01/12) 420 return ; // 3.5.6.0 (2004/06/18) 421 } 422 423 if( onMark.charAt(0) == '[' ) { 424 markCmlNo[intKey] = table.getColumnNo( onMark.substring( 1,onMark.length()-1 )); 425 } 426 else { 427 markCmlNo[intKey] = -1; 428 markKey[intKey] = onMark ; 429 } 430 431 if( markList.charAt(0) == '[' ) { 432 markListNo[intKey] = table.getColumnNo( markList.substring( 1,markList.length()-1 )); 433 } 434 else { 435 markListNo[intKey] = -1; 436 markLists[intKey] = markList; 437 } 438 } 439 440 /** 441 * マーカーを作成するかどうかを判断します。 442 * int[列番号] isMark ⇒ fgMark には、 未設定 FALSE TRUE の状態を持っており、 443 * 列でマーカーを作成する状態が固定の場合(例えば、onMark属性がデフォルト "true" の場合) 444 * カラムに関係なく、同じ値を返すときに、使用します。 445 * 446 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属性を追加 447 * @og.rev 3.5.4.0 (2003/11/25) onMark ,markList が null(またはゼロストリング)の場合は、false とする。 448 * @og.rev 4.0.0.0 (2005/08/31) 同一カラムの複数登録を許可します。 449 * @og.rev 6.7.2.0 (2017/01/16) markListの先頭が、"?" の場合、正規表現で判定します。 450 * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 対応 isMark ⇒ fgMark 451 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、private を protected に、一部修正します。 452 * 453 * @param row 列番号 454 * @param clm カラムキーの名称 455 * 456 * @return 処理するリスト番号、-1 の場合は、該当なし 457 */ 458// private int isOnMark( final int row,final int clm ) { 459 protected int onMarkNo( final int row,final int clm ) { // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 対応 460 final List<Integer> list = clmMap.get( clm ); 461 if( list == null ) { return -1; } 462 463 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ForLoopCanBeForeach 464// for( int i=0; i<list.size(); i++ ) { 465// final int intKey = list.get( i ); 466 for( final int intKey : list ) { 467// if( isMark[intKey] != MARK_NULL ) { 468// if( isMark[intKey] == MARK_TRUE ) { return intKey; } 469 if( fgMark[intKey] != MARK_NULL ) { // 8.5.4.2 (2024/01/12) 470 if( fgMark[intKey] == MARK_TRUE ) { return intKey; } // 8.5.4.2 (2024/01/12) 471 else { continue; } 472 } 473 474 final String onMark ; 475 if( markCmlNo[intKey] < 0 ) { onMark = markKey[intKey] ; } 476 else { onMark = table.getValue( row,markCmlNo[intKey] ); } 477 478 // 3.5.4.0 (2003/11/25) 追加 479 if( onMark == null || onMark.isEmpty() ) { continue; } 480 481 final String markList ; 482 if( markListNo[intKey] < 0 ) { markList = markLists[intKey] ; } 483 else { markList = table.getValue( row,markListNo[intKey] ); } 484 485 // 3.5.4.0 (2003/11/25) 修正 486 if( markList == null || markList.isEmpty() ) { continue; } 487 488 // 6.7.2.0 (2017/01/16) markListの先頭が、"?" の場合、正規表現で判定します。 489 if( markList.charAt(0) == '?' ) { 490 if( onMark.matches( markList.substring(1) ) ) { 491 return intKey; 492 } 493 } 494 else if( markList.indexOf( onMark ) >= 0 ) { return intKey; } 495 } 496 return -1; 497 } 498 499 /** 500 * マーカーされたカラム番号の配列を返します。 501 * 502 * これは特殊処理で、Edit機能で、カラム列をキャッシュしているときに、 503 * JSPのソース等の変更時に、変更が反映されない対応を行う場合、 504 * 通常の ViewFormのサブクラスから、Edit専用の ViewForm_HTMLSeqClmTable で 505 * 制御する場合、ViewMarkerのEditMarkerでは、通常非表示(検索の場合)ですが 506 * Editのポップアップ画面に、表示されてしまうのを避けるため、noDisplay に 507 * 強制的にするカラム番号が必要です。 508 * あくまで、暫定処置です。Edit機能を改修するときに、この機能は削除します。 509 * 510 * ※ この処理は、EditMarkerでのみ有効にします。 511 * 512 * @og.rev 6.0.3.0 (2014/11/13) Edit機能で、JSPソース変更時の対応 513 * 514 * @return マーカーされたカラム番号の配列 515 */ 516 @Override // ViewMarker 517 public int[] getColumnNos() { 518 return clmMap.keySet().stream().mapToInt(i -> i).toArray(); 519 520// final int[] rtn = new int[clmMap.size()]; 521// // 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable i ⇒ ii 522// int ii=0; 523// for( final Integer obj : clmMap.keySet() ) { 524// // 2.0.0 (2024/01/12) PMD 7.0.0 UnnecessaryBoxing 525//// rtn[ii++] = obj.intValue(); 526// rtn[ii++] = obj; 527// } 528// 529// return rtn; 530 } 531}