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.common.HybsSystemException; 020import org.opengion.hayabusa.resource.URLXfer; 021import org.opengion.fukurou.util.StringUtil ; 022import static org.opengion.fukurou.system.HybsConst.CR ; // 6.1.0.0 (2014/12/26) 023 024import javax.servlet.http.HttpSession ; 025import javax.servlet.http.HttpServletResponse; 026import javax.servlet.http.HttpServletRequest; 027import javax.servlet.jsp.tagext.TagSupport ; 028import javax.servlet.jsp.JspWriter ; 029 030import java.io.IOException; 031import java.util.concurrent.atomic.AtomicInteger; // 6.3.9.0 (2015/11/06) 032 033/** 034 * マルチセッション起動チェックを行います。 035 * 036 * このタグは、特殊で、一番最上位のJSP(通常は、jsp/index.jsp)に仕込むことで、 037 * マルチセッション起動チェックを行います。 038 * とくに、TopMenuTag と関連しており、このタグが存在しないと、メニューが 039 * 動作しません。 040 * このタグでは、URLXfer による、リンク変換転送をサポートします。 041 * URLのXFER変数をキーに、GE17 テーブルを検索し、指定のURLへ sendRedirect します。 042 * 043 * @og.formSample 044 * ●形式:<og:jspInit /> 045 * ●body:なし 046 * 047 * ●使用例 048 * <og:jspInit /> 049 * 050 * @og.rev 4.0.0.0 (2005/08/31) 新規作成 051 * @og.group メニュー制御 052 * 053 * @version 4.0 054 * @author Kohei Naruse 055 * @since JDK5.0, 056 */ 057public class JspInitTag extends TagSupport { 058 /** このプログラムのVERSION文字列を設定します。 {@value} */ 059 private static final String VERSION = "6.3.9.0 (2015/11/06)" ; 060 private static final long serialVersionUID = 639020151106L ; 061 062 private static final AtomicInteger MSC_CNT = new AtomicInteger(); // 6.3.9.0 (2015/11/06) 063 064 /** 065 * 同一セッションでのマルチ起動対策用カウンタを、同期処理します。 066 * 067 * この count は、適当でよかったのですが、findBugs で、警告されるため、きちんとしておきます。 068 * 069 * @og.rev 6.0.2.5 (2014/10/31) findBugs対応。 070 * @og.rev 6.3.9.0 (2015/11/06) Use block level rather than method level synchronization.(PMD) 071 * 072 * @return マルチ起動対策用カウンタの値 073 */ 074 private static String getCount() { 075 return String.valueOf( MSC_CNT.getAndIncrement() ); // 互換性のため、今の値を取得してから、+1する。 076 } 077 078 /** 079 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 080 * 081 * @og.rev 4.1.1.0 (2008/02/07) UserInfo の再作成する機能を追加 082 * @og.rev 4.2.2.0 (2008/05/28) Guestユーザ対応 083 * @og.rev 4.3.4.1 (2008/12/08) UserInfo の再作成する機能を削除 084 * @og.rev 5.7.4.3 (2014/03/28) 出力する HTML は、フィルターします。 085 * @og.rev 5.7.6.2 (2014/05/16) IEのHTML5機能が有効か無効かの判定キーを削除(初期化)します。 086 * @og.rev 6.0.2.5 (2014/10/31) マルチ起動対策用カウンタのfindBugs対応。 087 * 088 * @return 後続処理の指示 089 */ 090 @Override 091 public int doEndTag() { 092 // 5.7.4.3 (2014/03/28) エラー時でも、debug=true があれば、継続する。 093 final HttpServletRequest request = ( HttpServletRequest )pageContext.getRequest(); 094 final boolean debug = "true".equalsIgnoreCase( request.getParameter( "debug" ) ); 095 096 // Tomcat 初期起動時の common/SystemParameter.java でエラーが発生した場合。 097 // 6.4.2.1 (2016/02/05) PMD refactoring. Prefer StringBuffer over += for concatenating strings 098 final String cntxErrMsg = HybsSystem.sys( HybsSystem.LOCAL_CONTX_ERR_KEY ); 099 if( cntxErrMsg != null && !debug ) { 100 try { 101 final JspWriter out = pageContext.getOut(); 102 out.println( "<html><body><pre>" ); 103 // 5.7.4.3 (2014/03/28) 出力する HTML は、フィルターします。 104 out.println( StringUtil.htmlFilter( cntxErrMsg ) ); 105 out.println( "</pre></body></html>" ); 106 } 107 catch( final IOException ex ) { 108 // 6.4.2.1 (2016/02/05) PMD refactoring. Prefer StringBuffer over += for concatenating strings 109 final String errMsg = "画面出力時の PageContext の取得時にエラーが発生しました。" 110 + CR 111 + cntxErrMsg ; 112 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び順変更 113 } 114 return SKIP_PAGE ; // ページの残りの処理を行わない。 115 } 116 117 final HttpSession session = pageContext.getSession(); 118 synchronized( JspInitTag.class ) { 119 // 3.8.0.0 (2005/06/07) 同一セッションでのマルチ起動対策を行います。 120 session.setAttribute( HybsSystem.MULTI_SESSION_CHECK, getCount() ); // 6.0.2.5 (2014/10/31) 121 } 122 123 // 5.7.6.2 (2014/05/16) IEのHTML5機能が有効か無効かの判定キーを削除(初期化)します。 124 session.removeAttribute( HybsSystem.IE_HTML5_KEY ); 125 126 // URLXfer による、リンク変換転送機能 127 final String key = request.getParameter( "XFER" ); 128 if( key != null ) { 129 final URLXfer xfer = new URLXfer(); 130 final String url = xfer.getRedirectURL( key ); 131 if( url != null ) { 132 try { 133 final HttpServletResponse response = (HttpServletResponse)pageContext.getResponse(); 134 response.sendRedirect( url ); 135 return SKIP_PAGE ; // ページの残りの処理を行わない。 136 } 137 catch( final IOException ex ) { 138 // 6.4.2.1 (2016/02/05) PMD refactoring. Prefer StringBuffer over += for concatenating strings 139 final String errMsg = "URLの振り分け処理時に IOException が発生しました。 XFER=" + key; 140 throw new HybsSystemException( errMsg,ex ); 141 } 142 } 143 } 144 145 return EVAL_PAGE ; // ページの残りを評価する。 146 } 147}