    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         * このコンストラクタは、ＤＢリソースファイルを想定しています。
    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        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) １文字 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         *
    209         * @return      実行実アドレス
    210         */
    211        public String getRealAddress( final String page ) {
    212                // 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
    213                return ! pageUse || page == null ? realAddress : realAddress + page;
    214        }
    215
    216        /**
    217         * 画面オブジェクトの表示順を返します。
    218         *
    219         * @return      画面オブジェクトの表示順
    220         */
    221        public int getSeqno() { return seqno; }
    222
    223        /**
    224         * 画面オブジェクトのグループを返します。
    225         *
    226         * @return      画面オブジェクトのグループ
    227         */
    228        public String getGroups() { return groups; }
    229
    230        /**
    231         * 画面オブジェクトの分類を返します。
    232         *
    233         * @return      画面オブジェクトの分類
    234         */
    235        public String getClassify() { return classify; }
    236
    237        /**
    238         * 画面オブジェクトのロールズを返します。
    239         *
    240         * @return      画面オブジェクトのロールズ文字列
    241         */
    242        public String getRoles() { return roleMode.getRoles(); }
    243
    244        /**
    245         * 画面オブジェクトのモード文字列を返します。
    246         *
    247         * @return      画面オブジェクトのモード文字列
    248         */
    249        public String getMode() { return roleMode.getMode(); }
    250
    251        /**
    252         * RoleMode 構築時に発生したｴﾗｰﾒｯｾｰｼﾞを返します。
    253         * ｴﾗｰがない場合は、null を返します。
    254         *
    255         * @og.rev 8.4.0.0 (2023/01/31) RoleMode でthrow しても、ｲﾝｽﾀﾝｽは生成する。
    256         *
    257         * @return ｴﾗｰﾒｯｾｰｼﾞ(正常時は、null)
    258         */
    259        public String getModeErrMsg() { return roleMode.getModeErrMsg(); }
    260
    261        /**
    262         * ロールモード情報を取得します。
    263         *
    264         * @og.rev 4.3.0.0 (2008/07/04) 新規追加
    265         *
    266         * @return      ロールモード情報
    267         */
    268        public RoleMode getRoleMode() { return roleMode ; }
    269
    270        /**
    271         * 画面オブジェクトのターゲットを返します。
    272         *
    273         * @return 画面オブジェクトのターゲット
    274         */
    275        public String getTarget() { return target; }
    276
    277        /**
    278         * 画面オブジェクトのパラメータを返します。
    279         *
    280         * @return 画面オブジェクトのパラメータ
    281         */
    282        public String getParam() { return param; }
    283
    284        /**
    285         * 画面オブジェクトのリンク区分を返します。
    286         *
    287         * @return 画面オブジェクトのリンク区分
    288         */
    289        public String getKblink() { return kblink; }
    290
    291        /**
    292         * 画面オブジェクトの更新日時を返します。
    293         *
    294         * @og.rev 5.3.3.0 (2011/03/01) 新規追加
    295         *
    296         * @return 画面オブジェクトの更新日時
    297         */
    298        public String getDyupd() { return dyupd; }
    299
    300        /**
    301         * イメージアイコンのキーを返します。
    302         *
    303         * 画面にアイコンを追加する場合、jsp/menuImage フォルダに、画面ID と同じ名称の
    304         * 画像ファイルを置く必要があります。
    305         *
    306         * ※ 6.3.8.4 (2015/10/09)
    307         *    従来は、PARAM 属性に、IMAGE_KEY=XXXX と指定していましたが、
    308         *    KBLINK(リンク区分) を使用するように変更しました。
    309         *
    310         * @og.rev 5.5.2.5 (2012/05/21) 新規追加
    311         * @og.rev 6.3.8.4 (2015/10/09) KBLINK(リンク区分)を画面のイメージファイルに割り当てます。
    312         *
    313         * @return イメージアイコンのキー
    314         */
    315        public String getImageKey() { return imageKey; }
    316
    317        /**
    318         * オブジェクトの識別子として，詳細なユーザー情報を返します。
    319         *
    320         * @og.rev 5.3.3.0 (2011/03/01) 更新日時を追加
    321         * @og.rev 5.6.4.3 (2013/05/24) faq
    322         * @og.rev 6.3.8.4 (2015/10/09) GE80(FAQﾃｰﾌﾞﾙ)の取得は廃止。(helpタグで行う)
    323         *
    324         * @return  詳細な画面情報
    325         * @og.rtnNotNull
    326         */
    327        @Override
    328        public String toString() {
    329                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE )
    330                        .append( "guiKey     :" ).append( guiKey      ).append( CR )
    331                        .append( "guiLevel   :" ).append( guiLevel    ).append( CR )
    332                        .append( "address    :" ).append( address     ).append( CR )
    333                        .append( "realAddress:" ).append( realAddress ).append( CR )
    334                        .append( "seqno      :" ).append( seqno       ).append( CR )
    335                        .append( "classify   :" ).append( classify    ).append( CR )
    336                        .append( "roles      :" ).append( getRoles()  ).append( CR )
    337                        .append( "mode       :" ).append( getMode()   ).append( CR )
    338                        .append( "target     :" ).append( target      ).append( CR )
    339                        .append( "param      :" ).append( param       ).append( CR )
    340                        .append( "kblink     :" ).append( kblink      ).append( CR )
    341                        .append( "dyupd      :" ).append( dyupd       ).append( CR );
    342                return rtn.toString();
    343        }
    344}