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