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.fukurou.util.Attributes; 021import org.opengion.fukurou.util.XHTMLTag ; 022 023import static org.opengion.fukurou.util.StringUtil.nval ; 024 025import javax.servlet.http.HttpServletRequest ; 026 027/** 028 * サブミットボタンの表示や、画面遷移先情報(forward.jsp)を制御するタグです。 029 * 030 * ユーザー情報と画面情報を元に、ロール/グループの権限と 031 * RW(読取/書込)モードを比較して、条件が成立しない場合は,そのBODY部を表示しないように 032 * できます。 033 * また、エディット設定を行っている場合は、強制的に書き込み禁止に設定しています。 034 * このタグは、form 内に一つだけ記述してください。 035 * 036 * @og.formSample 037 * ●形式:<og:writeCheck /> 038 * ●body:あり(EVAL_BODY_INCLUDE:BODYをインクルードし、{@XXXX} は解析しません) 039 * 040 * ●Tag定義: 041 * <og:writeCheck 042 * useGamenId 【TAG】GAMENID,BACK_GAMENID 属性を付加するかどうか[true/false]を設定します(初期値:true) 043 * roles 【TAG】画面と別にロールズを与えます 044 * writable 【TAG】書き込み可能かどうか[true/false]を設定します(初期値:true) 045 * useDummy 【TAG】IE用ダミーinputを出力するかどうか 046 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 047 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 048 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:true) 049 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:true) 050 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 051 * > ... Body ... 052 * </og:writeCheck> 053 * 054 * ●使用例 055 * <og:writeCheck> 056 * <og:submit value="copy" lbl="COPY" accesskey="C" /> 057 * <og:submit value="modify" lbl="MODIFY" accesskey="M" /> 058 * <og:submit value="delete" lbl="DELETE" accesskey="D" /> 059 * <jsp:directive.include file="{@SYS.JSP}/common/Excel_direct.jsp" /> 060 * <br /> 061 * </og:writeCheck> 062 * 063 * @og.group 画面制御 064 * 065 * @version 4.0 066 * @author Kazuhiko Hasegawa 067 * @since JDK5.0, 068 */ 069public class WriteCheckTag extends CommonTagSupport { 070 //* このプログラムのVERSION文字列を設定します。 {@value} */ 071 private static final String VERSION = "5.7.8.0 (2014/07/04)" ; 072 073 private static final long serialVersionUID = 578020140704L ; 074 075 private static final String DUMMY_INPUT = "HYBS_DUMMY_NPUT"; // 5.6.1.0 (2013/02/01) 076 077 // 3.5.4.0 (2003/11/25) BACK_GAMENID を使用する/しないを指定します。 078 private boolean useGamenId = true; 079 // 3.5.4.0 (2003/11/25) 画面と別にロールズを与えられます。 080 private String roles = null; 081 082 // 3.8.5.1 (2006/05/08) 書き込み許可属性 writable 追加 083 private boolean writable = true; 084 085 // 5.5.4.2 (2012/06/13) EDITNAME利用時の編集 086 private boolean useEdit = HybsSystem.sysBool( "USE_EDIT_WITH_EDITNAME" ); 087 private boolean outputEditName = HybsSystem.sysBool( "OUTPUT_EDITNAME" ); // EditNameをhidden出力するか 088 089 // 5.6.1.0 (2013/02/01) display:noneのダミー出力 090 private boolean useDummy = HybsSystem.sysBool( "USE_DUMMY_INPUT" ); 091 092 /** 093 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 094 * 095 * @og.rev 3.0.1.2 (2003/03/07) forward.jsp の代替用 CommonForwardTag を新規作成 096 * @og.rev 3.5.4.0 (2003/11/25) useGamenId で、BACK_GAMENID を使用する/しないを指定します。 097 * @og.rev 3.8.5.1 (2006/05/08) 書き込み許可属性 writable 追加 098 * @og.rev 5.6.1.0 (2013/02/01) display:noneのdummyインプットを出力する 099 * @og.rev 5.7.8.0 (2014/07/04) caseKey,caseVal,caseNN,caseNull 属性を追加 100 * 101 * @return 後続処理の指示 102 */ 103 @Override 104 public int doStartTag() { 105 if( writable && isWrite() && useTag() ) { // 5.7.8.0 (2014/07/04) 追加 106// if( writable && isWrite() ) { 107 if( useDummy ){ jspPrint( getDummyInput() ); } // 5.6.1.0 (2013/02/01) 108 if( useGamenId ) { jspPrint( getHiddenTag() ); } 109 return EVAL_BODY_INCLUDE ; 110 } 111// else { 112 return SKIP_BODY ; 113// } 114 } 115 116 /** 117 * タグリブオブジェクトをリリースします。 118 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 119 * 120 * @og.rev 3.5.4.0 (2003/11/25) 新規追加。 121 * @og.rev 3.8.5.1 (2006/05/08) 書き込み許可属性 writable 追加 122 * @og.rev 5.5.4.2 (2012/07/13) EDITNAME利用時の編集 123 * @og.rev 5.6.1.0 (2013/02/01) useDummy 124 * 125 */ 126 @Override 127 protected void release2() { 128 super.release2(); 129 useGamenId = true; 130 roles = null; 131 writable = true; // 3.8.5.1 (2006/05/08) 132 useEdit = HybsSystem.sysBool( "USE_EDIT_WITH_EDITNAME" ); // 5.5.4.2 (2012/06/13) 133 outputEditName = HybsSystem.sysBool( "OUTPUT_EDITNAME" ); // 5.5.4.2 (2012/06/13) 134 useDummy = HybsSystem.sysBool( "USE_DUMMY_INPUT" ); // 5.6.1.0 (2013/02/01) 135 } 136 137 /** 138 * guiInfo.isWrite() の結果をチェック[true/false]して返します。 139 * 140 * @og.rev 3.5.4.0 (2003/11/25) 画面と別にロールズを与えられます。 141 * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応 142 * @og.rev 5.3.6.0 (2011/06/01) エディット設定時もfalse(書き込み禁止)とする。 143 * @og.rev 5.5.4.2 (2012/07/13) EDITNAME利用時の登録 144 * 145 * @return 書き込み許可があるかどうか[true/false] 146 */ 147 private boolean isWrite() { 148 boolean rtnFlag = false; 149 150 // 4.0.0 (2005/11/30) 指定のロールが、アクセス許可の場合は、出力します。 151 if( roles != null ) { 152 rtnFlag = getUser().isAccess( roles ) ; 153 } 154 else { 155 GUIInfo guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY ); 156 rtnFlag = guiInfo.isWrite() ; // 4.0.0 (2005/01/31) 157 } 158 159 // 5.3.6.0 (2011/06/01) エディット設定時もfalse(書き込み禁止)とする。 160 if( rtnFlag ) { 161 String editName = getRequestValue( "editName" ); 162 if( editName != null && editName.length() > 0 ) { 163 // rtnFlag = false; 164 rtnFlag = useEdit; // 5.5.4.2 (2012/07/13) 165 } 166 } 167 168 return rtnFlag; 169 } 170 171 /** 172 * 隠し属性タグを取得します。 173 * 174 * ※内部コール用 175 * 176 * @og.rev 3.0.1.2 (2003/03/07) forward.jsp の代替用 CommonForwardTag を新規作成 177 * @og.rev 3.1.7.0 (2003/05/02) 画面IDのセットで、自画面を、BACK_GAMENID 、飛び先を、GAMENID にする。 178 * @og.rev 3.1.8.0 (2003/05/16) BACK_GAMENID を、リクエスト情報ではなく、GUI.KEY を利用するように修正。 179 * @og.rev 3.5.5.5 (2004/04/23) hidden の出力に、XHTMLTag.hidden を使用します。 180 * @og.rev 3.8.8.2 (2007/01/26) hidden の出力に、GAMENID を使用します。 181 * @og.rev 5.5.4.2 (2012/07/13) editNameの出力を追加 182 * 183 * @return 隠し属性タグ 184 */ 185 private final String getHiddenTag() { 186 187 String requestURI = ((HttpServletRequest)getRequest()).getRequestURI(); 188 if( requestURI == null ) { 189 return ""; 190 } 191 192 int index2 = requestURI.lastIndexOf( '/' ); 193 String jspID = requestURI.substring( index2 + 1 ); 194 String gamenId = getGUIInfoAttri( "KEY" ); // 4.0.0 (2005/01/31) 195 196 StringBuilder strRet = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 197 strRet.append( XHTMLTag.hidden( "BACK_GAMENID",gamenId ) ); 198 strRet.append( XHTMLTag.hidden( "BACK_JSPID" ,jspID ) ); 199 strRet.append( XHTMLTag.hidden( "GAMENID" ,gamenId ) ); // 3.8.8.2 200 if( useEdit & outputEditName ){ // 5.5.4.2 (2012/07/13) 201 strRet.append( XHTMLTag.hidden( "editName" ,getRequestValue( "editName" ) ) ); 202 } 203 204 return strRet.toString(); 205 } 206 207 /** 208 * IEのEnterボタンのための、隠しinput出力。 209 * 210 * ※内部コール用 211 * 212 * @og.rev 5.6.1.0 (2013/02/01) 新規作成 213 * 214 * @return 隠し属性タグ 215 */ 216 private final String getDummyInput() { 217 218 StringBuilder strRet = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 219 Attributes attributes = new Attributes(); 220 attributes.set("name",DUMMY_INPUT); 221 attributes.set("value",null); 222 attributes.set("optionAttributes","style='display:none;'"); 223 strRet.append( XHTMLTag.input( attributes ) ); 224 225 return strRet.toString(); 226 } 227 228 /** 229 * 【TAG】GAMENID,BACK_GAMENID 属性を付加するかどうか[true/false]を設定します(初期値:true)。 230 * 231 * @og.tag 232 * "true"の場合は、BACK_GAMENID 、BACK_JSPID 属性を hidden で出力します。 233 * "false"の場合は、付加しません。 234 * これは、戻るリンクを作成する場合に利用されます。 235 * 初期値は、 "true"です。 236 * ボタンで遷移先がポップアップ画面の場合に、戻るリンクを出しても戻れない為、 237 * そのようなケースでは false にします。 238 * 239 * @og.rev 3.5.4.0 (2003/11/25) useGamenId のために、新規追加。 240 * 241 * @param flag BACK_GAMENID 属性を付加するかどうか 242 * "true"(追加する)/その他(追加しない) 243 */ 244 public void setUseGamenId( final String flag ) { 245 useGamenId = nval( getRequestParameter( flag ),useGamenId ); 246 } 247 248 /** 249 * 【TAG】画面と別にロールズを与えます。 250 * 251 * @og.tag 252 * このロールズが与えられた場合は、画面のロールズではなく、 253 * 個別のロールズを使用して、表示の制御を行います。 254 * 255 * @og.rev 3.5.4.0 (2003/11/25) 新規追加。 256 * 257 * @param rols ロールズ 258 */ 259 public void setRoles( final String rols ) { 260 roles = nval( getRequestParameter( rols ),roles ); 261 } 262 263 /** 264 * 【TAG】書き込み可能かどうか[true/false]を設定します(初期値:true)。 265 * 266 * @og.tag 267 * 書込み許可する場合は, true、許可しない場合は, true 以外を設定します。 268 * デフォルト値は、互換性のため、true です。 269 * ここで、false を設定するとBODY部の内容は表示されません。true を設定した場合、 270 * 通常通り BODY 部は表示されます。 271 * これは、roles の簡易版として、外部から ON/OFF を制御するのに使用できます。 272 * 273 * @og.rev 3.8.5.1 (2006/05/08) 書き込み許可属性 writable 追加 274 * 275 * @param flag 書込み [true:許可/それ以外:禁止] 276 */ 277 public void setWritable( final String flag ) { 278 writable = nval( getRequestParameter( flag ),writable ); 279 } 280 281 /** 282 * 【TAG】EDITNAME利用時の編集を可能にするか設定します 283 * (初期値:USE_EDIT_WITH_EDITNAME[={@og.value org.opengion.hayabusa.common.SystemData#USE_EDIT_WITH_EDITNAME}])。 284 * 285 * @og.tag 286 * カラムの並び替えや表示等を設定した場合に編集可能にするかを設定します。 287 * (つまり、ボタンを出すかどうかをコントロールします) 288 * (初期値:USE_EDIT_WITH_EDITNAME[={@og.value org.opengion.hayabusa.common.SystemData#USE_EDIT_WITH_EDITNAME}])。 289 * 290 * @og.rev 5.5.4.2 (2012/07/13) 新規追加 291 * 292 * @param flag 編集可能に[する(true)/しない(false)] 293 * @see org.opengion.hayabusa.common.SystemData#USE_EDIT_WITH_EDITNAME 294 */ 295 public void setUseEdit( final String flag ) { 296 useEdit = nval( getRequestParameter( flag ), useEdit ); 297 } 298 299 /** 300 * 【TAG】editNameをhiddenタグで出力するか設定します 301 * (初期値:OUTPUT_EDITNAME[={@og.value org.opengion.hayabusa.common.SystemData#OUTPUT_EDITNAME}])。 302 * 303 * @og.tag 304 * 選択したeditNameを次の画面に送信するためのhiddenタグを出力します。 305 * editNameを次の画面に送信した場合は送信先画面のviewタグのviewFormTypeが 306 * 内部的に自動セットされるため注意が必要です。 307 * useEditがfalseの場合は出力しません。 308 * (初期値:OUTPUT_EDITNAME[={@og.value org.opengion.hayabusa.common.SystemData#OUTPUT_EDITNAME}])。 309 * 310 * @og.rev 5.5.4.2 (2012/07/13) 新規追加 311 * 312 * @param flag 編集可能に[する(true)/しない(false)] 313 * @see org.opengion.hayabusa.common.SystemData#OUTPUT_EDITNAME 314 */ 315 public void setOutputEditName( final String flag ) { 316 outputEditName = nval( getRequestParameter( flag ), outputEditName ); 317 } 318 319 /** 320 * 【TAG】ダミーのinputタグ(display:none)を出力するか設定します。 321 * (初期値:USE_DUMMY_INPUT[={@og.value org.opengion.hayabusa.common.SystemData#USE_DUMMY_INPUT}])。 322 * 323 * @og.tag 324 * ダミーのinputタグ(display:none)を出力するか設定します。 325 * IEではinputが1つだけの場合にエンターでのsubmitが上手くいかないため、ダミーを配置する必要があります。 326 * trueに設定するとWriteCheckタグがダミーを(常に)出力します。 327 * (初期値:USE_DUMMY_INPUT[={@og.value org.opengion.hayabusa.common.SystemData#USE_DUMMY_INPUT}])。 328 * 329 * @og.rev 5.6.1.0 (2013/02/01) 新規追加 330 * 331 * @param flag 出力[する(true)/しない(false)] 332 * @see org.opengion.hayabusa.common.SystemData#USE_DUMMY_INPUT 333 */ 334 public void setUseDummy( final String flag ) { 335 useDummy = nval( getRequestParameter( flag ), useDummy ); 336 } 337 338 /** 339 * このオブジェクトの文字列表現を返します。 340 * 基本的にデバッグ目的に使用します。 341 * 342 * @return このクラスの文字列表現 343 */ 344 @Override 345 public String toString() { 346 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 347 .println( "VERSION" ,VERSION ) 348 .println( "useGamenId" ,useGamenId ) 349 .println( "roles" ,roles ) 350 .println( "Other..." ,getAttributes().getAttribute() ) 351 .fixForm().toString() ; 352 } 353}