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}