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 * ●形式:<og:guiQuery command="…" roles="…" />
062 * ●body:なし
063 *
064 * ●Tag定義:
065 *   <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 *   >   ... Body ...
077 *   </og:guiQuery>
078 *
079 * ●使用例
080 *         <og:guiQuery
081 *                command = "NEW"
082 *                roles   = "AA|BB|CC"
083 *         />
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         * @og.rev 5.10.16.2 (2019/10/18) X-Forwarded-For対応
166         *
167         */
168        protected void execute() {
169//              UserInfo userInfo = new UserInfo( "XX","ja","DUMMY",roles,null,"GF","127.0.0.1",null );
170                UserInfo userInfo = new UserInfo( "XX","ja","DUMMY",roles,null,"GF","127.0.0.1",null,null ); //5.10.16.2 (2019/10/18)
171
172                getResource().makeGUIInfos( userInfo );
173
174                GUIInfo[] guiInfos = userInfo.getGUIInfos();
175
176                for( int i=0; i<guiInfos.length; i++ ) {
177                        addGUIInfo( guiInfos[i] );
178                }
179                executeCount = table.getRowCount();
180        }
181
182        /**
183         * 初期化された DBTableModel を返します。
184         *
185         * @return      テーブルモデル
186         */
187        private DBTableModel initDBTable() {
188                DBTableModel tbl = DBTableModelUtil.newDBTable();
189
190                tbl.init( SELECT.length );
191                for( int i=0; i<SELECT.length; i++ ) {
192                        DBColumn dbColumn = getDBColumn( SELECT[i] );
193                        tbl.setDBColumn( i,dbColumn );
194                }
195
196                return tbl ;
197        }
198
199        /**
200         * DBTableModel に、ファイル情報をセットします。
201         * ファイルの検索結果は、GUIKEY,ADDRESS,REALADDRESS,SEQNO,GROUPS,CLASSIFY,LEVEL,
202         * NAME_JA,SNAME,LNAME,ROLES,RWMODE,TARGET,PARAM,KBLINK,DESCRIPTION,DYUPD のカラムを持つ
203         * DBTableModel にセット されます。このカラムは、固定です。
204         *
205         * @og.rev 5.3.3.0 (2011/03/01) 更新日時追加、分類を名称でセット
206         *
207         * @param       guiInfo セットする画面リソース
208         */
209        private void addGUIInfo( final GUIInfo guiInfo ) {
210                String guiLevel = String.valueOf( guiInfo.getLevel() );
211                if( level != null && !level.equals( guiLevel ) ) { return; }
212
213                String guiMode  = guiInfo.getMode();
214                if( rwmode != null && guiMode != null && !guiMode.startsWith( rwmode ) ) { return; }
215
216                String[] data = new String[ SELECT.length ];
217
218                data[GUIKEY     ] = guiInfo.getKey();
219                data[ADDRESS    ] = guiInfo.getAddress();
220                data[REALADDRESS] = guiInfo.getRealAddress();
221                data[SEQNO      ] = String.valueOf( guiInfo.getSequence() );
222                data[GROUPS     ] = guiInfo.getGroups();
223//              data[CLASSIFY   ] = guiInfo.getClassify();
224                data[CLASSIFY   ] = getResource().getLabel( guiInfo.getClassify() );
225                data[LEVEL      ] = guiLevel;
226                data[NAME_JA    ] = guiInfo.getLabel();
227                data[SNAME      ] = guiInfo.getName();
228                data[LNAME      ] = guiInfo.getLongName();
229                data[ROLES      ] = guiInfo.getRoles();
230                data[RWMODE     ] = guiMode;
231                data[TARGET     ] = guiInfo.getTarget();
232                data[PARAM      ] = guiInfo.getParam();
233                data[KBLINK     ] = guiInfo.getKblink();
234                data[DESCRIPTION] = guiInfo.getDescription();
235                data[DYUPD      ] = guiInfo.getDyupd();
236
237                table.addColumnValues( data );
238        }
239
240        /**
241         * 【TAG】画面リソースの条件となるロールズを指定します。
242         *
243         * @og.tag
244         * ロールズ判定は、ダミーユーザーを作成して通常の処理と同様の判定方式で
245         * 有効な画面リソースをピックアップします。
246         *
247         * @param       rols    ロールズ
248         */
249        public void setRoles( final String rols ) {
250                roles = nval( getRequestParameter( rols ),roles );
251        }
252
253        /**
254         * 【TAG】画面リソースの条件となるレベルを指定します。
255         *
256         * @og.tag
257         * レベル判定は、文字列レベルの判定を行います。
258         * 画面リソースの階層番号(レベル)は、
259         *  0:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます)
260         *  1:トップ階層(【分類名称】)
261         *  2:選択階層(通常の折りたたみメニュー)
262         *  3:選択非表示(通常は、隠してあります)
263         * です。
264         *
265         * ロール等の他の条件でピックアップされたリソースと AND 処理されます。
266         * 何も指定しなければ、すべてを対象とします。
267         *
268         * @param       lvl     ロールズ
269         */
270        public void setLevel( final String lvl ) {
271                level = nval( getRequestParameter( lvl ),level );
272        }
273
274        /**
275         * 【TAG】画面リソースの条件となるRWモードを指定します。
276         *
277         * @og.tag
278         * RWモード判定は、文字列レベルの判定を行います。(通常のRW判定と異なります)
279         * RWモードの代表的な記述は、mw,mr,-w,-r です。ここでは、特殊な検索は出来ないため、
280         * 上記文字列そのままで、一致するか、m,- の前方一致で判断するかのどちらかです。
281         *
282         * ロール等の他の条件でピックアップされたリソースと AND 処理されます。
283         * 何も指定しなければ、すべてを対象とします。
284         *
285         * @param       mode    RWモード
286         */
287        public void setRwmode( final String mode ) {
288                rwmode = nval( getRequestParameter( mode ),rwmode );
289        }
290
291        /**
292         * シリアライズ用のカスタムシリアライズ書き込みメソッド
293         *
294         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
295         * @serialData 一部のオブジェクトは、シリアライズされません。
296         *
297         * @param       strm    ObjectOutputStreamオブジェクト
298         * @throws IOException  入出力エラーが発生した場合
299         */
300        private void writeObject( final ObjectOutputStream strm ) throws IOException {
301                strm.defaultWriteObject();
302        }
303
304        /**
305         * シリアライズ用のカスタムシリアライズ読み込みメソッド
306         *
307         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
308         *
309         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
310         * @serialData 一部のオブジェクトは、シリアライズされません。
311         *
312         * @param       strm    ObjectInputStreamオブジェクト
313         * @see #release2()
314         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
315         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
316         */
317        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
318                strm.defaultReadObject();
319        }
320
321        /**
322         * このオブジェクトの文字列表現を返します。
323         * 基本的にデバッグ目的に使用します。
324         *
325         * @return このクラスの文字列表現
326         */
327        @Override
328        public String toString() {
329                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
330                                .println( "VERSION"             ,VERSION        )
331                                .println( "roles"               ,roles  )
332                                .fixForm().toString()
333                        + HybsSystem.CR
334                        + super.toString() ;
335        }
336}