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