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}