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 018// import java.util.concurrent.ConcurrentMap; // 6.4.3.3 (2016/03/04) 019// import java.util.concurrent.ConcurrentHashMap; // 6.4.3.1 (2016/02/12) refactoring 020// import java.util.List; 021// import java.util.ArrayList; 022import java.util.Arrays; 023 024import org.opengion.hayabusa.common.HybsSystem; 025// import org.opengion.hayabusa.db.DBTableModel; 026import org.opengion.fukurou.security.HybsCryptography; // 5.8.8.0 (2015/06/05) 027import org.opengion.fukurou.security.URLHashMap; 028import org.opengion.fukurou.util.StringUtil; 029import org.opengion.fukurou.util.Attributes; 030import org.opengion.fukurou.util.XHTMLTag; 031import org.opengion.fukurou.model.Formatter; 032import static org.opengion.fukurou.system.HybsConst.BUFFER_LARGE; // 6.1.0.0 (2014/12/26) refactoring 033 034/** 035 * ViewLink インターフェース の実装オブジェクトです。 036 * これを共通のスーパークラスとして 各種表示フォーム(例:HTML表示等)に使います。 037 * 038 * このクラスは、setter/getterメソッドのデフォルト実装を提供しています。 039 * 各種表示フォームに対応したサブクラス上で、 create() をオーバーライドして下さい。 040 * 041 * @og.rev 2.1.0.3 (2002/11/08) エンコードの開始/終了アドレスを求める処理の修正 042 * @og.rev 4.0.0.0 (2005/08/31) 同一カラムの複数登録を許可します。 043 * @og.rev 8.5.6.1 (2024/03/29) ViewMarker_MARKER を継承します。 044 * @og.group 画面表示 045 * 046 * @version 4.0 047 * @author Kazuhiko Hasegawa 048 * @since JDK5.0, 049 */ 050// public class ViewLink_LINK implements ViewMarker { 051public class ViewLink_LINK extends ViewMarker_MARKER { 052 // 8.5.6.1 (2024/03/29) ViewMarker_MARKER を継承します。 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 057// private List<Attributes> markData ; // 4.0.0 (2005/08/31) 058// /** 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 */ 059// private final ConcurrentMap<Integer,Formatter> formMap = new ConcurrentHashMap<>(); // 6.4.3.1 (2016/02/12) 060 061// /** 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 */ 062// private final ConcurrentMap<Integer,List<Integer>> clmMap = new ConcurrentHashMap<>(); // 6.4.3.1 (2016/02/12) 063 064// private DBTableModel table ; 065// private int[] markCmlNo ; 066//// private int[] isMark ; 067// private int[] fgMark ; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 068// // 3.5.2.0 (2003/10/20) 069// private String[] markKey ; 070// private String[] markLists ; 071// private int[] markListNo ; 072 073 // ***** ViewLink_LINK のみに存在する変数 ***** 074 private static final String REQ_KEY = HybsSystem.URL_HASH_REQ_KEY ; 075 private static final int ACCS_LVL = HybsSystem.sysInt( "URL_ACCESS_SECURITY_LEVEL" ); 076 077 // 2.1.0.3 (2002/11/08) エンコードの開始/終了アドレスを求める処理の修正 078 /** 6.2.0.1 (2015/03/06) hrefアドレスのASCII以外の文字の、URLエンコードを行う。 */ 079 private int[] hrefIn ; // 初期値:範囲外 6.2.0.1 (2015/03/06) 080 private int[] encodeIn ; // 初期値:範囲外 081 private int[] encodeOut ; // 初期値:範囲外 082 083 private boolean[] useURLCheck ; // 4.3.7.1 (2009/06/08) 084 private String[] urlCheckUser ; // 4.3.7.1 (2009/06/08) 085 private long[] urlCheckTime ; // 4.3.7.1 (2009/06/08) 086 private HybsCryptography[] urlCheckCrypt ; // 5.8.8.0 (2015/06/05) 087 private boolean[] useHrefEncode ; // 6.0.2.0 (2014/09/19) 088 private boolean[] hrefOnly ; // 7.1.0.1 (2020/02/07) 089// private String[] extToken ; // 5.8.2.1 (2014/12/13) 6.9.5.0 (2018/04/23) extToken 廃止 090 private int editClmNo ; // 6.4.7.0 (2016/06/03) エディット機能で、rowCount カラムが存在するときのカラム番号。無ければ-1 091 092 /** 093 * デフォルトコンストラクター 094 * 095 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 096 */ 097 public ViewLink_LINK() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 098 099 /** 100 * 内容をクリア(初期化)します。 101 * 102 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 103 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属性を追加 104 * @og.rev 3.5.6.1 (2004/06/25) formMap属性を追加 105 * @og.rev 4.3.7.1 (2009/06/08) URLチェック属性追加 106 * @og.rev 6.0.2.0 (2014/09/19) useHrefEncode属性追加 107 * @og.rev 5.8.2.1 (2014/12/13) extToken追加 108 * @og.rev 6.2.0.1 (2015/03/06) hrefアドレスのASCII以外の文字の、URLエンコードを行う。 109 * @og.rev 5.8.8.0 (2015/06/05) urlCheckCrypt追加 110 * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 111 * @og.rev 6.4.7.0 (2016/06/03) エディット機能で、rowCount カラムが存在するときのカラム番号。無ければ-1; 112 * @og.rev 6.9.5.0 (2018/04/23) extToken 廃止 113 * @og.rev 7.1.0.1 (2020/02/07) hrefOnly属性追加 114 * @og.rev 8.5.6.1 (2024/03/29) ViewMarker_MARKER を継承します。 115 */ 116 @Override // ViewMarker 117 public void clear() { 118 super.clear(); // 8.5.6.1 (2024/03/29) ViewMarker_MARKER を継承します。 119// markData = null; // 4.0.0 (2005/08/31) 120// formMap.clear(); // 6.4.3.3 (2016/03/04) 121// clmMap.clear(); // 6.4.3.3 (2016/03/04) 122// table = null; 123//// isMark = null; 124// fgMark = null; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 125// markKey = null; 126// markLists = null; 127// markListNo = null; 128 // ***** ViewLink_LINK のみに存在する変数 ***** 129 hrefIn = null; // 6.2.0.1 (2015/03/06) 130 encodeIn = null; 131 encodeOut = null; 132 useURLCheck = null; // 4.3.7.1 (2009/06/08) 133 urlCheckUser = null; // 4.3.7.1 (2009/06/08) 134 urlCheckTime = null; // 4.3.7.1 (2009/06/08) 135 urlCheckCrypt = null; // 5.8.8.0 (2015/06/05) 136 useHrefEncode = null; // 6.0.2.0 (2014/09/19) 137 hrefOnly = null; // 6.0.2.0 (2014/09/19) 138// extToken = null; // 5.8.2.1 (2014/12/14) 139 editClmNo = -1; // 7.1.0.1 (2020/02/07) 140 } 141 142// /** 143// * カラムに対するリンクアトリビュートをセットします。 144// * 145// * @og.rev 3.1.0.0 (2003/03/20) Hashtable を使用している箇所で、非同期でも構わない箇所を、HashMap に置換え。 146// * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 147// * @og.rev 4.0.0.0 (2005/08/31) 同一カラムの複数登録を許可します。 148// * @og.rev 8.5.6.1 (2024/03/29) ViewMarker_MARKER を継承します。 149// * 150// * @param attri リンクアトリビュート 151// */ 152// @Override // ViewMarker 153// public void addAttribute( final Attributes attri ) { 154// if( markData == null ) { markData = new ArrayList<>(); } 155// markData.add( attri ); 156// } 157 158// /** 159// * このマーカーが、初期化されているかどうかを判定します。 160// * 161// * 使用できる状態の場合は、true , 初期化が出来ていない場合は、false を返します。 162// * 163// * @og.rev 6.7.2.0 (2017/01/16) caseKey,caseVal等で未使用のときの対応。 164// * @og.rev 8.5.6.1 (2024/03/29) ViewMarker_MARKER を継承します。 165// * 166// * @return 初期化状況 [true:初期化済み/false:未初期化] 167// */ 168// @Override // ViewMarker 169// public boolean isUsable() { 170//// return markData != null && markData.size() > 0 ; // 本当は、ゼロということは無いはず。 171// return markData != null && !markData.isEmpty() ; // 本当は、ゼロということは無いはず。 // 6.9.7.0 (2018/05/14) PMD 172// } 173 174// /** 175// * 内部に DBTableModel をセットします。 176// * 177// * @og.rev 2.1.0.3 (2002/11/08) エンコードの開始/終了アドレスを求める処理の修正 178// * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 179// * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属性を追加 180// * @og.rev 3.5.5.0 (2004/03/12) xlink 属性によるリンク情報作成方法の分岐を追加 181// * @og.rev 3.5.6.1 (2004/06/25) DBTableModel の再設定に対応。 182// * @og.rev 3.5.6.2 (2004/07/05) linkFormat をパラメータで取得するように変更。 183// * @og.rev 3.8.1.1 (2005/11/21) linkFormat が "[","]" をエンコードしてしまった場合に元に戻します。 184// * @og.rev 4.0.0.0 (2005/08/31) 同一カラムの複数登録を許可します。 185// * @og.rev 4.3.7.1 (2009/06/08) URLチェック機能追加 186// * @og.rev 6.0.2.0 (2014/09/19) useHrefEncode属性追加 187// * @og.rev 6.2.0.1 (2015/03/06) hrefアドレスのASCII以外の文字の、URLエンコードを行う。 188// * @og.rev 5.8.8.0 (2015/06/05) urlCheckCrypt対応 189// * @og.rev 6.4.3.3 (2016/03/04) Map#computeIfAbsent で対応する。 190// * @og.rev 6.4.3.4 (2016/03/11) Formatterに新しいコンストラクターを追加する。 191// * @og.rev 6.4.7.0 (2016/06/03) エディット機能で、rowCount カラムが存在するときのカラム番号。無ければ-1; 192// * @og.rev 6.7.6.0 (2017/03/17) strictCheck 追加。 193// * @og.rev 6.9.5.0 (2018/04/23) extToken 廃止 194// * @og.rev 7.1.0.1 (2020/02/07) hrefOnly属性追加 195// * @og.rev 8.5.3.0 (2023/09/08) DynamicAttributes対応 196// * @og.rev 8.5.6.1 (2024/03/29) ViewMarker_MARKER を継承します。 197// * 198// * @param tbl DBTableModelオブジェクト 199// */ 200// @Override // ViewMarker 201// public void setDBTableModel( final DBTableModel tbl ) { 202// table = tbl; 203// final int count = markData.size(); // 4.0.0 (2005/08/31) 204// 205//// isMark = new int[count]; 206// fgMark = new int[count]; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 207// markKey = new String[count]; 208// markCmlNo = new int[count]; 209// markLists = new String[count]; 210// markListNo = new int[count]; 211// 212// hrefIn = new int[count]; // 6.2.0.1 (2015/03/06) 213// encodeIn = new int[count]; 214// encodeOut = new int[count]; 215// useURLCheck = new boolean[count]; // 4.3.7.1 (2009/06/08) 216// urlCheckUser = new String[count]; // 4.3.7.1 (2009/06/08) 217// urlCheckTime = new long[count]; // 4.3.7.1 (2009/06/08) 218// urlCheckCrypt = new HybsCryptography[count]; // 5.8.8.0 (2015/06/05) 219// useHrefEncode = new boolean[count]; // 6.0.2.0 (2014/09/19) 220// hrefOnly = new boolean[count]; // 7.1.0.1 (2020/02/07) 221//// extToken = new String[count]; // 5.8.2.1 (2014/12/13) 6.9.5.0 (2018/04/23) extToken 廃止 222// 223//// Arrays.fill( isMark,MARK_FALSE ); // リンクの表示可否 224// Arrays.fill( fgMark,MARK_FALSE ); // リンクの表示可否 // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 225// Arrays.fill( markCmlNo ,-1 ); // リンクの可否を判断するカラム番号 226// 227// Arrays.fill( hrefIn ,10_000 ); // 初期値:範囲外 6.2.0.1 (2015/03/06) 228// Arrays.fill( encodeIn ,10_000 ); // 初期値:範囲外 // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseUnderscoresInNumericLiterals 229// Arrays.fill( encodeOut ,-1 ); // 初期値:範囲外 230// Arrays.fill( useURLCheck , false ); // 4.3.7.1 (2009/06/08) 231// Arrays.fill( urlCheckTime , 0L ); // 4.3.7.1 (2009/06/08) 232// Arrays.fill( useHrefEncode , false ); // 6.0.2.0 (2014/09/19) 決め打ちに近いがとりあえず初期化は false 233// Arrays.fill( hrefOnly , false ); // 7.1.0.1 (2020/02/07) 234// 235// // 6.4.7.0 (2016/06/03) エディット機能で、rowCount カラムが存在するときのカラム番号。無ければ-1; 236// editClmNo = table.getColumnNo( "rowCount" , false ); 237// 238// // 4.0.0 (2005/08/31) 同一カラムの複数登録を許可します。 239// for( int intKey=0; intKey<count; intKey++ ) { 240// final Attributes attri = markData.get( intKey ); 241// final String column = attri.get( "p_column" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 242// 243// // 6.7.6.0 (2017/03/17) カラムのDBTableModel存在チェック。初期値が true なので、attri に無い場合も、true になる。 244// final String strChk = attri.get( "p_strictCheck" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 245// final boolean strictCheck = ! "false".equalsIgnoreCase( strChk ); 246// 247// // 6.4.3.1 (2016/02/12) ConcurrentMap 系は、key,val ともに not null 制限です。 248// final int clm = table.getColumnNo( column,strictCheck ); // 6.7.6.0 (2017/03/17) strictCheck で、true の場合は、clm番号が見つからないときは、Exception発生 249// if( clm < 0 ) { continue; } // 6.7.6.0 (2017/03/17) 存在しない場合、以下の処理を行わない。= clmMap に、カラムが登録されない。 250// 251// // 6.4.3.3 (2016/03/04) Map#compute で対応する。 252// // Map#computeIfAbsent : 戻り値は、既存の、または計算された値。追加有り、置換なし、削除なし 253// clmMap.computeIfAbsent( clm,k -> new ArrayList<>() ).add( intKey ); 254// 255// String linkFormat = attri.get( "p_linkFormat" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 256// linkFormat = StringUtil.replace( linkFormat,"%5B","[" ); // 3.8.1.1 (2005/11/21) 257// linkFormat = StringUtil.replace( linkFormat,"%5D","]" ); // 3.8.1.1 (2005/11/21) 258// 259// final Formatter formatter = new Formatter( table,linkFormat ); // 6.4.3.4 (2016/03/11) 260// // 6.4.3.1 (2016/02/12) ConcurrentMap 系は、key,val ともに not null 制限です。 261// formMap.put( intKey, formatter ); 262// 263// // URLエンコード用の範囲設定。この範囲内のデータをURLエンコードする。 264// final String[] format = formatter.getFormat(); 265// boolean findHref = false; 266// for( int j=0; j<format.length; j++ ) { 267// // 6.2.0.1 (2015/03/06) hrefアドレスのASCII以外の文字の、URLエンコードを行う。 268// if( format[j] != null && format[j].indexOf( "href" ) >= 0 ) { findHref = true; hrefIn[intKey] = j; } 269// if( findHref && format[j].indexOf( '?' ) >= 0 ) { encodeIn[intKey] = j; } 270// if( findHref && format[j].indexOf( "\" " ) >= 0 ) { encodeOut[intKey] = j; findHref = false; } 271// } 272// 273// // 4.3.7.1 (2009/06/08) 274// useURLCheck[intKey] = StringUtil.nval( attri.get( "p_useURLCheck" ) , false ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 275// urlCheckUser[intKey] = StringUtil.nval( attri.get( "p_urlCheckUser" ) , null ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 276// urlCheckTime[intKey] = StringUtil.nval( attri.get( "p_urlCheckTime" ) , 0L ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 277// final String cryptKey= StringUtil.nval( attri.get( "p_urlCheckCrypt" ) , null ); // 5.8.8.0 (2015/06/05) 8.5.3.0 (2023/09/08) 先頭に"p_"付与 278// urlCheckCrypt[intKey]= new HybsCryptography( cryptKey ); // 5.8.8.0 (2015/06/05) 279// useHrefEncode[intKey]= StringUtil.nval( attri.get( "p_useHrefEncode") , false ); // 6.0.2.0 (2014/09/19) 8.5.3.0 (2023/09/08) 先頭に"p_"付与 280// hrefOnly[intKey] = StringUtil.nval( attri.get( "p_hrefOnly") , false ); // 7.1.0.1 (2020/02/07) 8.5.3.0 (2023/09/08) 先頭に"p_"付与 281//// extToken[intKey] = StringUtil.nval( attri.get( "extToken" ) , null ); // 5.8.2.1 (2014/12/14) 6.9.5.0 (2018/04/23) extToken 廃止 282// 283// // 8.5.6.1 (2024/03/29) makeOnLinkFormat → makeOnFormat に変更 284//// makeOnLinkFormat( intKey,attri ); 285// makeOnFormat( intKey,attri ); 286// } 287// } 288 289 /** 290 * setDBTableModel の ViewMarker_MARKER と、ViewLink_LINK の差異を吸収するためのメソッドです。 291 * 292 * それぞれのクラスで独自に設定している項目を、ここで設定します。 293 * ここでは、インスタンス変数の初期化を行っています。 294 * 295 * @og.rev 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD 新規追加 296 * 297 * @param count マーカーの数 298 */ 299 @Override // ViewMarker_MARKER 300 protected void initParameter( final int count ) { 301 super.initParameter( count ); 302 hrefIn = new int[count]; // 6.2.0.1 (2015/03/06) 303 encodeIn = new int[count]; 304 encodeOut = new int[count]; 305 useURLCheck = new boolean[count]; // 4.3.7.1 (2009/06/08) 306 urlCheckUser = new String[count]; // 4.3.7.1 (2009/06/08) 307 urlCheckTime = new long[count]; // 4.3.7.1 (2009/06/08) 308 urlCheckCrypt = new HybsCryptography[count]; // 5.8.8.0 (2015/06/05) 309 useHrefEncode = new boolean[count]; // 6.0.2.0 (2014/09/19) 310 hrefOnly = new boolean[count]; // 7.1.0.1 (2020/02/07) 311// extToken = new String[count]; // 5.8.2.1 (2014/12/13) 6.9.5.0 (2018/04/23) extToken 廃止 312 313 Arrays.fill( hrefIn ,10_000 ); // 初期値:範囲外 6.2.0.1 (2015/03/06) 314 Arrays.fill( encodeIn ,10_000 ); // 初期値:範囲外 // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseUnderscoresInNumericLiterals 315 Arrays.fill( encodeOut ,-1 ); // 初期値:範囲外 316 Arrays.fill( useURLCheck , false ); // 4.3.7.1 (2009/06/08) 317 Arrays.fill( urlCheckTime , 0L ); // 4.3.7.1 (2009/06/08) 318 Arrays.fill( useHrefEncode , false ); // 6.0.2.0 (2014/09/19) 決め打ちに近いがとりあえず初期化は false 319 Arrays.fill( hrefOnly , false ); // 7.1.0.1 (2020/02/07) 320 321 // 6.4.7.0 (2016/06/03) エディット機能で、rowCount カラムが存在するときのカラム番号。無ければ-1; 322 editClmNo = table.getColumnNo( "rowCount" , false ); 323 } 324 325 /** 326 * setDBTableModel の ViewMarker_MARKER と、ViewLink_LINK の差異を吸収するためのメソッドです。 327 * 328 * それぞれのクラスで独自に設定している項目を、ここで設定します。 329 * ここでは、for ループ内の、繰り返し処理内の設定をメソッド化しています。 330 * 331 * @og.rev 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD 新規追加 332 * 333 * @param attri Attributesオブジェクト 334 * @param intKey 指定の列 335 */ 336 @Override // ViewMarker_MARKER 337 protected void initFormatter( final Attributes attri, final int intKey ) { 338 String linkFormat = attri.get( "p_linkFormat" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 339 linkFormat = StringUtil.replace( linkFormat,"%5B","[" ); // 3.8.1.1 (2005/11/21) 340 linkFormat = StringUtil.replace( linkFormat,"%5D","]" ); // 3.8.1.1 (2005/11/21) 341 342 final Formatter formatter = new Formatter( table,linkFormat ); // 6.4.3.4 (2016/03/11) 343 // 6.4.3.1 (2016/02/12) ConcurrentMap 系は、key,val ともに not null 制限です。 344 formMap.put( intKey, formatter ); 345 346 // URLエンコード用の範囲設定。この範囲内のデータをURLエンコードする。 347 final String[] format = formatter.getFormat(); 348 boolean findHref = false; 349 for( int j=0; j<format.length; j++ ) { 350 // 6.2.0.1 (2015/03/06) hrefアドレスのASCII以外の文字の、URLエンコードを行う。 351 if( format[j] != null && format[j].indexOf( "href" ) >= 0 ) { findHref = true; hrefIn[intKey] = j; } 352 if( findHref && format[j].indexOf( '?' ) >= 0 ) { encodeIn[intKey] = j; } 353 if( findHref && format[j].indexOf( "\" " ) >= 0 ) { encodeOut[intKey] = j; findHref = false; } 354 } 355 356 // 4.3.7.1 (2009/06/08) 357 useURLCheck[intKey] = StringUtil.nval( attri.get( "p_useURLCheck" ) , false ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 358 urlCheckUser[intKey] = StringUtil.nval( attri.get( "p_urlCheckUser" ) , null ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 359 urlCheckTime[intKey] = StringUtil.nval( attri.get( "p_urlCheckTime" ) , 0L ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 360 final String cryptKey= StringUtil.nval( attri.get( "p_urlCheckCrypt" ) , null ); // 5.8.8.0 (2015/06/05) 8.5.3.0 (2023/09/08) 先頭に"p_"付与 361 urlCheckCrypt[intKey]= new HybsCryptography( cryptKey ); // 5.8.8.0 (2015/06/05) 362 useHrefEncode[intKey]= StringUtil.nval( attri.get( "p_useHrefEncode") , false ); // 6.0.2.0 (2014/09/19) 8.5.3.0 (2023/09/08) 先頭に"p_"付与 363 hrefOnly[intKey] = StringUtil.nval( attri.get( "p_hrefOnly") , false ); // 7.1.0.1 (2020/02/07) 8.5.3.0 (2023/09/08) 先頭に"p_"付与 364// extToken[intKey] = StringUtil.nval( attri.get( "extToken" ) , null ); // 5.8.2.1 (2014/12/14) 6.9.5.0 (2018/04/23) extToken 廃止 365 } 366 367 /** 368 * 指定の行列に対するマーカー文字列を返します。 369 * この値は、すでにマーカー文字列処理されている為、RendererValue で 370 * 変換する必要はありません。 371 * 引数の value はそのカラムの値として利用されます。この値は、修飾済みの 372 * 値を与えることが可能です。 373 * 374 * @og.rev 2.1.0.3 (2002/11/08) エンコードの開始/終了アドレスを求める処理の修正 375 * @og.rev 3.0.0.0 (2002/12/25) URLEncoder.encode を StringUtil#urlEncode に置換え 376 * @og.rev 3.0.0.1 (2003/02/14) リンクの引数部分に、RendererValue が適用される箇所を修正 377 * @og.rev 3.0.0.1 (2003/02/14) リンクの引数部分に、RendererValue が適用される箇所を修正 378 * @og.rev 3.5.6.1 (2004/06/25) formMap属性を使用します。 379 * @og.rev 3.7.0.3 (2005/03/01) "{I}" 文字列に、行番号(row)を割り当てます。 380 * @og.rev 3.8.5.0 (2006/03/20) "{I}" ⇒ "%7BI%7D" として、行番号(row)を割り当てます。 381 * @og.rev 4.3.7.1 (2009/06/08) URLチェック機能追加 382 * @og.rev 4.3.7.4 (2009/07/01) 循環参照を解消 383 * @og.rev 5.2.3.0 (2010/12/01) URLのハッシュ化/暗号化を行います。 384 * @og.rev 6.0.2.0 (2014/09/19) useHrefEncode属性追加 385 * @og.rev 5.8.2.1 (2014/12/13) トークンプラグイン対応 386 * @og.rev 6.2.0.1 (2015/03/06) ASCII以外の文字の、URLエンコードを行う。 387 * @og.rev 6.2.4.0 (2015/05/15) エンコード範囲内の value は、値を使う。(元に戻す) 388 * @og.rev 5.8.8.0 (2015/06/05) urlCheckCrypt対応 389 * @og.rev 6.4.3.3 (2016/03/04) HybsSystem.newInstance(String,String) への置き換え。 390 * @og.rev 6.4.3.4 (2016/03/11) hrefIn の部分エンコードと、?以下のパラメータエンコードの判定間違い、修正 391 * @og.rev 6.4.7.0 (2016/06/03) エディット機能で、rowCount カラムが存在するときのカラム番号。無ければ-1; 392 * @og.rev 6.9.5.0 (2018/04/23) extToken 廃止 393 * @og.rev 7.1.0.1 (2020/02/07) hrefOnly属性追加 394 * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable 対応 for 変数の外だししている j を、中に入れる。 395 * 396 * @param row 指定の行 397 * @param clm 指定の列 398 * @param value カラムの値 399 * 400 * @return row行、colum列 のマーカー文字列 401 */ 402 @Override // ViewMarker 403 public String getMarkerString( final int row,final int clm,final String value ) { 404// final int intKey = isOnLink(row,clm) ; 405 // 8.5.6.1 (2024/03/29) onLinkNo → onMarkNo に変更 406// final int intKey = onLinkNo(row,clm) ; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 407 final int intKey = onMarkNo(row,clm) ; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 408 if( intKey < 0 ) { return value; } 409 410 final Formatter formatter = formMap.get( intKey ); 411 final int[] clmNo = formatter.getClmNos(); 412 final String[] format = formatter.getFormat(); 413 414 final StringBuilder strLink = new StringBuilder( BUFFER_LARGE ); 415 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable 対応 for 変数の外だししている j を、中に入れる。 416// int j=0; 417// for( ; j<clmNo.length; j++ ) { 418 for( int j=0; j<clmNo.length; j++ ) { 419 strLink.append( format[j] ); 420 421 // 6.2.4.0 (2015/05/15) エンコード範囲内の value は、値を使う。(元に戻す) 422 String val = formatter.getValue(row,clmNo[j]); 423 424 // 6.4.3.4 (2016/03/11) hrefIn の部分エンコードと、?以下のパラメータエンコードの判定間違い、修正 425 if( hrefIn[intKey] <= j && j < encodeOut[intKey] ) { // (href) encode範囲内 426 if( encodeIn[intKey] <= j ) { 427 val = StringUtil.urlEncode( val ); // パラメータはフルエンコード 428 } 429 else if( useHrefEncode[intKey] ) { // 6.0.2.0 (2014/09/19) useHrefEncode属性追加 430 val = StringUtil.urlEncode2( val ); // ファイル名などは、部分エンコード 431 } 432 } 433 else { // encode範囲外 434 // なにもしない。 435 if( clm == clmNo[j] ) { val = value; } // 一致する場合の valueは、通常レンデラー 436 else if( hrefOnly[intKey] ) { // 7.1.0.1 (2020/02/07) hrefOnly属性追加 437// val = StringUtil.urlEncode( val ); 438 val = StringUtil.urlEncode2( val ); // 7.2.1.0 (2020/03/13) 部分エンコード 439 } 440 } 441 442// // 6.4.3.4 (2016/03/11) hrefIn の部分エンコードと、?以下のパラメータエンコードの判定間違い、修正 443// if( hrefIn[intKey] <= j && j < encodeOut[intKey] ) { // (href) encode範囲内 444// if( encodeIn[intKey] <= j ) { 445// val = StringUtil.urlEncode( val ); // パラメータはフルエンコード 446// } 447// else if( useHrefEncode[intKey] ) { // 6.0.2.0 (2014/09/19) useHrefEncode属性追加 448// val = StringUtil.urlEncode2( val ); // ファイル名などは、部分エンコード 449// } 450// } 451// else { // encode範囲外 452// // なにもしない。 453// if( clm == clmNo[j] ) { val = value;} // 一致する場合の valueは、通常レンデラー 454// } 455 456 strLink.append( val ); 457 } 458// strLink.append( format[j] ); 459 strLink.append( format[clmNo.length] ); // 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable 対応 460 461 // 3.8.5.0 (2006/03/27) "{I}" と そのエンコード文字 "%7BI%7D" に、行番号(row)を割り当てます。 462 String rtn = strLink.toString(); 463 final String sRow = String.valueOf( row ); 464 rtn = StringUtil.replace( rtn,"{I}",sRow ); 465 rtn = StringUtil.replace( rtn,"%7BI%7D",sRow ); 466 467 // 4.3.7.1 (2009/06/08) 468 if( useURLCheck[intKey] ) { 469 // 4.3.7.4 (2009/07/01) 470 rtn = XHTMLTag.embedURLCheckKey( rtn, HybsSystem.URL_CHECK_KEY, urlCheckUser[intKey], urlCheckTime[intKey], urlCheckCrypt[intKey] ); // 5.8.8.0 (2015/06/05) 471 } 472 473// // 5.8.2.1 (2014/12/13) トークンプラグイン対応 474// // 6.9.5.0 (2018/04/23) extToken 廃止 475// if( extToken[intKey] != null && extToken[intKey].length() > 0 ){ 476// final String[] tokens = StringUtil.csv2Array( extToken[intKey] ); 477// for( final String tk :tokens ){ 478// final CreateToken ct = HybsSystem.newInstance( "CreateToken_" , tk ); 479// rtn = ct.embedToken( rtn, urlCheckTime[intKey], null ); 480// } 481// } 482 483 // 5.2.3.0 (2010/12/01) URLのハッシュ化/暗号化 484 if( ACCS_LVL == 2 ) { 485 // ACCS_LVL == 2 の場合は、外部のみ処理するので、extOnly=true をセットする。 486 rtn = URLHashMap.makeUrlChange( rtn,REQ_KEY,true ); 487 } 488 else if( ACCS_LVL == 3 ) { 489 rtn = URLHashMap.makeUrlChange( rtn,REQ_KEY,false ); 490 } 491 492 return rtn ; 493 } 494 495 /** 496 * マーカーを作成する/作成しないの指定カラム番号を求めます。 497 * 498 * setDBTableModel から呼ばれますが、MARKER と、LINK で少しの差異 499 * あるため、それを吸収するためのメソッドです。 500 * 501 * @og.rev 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD 新規追加 502 * 503 * @param intKey カラムキーの番号 504 * @param attri アトリビュート 505 */ 506 @Override // ViewMarker_MARKER 507 protected void makeOnFormat( final int intKey,final Attributes attri ) { 508 final String onMark = attri.get( "p_onLink" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 509 makeOnFormat( intKey, attri, onMark ); 510 } 511 512// /** 513// * リンクを張る/張らないの指定カラム番号を求めます。 514// * また、int[列番号] isMark ⇒ fgMark を初期化します。 515// * 516// * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属性を追加 517// * @og.rev 8.5.3.0 (2023/09/08) DynamicAttributes対応 518// * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 対応 isMark ⇒ fgMark 519// * @og.rev 8.5.6.1 (2024/03/29) makeOnLinkFormat → makeOnFormat に変更 520// * @og.rev 8.5.6.1 (2024/03/29) ViewMarker_MARKER を継承します。 521// * 522// * @param intKey カラムキーの番号 523// * @param attri アトリビュート 524// */ 525// @Override // ViewMarker_MARKER 526//// private void makeOnLinkFormat( final int intKey,final Attributes attri ) { 527// protected void makeOnFormat( final int intKey,final Attributes attri, final String onMark ) { 528// final String onMark = attri.get( "p_onLink" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 529// final String markList = attri.get( "p_markList" ); // 8.5.3.0 (2023/09/08) 先頭に"p_"付与 530// 531// // 3.5.6.0 (2004/06/18) nullポインタの参照外しバグの対応 532// // このロジックで値が設定済みであれば、以下の処理は不要である。 533//// isMark[intKey] = MARK_NULL; 534// fgMark[intKey] = MARK_NULL; // 8.5.4.2 (2024/01/12) 535// if( onMark == null || onMark.isEmpty() || 536// markList == null || markList.isEmpty() ) { 537//// isMark[intKey] = MARK_FALSE; 538// fgMark[intKey] = MARK_FALSE; // 8.5.4.2 (2024/01/12) 539// return ; // 3.5.6.0 (2004/06/18) 540// } 541// else if( onMark.charAt(0) != '[' && markList.charAt(0) != '[' ) { 542//// isMark[intKey] = markList.indexOf( onMark ) >= 0 ? MARK_TRUE : MARK_FALSE; 543// fgMark[intKey] = markList.indexOf( onMark ) >= 0 ? MARK_TRUE : MARK_FALSE; // 8.5.4.2 (2024/01/12) 544// return ; // 3.5.6.0 (2004/06/18) 545// } 546// 547// if( onMark.charAt(0) == '[' ) { 548// markCmlNo[intKey] = table.getColumnNo( onMark.substring( 1,onMark.length()-1 )); 549// } 550// else { 551// markCmlNo[intKey] = -1; 552// markKey[intKey] = onMark ; 553// } 554// 555// if( markList.charAt(0) == '[' ) { 556// markListNo[intKey] = table.getColumnNo( markList.substring( 1,markList.length()-1 )); 557// } 558// else { 559// markListNo[intKey] = -1; 560// markLists[intKey] = markList; 561// } 562// } 563 564 /** 565 * リンクを張るかどうかを判断します。 566 * int[列番号] isMark ⇒ fgMark には、 未設定 FALSE TRUE の状態を持っており、 567 * 列でリンクを張る状態が固定の場合(例えば、onLink属性がデフォルト "true" の場合) 568 * カラムに関係なく、同じ値を返すときに、使用します。 569 * @og.rev 8.5.6.1 (2024/03/29) ViewMarker_MARKER を継承します。 570 * 571 * @param row 列番号 572 * @param clm カラムキーの名称 573 * 574 * @return 処理するリスト番号、-1 の場合は、該当なし 575 */ 576 @Override // ViewMarker_MARKER 577 protected int onMarkNo( final int row,final int clm ) { // 8.5.4.2 (2024/01/12) 578 if( editClmNo >= 0 && StringUtil.nval( table.getValue( row,editClmNo ) , null ) != null ) { 579 return -1; 580 } 581 return super.onMarkNo(row,clm); 582 } 583 584// /** 585// * リンクを張るかどうかを判断します。 586// * int[列番号] isMark ⇒ fgMark には、 未設定 FALSE TRUE の状態を持っており、 587// * 列でリンクを張る状態が固定の場合(例えば、onLink属性がデフォルト "true" の場合) 588// * カラムに関係なく、同じ値を返すときに、使用します。 589// * 590// * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属性を追加 591// * @og.rev 3.5.4.0 (2003/11/25) onMark ,markList が null(またはゼロストリング)の場合は、false とする。 592// * @og.rev 4.0.0.0 (2005/08/31) 同一カラムの複数登録を許可します。 593// * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 対応 isMark ⇒ fgMark 594// * @og.rev 8.5.6.1 (2024/03/29) onLinkNo → onMarkNo に変更 595// * @og.rev 8.5.6.1 (2024/03/29) ViewMarker_MARKER を継承します。 596// * 597// * @param row 列番号 598// * @param clm カラムキーの名称 599// * 600// * @return 処理するリスト番号、-1 の場合は、該当なし 601// */ 602// @Override // ViewMarker_MARKER 603//// private int isOnLink( final int row,final int clm ) { 604//// private int onLinkNo( final int row,final int clm ) { // 8.5.4.2 (2024/01/12) 605// private int onMarkNo( final int row,final int clm ) { // 8.5.4.2 (2024/01/12) 606// if( editClmNo >= 0 && StringUtil.nval( table.getValue( row,editClmNo ) , null ) != null ) { 607// return -1; 608// } 609// 610// final List<Integer> list = clmMap.get( clm ); 611// if( list == null ) { return -1; } 612// 613// // 8.5.4.2 (2024/01/12) PMD 7.0.0 ForLoopCanBeForeach 614//// for( int i=0; i<list.size(); i++ ) { 615//// final int intKey = list.get( i ); 616// for( final int intKey : list ) { 617//// if( isMark[intKey] != MARK_NULL ) { 618//// if( isMark[intKey] == MARK_TRUE ) { return intKey; } 619// if( fgMark[intKey] != MARK_NULL ) { // 8.5.4.2 (2024/01/12) 620// if( fgMark[intKey] == MARK_TRUE ) { return intKey; } // 8.5.4.2 (2024/01/12) 621// else { continue; } 622// } 623// 624// final String onMark ; 625// if( markCmlNo[intKey] < 0 ) { onMark = markKey[intKey] ; } 626// else { onMark = table.getValue( row,markCmlNo[intKey] ); } 627// 628// // 3.5.4.0 (2003/11/25) 追加 629// if( onMark == null || onMark.isEmpty() ) { continue; } 630// 631// final String markList ; 632// if( markListNo[intKey] < 0 ) { markList = markLists[intKey] ; } 633// else { markList = table.getValue( row,markListNo[intKey] ); } 634// 635// // 3.5.4.0 (2003/11/25) 修正 636// if( markList == null || markList.isEmpty() ) { continue; } 637// 638// if( markList.indexOf( onMark ) >= 0 ) { return intKey; } 639// } 640// return -1; 641// } 642 643 /** 644 * マーカーされたカラム番号の配列を返します。 645 * 646 * これは特殊処理で、Edit機能で、カラム列をキャッシュしているときに、 647 * JSPのソース等の変更時に、変更が反映されない対応を行う場合、 648 * 通常の ViewFormのサブクラスから、Edit専用の ViewForm_HTMLSeqClmTable で 649 * 制御する場合、ViewMarkerのEditMarkerでは、通常非表示(検索の場合)ですが 650 * Editのポップアップ画面に、表示されてしまうのを避けるため、noDisplay に 651 * 強制的にするカラム番号が必要です。 652 * あくまで、暫定処置です。Edit機能を改修するときに、この機能は削除します。 653 * 654 * ※ この処理は、EditMarkerでのみ有効にします。 655 * 656 * @og.rev 6.0.3.0 (2014/11/13) Edit機能で、JSPソース変更時の対応 657 * @og.rev 8.5.6.1 (2024/03/29) ViewMarker_MARKER を継承します。 658 * 659 * @return マーカーされたカラム番号の配列(常に、長さ0の配列を返す) 660 */ 661 @Override // ViewMarker 662 public int[] getColumnNos() { 663 return new int[0]; 664 } 665}