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 */
016 package org.opengion.hayabusa.taglib;
017
018 import org.opengion.hayabusa.common.HybsSystem;
019 import org.opengion.hayabusa.resource.GUIInfo;
020 import org.opengion.fukurou.util.Attributes;
021 import org.opengion.fukurou.util.XHTMLTag ;
022
023 import static org.opengion.fukurou.util.StringUtil.nval ;
024
025 import javax.servlet.http.HttpServletRequest ;
026
027 /**
028 * サブミãƒ?ƒˆボタンの表示ã‚??画面遷移先情報(forward.jsp)を制御するタグですã?
029 *
030 * ユーザーæƒ??と画面æƒ??をå?に、ロール/グループã?権限と
031 * RW(読å�?書込)モードを比è¼?�—て、条件がæ?立しなã�??合ã?,そã?BODY部を表示しなã�?‚ˆã�?�«
032 * できますã?
033 * またã?エãƒ?‚£ãƒ?ƒˆ設定を行ってã�?‚‹場合ã?、強制çš?�«書き込み禁止に設定してã�?�¾すã?
034 * こã?タグは、form å†?�«ä¸?�¤ã�?�‘記述してくださいã€?
035 *
036 * @og.formSample
037 * ●形式ï¼?lt;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 */
069 public 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) 画面?©?¤のセãƒ?ƒˆで、è?画面をã?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 }