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