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