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 = "7.4.4.0 (2021/06/30)" ; 092 private static final long serialVersionUID = 744020210630L ; 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 * @og.rev 7.4.4.0 (2021/06/30) openGionV8事前準備(DataRole.java廃止) 165 * 166 */ 167 protected void execute() { 168 // final UserInfo userInfo = new UserInfo( "XX","ja","DUMMY",roles,null,"GF","127.0.0.1",null ); 169 final UserInfo userInfo = new UserInfo( "XX","ja","DUMMY",roles,"GF","127.0.0.1",null ); 170 171 getResource().makeGUIInfos( userInfo ); 172 173 final GUIInfo[] guiInfos = userInfo.getGUIInfos(); 174 175 for( int i=0; i<guiInfos.length; i++ ) { 176 addGUIInfo( guiInfos[i] ); 177 } 178 executeCount = table.getRowCount(); 179 } 180 181 /** 182 * 初期化された DBTableModel を返します。 183 * 184 * @return テーブルモデル 185 */ 186 private DBTableModel initDBTable() { 187 final DBTableModel tbl = DBTableModelUtil.newDBTable(); 188 189 tbl.init( SELECT.length ); 190 for( int i=0; i<SELECT.length; i++ ) { 191 final DBColumn dbColumn = getDBColumn( SELECT[i] ); 192 tbl.setDBColumn( i,dbColumn ); 193 } 194 195 return tbl ; 196 } 197 198 /** 199 * DBTableModel に、ファイル情報をセットします。 200 * ファイルの検索結果は、GUIKEY,ADDRESS,REALADDRESS,SEQNO,GROUPS,CLASSIFY,LEVEL, 201 * NAME_JA,SNAME,LNAME,ROLES,RWMODE,TARGET,PARAM,KBLINK,DESCRIPTION,DYUPD のカラムを持つ 202 * DBTableModel にセット されます。このカラムは、固定です。 203 * 204 * @og.rev 5.3.3.0 (2011/03/01) 更新日時追加、分類を名称でセット 205 * 206 * @param guiInfo セットする画面リソース 207 */ 208 private void addGUIInfo( final GUIInfo guiInfo ) { 209 final String guiLevel = String.valueOf( guiInfo.getLevel() ); 210 if( level != null && !level.equals( guiLevel ) ) { return; } 211 212 final String guiMode = guiInfo.getMode(); 213 if( rwmode != null && guiMode != null && !guiMode.startsWith( rwmode ) ) { return; } 214 215 String[] data = new String[ SELECT.length ]; 216 217 data[GUIKEY ] = guiInfo.getKey(); 218 data[ADDRESS ] = guiInfo.getAddress(); 219 data[REALADDRESS] = guiInfo.getRealAddress(); 220 data[SEQNO ] = String.valueOf( guiInfo.getSequence() ); 221 data[GROUPS ] = guiInfo.getGroups(); 222 data[CLASSIFY ] = getResource().getLabel( guiInfo.getClassify() ); 223 data[LEVEL ] = guiLevel; 224 data[NAME_JA ] = guiInfo.getLabel(); 225 data[SNAME ] = guiInfo.getName(); 226 data[LNAME ] = guiInfo.getLongName(); 227 data[ROLES ] = guiInfo.getRoles(); 228 data[RWMODE ] = guiMode; 229 data[TARGET ] = guiInfo.getTarget(); 230 data[PARAM ] = guiInfo.getParam(); 231 data[KBLINK ] = guiInfo.getKblink(); 232 data[DESCRIPTION] = guiInfo.getDescription(); 233 data[DYUPD ] = guiInfo.getDyupd(); 234 235 table.addColumnValues( data ); 236 } 237 238 /** 239 * 【TAG】画面リソースの条件となるロールズを指定します。 240 * 241 * @og.tag 242 * ロールズ判定は、ダミーユーザーを作成して通常の処理と同様の判定方式で 243 * 有効な画面リソースをピックアップします。 244 * 245 * @param rols ロールズ 246 */ 247 public void setRoles( final String rols ) { 248 roles = nval( getRequestParameter( rols ),roles ); 249 } 250 251 /** 252 * 【TAG】画面リソースの条件となるレベルを指定します。 253 * 254 * @og.tag 255 * レベル判定は、文字列レベルの判定を行います。 256 * 画面リソースの階層番号(レベル)は、 257 * 0:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます) 258 * 1:トップ階層(【分類名称】) 259 * 2:選択階層(通常の折りたたみメニュー) 260 * 3:選択非表示(通常は、隠してあります) 261 * です。 262 * 263 * ロール等の他の条件でピックアップされたリソースと AND 処理されます。 264 * 何も指定しなければ、すべてを対象とします。 265 * 266 * @param lvl ロールズ 267 */ 268 public void setLevel( final String lvl ) { 269 level = nval( getRequestParameter( lvl ),level ); 270 } 271 272 /** 273 * 【TAG】画面リソースの条件となるRWモードを指定します。 274 * 275 * @og.tag 276 * RWモード判定は、文字列レベルの判定を行います。(通常のRW判定と異なります) 277 * RWモードの代表的な記述は、mw,mr,-w,-r です。ここでは、特殊な検索は出来ないため、 278 * 上記文字列そのままで、一致するか、m,- の前方一致で判断するかのどちらかです。 279 * 280 * ロール等の他の条件でピックアップされたリソースと AND 処理されます。 281 * 何も指定しなければ、すべてを対象とします。 282 * 283 * @param mode RWモード 284 */ 285 public void setRwmode( final String mode ) { 286 rwmode = nval( getRequestParameter( mode ),rwmode ); 287 } 288 289 /** 290 * このオブジェクトの文字列表現を返します。 291 * 基本的にデバッグ目的に使用します。 292 * 293 * @return このクラスの文字列表現 294 * @og.rtnNotNull 295 */ 296 @Override 297 public String toString() { 298 return ToString.title( this.getClass().getName() ) 299 .println( "VERSION" ,VERSION ) 300 .println( "roles" ,roles ) 301 .fixForm().toString() 302 + CR 303 + super.toString() ; 304 } 305}