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 java.util.ArrayList; 019import java.util.Collections; 020import java.util.List; 021 022import org.opengion.fukurou.db.DBUtil; 023import org.opengion.fukurou.db.ApplicationInfo; 024import org.opengion.hayabusa.common.HybsSystem; 025 026/** 027 * systemId と lang に対応した画面データを作成するデータロードクラスです。 028 * 029 * 画面データは、画面ID(GUIKEY)に対して、各種画面情報を持っています。 030 * 従来と異なるのは、同一画面IDに対して、アドレスやロールズを変えた情報を持てると言う 031 * 事です。これは、カスタマイズ時に、画面IDは変えずに、実際のアクセスされるアドレスを 032 * 変える事で、他のアプリケーションへの影響を最小限にして開発できます。 033 * linkタグや、submit などの gamenID を指定するカスタムタグでは、実際のアクセス先は、 034 * ログインユーザーのロールズでアクセス可能な画面のアドレスに転送されます。 035 * 作番毎のカスタマイズや、ユーザーロールに応じた飛び先変更などにも使用できます。 036 * 037 * 画面データでは、複数階層持てるように、画面階層(GUILVL)を持っています。このレベルに 038 * 応じて、分類(CLASSIFY)の表示方法が変わります。(擬似階層構造) 039 * 040 * 画面データでは、言語(LANG)は、条件から消えました。実際に名称を表示させる時は、 041 * 画面カラムID(LABEL_CLM)に対応する ラベル定義より、言語に応じたラベルを取得します。 042 * エンジン内部で使用している GUIInfo オブジェクト構築時に割り当てます。 043 * 分類(CLASSIFY)は、コードリソースに登録します。 044 * 045 * 画面データを作成する場合は、同一画面IDで、作成区分(KBSAKU)違いの場合は、 046 * 最も大きな作成区分を持つ画面情報を使用します。 047 * 作成区分(KBSAKU)='0' のデータは、マスタリソースとして、エンジンとともに 048 * 配布されるリソースになります。 049 * 050 * 画面データは、カラム定義のような、読込フラグ(FGLOAD)はありません。 051 * 画面情報(GUIInfo)は、ユーザーログイン毎に作成されます。(キャッシュは 052 * セッション情報に登録されます。) 053 * これは、画面アクセス条件を、ログイン時に済ますことで、高速化を図っています。 054 * 画面IDの件数が少ないことと、画面IDを自動作成した場合でも、 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 GUIDataLoader { 068 // リソースの接続先を、取得します。 069 private final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); 070 071 // DBリソースの初期一括読み込みのクエリー 072 // ソート順は、画面IDオブジェクトの優先順(後優先)で、画面表示順ではありません。 073 // 5.6.4.3 (2013/05/24) FAQ追加 現段階ではシステムコードは考慮しない 074 // 6.3.8.4 (2015/10/09) GE80(FAQテーブル)の取得は廃止。(helpタグで行う) 075 // 6.3.9.0 (2015/11/06) コンパイル時に静的な値に初期化されるフィールドは static フィールドにしてください(findbugs)。 076 private static final String QUERY = "select GUIKEY,GUILVL,LABEL_CLM,ADDRESS,SEQNO" 077 + ",GROUPS,'',ROLES,RWMODE,TARGET,PARAM,KBLINK,DYUPD" 078 + " from GEA11 where SYSTEM_ID in ( ?,'**') and FGJ='1'" 079 + " order by SYSTEM_ID,KBSAKU,SEQNO,GUIKEY" ; 080 081 private final List<GUIData> pool = Collections.synchronizedList(new ArrayList<>()); // キャッシュ用プール 082 private final String SYSTEM_ID ; // システムID 083 084 /** コネクションにアプリケーション情報を追記するかどうか指定 */ 085 public static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 086 087 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 088 private final ApplicationInfo appInfo; 089 090 /** 091 * SystemId 毎に ファクトリオブジェクトを作成します。 092 * 093 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 094 * 095 * @param systemId システムID 096 */ 097 GUIDataLoader( final String systemId ) { 098 SYSTEM_ID = systemId; 099 100 // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 101 if( USE_DB_APPLICATION_INFO ) { 102 appInfo = new ApplicationInfo(); 103 // ユーザーID,IPアドレス,ホスト名 104 appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME ); 105 // 画面ID,操作,プログラムID 106 appInfo.setModuleInfo( "GUIDataLoader",null,null ); 107 } 108 else { 109 appInfo = null; 110 } 111 112 // ApplicationInfo の設定が終わってから実行します。 113 loadDBResource(); 114 } 115 116 /** 117 * DBリソースより 画面データを取得、設定します。 118 * DBリソースは、GUIKEY,GUILVL,LABEL_CLM,ADDRESS,SEQNO,GROUPS, 119 * CLASSIFY,ROLES,RWMODE,TARGET,PARAM,KBLINK の順番で、GUIKEY の重複を許します。 120 * 重複している場合(ロール違い等)は、一つのオブジェクトとして作成され、 121 * 個々のログインユーザー毎にユニークになるように、設定する必要があります。 122 * 123 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定 124 * @og.rev 4.0.0.0 (2007/10/31) ロールの継承機能の追加・分類の取得を追加(暫定対応) 125 * @og.rev 5.3.1.0 (2011/01/01) 通常画面に対してアドレスを設定しない場合にロールが効かないバグを修正します。 126 * @og.rev 5.3.1.0 (2011/01/01) ロール継承機能廃止 127 */ 128 private void loadDBResource() { 129 final String[] args = new String[] { SYSTEM_ID }; 130 131 String[][] vals = DBUtil.dbExecute( QUERY,args,appInfo,DBID ); 132 final int len = vals.length; 133 134 int level ; 135 String classify = ""; 136 for( int i=0; i<len; i++ ) { 137 138 // ロールの継承対応 139 level = Integer.parseInt( vals[i][GUIData.GUILVL] ); 140 if( level == 2 ) { 141 classify = vals[i][GUIData.GUIKEY]; // 暫定対応 142 } 143 else if( level >= 3 ) { 144 vals[i][GUIData.CLASSIFY] = classify; // 暫定対応 145 } 146 147 // 5.3.1.0 (2011/01/01) 通常画面に対してアドレスを設定しない場合にロールが効かないバグを修正します。 148 if( ( level == 1 || level == 2 ) && ( vals[i][GUIData.ADDRESS] == null || vals[i][GUIData.ADDRESS].isEmpty() ) ) { 149 vals[i][GUIData.ROLES] = null; 150 } 151 152 pool.add( new GUIData( vals[i] ) ); 153 } 154 155 System.out.println( " GUIDataLoader [" + len + "] loaded" ); 156 } 157 158 /** 159 * すべてのGUIData オブジェクト配列を取得します。 160 * プールに持っているすべてのキャッシュを、GUIData オブジェクト配列 161 * にして返します。 162 * このリソースは、List で管理しており、読み込み時にすべてキャッシュされます。 163 * 164 * @return すべてのGUIDataオブジェクト配列 165 */ 166 public GUIData[] getAllData() { 167 if( pool.isEmpty() ) { loadDBResource(); } 168 return pool.toArray( new GUIData[pool.size()] ); 169 } 170 171 /** 172 * GUIData オブジェクトのキャッシュをクリアします。 173 * 174 */ 175 public void clear() { 176 pool.clear(); 177 } 178}