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.resource; 017 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.fukurou.db.ApplicationInfo; 020import org.opengion.fukurou.db.DBUtil; 021// import org.opengion.fukurou.util.StringUtil; // 7.2.6.0 (2020/06/30) 022 023import java.util.Map; 024import java.util.HashMap; 025import java.util.LinkedHashMap ; 026import java.util.WeakHashMap ; 027import java.util.Collections ; 028 029/** 030 * コードオブジェクトを作成するデータロードクラスです。 031 * systemId と lang に対応したコードオブジェクトを作成します。 032 * 033 * コードオブジェクトは、項目(CLM)に対して、複数のコード(CODE)を持っています。 034 * この複数のコードを表示順に持つことで、プルダウンメニュー等の表示順を指定します。 035 * 036 * コードオブジェクトを作成する場合は、同一項目・コードで、作成区分(KBSAKU)違いの場合は、 037 * 最も大きな作成区分を持つコードを使用します。 038 * 作成区分(KBSAKU)は、他のリソースと異なり、同一項目・コード単位に設定すべきです。 039 * これは、通常は項目単位に作成区分を持つべきところを、コード単位でしか 040 * 持てないデータベースの設計になっている為です。アプリケーション側で設定条件を 041 * きちんと管理すれば、作成区分を使用できますが、一般にはお奨めできません。 042 * 作成区分(KBSAKU)='0' のデータは、マスタリソースとして、エンジンとともに 043 * 配布されるリソースになります。 044 * 045 * 読み込みフラグ(FGLOAD)は、使用しません。 046 * コードリソースに関しては、システム起動時に、すべてのコードリソースをエンジン内部 047 * に取り込みます。ただし、リソースのキャッシュに、WeakHashMap クラスを使用しているため、 048 * メモリオーバー時には、クリアされるため、単独での読み取りも行います。 049 * SYSTEM_ID='**' は、共通リソースです。 050 * これは、システム間で共通に使用されるリソース情報を登録しておきます。 051 * 052 * @og.rev 4.0.0.0 (2004/12/31) 新規作成 053 * @og.group リソース管理 054 * 055 * @version 4.0 056 * @author Kazuhiko Hasegawa 057 * @since JDK5.0, 058 */ 059final class CodeDataLoader { 060 // リソースの接続先を、取得します。 061 private final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); 062 063 /** DBリソースの初期一括読み込みのクエリー */ 064// // キーブレイクで、SYSTEM_ID 違いは、まとめて処理する為、最初に ORDER BY しておく必要があります。 065// // 5.1.9.0 (2010/08/01) order by 変更 066// // 6.2.0.0 (2015/02/27) Description 追加に伴うQUERY桁数変更 067// public static final String QUERY = "select CLM,CODE,'','',CODELVL,CODEGRP,CODE_PARAM,ROLES,SYSTEM_ID,KBSAKU,'','',''" // 6.2.0.0 (2015/02/27) 068// + " from GEA04 where SYSTEM_ID in ( ?,'**') and FGJ='1'" 069// + " order by SYSTEM_ID,KBSAKU,CLM,SEQNO,CODELVL,CODE" ; 070 071// // 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応 072// public static final String QUERY = "select CLM,CODE,'' as LNAME,'' as SNAME,CODELVL,CODEGRP" 073// + " ,CODE_PARAM,ROLES,SYSTEM_ID,KBSAKU" 074// + " ,'' as RSNAME,'' as RLNAME,'' as DESCRIPT" // 6.2.0.0 (2015/02/27) 075// + " ,1 as SNO,SEQNO" 076// + " from GEA04 where SYSTEM_ID in ( ?,'**') and FGJ='1'" // RESOURCE_BASE_SYSTEM_ID 077// + " union all" 078// + " select CLM,CODE,'' as LNAME,'' as SNAME,CODELVL,CODEGRP" 079// + " ,CODE_PARAM,ROLES,SYSTEM_ID,KBSAKU" 080// + " ,'' as RSNAME,'' as RLNAME,'' as DESCRIPT" // 6.2.0.0 (2015/02/27) 081// + " ,2 as SNO,SEQNO" 082// + " from GEA04 where SYSTEM_ID = ? and FGJ='1'" // 従来のSYSTEM_ID 083// + " order by SNO,SYSTEM_ID,KBSAKU,CLM,SEQNO,CODELVL,CODE" ; 084 085// // 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応 086// public static final String QUERY = "select CLM,CODE,'' as LNAME,'' as SNAME,CODELVL,CODEGRP" 087// + " ,CODE_PARAM,ROLES,SYSTEM_ID,KBSAKU" 088// + " ,'' as RSNAME,'' as RLNAME,'' as DESCRIPT" // 6.2.0.0 (2015/02/27) 089// + " ,SNO,SEQNO" 090// + " from (" 091// + " select 0 as SNO,B.* from GEA04 B where SYSTEM_ID='**' and FGJ='1'" // エンジン共通 092// + " union all" 093// + " select 1 as SNO,B.* from GEA04 B where SYSTEM_ID=? and FGJ='1'" // RESOURCE_BASE_SYSTEM_ID 094// + " union all" 095// + " select 2 as SNO,B.* from GEA04 B where SYSTEM_ID=? and FGJ='1'" // 最上位ののSYSTEM_ID 096// + " ) A" 097// + " order by SNO,SYSTEM_ID,KBSAKU,CLM,SEQNO,CODELVL,CODE" ; 098 099// // 7.2.8.0 (2020/09/04) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応。SQL文手直し 100// public static final String QUERY = "select A.CLM,A.CODE,'' as LNAME,'' as SNAME,A.CODELVL,A.CODEGRP" 101// + " ,A.CODE_PARAM,A.ROLES,A.SYSTEM_ID,A.KBSAKU" 102// + " ,'' as RSNAME,'' as RLNAME,'' as DESCRIPT" // 6.2.0.0 (2015/02/27) 103// + " ,A.SNO,A.SEQNO" 104// + " from (" 105// + " select 0 as SNO,B.* from GEA04 B where B.SYSTEM_ID='**'" // エンジン共通 106// + " union all" 107// + " select 1 as SNO,B.* from GEA04 B where B.SYSTEM_ID=?" // RESOURCE_BASE_SYSTEM_ID 108// + " union all" 109// + " select 2 as SNO,B.* from GEA04 B where B.SYSTEM_ID=?" // 最上位ののSYSTEM_ID 110// + " ) A" 111// + " where A.FGJ='1'" 112// + " order by A.SNO,A.KBSAKU,A.CLM,A.SEQNO,A.CODELVL,A.CODE" ; 113 114 // 7.3.1.3 (2021/03/09) 115 private static final String SEL_CLM = "select CLM,CODE,'' as LNAME,'' as SNAME,CODELVL,CODEGRP" 116 + ",CODE_PARAM,ROLES,SYSTEM_ID,KBSAKU" 117 + ",'' as RSNAME,'' as RLNAME,'' as DESCRIPT" 118 + ",SEQNO" ; 119 120 // 7.3.1.3 (2021/03/09) 121 private static final String QUERY = SEL_CLM + ",0 as SNO" 122 + " from GEA04 where SYSTEM_ID='**' and FGJ='1'" // エンジン共通 123 + " union all " 124 + SEL_CLM + ",1 as SNO" 125 + " from GEA04 where SYSTEM_ID=? and FGJ='1'" // RESOURCE_BASE_SYSTEM_ID 126 + " union all " 127 + SEL_CLM + ",2 as SNO" 128 + " from GEA04 where SYSTEM_ID=? and FGJ='1'" // 最上位ののSYSTEM_ID 129 + " order by SNO,KBSAKU,CLM,SEQNO,CODELVL,CODE" ; 130 131 /** DBリソースの個別読み込み時のクエリー */ 132// // 5.1.9.0 (2010/08/01) order by 変更 133// // 6.2.0.0 (2015/02/27) Description 追加に伴うQUERY桁数変更 134// public static final String QUERY2 = "select CLM,CODE,'','',CODELVL,CODEGRP,CODE_PARAM,ROLES,SYSTEM_ID,KBSAKU,'','',''" // 6.2.0.0 (2015/02/27) 135// + " from GEA04 where SYSTEM_ID in ( ?,'**') and FGJ='1' and CLM=?" 136// + " order by SYSTEM_ID,KBSAKU,CLM,SEQNO,CODELVL,CODE" ; 137 138// // 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応 139// public static final String QUERY2 = "select CLM,CODE,'' as LNAME,'' as SNAME,CODELVL,CODEGRP" 140// + " ,CODE_PARAM,ROLES,SYSTEM_ID,KBSAKU" 141// + " ,'' as RSNAME,'' as RLNAME,'' as DESCRIPT" // 6.2.0.0 (2015/02/27) 142// + " ,1 as SNO,SEQNO" 143// + " from GEA04 where SYSTEM_ID in ( ?,'**') and FGJ='1' and CLM=?" // RESOURCE_BASE_SYSTEM_ID 144// + " union all" 145// + " select CLM,CODE,'' as LNAME,'' as SNAME,CODELVL,CODEGRP" 146// + " ,CODE_PARAM,ROLES,SYSTEM_ID,KBSAKU" 147// + " ,'' as RSNAME,'' as RLNAME,'' as DESCRIPT" // 6.2.0.0 (2015/02/27) 148// + " ,2 as SNO,SEQNO" 149// + " from GEA04 where SYSTEM_ID = ? and FGJ='1' and CLM=?" // 従来のSYSTEM_ID 150// + " order by SNO,SYSTEM_ID,KBSAKU,CLM,SEQNO,CODELVL,CODE" ; 151 152// // 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応 153// public static final String QUERY2 = "select CLM,CODE,'' as LNAME,'' as SNAME,CODELVL,CODEGRP" 154// + " ,CODE_PARAM,ROLES,SYSTEM_ID,KBSAKU" 155// + " ,'' as RSNAME,'' as RLNAME,'' as DESCRIPT" // 6.2.0.0 (2015/02/27) 156// + " ,SNO,SEQNO" 157// + " from (" 158// + " select 0 as SNO,B.* from GEA04 B where SYSTEM_ID='**' and CLM=? and FGJ='1'" // エンジン共通 159// + " union all" 160// + " select 1 as SNO,B.* from GEA04 B where SYSTEM_ID=? and CLM=? and FGJ='1'" // RESOURCE_BASE_SYSTEM_ID 161// + " union all" 162// + " select 2 as SNO,B.* from GEA04 B where SYSTEM_ID=? and CLM=? and FGJ='1'" // 最上位ののSYSTEM_ID 163// + " ) A" 164// + " order by SNO,SYSTEM_ID,KBSAKU,CLM,SEQNO,CODELVL,CODE" ; 165 166// // 7.2.8.0 (2020/09/04) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応。SQL文手直し 167// public static final String QUERY2 = "select A.CLM,A.CODE,'' as LNAME,'' as SNAME,A.CODELVL,A.CODEGRP" 168// + " ,A.CODE_PARAM,A.ROLES,A.SYSTEM_ID,A.KBSAKU" 169// + " ,'' as RSNAME,'' as RLNAME,'' as DESCRIPT" // 6.2.0.0 (2015/02/27) 170// + " ,A.SNO,A.SEQNO" 171// + " from (" 172// + " select 0 as SNO,B.* from GEA04 B where B.SYSTEM_ID='**'" // エンジン共通 173// + " union all" 174// + " select 1 as SNO,B.* from GEA04 B where B.SYSTEM_ID=?" // RESOURCE_BASE_SYSTEM_ID 175// + " union all" 176// + " select 2 as SNO,B.* from GEA04 B where B.SYSTEM_ID=?" // 最上位ののSYSTEM_ID 177// + " ) A" 178// + " where A.CLM=? and A.FGJ='1'" 179// + " order by A.SNO,A.KBSAKU,A.CLM,A.SEQNO,A.CODELVL,A.CODE" ; 180 181 // 注意:CLMを unionする前に条件として入れたのでパラメータの順番が変わる。 182 // 7.3.1.3 (2021/03/09) 183 private static final String QUERY2 = SEL_CLM + ",0 as SNO" 184 + " from GEA04 where SYSTEM_ID='**' and CLM=? and FGJ='1'" // エンジン共通 185 + " union all " 186 + SEL_CLM + ",1 as SNO" 187 + " from GEA04 where SYSTEM_ID=? and CLM=? and FGJ='1'" // RESOURCE_BASE_SYSTEM_ID 188 + " union all " 189 + SEL_CLM + ",2 as SNO" 190 + " from GEA04 where SYSTEM_ID=? and CLM=? and FGJ='1'" // 最上位ののSYSTEM_ID 191 + " order by SNO,KBSAKU,CLM,SEQNO,CODELVL,CODE" ; 192 193 /** 6.4.3.1 (2016/02/12) Collections.synchronizedMap で同期処理を行います。 */ 194 private final Map<String,CodeData> codeDtMap = Collections.synchronizedMap( new WeakHashMap<>() ); // キャッシュ用プール 195 private final String SYSTEM_ID ; // システムID 196// private String BASE_SYS_ID = "**" ; // 7.2.6.0 (2020/06/30) ベースシステムID 197// private final String BASE_SYS_ID = StringUtil.nval( HybsSystem.sys( "RESOURCE_BASE_SYSTEM_ID", false ),"**" ) ; // 7.2.9.1 (2020/10/23) ベースシステムID 198 private final String BASE_SYS_ID ; // 7.2.9.2 (2020/10/30) ベースシステムID 199 200 /** コネクションにアプリケーション情報を追記するかどうか指定 */ 201 public static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 202 203 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 204 private final ApplicationInfo appInfo; 205 206 private final LabelDataLoader LABEL_LOADER; // 見直し要!!! 207 208 /** 209 * lang 毎に ファクトリオブジェクトを作成します。 210 * 211 * @og.rev 7.2.9.2 (2020/10/30) ベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)の取得 212 * 213 * @param systemId システムID 214 * @param baseSys ベースとなるSYSTEM_ID 215 * @param initLoad リソースデータの先読み可否(true:先読みする) 216 * @param lLoader ラベルデータローダー 217 */ 218// CodeDataLoader( final String systemId,final boolean initLoad,final LabelDataLoader lLoader) { 219 CodeDataLoader( final String systemId,final String baseSys,final boolean initLoad,final LabelDataLoader lLoader) { 220 SYSTEM_ID = systemId; 221 BASE_SYS_ID = baseSys ; // 7.2.9.2 (2020/10/30) 222 LABEL_LOADER= lLoader; 223 224 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 225 if( USE_DB_APPLICATION_INFO ) { 226 appInfo = new ApplicationInfo(); 227 // ユーザーID,IPアドレス,ホスト名 228 appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME ); 229 // 画面ID,操作,プログラムID 230 appInfo.setModuleInfo( "CodeDataLoader",null,null ); 231 } 232 else { 233 appInfo = null; 234 } 235 236 // ApplicationInfo の設定が終わってから実行します。 237 if( initLoad ) { loadDBResource(); } 238 } 239 240 /** 241 * DBリソースより コードデータを取得、設定します。 242 * 243 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 244 * @og.rev 4.3.8.0 (2009/08/01) rawShortLabel追加 245 * @og.rev 5.6.8.2 (2013/09/20) rawLongLabel対応 246 * @og.rev 6.2.0.0 (2015/02/27) description 概要説明 追加 247 * @og.rev 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応 248 */ 249 private void loadDBResource() { 250// // 7.2.6.0 (2020/06/30) 251// final String baseSystemId = HybsSystem.sys( "RESOURCE_BASE_SYSTEM_ID", false ); 252// BASE_SYS_ID = StringUtil.isEmpty( baseSystemId ) ? "**" : baseSystemId; 253 254// final String[] args = new String[] { SYSTEM_ID }; 255 final String[] args = new String[] { BASE_SYS_ID,SYSTEM_ID }; // 7.2.6.0 (2020/06/30) 256 257 String[][] vals = DBUtil.dbExecute( QUERY,args,appInfo,DBID ); 258 259 final Map<String,Map<String,String[]>> clmMap = new HashMap<>(); 260 final int len = vals.length; 261 String bkClm = null; // キーブレイク 262 String bkSystem = null; 263 String bkKbsaku = null; 264 // 以下の処理は、SYSTEM_ID違いを塊で処理します。(混在させません。) 265 Map<String,String[]> codeMap = null; 266 for( int i=0; i<len; i++ ) { 267 final String clm = vals[i][CodeData.CLM]; 268 final String code = vals[i][CodeData.CODE]; 269 final String systemId = vals[i][CodeData.SYSTEM_ID]; 270 final String kbsaku = vals[i][CodeData.KBSAKU]; 271 if( bkClm == null || !bkClm.equals( clm ) || !bkSystem.equals( systemId ) || !bkKbsaku.equals( kbsaku ) ) { 272 codeMap = new LinkedHashMap<>(); 273 clmMap.put( clm,codeMap ); 274 bkClm = clm; 275 bkSystem = systemId; 276 bkKbsaku = kbsaku; 277 } 278 279 final String lkey = clm+"."+code; // やっつけ~ 280 // 6.2.0.0 (2015/02/27) 変数使用 281 final LabelData lblData = LABEL_LOADER.getLabelData(lkey); 282 vals[i][CodeData.LNAME] = lblData.getLongLabel(); 283 vals[i][CodeData.SNAME] = lblData.getShortLabel(); 284 vals[i][CodeData.RSNAME] = lblData.getRawShortLabel(); // 4.3.8.0 (2009/08/01) spanが付かない名前短 285 vals[i][CodeData.RLNAME] = lblData.getRawLongLabel(); // 5.6.8.2 (2013/09/01) 加工していない名前長 286 vals[i][CodeData.DESCRIPT] = lblData.getDescription(); // 6.2.0.0 (2015/02/27) 概要説明 287 288 codeMap.put( code,vals[i] ); 289 } 290 291 final String[] clmKeys = clmMap.keySet().toArray( new String[clmMap.size()] ); 292 final int size = clmKeys.length; 293 for( int i=0; i<size; i++ ) { 294 final String clm = clmKeys[i]; 295 codeMap = clmMap.get( clm ); 296 297 codeDtMap.put( clm,new CodeData( clm,codeMap ) ); 298 } 299 300 System.out.println( " CodeDataLoader [" + size + "] loaded" ); 301 } 302 303 /** 304 * CodeData オブジェクトを取得します。 305 * 作成したCodeDataオブジェクトは,内部にプールしておき,同じリソース要求が 306 * あったときは,プールの CodeDataを返します。 307 * 308 * @og.rev 4.3.8.0 (2009/08/01) rawShortLabel追加 309 * @og.rev 5.6.8.2 (2013/09/20) rawLongLabel追加 310 * @og.rev 6.2.0.0 (2015/02/27) description 概要説明 追加 311 * @og.rev 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応 312 * @og.rev 7.3.1.3 (2021/03/09) QUERY文字列を変更。それに伴って、引数の並び順を変更。 313 * 314 * @param key コードのキー 315 * 316 * @return CodeDataオブジェクト 317 */ 318 public CodeData getCodeData( final String key ) { 319 CodeData codeData = codeDtMap.get( key ) ; 320 321 if( codeData == null ) { 322// final String[] args = new String[] { SYSTEM_ID,key }; 323// final String[] args = new String[] { key,BASE_SYS_ID,key,SYSTEM_ID,key }; // 7.2.6.0 (2020/06/30) 324// final String[] args = new String[] { BASE_SYS_ID,SYSTEM_ID,key }; // 7.2.8.0 (2020/09/04) 325 final String[] args = new String[] { key,BASE_SYS_ID,key,SYSTEM_ID,key }; // 7.3.1.3 (2021/03/09) 326 String[][] vals = DBUtil.dbExecute( QUERY2,args,appInfo,DBID ); 327 328 final int len = vals.length; 329 String bkSystem = null; // キーブレイク 330 String bkKbsaku = null; 331 // 以下の処理は、SYSTEM_ID違いを塊で処理します。(混在させません。) 332 Map<String,String[]> codeMap = null; 333 for( int i=0; i<len; i++ ) { 334 final String systemId = vals[i][CodeData.SYSTEM_ID]; 335 final String code = vals[i][CodeData.CODE]; 336 final String kbsaku = vals[i][CodeData.KBSAKU]; 337 if( bkSystem == null || !bkSystem.equals( systemId ) || !bkKbsaku.equals( kbsaku ) ) { 338 codeMap = new LinkedHashMap<>(); 339 bkSystem = systemId; 340 bkKbsaku = kbsaku; 341 } 342 343 final String lkey = key+"."+code; // やっつけ~ 344 // 6.2.0.0 (2015/02/27) 変数使用 345 final LabelData lblData = LABEL_LOADER.getLabelData(lkey); 346 vals[i][CodeData.LNAME] = lblData.getLongLabel(); 347 vals[i][CodeData.SNAME] = lblData.getShortLabel(); 348 vals[i][CodeData.RSNAME] = lblData.getRawShortLabel(); // 4.3.8.0 (2009/08/01) spanが付かない名前短 349 vals[i][CodeData.RLNAME] = lblData.getRawLongLabel(); // 5.6.8.2 (2013/09/01) 加工していない名前長 350 vals[i][CodeData.DESCRIPT] = lblData.getDescription(); // 6.2.0.0 (2015/02/27) 概要説明 351 352 codeMap.put( code,vals[i] ); 353 } 354 355 if( codeMap != null ) { 356 codeData = new CodeData( key,codeMap ); 357 codeDtMap.put( key,codeData ); 358 } 359 } 360 return codeData ; 361 } 362 363 /** 364 * CodeData オブジェクトを取得します。 365 * 作成したCodeDataオブジェクトは,内部にプールしておき,同じリソース要求が 366 * あったときは,プールの CodeDataを返します。 367 * 368 * 引数にQUERYを渡すことで、DBから、動的にコードリソースを作成できます。 369 * 引数の順番は、CodeData で定義している CLM,CODE,LNAME,SNAME の順番のままです。 370 * QUERY には、key を引数にとる必要があります。つまり、WHERE CLM = ? の様な記述が必要です。 371 * 372 * @og.rev 5.4.2.2 (2011/12/14) 新規追加。 373 * 374 * @param key コードのキー 375 * @param query 検索SQL(引数に、? を一つ持つ) 376 * 377 * @return CodeDataオブジェクト 378 */ 379 public CodeData getCodeData( final String key,final String query ) { 380 CodeData codeData = codeDtMap.get( key ) ; 381 382 if( codeData == null ) { 383 final String[] args = new String[] { key }; 384 final String[][] vals = DBUtil.dbExecute( query,args,appInfo,DBID ); 385 386 final int len = vals.length; 387 final Map<String,String[]> codeMap = new LinkedHashMap<>(); 388 for( int i=0; i<len; i++ ) { 389// String[] cdVals = new String[CodeData.MAX_LENGTH]; // 空の配列を毎回作成 390 String[] cdVals = new String[CodeData.DATA_SIZE]; // 7.2.6.0 (2020/06/30) キーワード変更 空の配列を毎回作成 391 392 final String code = vals[i][CodeData.CODE]; 393 394 cdVals[CodeData.CLM] = key ; 395 cdVals[CodeData.CODE] = code; 396 cdVals[CodeData.LNAME] = vals[i][CodeData.LNAME]; 397 cdVals[CodeData.SNAME] = vals[i][CodeData.SNAME]; 398 399 codeMap.put( code,cdVals ); 400 } 401 402 if( ! codeMap.isEmpty() ) { 403 codeData = new CodeData( key,codeMap ); 404 codeDtMap.put( key,codeData ); 405 } 406 } 407 return codeData ; 408 } 409 410 /** 411 * CodeData オブジェクトのキャッシュを個別にクリアします。 412 * リソースデータの更新など、一部分の更新時に、すべてのキャッシュを 413 * 破棄するのではなく、指定の分のみ破棄できる機能です。 414 * 415 * @og.rev 4.0.2.0 (2007/12/25) コードリソースクリア時に対応するラベルリソースもクリアする。 416 * 417 * @param key コードのキー 418 */ 419 public void clear( final String key ) { 420 421 // 4.0.2.0 (2007/12/25) 422 final CodeData cdata = codeDtMap.remove( key ); 423 if( cdata != null ) { 424 final String clm = cdata.getColumn(); 425 for( int i=0; i<cdata.getSize(); i++ ) { 426 LABEL_LOADER.clear( clm + '.' + cdata.getCodeKey( i ) ); 427 } 428 } 429 } 430 431 /** 432 * CodeData オブジェクトのキャッシュをクリアして、再作成します。 433 * 434 */ 435 public void clear() { 436 codeDtMap.clear(); 437 } 438}