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.util.StringUtil;                                                                    // 6.2.0.0 (2015/02/27)
020import static org.opengion.fukurou.util.StringUtil.nval2;
021import static org.opengion.fukurou.system.HybsConst.CR;                                                 // 6.1.0.0 (2014/12/26)
022import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE;                              // 6.1.0.0 (2014/12/26) refactoring
023
024/**
025 * 画面オブジェクトの元となる 画面データを作成します。
026 * 画面データは、言語(lang)に依存しない情報で、最終的な 画面オブジェクト内部で
027 * 使用される 固定的なデータオブジェクトになります。
028 *
029 * @og.rev 4.0.0.0 (2004/12/31) 新規作成
030 * @og.group リソース管理
031 *
032 * @version     4.0
033 * @author      Kazuhiko Hasegawa
034 * @since       JDK5.0,
035 */
036public final class GUIData {
037
038        // 内部データのカラム番号
039        /** カラム番号 {@value} */ public static final int GUIKEY            = 0 ;
040        /** カラム番号 {@value} */ public static final int GUILVL            = 1 ;
041        /** カラム番号 {@value} */ public static final int LABEL_CLM = 2 ;
042        /** カラム番号 {@value} */ public static final int ADDRESS           = 3 ;
043        /** カラム番号 {@value} */ public static final int SEQNO             = 4 ;
044        /** カラム番号 {@value} */ public static final int GROUPS            = 5 ;
045        /** カラム番号 {@value} */ public static final int CLASSIFY  = 6 ;
046        /** カラム番号 {@value} */ public static final int ROLES             = 7 ;
047        /** カラム番号 {@value} */ public static final int RWMODE            = 8 ;
048        /** カラム番号 {@value} */ public static final int TARGET            = 9 ;
049        /** カラム番号 {@value} */ public static final int PARAM             = 10 ;
050        /** カラム番号 {@value} */ public static final int KBLINK            = 11 ;
051        /** カラム番号 {@value} */ public static final int DYUPD             = 12 ;  // 5.3.3.0 (2011/03/01) 更新日時追加
052        /** カラム番号 {@value} */ public static final int SYSTEM_ID = 13 ;  // 7.2.6.0 (2020/06/30) 内部的に使ってないが定義しておく
053        /** カラム番号 {@value} */ public static final int KBSAKU            = 14 ;  // 7.4.2.0 (2021/05/18) 内部的に使ってないが定義しておく
054        /** カラム番号 {@value} */ public static final int SNO                       = 15 ;  // 7.2.6.1 (2020/07/17) 内部的に使ってないが定義しておく
055
056        private final String    guiKey;                                                 // 画面ID
057        private final int               guiLevel;                                               // 画面階層
058        private final String    lblClm;                                                 // 画面カラムID
059        private final String    address;                                                // アドレス
060        private final String    realAddress;                                    // 実行実アドレス
061        private final int               seqno;                                                  // 表示順
062        private final String    groups;                                                 // グループ
063        private final String    classify;                                               // 分類
064        private final String    target;                                                 // ターゲット
065        private final String    param;                                                  // 設定値(パラメータ) 6.3.8.4 (2015/10/09) イメージアイコン設定は、KBLINK にします。
066        private final String    kblink;                                                 // リンク区分
067        private final boolean   pageUse;                                                // page が、アドレスに追加できるかどうか
068        private final RoleMode  roleMode;                                               // 4.3.0.0 (2008/07/04) ロールズとモードを管理するオブジェクト
069        private final String    dyupd;                                                  // 5.3.3.0 (2011/03/01) 更新日時追加
070        private final String    imageKey;                                               // 5.5.2.5 (2012/05/21) イメージアイコンの値。null の場合は、画面ID
071
072        private static final String CON_DIR = "/" + HybsSystem.getContextName() + "/";
073
074        /**
075         * 配列文字列のデータを元に、GUIDataオブジェクトを構築します。
076         * このコンストラクタは、他のパッケージから呼び出せないように、
077         * パッケージプライベートにしておきます。
078         * このコンストラクタは、DBリソースファイルを想定しています。
079         *
080         * @og.rev 4.3.3.7 (2008/11/22) https対応
081         * @og.rev 5.1.3.0 (2010/02/01) 画面ロールのroot の場合は、user が root 以外、アクセス禁止のはず
082         * @og.rev 5.3.3.0 (2011/03/01) 更新日時追加 DYUPD
083         * @og.rev 5.5.2.5 (2012/05/21) imageKey イメージアイコンの処理を追加
084         * @og.rev 5.6.4.3 (2013/05/24) faqt追加
085         * @og.rev 5.7.8.1 (2014/07/18) address の "/" 対応
086         * @og.rev 6.3.8.4 (2015/10/09) GE80(FAQテーブル)の取得は廃止。(helpタグで行う)
087         * @og.rev 6.3.8.4 (2015/10/09) KBLINK(リンク区分)を画面のイメージファイルに割り当てます。
088         *
089         * @param       data    GUIKEY,GUILVL,LABEL_CLM,ADDRESS,SEQNO,GROUPS,CLASSIFY,ROLES,RWMODE,TARGET,KBLINK,DYUPD
090         */
091        /* default */ GUIData( final String[] data ) {
092                guiKey          = data[GUIKEY].intern() ;                                       // 画面ID
093                guiLevel        = Integer.parseInt( data[GUILVL] );                     // 画面階層
094                lblClm          = nval2( data[LABEL_CLM],guiKey ) ;                     // 画面カラムID
095                address         = data[ADDRESS].intern() ;                                      // アドレス
096                seqno           = Integer.parseInt( data[SEQNO] );                      // 表示順
097                groups          = nval2( data[GROUPS] , null ) ;                        // グループ
098                classify        = nval2( data[CLASSIFY] , "" ) ;                        // 分類
099                target          = nval2( data[TARGET] , null ) ;                        // ターゲット
100
101                // realAddress と pageUse を設定します。
102                // 3.5.5.0 (2004/03/12) kblink の設定方法を見直し
103                // 4.3.3.7 (2008/11/22) https対応
104                if( address.startsWith( "http://" ) || address.startsWith( "https://" ) || StringUtil.startsChar( address , '.' ) ) {
105                        pageUse = false;
106                        kblink = "http";
107                        realAddress = address;
108                }
109                // 5.7.8.1 (2014/07/18) address の "/" 対応
110                else if( StringUtil.startsChar( address , '/' ) ) {             // 6.2.0.0 (2015/02/27) 1文字 String.startsWith
111                        pageUse = false;
112                        kblink  = "/";
113                        realAddress = address;
114                }
115                // 6.3.8.4 (2015/10/09) KBLINK(リンク区分)を画面のイメージファイルに割り当てます。
116                else {
117                        pageUse = true;
118                        kblink = "jsp";         // 6.3.8.4 (2015/10/09)
119                        realAddress = CON_DIR + "jsp/" + address + "/" ;
120                }
121
122                // 4.0.0 (2005/01/31) param を追加します。
123                final String paramTmp = data[PARAM] ;   // 設定値(パラメータ)
124                if( paramTmp != null && paramTmp.length() > 0 ) {
125                        param = paramTmp.intern() ;
126                }
127                else {
128                        param = "" ;
129                }
130
131                // 5.5.2.5 (2012/05/21) イメージアイコンの処理。既存の param 設定と分けておきます。(将来的にはDBから読み取りたい)
132                // 6.3.8.4 (2015/10/09) KBLINK(リンク区分)を画面のイメージファイルに割り当てます。
133                imageKey = nval2( data[KBLINK] , guiKey ) ;
134
135                // 5.1.3.0 (2010/02/01) 画面ロールのroot の場合は、user が root 以外、アクセス禁止のはず
136                // ここでは、RoleMode で、共通化を図っているため、"root" を、"r00t" に置換えます。
137                String roles = data[ROLES];
138                if( "root".equals( roles ) ) { roles = "r00t" ; }
139                roleMode        = RoleMode.newInstance( roles,data[RWMODE] );   // ロールモード
140
141                dyupd = nval2( data[DYUPD] , "" ) ;
142        }
143
144        /**
145         * 画面オブジェクトのキーを返します。
146         *
147         * @return 画面オブジェクトのキー
148         */
149        public String getGuiKey() { return guiKey; }
150
151        /**
152         * 画面オブジェクトの階層レベルを返します。
153         *
154         * @return 画面オブジェクトの階層レベル
155         */
156        public int getGuiLevel() { return guiLevel ; }
157
158        /**
159         * 画面オブジェクトの画面カラムIDを返します。
160         * これは、同一画面ID(GUIKEY)で、ロール違いやアドレス違いにより
161         * 画面に表示する名称を変える場合に使用します。
162         *
163         * @return 画面オブジェクトの画面カラムID
164         */
165        public String getLabelClm() { return lblClm ; }
166
167        /**
168         * 画面オブジェクトのアドレスを返します。
169         *
170         * @return 画面オブジェクトのアドレス
171         */
172        public String getAddress() { return address; }
173
174        /**
175         * トップからの実行アドレス情報を取得します。
176         * コンテキスト名とリンク区分属性を利用して、サーバートップからのアドレスを
177         * 返します。ただし、GUIリソースに、http://~ または、.~ から始まるアドレスは
178         * そのまま、なにも変換せずに返します。
179         * param 属性がある場合は、引数として後ろに追加します。
180         *
181         * http://AAAA  ⇒  http://AAAA
182         * ../../AAAA/  ⇒  ../../AAAA/
183         * AAAA         ⇒  /CONTEXT_NAME/KBLINK/AAAA/
184         *
185         * @og.rev 3.5.5.0 (2004/03/12) 新規追加
186         * @og.rev 4.0.0.0 (2005/01/31) param 属性の追加
187         *
188         * @return      実行実アドレス
189         */
190        public String getRealAddress() {
191                return realAddress ;
192        }
193
194        /**
195         * トップからの実行アドレス情報を取得します。
196         * コンテキスト名とリンク区分属性を利用して、サーバートップからのアドレスを
197         * 返します。ただし、GUIリソースに、http://~ または、.~ から始まるアドレスは
198         * そのまま、なにも変換せずに返します。
199         * また、アドレスの最後がスラッシュ(/)で終了している場合は、page属性を追加します。
200         *
201         * http://AAAA  ⇒  http://AAAA
202         * ../../AAAA/  ⇒  ../../AAAA/
203         * AAAA         ⇒  /CONTEXT_NAME/KBLINK/AAAA/
204         *
205         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
206         *
207         * @param       page    実行ページ(index.jsp など)
208         * @return      実行実アドレス
209         */
210        public String getRealAddress( final String page ) {
211                // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
212                return ! pageUse || page == null ? realAddress : (realAddress + page);
213        }
214
215        /**
216         * 画面オブジェクトの表示順を返します。
217         *
218         * @return      画面オブジェクトの表示順
219         */
220        public int getSeqno() { return seqno; }
221
222        /**
223         * 画面オブジェクトのグループを返します。
224         *
225         * @return      画面オブジェクトのグループ
226         */
227        public String getGroups() { return groups; }
228
229        /**
230         * 画面オブジェクトの分類を返します。
231         *
232         * @return      画面オブジェクトの分類
233         */
234        public String getClassify() { return classify; }
235
236        /**
237         * 画面オブジェクトのロールズを返します。
238         *
239         * @return      画面オブジェクトのロールズ文字列
240         */
241        public String getRoles() { return roleMode.getRoles(); }
242
243        /**
244         * 画面オブジェクトのモード文字列を返します。
245         *
246         * @return      画面オブジェクトのモード文字列
247         */
248        public String getMode() { return roleMode.getMode(); }
249
250        /**
251         * RoleMode 構築時に発生したエラーメッセージを返します。
252         * エラーがない場合は、null を返します。
253         *
254         * @og.rev 8.4.0.0 (2023/01/31) RoleMode でthrow しても、インスタンスは生成する。
255         *
256         * @return      エラーメッセージ(正常時は、null)
257         */
258        public String getModeErrMsg() { return roleMode.getModeErrMsg(); }
259
260        /**
261         * ロールモード情報を取得します。
262         *
263         * @og.rev 4.3.0.0 (2008/07/04) 新規追加
264         *
265         * @return      ロールモード情報
266         */
267        public RoleMode getRoleMode() { return roleMode ; }
268
269        /**
270         * 画面オブジェクトのターゲットを返します。
271         *
272         * @return      画面オブジェクトのターゲット
273         */
274        public String getTarget() { return target; }
275
276        /**
277         * 画面オブジェクトのパラメータを返します。
278         *
279         * @return      画面オブジェクトのパラメータ
280         */
281        public String getParam() { return param; }
282
283        /**
284         * 画面オブジェクトのリンク区分を返します。
285         *
286         * @return      画面オブジェクトのリンク区分
287         */
288        public String getKblink() { return kblink; }
289
290        /**
291         * 画面オブジェクトの更新日時を返します。
292         *
293         * @og.rev 5.3.3.0 (2011/03/01) 新規追加
294         *
295         * @return      画面オブジェクトの更新日時
296         */
297        public String getDyupd() { return dyupd; }
298
299        /**
300         * イメージアイコンのキーを返します。
301         *
302         * 画面にアイコンを追加する場合、jsp/menuImage フォルダに、画面ID と同じ名称の
303         * 画像ファイルを置く必要があります。
304         *
305         * ※ 6.3.8.4 (2015/10/09)
306         *    従来は、PARAM 属性に、IMAGE_KEY=XXXX と指定していましたが、
307         *    KBLINK(リンク区分) を使用するように変更しました。
308         *
309         * @og.rev 5.5.2.5 (2012/05/21) 新規追加
310         * @og.rev 6.3.8.4 (2015/10/09) KBLINK(リンク区分)を画面のイメージファイルに割り当てます。
311         *
312         * @return      イメージアイコンのキー
313         */
314        public String getImageKey() { return imageKey; }
315
316        /**
317         * オブジェクトの識別子として、詳細なユーザー情報を返します。
318         *
319         * @og.rev 5.3.3.0 (2011/03/01) 更新日時を追加
320         * @og.rev 5.6.4.3 (2013/05/24) faq
321         * @og.rev 6.3.8.4 (2015/10/09) GE80(FAQテーブル)の取得は廃止。(helpタグで行う)
322         *
323         * @return      詳細な画面情報
324         * @og.rtnNotNull
325         */
326        @Override
327        public String toString() {
328                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE )
329                        .append( "guiKey     :" ).append( guiKey      ).append( CR )
330                        .append( "guiLevel   :" ).append( guiLevel    ).append( CR )
331                        .append( "address    :" ).append( address     ).append( CR )
332                        .append( "realAddress:" ).append( realAddress ).append( CR )
333                        .append( "seqno      :" ).append( seqno       ).append( CR )
334                        .append( "classify   :" ).append( classify    ).append( CR )
335                        .append( "roles      :" ).append( getRoles()  ).append( CR )
336                        .append( "mode       :" ).append( getMode()   ).append( CR )
337                        .append( "target     :" ).append( target      ).append( CR )
338                        .append( "param      :" ).append( param       ).append( CR )
339                        .append( "kblink     :" ).append( kblink      ).append( CR )
340                        .append( "dyupd      :" ).append( dyupd       ).append( CR );
341                return rtn.toString();
342        }
343}