    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         * このコンストラクタは、ＤＢリソースファイルを想定しています。
    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}