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.hayabusa.db.DBColumnConfig;              // 7.0.7.0 (2019/12/13)
022// import org.opengion.fukurou.util.StringUtil;                 // 7.2.6.0 (2020/06/30)
023
024import java.util.Map;
025import java.util.WeakHashMap;
026import java.util.Collections ;
027
028/**
029 * systemId に対応したカラムデータを作成するデータロードクラスです。
030 *
031 * カラムデータは、項目(CLM)に対して、各種カラム情報を持っています。
032 * エンジン内部で使用している DBColumn オブジェクトは、RENDERER や EDITOR など
033 * 実際にはオブジェクトで管理していますが、この ColumnData では、それらのキーとなる
034 * 文字列を持っています。実際に DBColumn オブジェクトの構築時に、各属性オブジェクトを
035 * 生成(または、キャッシュから取り出し)ます。
036 *
037 * カラムデータを作成する場合は、同一カラムで、作成区分(KBSAKU)違いの場合は、
038 * 最も大きな作成区分を持つコードを使用します。
039 * 作成区分(KBSAKU)='0' のデータは、マスタリソースとして、エンジンとともに
040 * 配布されるリソースになります。
041 *
042 * カラムデータには、3つのレベルのオブジェクト作成方法が適用されます。
043 * エンジン内部のカラムリソースファイル(org.opengion.hayabusa.common.data.ColumnResource)は、
044 * 初期作成されるカラムリソースです。エンジンの更新に対応して、このリソースも同時に
045 * 更新されます。このカラムは、最も優先順位の低いリソースで、同一キー情報で他の形式の
046 * カラムがあれば、そちらが使用されます。
047 *
048 * 読込フラグ(FGLOAD)='1'のカラムリソースは、すべて初期起動時に一括読み込みされます。
049 * 読込フラグが、'1' 以外のデータは、初期起動時には、メモリにキャッシュされず
050 * 実際に使用されるまで、オブジェクトが作成されません。
051 * これは、使用されるかどうか判らないカラムデータを、予め作成しないことで、メモリの
052 * 節約を図っています。
053 *
054 * SYSTEM_ID='**' は、共通リソースです。
055 * これは、システム間で共通に使用されるリソース情報を登録しておきます。
056 *
057 * @og.rev 4.0.0.0 (2004/12/31) 新規作成
058 * @og.group リソース管理
059 *
060 * @version  4.0
061 * @author   Kazuhiko Hasegawa
062 * @since    JDK5.0,
063 */
064final class ColumnDataLoader {
065        // リソースの接続先を、取得します。
066        private final String DBID = HybsSystem.sys( "RESOURCE_DBID" );
067
068        // DBリソースの初期一括読込のクエリー
069// private static final String QUERY = "select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
070//                                                                      + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
071//                                                                      + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES"
072//                                                                      + " from GEA03 where SYSTEM_ID in ( ?,'**')"
073//                                                                      + " and FGJ='1' and FGLOAD = '1'"
074//                                                                      + " order by SYSTEM_ID,CLM,KBSAKU" ;
075
076//      // 4.3.5.7 (2009/03/22) FGLOADの影響で個別システムのリソースが読まれない問題の対応
077//      // 6.2.0.0 (2015/02/27) フィールドサイズ(FIELD_SIZE) 追加
078//      private static final String QUERY = "select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
079//                                                                      + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
080//                                                                      + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES,'' AS FIELD_SIZE"                     // 6.4.9.5 (2016/09/09) javaDB対応
081//                                                                      + ",FGLOAD"
082//                                                                      + " from GEA03 where SYSTEM_ID in ( ?,'**')"
083//                                                                      + " and FGJ='1'"
084//                                                                      + " order by SYSTEM_ID,CLM,KBSAKU" ;
085
086//      // 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応
087//      private static final String QUERY = "select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
088//                                                                      + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
089//                                                                      + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES"
090//                                                                      + ",'' AS FIELD_SIZE,FGLOAD,UNIQ,SYSTEM_ID"
091//                                                                      + ",1 as SNO,KBSAKU"
092//                                                                      + " from GEA03 where SYSTEM_ID in ( ?,'**') and FGJ='1'"                // RESOURCE_BASE_SYSTEM_ID
093//                                                                      + " union all"
094//                                                                      + " select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
095//                                                                      + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
096//                                                                      + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES"
097//                                                                      + ",'' AS FIELD_SIZE,FGLOAD,UNIQ,SYSTEM_ID"
098//                                                                      + ",2 as SNO,KBSAKU"
099//                                                                      + " from GEA03 where SYSTEM_ID = ? and FGJ='1'"                                 // 従来のSYSTEM_ID
100//                                                                      + " order by SNO,SYSTEM_ID,CLM,KBSAKU" ;
101
102//      // 7.2.6.1 (2020/07/17) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応
103//      private static final String QUERY = "select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
104//                                                                      + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
105//                                                                      + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES"
106//                                                                      + ",'' AS FIELD_SIZE,FGLOAD,UNIQ,SYSTEM_ID"
107//                                                                      + ",SNO,KBSAKU"
108//                                                                      + " from ("
109//                                                                      + "  select 0 as SNO,B.* from GEA03 B where SYSTEM_ID='**' and FGJ='1'" // エンジン共通
110//                                                                      + "  union all"
111//                                                                      + "  select 1 as SNO,B.* from GEA03 B where SYSTEM_ID=? and FGJ='1'"    // RESOURCE_BASE_SYSTEM_ID
112//                                                                      + "  union all"
113//                                                                      + "  select 2 as SNO,B.* from GEA03 B where SYSTEM_ID=? and FGJ='1'"    // 最上位ののSYSTEM_ID
114//                                                                      + " ) A"
115//                                                                      + " order by SNO,SYSTEM_ID,KBSAKU,CLM" ;
116
117//      // 7.2.8.0 (2020/09/04)  "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応。SQL文手直し
118//      private static final String QUERY = "select A.CLM,A.CLS_NAME,A.USE_LENGTH,A.VIEW_LENGTH"
119//                                                                              + ",A.RENDERER,A.EDITOR,A.DBTYPE,A.DATA_DEFAULT,A.LABEL_CLM,A.CODE_CLM"
120//                                                                              + ",A.CLM_PARAM,A.RENDERER_PARAM,A.EDITOR_PARAM,A.TYPE_PARAM,A.ROLES"
121//                                                                              + ",'' AS FIELD_SIZE,A.FGLOAD,A.UNIQ,A.SYSTEM_ID"
122//                                                                              + ",A.SNO,A.KBSAKU"
123//                                                                              + " from ("
124//                                                                              + "  select 0 as SNO,B.* from GEA03 B where B.SYSTEM_ID='**'"   // エンジン共通
125//                                                                              + "  union all"
126//                                                                              + "  select 1 as SNO,B.* from GEA03 B where B.SYSTEM_ID=?"              // RESOURCE_BASE_SYSTEM_ID
127//                                                                              + "  union all"
128//                                                                              + "  select 2 as SNO,B.* from GEA03 B where B.SYSTEM_ID=?"              // 最上位ののSYSTEM_ID
129//                                                                              + " ) A"
130//                                                                              + " where A.FGJ='1'"
131//                                                                              + " order by A.SNO,A.KBSAKU,A.CLM" ;
132
133        // 7.3.1.3 (2021/03/09)
134        private static final String SEL_CLM = "select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH"
135                                                                                + ",RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM"
136                                                                                + ",CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES"
137                                                                                + ",'' AS FIELD_SIZE,FGLOAD,UNIQ,SYSTEM_ID"
138                                                                                + ",KBSAKU" ;
139
140        // 7.3.1.3 (2021/03/09)
141        private static final String QUERY = SEL_CLM + ",0 as SNO"
142                                                                        + " from GEA03 where SYSTEM_ID='**' and FGJ='1'"                // エンジン共通
143                                                                        + " union all "
144                                                                        +  SEL_CLM + ",1 as SNO"
145                                                                        + " from GEA03 where SYSTEM_ID=? and FGJ='1'"           // RESOURCE_BASE_SYSTEM_ID
146                                                                        + " union all "
147                                                                        +  SEL_CLM + ",2 as SNO"
148                                                                        + " from GEA03 where SYSTEM_ID=? and FGJ='1'"           // 最上位ののSYSTEM_ID
149                                                                        + " order by SNO,KBSAKU,CLM" ;
150
151//      // DBリソースの個別読込時のクエリー
152//      // 6.2.0.0 (2015/02/27) フィールドサイズ(FIELD_SIZE) 追加
153//      // 6.3.1.1 (2015/07/10) FGLOAD,UNIQ 追加
154//      private static final String QUERY2 = "select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
155//                                                                      + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
156//                                                                      + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES,'' AS FIELD_SIZE"             // 6.4.9.5 (2016/09/09) javaDB対応
157//                                                                      + ",FGLOAD,UNIQ,SYSTEM_ID"                              // 6.3.1.1 (2015/07/10)
158//                                                                      + " from GEA03 where SYSTEM_ID in ( ?,'**')"
159//                                                                      + " and CLM=? and FGJ='1'"
160//                                                                      + " order by SYSTEM_ID,KBSAKU" ;
161
162//      // 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応
163//      private static final String QUERY2 = "select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
164//                                                                      + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
165//                                                                      + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES"                      // 6.4.9.5 (2016/09/09) javaDB対応
166//                                                                      + ",'' AS FIELD_SIZE,FGLOAD,UNIQ,SYSTEM_ID"                                                     // 6.3.1.1 (2015/07/10)
167//                                                                      + ",1 as SNO,KBSAKU"
168//                                                                      + " from GEA03 where SYSTEM_ID in ( ?,'**') and CLM=? and FGJ='1'"      // RESOURCE_BASE_SYSTEM_ID
169//                                                                      + " union all"
170//                                                                      + " select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
171//                                                                      + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
172//                                                                      + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES"                      // 6.4.9.5 (2016/09/09) javaDB対応
173//                                                                      + ",'' AS FIELD_SIZE,FGLOAD,UNIQ,SYSTEM_ID"                                                     // 6.3.1.1 (2015/07/10)
174//                                                                      + ",2 as SNO,KBSAKU"
175//                                                                      + " from GEA03 where SYSTEM_ID = ? and CLM=? and FGJ='1'"                       // 従来のSYSTEM_ID
176//                                                                      + " order by SNO,SYSTEM_ID,KBSAKU" ;
177
178//      // 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応
179//      private static final String QUERY2 = "select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
180//                                                                      + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
181//                                                                      + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES"                      // 6.4.9.5 (2016/09/09) javaDB対応
182//                                                                      + ",'' AS FIELD_SIZE,FGLOAD,UNIQ,SYSTEM_ID"                                                     // 6.3.1.1 (2015/07/10)
183//                                                                      + ",1 as SNO,KBSAKU"
184//                                                                      + " from ("
185//                                                                      + "  select 0 as SNO,B.* from GEA03 B where SYSTEM_ID='**' and CLM=? and FGJ='1'"       // エンジン共通
186//                                                                      + "  union all"
187//                                                                      + "  select 1 as SNO,B.* from GEA03 B where SYSTEM_ID=? and CLM=? and FGJ='1'"  // RESOURCE_BASE_SYSTEM_ID
188//                                                                      + "  union all"
189//                                                                      + "  select 2 as SNO,B.* from GEA03 B where SYSTEM_ID=? and CLM=? and FGJ='1'"  // 最上位ののSYSTEM_ID
190//                                                                      + " ) A"
191//                                                                      + " order by SNO,SYSTEM_ID,KBSAKU" ;
192
193//      // 7.2.8.0 (2020/09/04)  "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応。SQL文手直し
194//      private static final String QUERY2 = "select A.CLM,A.CLS_NAME,A.USE_LENGTH,A.VIEW_LENGTH,"
195//                                                                              + "A.RENDERER,A.EDITOR,A.DBTYPE,A.DATA_DEFAULT,A.LABEL_CLM,A.CODE_CLM"
196//                                                                              + ",A.CLM_PARAM,A.RENDERER_PARAM,A.EDITOR_PARAM,A.TYPE_PARAM,A.ROLES"           // 6.4.9.5 (2016/09/09) javaDB対応(null AS エラー)
197//                                                                              + ",'' AS FIELD_SIZE,A.FGLOAD,A.UNIQ,A.SYSTEM_ID"                                                       // 6.3.1.1 (2015/07/10)
198//                                                                              + ",A.SNO,A.KBSAKU"
199//                                                                              + " from ("
200//                                                                              + "  select 0 as SNO,B.* from GEA03 B where B.SYSTEM_ID='**'"   // エンジン共通
201//                                                                              + "  union all"
202//                                                                              + "  select 1 as SNO,B.* from GEA03 B where B.SYSTEM_ID=?"              // RESOURCE_BASE_SYSTEM_ID
203//                                                                              + "  union all"
204//                                                                              + "  select 2 as SNO,B.* from GEA03 B where B.SYSTEM_ID=?"              // 最上位ののSYSTEM_ID
205//                                                                              + " ) A"
206//                                                                              + " where A.CLM=? and A.FGJ='1'"
207//                                                                              + " order by A.SNO,A.KBSAKU" ;
208
209        // 注意:CLMを unionする前に条件として入れたのでパラメータの順番が変わる。
210        // 7.3.1.3 (2021/03/09)
211        private static final String QUERY2 = SEL_CLM + ",0 as SNO"
212                                                                        + " from GEA03 where SYSTEM_ID='**' and CLM=? and FGJ='1'"              // エンジン共通
213                                                                        + " union all "
214                                                                        +  SEL_CLM + ",1 as SNO"
215                                                                        + " from GEA03 where SYSTEM_ID=? and CLM=? and FGJ='1'"         // RESOURCE_BASE_SYSTEM_ID
216                                                                        + " union all "
217                                                                        +  SEL_CLM + ",2 as SNO"
218                                                                        + " from GEA03 where SYSTEM_ID=? and CLM=? and FGJ='1'"         // 最上位ののSYSTEM_ID
219                                                                        + " order by SNO,KBSAKU,CLM" ;
220
221        // 6.3.1.1 (2015/07/10) 読込フラグ(FGLOAD) のマーカー設定追加。
222        private static final boolean IS_FGLOAD_AUTOSET = HybsSystem.sysBool( "USE_FGLOAD_AUTOSET" );            // 6.4.1.1 (2016/01/16) useFgloadAutoset → IS_FGLOAD_AUTOSET  refactoring
223
224        // 6.3.1.1 (2015/07/10) FGLOAD更新(UNIQ だけで指定可能だが、万一を想定して、SYSTEM_IDとCLMを条件に追記)
225        // 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応したため、where条件から、SYSTEM_ID は削除します。
226//      private static final String UPDATE2 = "update GEA03 set FGLOAD='2' where UNIQ=? and SYSTEM_ID=? and CLM=?";
227        private static final String UPDATE2 = "update GEA03 set FGLOAD='2' where UNIQ=? and CLM=?";
228
229        /** 6.4.3.1 (2016/02/12) Collections.synchronizedMap で同期処理を行います。  */
230        private final Map<String,ColumnData> columnMap = Collections.synchronizedMap( new WeakHashMap<>() );    // キャッシュ用プール
231        private final String SYSTEM_ID ;                        // システムID
232//      private       String BASE_SYS_ID = "**" ;       // 7.2.6.0 (2020/06/30) ベースシステムID
233//      private final String BASE_SYS_ID = StringUtil.nval( HybsSystem.sys( "RESOURCE_BASE_SYSTEM_ID", false ),"**" ) ; // 7.2.9.1 (2020/10/23) ベースシステムID
234        private final String BASE_SYS_ID ;                      // 7.2.9.2 (2020/10/30) ベースシステムID
235
236        /** コネクションにアプリケーション情報を追記するかどうか指定 */
237        public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
238
239        // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
240        private final ApplicationInfo appInfo;
241
242        /**
243         *  SystemId 毎に ファクトリオブジェクトを作成します。
244         *
245         * @og.rev 7.2.9.2 (2020/10/30) ベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)の取得
246         *
247         * @param systemId システムID
248         * @param baseSys ベースとなるSYSTEM_ID
249         * @param initLoad リソースデータの先読み可否(true:先読みする)
250         */
251//      ColumnDataLoader( final String systemId,final boolean initLoad ) {
252        ColumnDataLoader( final String systemId,final String baseSys,final boolean initLoad ) {
253                SYSTEM_ID   = systemId;
254                BASE_SYS_ID = baseSys ;                 // 7.2.9.2 (2020/10/30)
255
256                // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
257                if( USE_DB_APPLICATION_INFO ) {
258                        appInfo = new ApplicationInfo();
259                        // ユーザーID,IPアドレス,ホスト名
260                        appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
261                        // 画面ID,操作,プログラムID
262                        appInfo.setModuleInfo( "ColumnDataLoader",null,null );
263                }
264                else {
265                        appInfo = null;
266                }
267
268                // ApplicationInfo の設定が終わってから実行します。
269                if( initLoad ) { loadDBResource(); }
270        }
271
272        /**
273         * DBリソースより カラムデータを取得、設定します。
274         * 同一キー(CLM)に対して、複数の作成区分(KBSAKU)を持つデータが
275         * 検索される場合は、作成区分(KBSAKU)の大きな値が使用されます。
276         * つまり、より、ローカライズなキーほど、作成区分(KBSAKU)に大きな値を
277         * 使用するようにします。
278         *
279         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
280         * @og.rev 4.3.5.7 (2009/03/22) FGLOADの影響でシステム個別リソースが読まれない問題対応
281         * @og.rev 7.0.7.0 (2019/12/13) 読み取り件数の評価を、破棄分も考慮する。
282         * @og.rev 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応
283         *
284         */
285        private void loadDBResource() {
286//              // 7.2.6.0 (2020/06/30)
287//              final String baseSystemId = HybsSystem.sys( "RESOURCE_BASE_SYSTEM_ID", false );
288//              BASE_SYS_ID = StringUtil.isEmpty( baseSystemId ) ? "**" : baseSystemId;
289
290//              final String[] args = new String[] { SYSTEM_ID };
291                final String[] args = new String[] { BASE_SYS_ID,SYSTEM_ID };   // 7.2.6.1 (2020/07/17)
292
293                final String[][] vals = DBUtil.dbExecute( QUERY,args,appInfo,DBID );
294                final int[] cnt = new int[3];   // **,BASE_SYS_ID,SYSTEM_ID の個数
295
296                final int len = vals.length;
297                for( int i=0; i<len; i++ ) {
298                        final String clm = vals[i][0];
299                        final int idx = Integer.parseInt( vals[i][ColumnData.SNO] );
300//                      final String sys = vals[i][ColumnData.SYSTEM_ID];
301//                      final int idx = "**".equals( sys ) ? 0 : BASE_SYS_ID.equals( sys ) ? 1 : 2 ;
302
303                        if( "1".equals( vals[i][ColumnData.FG_LOAD] ) ) {                       // 4.3.5.7 (2009/03/22) 1:一括読込
304                                columnMap.put( clm,new ColumnData( vals[i] ) );
305                                cnt[idx]++ ;
306                        }
307                        // より上の作成区分で、FGLOAD='1'(一括読込)以外の場合は、破棄する。
308                        // order by SYSTEM_ID,CLM,KBSAKU
309                        else if( columnMap.get( clm ) != null ){
310                                columnMap.remove( clm );
311                        }
312                }
313
314                // 7.0.7.0 (2019/12/13) 読み取り件数の評価を、破棄分も考慮する。
315//              System.out.println( "  ColumnDataLoader [" + len + "] loaded" );
316                System.out.println( "  ColumnDataLoader [" + len + "] select [" + columnMap.size() + "] "
317                        +       " ** [" + cnt[0] + "] " + BASE_SYS_ID + " [" + cnt[1] + "] " + SYSTEM_ID + " [" + cnt[2] + "] loaded"  );
318        }
319
320        /**
321         * ColumnDataオブジェクトを取得します。
322         * 作成したColumnDataオブジェクトは,内部にプールしておき,同じリソース要求が
323         * あったときは,プールの ColumnDataを返します。
324         * 読込フラグ(FGLOAD)が '1' のデータは、起動時に先読みします。
325         * それ以外のデータは、ここでキー要求が発生した時点で読み込みます。
326         * 読込フラグ(FGLOAD) のマーカー設定モード(USE_FGLOAD_AUTOSET)を使用する(true)場合は、
327         * 追加読み込み(先読みされていないカラム)に対して、読込フラグ(FGLOAD)を 2:使用実績 に
328         * 設定します。(次回起動時の、初期読み込みは行いません。)
329         *
330         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
331         * @og.rev 6.3.1.1 (2015/07/10) 読込フラグ(FGLOAD) のマーカー設定追加。
332//       * @og.rev 7.0.7.0 (2019/12/13) FG_LOADが、3:使用確認 , 8:未使用 の場合に使用されると、2:使用実績 をセットする。       7.0.7.2 元に戻す
333         * @og.rev 7.0.7.0 (2019/12/13) キーだけからリソース無しのColumnDataを作成します。
334         * @og.rev 7.0.7.2 (2019/12/28) リソース無しのキャッシュは行わない。(DBからSELECTした際、スキーマから自動で文字か数字を判定しているから)
335         * @og.rev 7.2.6.0 (2020/06/30) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応
336         * @og.rev 7.3.1.3 (2021/03/09) QUERY文字列を変更。それに伴って、引数の並び順を変更。
337         *
338         * @param   key         カラムのキー
339         *
340         * @return      ColumnDataオブジェクト
341         */
342        public ColumnData getColumnData( final String key ) {
343                ColumnData column = columnMap.get( key ) ;
344                if( column == null ) {
345//                      final String[] args = new String[] { SYSTEM_ID,key };
346//                      final String[] args = new String[] { key,BASE_SYS_ID,key,SYSTEM_ID,key };       // 7.2.6.1 (2020/07/17)
347//                      final String[] args = new String[] { BASE_SYS_ID,SYSTEM_ID,key };                       // 7.2.8.0 (2020/09/04)
348                        final String[] args = new String[] { key,BASE_SYS_ID,key,SYSTEM_ID,key };       // 7.3.1.3 (2021/03/09)
349                        final String[][] vals = DBUtil.dbExecute( QUERY2,args,appInfo,DBID );           // SYSTEM_ID='**' も含む
350                        if( vals.length > 0 ) {
351                                final int row=vals.length-1;                                            // 最後の検索結果
352                                column = new ColumnData( vals[row] );                           // 最後の検索結果が有効
353                                columnMap.put( key,column );
354
355                                // 6.3.1.1 (2015/07/10) 読込フラグ(FGLOAD) のマーカー設定追加。
356                                if( IS_FGLOAD_AUTOSET ) {
357                                        // 1:一括読込 と、2:使用実績 以外のリソースは、2:使用実績 をセットする。(SYSTEM_ID='**'は含まない)
358                                        final String fgld  = vals[row][ColumnData.FG_LOAD];
359                                        final String sysld = vals[row][ColumnData.SYSTEM_ID];
360                                        if( !"1".equals( fgld ) && !"2".equals( fgld ) && !"**".equals( sysld ) ) {
361        //                              // 7.0.7.0 (2019/12/13) FG_LOADが、3:使用確認 , 8:未使用 の場合に使用されると、2:使用実績 をセットする。
362        //                              if( "3".equals( fgld ) || "8".equals( fgld ) ) {
363                                                // 7.2.6.0 (2020/06/30) RESOURCE_BASE_SYSTEM_ID 追加したため、where条件から、SYSTEM_ID は削除します。
364//                                              final String[] args2 = new String[] { vals[row][ColumnData.UNIQ],SYSTEM_ID,key };
365                                                final String[] args2 = new String[] { vals[row][ColumnData.UNIQ],key };
366                                                DBUtil.dbExecute( UPDATE2,args2,appInfo,DBID );         // FGLOAD を、2:使用実績 にセット
367                                        }
368                                }
369                        }
370
371//                      //
372//                      // 7.0.7.0 (2019/12/13) キーだけからリソース無しのColumnDataを作成します。
373//                      else {
374//                              final DBColumnConfig config = new DBColumnConfig( key );
375//                              column = config.getColumnData();
376//                              columnMap.put( key,column );
377//                      }
378                }
379                return column ;
380        }
381
382        /**
383         * ColumnData オブジェクトのキャッシュを個別にクリアします。
384         * リソースデータの更新など、一部分の更新時に、すべてのキャッシュを
385         * 破棄するのではなく、指定の分のみ破棄できる機能です。
386         *
387         * @og.rev 6.9.0.1 (2018/02/05) どのシステムIDのリソースがクリアされたかを表示します。
388         *
389         * @param   key         カラムのキー
390         */
391        public void clear( final String key ) {
392                System.out.println( "SYSTEM_ID=[" + SYSTEM_ID + "] , Key=[" + key + "] の部分リソースクリアを実施しました。" );
393                columnMap.remove( key );
394        }
395
396        /**
397         * ColumnData オブジェクトのキャッシュをクリアします。
398         *
399         * @og.rev 6.9.0.1 (2018/02/05) どのシステムIDのリソースがクリアされたかを表示します。
400         *
401         */
402        public void clear() {
403                System.out.println( "SYSTEM_ID=[" + SYSTEM_ID + "] の全リソースをクリアしました。" );
404                columnMap.clear();
405        }
406}