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.common.HybsSystemException;
020    
021    import org.opengion.hayabusa.resource.GUIInfo;
022    import org.opengion.hayabusa.resource.UserInfo;
023    import org.opengion.hayabusa.resource.FavoriteGUIData;
024    
025    import org.opengion.fukurou.util.XHTMLTag;
026    
027    import static org.opengion.fukurou.util.StringUtil.nval ;
028    
029    import javax.servlet.http.HttpServletRequest ;
030    import javax.servlet.http.HttpServletResponse;
031    
032    import java.util.Enumeration;
033    import java.util.ArrayList;
034    import java.util.Map;
035    import java.util.HashMap;
036    
037    import java.io.IOException;
038    
039    /**
040     * お気に入りリンクを作?するタグで?通常はresult.jspに?み)?
041     *
042     * 画面検索時?引数?ーザー??を?にして、ダイレクトに再検索できる
043     * リンクを作?します?こ?リンクをお気に入り等にセーブしておき、次回検索時に?
044     * 使用できるようにします?
045     *
046     * @og.formSample
047     * ●形式?lt;og:favoriteLink direct="true" target="_blank" method="GET" />
048     * ●body?あ?EVAL_BODY_BUFFERED:BODYを評価し?{@XXXX} を解析しま?
049     *
050     * ●Tag定義??
051     *   <og:favoriteLink
052     *       target             【TAG】リンク先??を表示させるフレー??また?ウィンドウの名前を指定しま?初期値:_blank)
053     *       direct             【TAG】直接アクセスできる形式?リンクを作?するかど?[true/false]を指定しま?初期値:false)
054     *       method             【TAG】リンクの作??なるメソ?[POST/GET/ALL]を指定しま?初期値:GET)
055     *       href               【TAG】リンクを作?する時?転送?アドレスを指定しま?初期値:index.jsp)
056     *       lbl                【TAG】ラベルリソースのラベルIDを指定しま?
057     *       linkCache          【TAG】リンクをキャ?ュするかど?[true/false]を指定しま?初期値:false)
058     *       lastQueryRedirect  【TAG】キャ?ュされたリンク先に転送するかど?[true/false]を指定しま?初期値:false)
059     *       debug              【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false)
060     *       useIcon            【TAG】お気に入りアイコンリンクを作?するかど?[true/false]を指定しま?初期値:false)
061     *   >   ... Body ...
062     *   </og:favoriteLink>
063     *
064     * ●使用例?
065     *    直接お気に入り?リンクを作?する?
066     *    ?ォルト属?を使用(direct="true" target="_blank" method="GET")
067     *    <og:favoriteLink > Favorite Link </og:favoriteLink >
068     *
069     * @og.group 画面部?
070     *
071     * @version  4.0
072     * @author       Kazuhiko Hasegawa
073     * @since    JDK5.0,
074     */
075    public class FavoriteLinkTag extends CommonTagSupport {
076            //* こ?プログラ??VERSION??を設定します?       {@value} */
077            private static final String VERSION = "5.0.0.2 (2009/09/15)" ;
078    
079            private static final long serialVersionUID = 500220090915L ;
080    
081            private static final Map<String,String>   lastQuery   = new HashMap<String,String>();       // 3.5.6.2 (2004/07/05)
082    
083            private boolean         direct          = false;                // 3.0.0.0 初期値変更
084            private String          target          = "_blank";             // 3.6.0.7 (2004/11/06)
085            private String          method          = "GET";
086            private String          href            = "index.jsp";  // 3.8.8.2 (2007/01/26)
087            private boolean         linkCache       = false;                // 3.5.5.9 (2004/06/07)
088            private boolean         redirect        = false;                // 3.5.5.9 (2004/06/07)
089            private boolean         useIcon         = false;                // 4.1.1.0 (2008/02/13)
090    
091            /**
092             * Taglibの開始タグが見つかったときに処??doStartTag() ?オーバ?ライドします?
093             *
094             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?ボディが存在する場合?みボディが呼ばれる対応?
095             * @og.rev 3.5.5.9 (2004/06/07) リンクキャ?ュより?画面を転送表示します?
096             * @og.rev 5.0.0.2 (2009/09/15) xss対?>チェ?する
097             *
098             * @return      後続????
099             */
100            @Override
101            public int doStartTag() {
102                    // 5.0.0.2 (2009/09/15) 強制False
103                    // useXssCheck( false );
104    
105                    // 3.5.5.9 (2004/06/07) リンクキャ?ュより?画面を転送表示
106                    if( redirect ) {
107                            final String page ;
108                            synchronized( lastQuery ) {
109                                    page = lastQuery.get( getUserInfo( "ID" ) ) ;
110                            }
111                            if( page != null ) {
112                                    HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();
113                                    String url = response.encodeRedirectURL( page );
114                                    try {
115                                            response.sendRedirect( url );
116                                    }
117                                    catch ( IOException ex ) {
118                                            String errMsg = "?画面の転送時のリ?レクトエラー" + toString();
119                                            throw new HybsSystemException( errMsg,ex );
120                                    }
121    
122                                    return( SKIP_BODY );
123                            }
124                    }
125    
126                    set( "body",getMsglbl() );
127                    return( EVAL_BODY_BUFFERED );   // Body を評価する? extends BodyTagSupport ?
128            }
129    
130            /**
131             * Taglibのタグ本体を処??doAfterBody() ?オーバ?ライドします?
132             *
133             * @og.rev 3.1.1.0 (2003/03/28) ボディの?を取得する??、CommonTagSupport で行う?
134             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?ボディが存在する場合?みボディが呼ばれる対応?
135             *
136             * @return      後続????(SKIP_BODY)
137             */
138            @Override
139            public int doAfterBody() {
140    
141                    String label = getBodyString();
142    
143                    if( label != null && label.length() > 0 ) {
144                            set( "body",label );
145                    }
146    
147                    return(SKIP_BODY);
148            }
149    
150            /**
151             * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
152             *
153             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
154             * @og.rev 4.1.1.0 (2008/0213) お気に入りアイコンリンクの作?
155             *
156             * @return      後続????
157             */
158            @Override
159            public int doEndTag() {
160                    debugPrint();           // 4.0.0 (2005/02/28)
161    
162                    // method による条件判断?
163                    String requestMethod = ((HttpServletRequest)getRequest()).getMethod();
164                    if( method != null &&
165                            ( "ALL".equalsIgnoreCase( method ) ||
166                              method.equalsIgnoreCase( requestMethod ) ) ) {
167                                    // 4.1.1.0 (2008/0213) お気に入りアイコンリンクの作?
168                                    if ( useIcon ) {
169                                            jspPrint( getFavoriteIcon() );
170                                    }
171                                    else {
172                                            jspPrint( makeTag() );
173                                    }
174                    }
175    
176                    return(EVAL_PAGE);
177            }
178    
179            /**
180             * タグリブオブジェクトをリリースします?
181             * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
182             *
183             * @og.rev 2.0.0.4 (2002/09/27) カスタ?グの release() メソ?を?追?
184             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
185             * @og.rev 3.5.5.9 (2004/06/07) linkCache , redirect 属?を追?
186             * @og.rev 3.6.0.7 (2004/11/06) target 属?の初期値?_new から _blank に変更
187             * @og.rev 3.8.8.2 (2007/01/26) href 属?を追?
188             *
189             */
190            @Override
191            protected void release2() {
192                    super.release2();
193                    direct          = false;
194                    target          = "_blank";             // 3.6.0.7 (2004/11/06)
195                    method          = "GET";
196                    href            = "index.jsp";  // 3.8.8.2 (2007/01/26)
197                    linkCache       = false;                // 3.5.5.9 (2004/06/07)
198                    redirect        = false;                // 3.5.5.9 (2004/06/07)
199            }
200    
201            /**
202             * お気に入りリンクを作?します?
203             *
204             * @og.rev 3.8.8.2 (2007/01/26) href 属?を追?
205             *
206             * @return      お気に入りリンクタグ??
207             */
208            protected String makeTag() {
209                    HttpServletRequest request = (HttpServletRequest)getRequest();
210    
211                    // ?レクトリンク時?設?
212    
213                    // リンクの作?
214                    // http://C00000:C00000@hn50g5:8080/dbdef/jsp/index.jsp?GAMENID=xxx&command=NEW&key=val
215                    StringBuilder link = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
216    
217                    link.append( "http://" );
218                    link.append( request.getServerName() ).append( ":" );   // hn50g5:
219                    link.append( request.getServerPort() );                                 // 8823
220                    link.append( request.getContextPath() );                                // /dbdef
221                    link.append( "/jsp/" );
222    
223                    // 4.0.0 (2005/01/31)
224                    String direct_jsp  = getGUIInfoAttri( "ADDRESS" ) + "/" + (String)getSessionAttribute( "JSPID" );
225    
226                    String hrefUrl = link.toString() ;
227                    if( direct ) {
228                            set( "href" , hrefUrl + direct_jsp );
229                    }
230                    else {
231                            set( "href" , hrefUrl + href );         // 3.8.8.2 (2007/01/26)
232                    }
233    
234                    set( "target" ,target );
235                    set( "title"  ,getGUIInfoAttri( "LABEL" ) );    // 4.0.0 (2005/01/31)
236    
237                    String urlEnc = makeUrlEncode( request );
238    
239                    // linkCache による、最終リクエスト?アドレスを?納しておきます?
240                    if( linkCache ) {
241                            String key = getUserInfo( "ID" );
242                            String val = hrefUrl + direct_jsp + "?" + urlEnc ;
243                            synchronized( lastQuery ) {
244                                    lastQuery.put( key,val );
245                            }
246                    }
247    
248                    return XHTMLTag.link( getAttributes(),urlEnc ) ;
249            }
250    
251            /**
252             * URLエンコードを行ったリンク??を作?します?
253             *
254             * @og.rev 3.1.0.0 (2003/03/20) Vector を使用して??で?同期でも構わな??を?ArrayList に置換え?
255             * @og.rev 3.1.2.0 (2003/04/07) 画面IDと実画面?レクトリとの関連見直?DIRの代りにGAMENIDを渡すよ?変更)
256             * @og.rev 3.1.8.0 (2003/05/16) ?で作?して? GAMENID 属?をセ?しな??変更?
257             * @og.rev 4.0.0.0 (2007/07/11) submitTag で作?された?タンパラメータは、次ペ?ジへ転送しません?
258             * @og.rev 5.0.0.2 (2009/09/15) xssチェ?対?
259             *
260             * @param       request HttpServletRequestオブジェク?
261             *
262             * @return      URLエンコードを行ったリンク??
263             */
264            private String makeUrlEncode( final HttpServletRequest request ) {
265                    Enumeration<?> enume = request.getParameterNames();               // 4.3.3.6 (2008/11/15) Generics警告対?
266                    ArrayList<String> v_keys = new ArrayList<String>();
267                    ArrayList<String> v_vals = new ArrayList<String>();
268                    while( enume.hasMoreElements() ) {
269                            String key = String.valueOf( enume.nextElement() );
270                            if( key != null && key.startsWith( HybsSystem.NO_XFER_KEY ) ) {
271                                    continue;
272                            }
273    
274                            // String val = getRequestValue( key );
275                            String val = getRequestValue( key, false ); // 5.0.0.2 (2009/09/15)
276                            if( val != null && val.length() > 0 ) {
277                                    v_keys.add( key );
278                                    v_vals.add( val );
279                            }
280                    }
281    
282                    String[] keys = v_keys.toArray( new String[v_keys.size()] );
283                    String[] vals = v_vals.toArray( new String[v_vals.size()] );
284    
285                    return XHTMLTag.urlEncode( keys,vals );
286            }
287    
288            /**
289             * お気に入りアイコンを取得します?
290             * @og.rev 4.1.1.0 (2008/02/12) 新規追?
291             *
292             * @return      お気に入りアイコンのリンクを返します?
293             */
294            private String getFavoriteIcon() {
295                    GUIInfo guiInfo         = ( GUIInfo )getSessionAttribute( HybsSystem.GUIINFO_KEY );
296                    String mscVal           = getRequestValue( "MSC" );
297                    StringBuilder buf       = new StringBuilder( HybsSystem.BUFFER_SMALL );
298    
299                    if( ( guiInfo.isRead() ) && ( mscVal.length() != 0 ) ) {
300                            String gamenId          = guiInfo.getKey();
301                            UserInfo userInfo       = getUser();
302                            Map<String,FavoriteGUIData> favoriteMap = userInfo.getFavoriteMap();
303    
304                            String fgEdit,image,updateLabel;
305                            if( favoriteMap.containsKey( gamenId ) ){
306                                    fgEdit = "0";
307                                    image  = "FAV_MENU_OUT.gif";
308                                    updateLabel  = getLabel( "DELETE" );
309                            }
310                            else {
311                                    fgEdit = "1";
312                                    image  = "FAV_MENU_IN.gif";
313                                    updateLabel  = getLabel( "INSERT" );
314                            }
315    
316                            String geContextName = HybsSystem.sys( "GE_CONTEXT_NAME" );
317                            if ( geContextName.length() == 0 ) {
318                                    String errMsg = "シス?パラメータ GE_CONTEXT_NAME が設定されて?せん?;
319                                    throw new HybsSystemException( errMsg );
320                            }
321    
322                            buf.append( "<a href=\"/").append( geContextName );
323                            buf.append("/jsp/GE0014/update.jsp?fgEdit=" ).append( fgEdit );
324                            buf.append( "&command=NEW" );
325                            buf.append( "&SYSTEM_ID=" ).append( userInfo.getParameter( "SYSTEM_ID" ) );
326                            buf.append( "&GUIKEY=" ).append( gamenId );
327                            buf.append( "&CONTEXT_URL=" ).append( userInfo.getParameter( "CONTEXT_URL" ) );
328                            buf.append( "\">");
329                            buf.append("<img src=\"" ).append( userInfo.getParameter( "JSP" ) );
330                            buf.append( "/image/" ).append( image ).append( "\" " );
331                            buf.append( "title=" ).append( "\"" ).append( getLabel( "FAVORITE_MENU" ) );
332                            buf.append( " " ).append( updateLabel ).append( "\"" );
333                            buf.append( "/></a>" );
334                    }
335    
336                    return buf.toString();
337            }
338    
339            /**
340             * 【TAG】直接アクセスできる形式?リンクを作?するかど?[true/false]を指定しま?初期値:false)?
341             *
342             * @og.tag
343             * <del>trueでは、ユーザー?パスワード?入力なしで直接アクセスできる
344             * 形式?リンクが作?されます?false の場合???常のリンクが作?されます?</del>
345             * trueは、指定?画面のフレー?ベルでの?になります?false は、ト??フレー?
346             * 含?なので??常の登録画面と同じ形式になります?
347             * 初期値は、false(直接リンクしな?です?
348             *
349             * @param       flag ?レクトリンクの作?可否
350             */
351            public void setDirect( final String flag ) {
352                    direct = nval( getRequestParameter( flag ),direct );
353            }
354    
355            /**
356             * 【TAG】リンク先??を表示させるフレー??また?ウィンドウの名前を指定しま?初期値:_blank)?
357             *
358             * @og.tag リンク先?フレー?(ターゲ?属?)を設定します?
359             *
360             * @param       flag リンク先??のフレー?(ターゲ?属?)
361             */
362            public void setTarget( final String flag ) {
363                    target = nval( getRequestParameter( flag ),target );
364            }
365    
366            /**
367             * 【TAG】リンクを作?する時?転送?アドレスを指定しま?初期値:index.jsp)?
368             *
369             * @og.tag
370             * direct="false"(初期値)に使用されるリンクの転送?アドレスを指定します?
371             * 初期値は、index.jspです?
372             *
373             * @param       url 転送?アドレス
374             */
375            public void setHref( final String url ) {
376                    href = nval( getRequestParameter( url ),href );
377            }
378    
379            /**
380             * 【TAG】リンクの作??なるメソ?[POST/GET/ALL]を指定しま?初期値:GET)?
381             *
382             * @og.tag
383             * ここで?したメソ?でリクエストされた場合?み、リンクを作?します?
384             * 初期値は、GET です?(つま?GET のみリンクを作?します?)
385             * これは、POST では、引数が付かな?です?(実際は付ける事ができますが・・・)
386             * ALL は、どちら?場合でもリンクを作?しますが、?に述べたよ? POST では
387             * 引数がつきません?
388             * 初期値は、GETです?
389             *
390             * @param       flag リンクの作??なるメソ? [POST/GET/ALL]
391             */
392            public void setMethod( final String flag ) {
393                    method = nval( getRequestParameter( flag ),method );
394            }
395    
396            /**
397             * 【TAG】リンクをキャ?ュするかど?[true/false]を指定しま?初期値:false)?
398             *
399             * @og.tag
400             * こ?、favoriteLink で?された画面を?ユーザー毎にキャ?ュします?
401             * キャ?ュされた画面は、lastQuery を指定することで、取り??転?
402             * することが?来ます?
403             * ここでのキャ?ュは、direct="true" を指定した?合?アドレスです?
404             * direct="false" は、index.jsp からのフレー?式?為、メール等で
405             * 送り、後ほど再開するような使?(また?、ワークフロー?使?)
406             * を想定して?すが、direct="true" により単独フレー?ータを?
407             * リアルタイ?使用するケース(EXCELのWebクエリーなど)で使用します?
408             * 初期値は、falseです?
409             *
410             * @og.rev 3.5.5.9 (2004/06/07) リンクキャ?ュより?画面を転送表示します?
411             *
412             * @param       flag リンクをキャ?ュするかど? [true:する/false:しない]
413             */
414            public void setLinkCache( final String flag ) {
415                    linkCache = nval( getRequestParameter( flag ),linkCache );
416            }
417    
418            /**
419             * 【TAG】キャ?ュされたリンク先に転送するかど?[true/false]を指定しま?初期値:false)?
420             *
421             * @og.tag
422             * こ?、favoriteLink で?された画面を?キャ?ュします?
423             * キャ?ュされた画面は、lastQuery を指定することで、取り??転?
424             * することが?来ます?
425             * ここでのキャ?ュは、direct="true" を指定した?合?アドレスです?
426             * direct="false" は、index.jsp からのフレー?式?為、メール等で
427             * 送り、後ほど再開するような使?(また?、ワークフロー?使?)
428             * を想定して?すが、direct="true" により単独フレー?ータを?
429             * リアルタイ?使用するケース(EXCELのWebクエリーなど)で使用します?
430             * 初期値は、falseです?
431             *
432             * @og.rev 3.5.5.9 (2004/06/07) リンクキャ?ュより?画面を転送表示します?
433             *
434             * @param       flag リンクをキャ?ュするかど? [true:する/false:しない]
435             */
436            public void setLastQueryRedirect( final String flag ) {
437                    redirect = nval( getRequestParameter( flag ),redirect );
438            }
439    
440            /**
441             * 【TAG】お気に入りアイコンリンクを作?するかど?[true/false]を指定しま?初期値:false)?
442             *
443             * @og.tag
444             * 初期値は、falseです?
445             *
446             * @og.rev 4.1.1.0 (2008/02/13) 新規追??
447             *
448             * @param       flag お気に入りアイコンリンクを作?するかど? [true:する/false:しない]
449             */
450            public void setUseIcon( final String flag ) {
451                    useIcon = nval( getRequestParameter( flag ),useIcon );
452            }
453    
454            /**
455             * リンクキャ?ュをクリアします?
456             * こ?時?poolされて?オブジェクト?、ResourceManager#clear() メソ??
457             * 呼び出します?
458             *
459             * @og.rev 3.5.5.9 (2004/06/07) 新規作?
460             */
461            public static void clear() {
462                    synchronized( lastQuery ) {
463                            lastQuery.clear();
464                    }
465            }
466    
467            /**
468             * こ?オブジェクト???表現を返します?
469             * 基本???目?使用します?
470             *
471             * @return こ?クラスの??表現
472             */
473            @Override
474            public String toString() {
475                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
476                                    .println( "VERSION"             ,VERSION        )
477                                    .println( "direct"              ,direct         )
478                                    .println( "target"              ,target         )
479                                    .println( "method"              ,method         )
480                                    .println( "linkCache"   ,linkCache      )
481                                    .println( "redirect"    ,redirect       )
482                                    .println( "Other..."    ,getAttributes().getAttribute() )
483                                    .fixForm().toString() ;
484            }
485    }