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