    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.taglib;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.resource.GUIInfo;
    020import org.opengion.hayabusa.resource.UserInfo;
    021import org.opengion.hayabusa.db.DBTableModel;
    022import org.opengion.hayabusa.db.DBColumn;
    023import org.opengion.hayabusa.db.DBTableModelUtil;
    024
    025import static org.opengion.fukurou.util.StringUtil.nval ;
    026
    027import java.io.ObjectOutputStream;
    028import java.io.ObjectInputStream;
    029import java.io.IOException;
    030
    031/**
    032 * 画面リソースのオブジェクトを検索し、DBTableModel にセットするタグです。
    033 *
    034 * ファイルの検索結果は、GUIKEY,ADDRESS,REALADDRESS,SEQNO,GROUPS,CLASSIFY,LEVEL,
    035 * NAME_JA,SNAME,LNAME,ROLES,RWMODE,TARGET,PARAM,KBLINK,DESCRIPTION,DYUPD のカラムを持つ
    036 * DBTableModel にセット されます。このカラムは、固定です。
    037 * 並び替え、および、画面リソースの選別(where 条件)は、固定で、指定できません。
    038 *
    039 * [カラム名]      検索するオブジェクトの属性は、以下のカラム名で作成されます。(固定)
    040 *     GUIKEY        画面ID
    041 *     ADDRESS       実行アドレス
    042 *     REALADDRESS   実行実アドレス
    043 *     SEQNO         表示順
    044 *     GROUPS        メニュグループ
    045 *     CLASSIFY      メニュ分類
    046 *     LEVEL         メニュ階層番号
    047 *     NAME_JA       画面名称
    048 *     SNAME         画面名称(short)
    049 *     LNAME         画面名称(long)
    050 *     ROLES         ロールズ
    051 *     MODE          アクセスモード列(mr,mw,-r,-w の羅列)
    052 *     TARGET        ターゲット
    053 *     PARAM         設定値(パラメータ)
    054 *     KBLINK        リンク区分
    055 *     DESCRIPTION   概要説明
    056 *     DYUPD         更新日時
    057 *
    058 * [roles 属性]      画面リソースの選別となる、ROLES 属性
    059 *
    060 * @og.formSample
    061 * ●形式：&lt;og:guiQuery command="…" roles="…" /&gt;
    062 * ●body：なし
    063 *
    064 * ●Tag定義：
    065 *   &lt;og:guiQuery
    066 *       roles              【TAG】画面リソースの条件となるロールズを指定します
    067 *       level              【TAG】画面リソースの条件となるレベルを指定します
    068 *       rwmode             【TAG】画面リソースの条件となるRWモードを指定します
    069 *       command            【TAG】コマンド(NEW,RENEW)をセットします(PlsqlUpdateTag,UpdateTag の場合は、ENTRY)
    070 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session)
    071 *       displayMsg         【TAG】検索結果を画面上に表示するメッセージリソースIDを指定します (初期値:VIEW_DISPLAY_MSG[=])
    072 *       notfoundMsg        【TAG】検索結果がゼロ件の場合に表示するメッセージリソースIDを指定します(初期値:MSG0077[対象データはありませんでした])
    073 *       tableId            【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
    074 *       useBeforeHtmlTag   【TAG】 処理時間(queryTime)などの情報出力[true:有効/false:無効]を指定します(初期値:true)
    075 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    076 *   &gt;   ... Body ...
    077 *   &lt;/og:guiQuery&gt;
    078 *
    079 * ●使用例
    080 *         &lt;og:guiQuery
    081 *                command = "NEW"
    082 *                roles   = "AA|BB|CC"
    083 *         /&gt;
    084 *
    085 * @og.rev 5.2.2.0 (2010/11/01) 新規追加
    086 * @og.group その他入力
    087 *
    088 * @version  4.0
    089 * @author       Kazuhiko Hasegawa
    090 * @since    JDK5.0,
    091 */
    092public class GuiQueryTag extends QueryTag {
    093        //* このプログラムのVERSION文字列を設定します。   {@value} */
    094        private static final String VERSION = "5.3.3.0 (2011/03/01)" ;
    095
    096        private static final long serialVersionUID = 533020110301L ;
    097
    098        private static final String[] SELECT =
    099                                new String[] { "GUIKEY","ADDRESS","REALADDRESS","SEQNO","GROUPS","CLASSIFY","LEVEL",
    100//                                                      "NAME_JA","SNAME","LNAME","ROLES","RWMODE","TARGET","PARAM","KBLINK","DESCRIPTION" };
    101                                                        "NAME_JA","SNAME","LNAME","ROLES","RWMODE","TARGET","PARAM","KBLINK","DESCRIPTION","DYUPD" };
    102
    103        private static final int GUIKEY      = 0;
    104        private static final int ADDRESS     = 1;
    105        private static final int REALADDRESS = 2;
    106        private static final int SEQNO       = 3;
    107        private static final int GROUPS      = 4;
    108        private static final int CLASSIFY    = 5;
    109        private static final int LEVEL       = 6;
    110        private static final int NAME_JA     = 7;
    111        private static final int SNAME       = 8;
    112        private static final int LNAME       = 9;
    113        private static final int ROLES       = 10;
    114        private static final int RWMODE      = 11;
    115        private static final int TARGET      = 12;
    116        private static final int PARAM       = 13;
    117        private static final int KBLINK      = 14;
    118        private static final int DESCRIPTION = 15;
    119        private static final int DYUPD       = 16; // 5.3.3.0 (2011/03/01) 更新日時追加
    120
    121        /** command 引数に渡す事の出来る コマンド リスト  */
    122//      private static final String[] COMMAND_LIST = new String[] { CMD_NEW , CMD_RENEW };
    123
    124        private String  roles           = null;
    125        private String  level           = null;
    126        private String  rwmode          = null;
    127
    128        /**
    129         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    130         *
    131         * 通常の QueryTagでは、Body を評価する(EVAL_BODY_BUFFERED)を返しますが、
    132         * GuiQueryでは BODYを評価しない為、SKIP_BODY を返します。
    133         *
    134         * @return      後続処理の指示(SKIP_BODY)
    135         */
    136        @Override
    137        public int doStartTag() {
    138                super.doStartTag();
    139
    140                // DBTableModel の初期化
    141                table = initDBTable();
    142
    143                // 実行
    144                execute() ;
    145
    146                return(SKIP_BODY);                              // Body を評価しない
    147        }
    148
    149        /**
    150         * タグリブオブジェクトをリリースします。
    151         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    152         *
    153         */
    154        @Override
    155        protected void release2() {
    156                super.release2();
    157                roles           = null;
    158                level           = null;
    159                rwmode          = null;
    160        }
    161
    162        /**
    163         * guiQuery を実行します。
    164         *
    165         */
    166        protected void execute() {
    167                UserInfo userInfo = new UserInfo( "XX","ja","DUMMY",roles,null,"GF","127.0.0.1",null );
    168
    169                getResource().makeGUIInfos( userInfo );
    170
    171                GUIInfo[] guiInfos = userInfo.getGUIInfos();
    172
    173                for( int i=0; i<guiInfos.length; i++ ) {
    174                        addGUIInfo( guiInfos[i] );
    175                }
    176                executeCount = table.getRowCount();
    177        }
    178
    179        /**
    180         * 初期化された DBTableModel を返します。
    181         *
    182         * @return      テーブルモデル
    183         */
    184        private DBTableModel initDBTable() {
    185                DBTableModel tbl = DBTableModelUtil.newDBTable();
    186
    187                tbl.init( SELECT.length );
    188                for( int i=0; i<SELECT.length; i++ ) {
    189                        DBColumn dbColumn = getDBColumn( SELECT[i] );
    190                        tbl.setDBColumn( i,dbColumn );
    191                }
    192
    193                return tbl ;
    194        }
    195
    196        /**
    197         * DBTableModel に、ファイル情報をセットします。
    198         * ファイルの検索結果は、GUIKEY,ADDRESS,REALADDRESS,SEQNO,GROUPS,CLASSIFY,LEVEL,
    199         * NAME_JA,SNAME,LNAME,ROLES,RWMODE,TARGET,PARAM,KBLINK,DESCRIPTION,DYUPD のカラムを持つ
    200         * DBTableModel にセット されます。このカラムは、固定です。
    201         *
    202         * @og.rev 5.3.3.0 (2011/03/01) 更新日時追加、分類を名称でセット
    203         *
    204         * @param       guiInfo セットする画面リソース
    205         */
    206        private void addGUIInfo( final GUIInfo guiInfo ) {
    207                String guiLevel = String.valueOf( guiInfo.getLevel() );
    208                if( level != null && !level.equals( guiLevel ) ) { return; }
    209
    210                String guiMode  = guiInfo.getMode();
    211                if( rwmode != null && guiMode != null && !guiMode.startsWith( rwmode ) ) { return; }
    212
    213                String[] data = new String[ SELECT.length ];
    214
    215                data[GUIKEY     ] = guiInfo.getKey();
    216                data[ADDRESS    ] = guiInfo.getAddress();
    217                data[REALADDRESS] = guiInfo.getRealAddress();
    218                data[SEQNO      ] = String.valueOf( guiInfo.getSequence() );
    219                data[GROUPS     ] = guiInfo.getGroups();
    220//              data[CLASSIFY   ] = guiInfo.getClassify();
    221                data[CLASSIFY   ] = getResource().getLabel( guiInfo.getClassify() );
    222                data[LEVEL      ] = guiLevel;
    223                data[NAME_JA    ] = guiInfo.getLabel();
    224                data[SNAME      ] = guiInfo.getName();
    225                data[LNAME      ] = guiInfo.getLongName();
    226                data[ROLES      ] = guiInfo.getRoles();
    227                data[RWMODE     ] = guiMode;
    228                data[TARGET     ] = guiInfo.getTarget();
    229                data[PARAM      ] = guiInfo.getParam();
    230                data[KBLINK     ] = guiInfo.getKblink();
    231                data[DESCRIPTION] = guiInfo.getDescription();
    232                data[DYUPD      ] = guiInfo.getDyupd();
    233
    234                table.addColumnValues( data );
    235        }
    236
    237        /**
    238         * 【TAG】画面リソースの条件となるロールズを指定します。
    239         *
    240         * @og.tag
    241         * ロールズ判定は、ダミーユーザーを作成して通常の処理と同様の判定方式で
    242         * 有効な画面リソースをピックアップします。
    243         *
    244         * @param       rols    ロールズ
    245         */
    246        public void setRoles( final String rols ) {
    247                roles = nval( getRequestParameter( rols ),roles );
    248        }
    249
    250        /**
    251         * 【TAG】画面リソースの条件となるレベルを指定します。
    252         *
    253         * @og.tag
    254         * レベル判定は、文字列レベルの判定を行います。
    255         * 画面リソースの階層番号(レベル)は、
    256         * 　0:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます)
    257         * 　1:トップ階層(【分類名称】)
    258         * 　2:選択階層(通常の折りたたみメニュー)
    259         * 　3:選択非表示(通常は、隠してあります)
    260         * です。
    261         *
    262         * ロール等の他の条件でピックアップされたリソースと AND 処理されます。
    263         * 何も指定しなければ、すべてを対象とします。
    264         *
    265         * @param       lvl     ロールズ
    266         */
    267        public void setLevel( final String lvl ) {
    268                level = nval( getRequestParameter( lvl ),level );
    269        }
    270
    271        /**
    272         * 【TAG】画面リソースの条件となるRWモードを指定します。
    273         *
    274         * @og.tag
    275         * RWモード判定は、文字列レベルの判定を行います。(通常のRW判定と異なります)
    276         * RWモードの代表的な記述は、mw,mr,-w,-r です。ここでは、特殊な検索は出来ないため、
    277         * 上記文字列そのままで、一致するか、m,- の前方一致で判断するかのどちらかです。
    278         *
    279         * ロール等の他の条件でピックアップされたリソースと AND 処理されます。
    280         * 何も指定しなければ、すべてを対象とします。
    281         *
    282         * @param       mode    RWモード
    283         */
    284        public void setRwmode( final String mode ) {
    285                rwmode = nval( getRequestParameter( mode ),rwmode );
    286        }
    287
    288        /**
    289         * シリアライズ用のカスタムシリアライズ書き込みメソッド
    290         *
    291         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    292         * @serialData 一部のオブジェクトは、シリアライズされません。
    293         *
    294         * @param       strm    ObjectOutputStreamオブジェクト
    295         * @throws IOException  入出力エラーが発生した場合
    296         */
    297        private void writeObject( final ObjectOutputStream strm ) throws IOException {
    298                strm.defaultWriteObject();
    299        }
    300
    301        /**
    302         * シリアライズ用のカスタムシリアライズ読み込みメソッド
    303         *
    304         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
    305         *
    306         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
    307         * @serialData 一部のオブジェクトは、シリアライズされません。
    308         *
    309         * @param       strm    ObjectInputStreamオブジェクト
    310         * @see #release2()
    311         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
    312         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
    313         */
    314        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
    315                strm.defaultReadObject();
    316        }
    317
    318        /**
    319         * このオブジェクトの文字列表現を返します。
    320         * 基本的にデバッグ目的に使用します。
    321         *
    322         * @return このクラスの文字列表現
    323         */
    324        @Override
    325        public String toString() {
    326                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    327                                .println( "VERSION"             ,VERSION        )
    328                                .println( "roles"               ,roles  )
    329                                .fixForm().toString()
    330                        + HybsSystem.CR
    331                        + super.toString() ;
    332        }
    333}