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