/*
 * Copyright (c) 2009 The openGion Project.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package org.opengion.hayabusa.common;

/**
 * 共通的に使用されるエクセプションクラスです。
 *
 * RuntimeException を継承しているため、try{} catch() {} は不要です。
 * 本システムでは、すべてこのエクセプションクラスを継承させたクラスを作成し、用途によって、
 * 使い分けるようにします。つまり、他のどのような、Throwable が発生したとしても、一旦、
 * try{} catch() {} で受けて、このクラスのサブクラスを、再度 throw させます。
 * そして、必要であれば、try{} catch() {} を用いて捕まえて、それぞれの対応処理を行います。
 *
 * このクラスには、元々の発生したエクセプション( Throwable )を引数にとり、
 * その printStackTrace()情報を、自分自身のトレース情報に含めます。
 * また、引数にオブジェクトを渡すことができますので、object.toString() で、オブジェクトの
 * 状態を表示できるようにしておけば、手軽にデバッグに使うことが可能になります。
 *
 * @og.group エラー処理
 * @og.rev 5.6.7.1 (2013/08/09) エラーに、エンジンのバージョン等のシステム関係の情報を付与します。
 *
 * @version  4.0
 * @author   Kazuhiko Hasegawa
 * @since    JDK5.0,
 */
public class HybsSystemException extends RuntimeException {
	private static final long serialVersionUID = 567120130809L ;

	/** システム依存の改行記号をセットします。  */
	private static final String CR = System.getProperty("line.separator");

	/** ４タブの代わりのスペース */
	private static final String TAB = "    " ;

	/** エラーメッセージに付与するシステム関係の情報 5.6.7.3 (2013/08/23) */
	private static final String ERR_INFO =
							"  -------- Exception Information ---------"	+ CR
						+	TAB		  + HybsSystem.sys( "OS_INFO"      )	+ CR		// Windows 7 Service Pack 1
						+	TAB		  + HybsSystem.sys( "SERVER_INFO"  )	+ CR		// 10374232-0004 ( 200.1.50.239 )
						+	TAB		  + HybsSystem.sys( "SERVLET_INFO" )	+ CR		// Apache Tomcat/7.0.42
						+	TAB + TAB + HybsSystem.sys( "TOMCAT_HOME"  )	+ CR		// C:/opengionV6/uap/bin/../../apps/tomcat7.0.42
						+	TAB		  + HybsSystem.sys( "JDK_INFO"     )	+ CR		// Java HotSpot(TM) Server VM 23.25-b01
						+	TAB + TAB + HybsSystem.sys( "JAVA_HOME"    )	+ CR		// H:/java/tomcat5.5.17
						+	TAB		  + HybsSystem.sys( "ENGINE_INFO"  )	+ CR		// 5.6.6.0 Release5 Builds (2013182)
						+	TAB + TAB + HybsSystem.sys( "REAL_PATH"    )				// C:/opengionV6/uap/webapps/gf/
						+	TAB + "(" + HybsSystem.sys( "SYSTEM_ID"    )	+ ")" + CR	// GF
						+	"  ----------------------------------------"	+ CR ;

	/**
	 *  詳細メッセージを指定しないで HybsSystemException を構築します。
	 *
	 * @og.rev 5.6.7.1 (2013/08/09) エラーに、エンジンのバージョン等の情報を付与します。
	 */
	public HybsSystemException() {
		// 4.3.4.4 (2009/01/01)
//		super();
		System.err.println( ERR_INFO );
	}

	/**
	 *  指定された詳細メッセージを持つ HybsSystemException を構築します。
	 *
	 * @og.rev 5.6.7.1 (2013/08/09) エラーに、エンジンのバージョン等の情報を付与します。
	 *
	 * @param	str	詳細メッセージ
	 */
	public HybsSystemException( final String str ) {
		super( str );
		System.err.println( ERR_INFO );
	}

	/**
	 *  指定された詳細メッセージを持つ HybsSystemException を構築します。
	 *
	 * @og.rev 5.6.7.1 (2013/08/09) エラーに、エンジンのバージョン等の情報を付与します。
	 *
	 * @param	th	例外Throwableオブジェクト
	 */
	public HybsSystemException( final Throwable th ) {
		super( th );
		System.err.println( ERR_INFO );
	}

	/**
	 *  指定されたオブジェクトを受け取る HybsSystemException を構築します。
	 *
	 * @og.rev 3.5.5.4 (2004/04/15) 引数を、RuntimeException(String , Throwable )にあわせます。
	 * @og.rev 5.6.7.1 (2013/08/09) エラーに、エンジンのバージョン等の情報を付与します。
	 *
	 * @param	str	詳細メッセージ
	 * @param	th	例外Throwableオブジェクト
	 * @see		java.lang.RuntimeException#RuntimeException(String,Throwable)
	 */
	public HybsSystemException( final String str,final Throwable th ) {
		super( str,th );
		System.err.println( ERR_INFO );
	}

	/**
	 * この Throwable オブジェクトの詳細メッセージ文字列を返します。
	 * このクラスは、発生元の Throwable の StackTrace を、例外チェーン機能
	 * を利用して取得しています。
	 * また、"org.opengion." を含むスタックトレースのみ、メッセージとして追加します。
	 *
	 * @og.rev 4.0.0.0 (2005/01/31) 例外チェーンを遡ってメッセージを出力します。
	 *
	 * @param  thIn Throwableオブジェクト
	 *
	 * @return  Throwableの詳細メッセージ
	 */
//	public static String getLongMessage( final Throwable thIn ) {
//		StringBuilder buf   = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
//		StringBuilder trace = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
//
//		buf.append( CR );
//		buf.append( "Version :" ).append( BuildNumber.ENGINE_INFO ).append( CR );
//
//		Throwable th = thIn ;
//		while( th != null ) {
//			trace = getStackData( trace,th );
//			if( th instanceof HybsSystemException ) {
//				buf.append( th.getMessage() );
//			}
//			else {
//				String msg = th.getMessage();
//				if( msg != null && buf.indexOf( msg ) < 0 ) {
//					buf.append( msg );
//				}
//			}
//			buf.append( CR );
//			th = th.getCause();
//		}
//
//		buf.append( trace.toString() );
//		return buf.toString();
//	}

	/**
	 * "org.opengion." を含む StackTraceElement のメッセージ文字列を返します。
	 *
	 * @og.rev 4.0.0.0 (2005/01/31) 新規追加
	 *
	 * @param  buf StringBuilder 以前のエラーメッセージ
	 * @param  th  Throwable スタックトレースを取り出すThrowableオブジェクト
	 *
	 * @return  "org.opengion." を含む StackTraceElement のメッセージ
	 */
//	private static StringBuilder getStackData( final StringBuilder buf,final Throwable th ) {
//		if( th != null ) {
//			int cnt = 0;
//			StackTraceElement[] trace = th.getStackTrace();
//			for( int i=0; i<trace.length; i++ ) {
//				String msg = trace[i].toString();
//				if( buf.indexOf( msg ) < 0 ) {
//					if( msg != null && msg.indexOf( "org.opengion." ) >= 0 ) {
//						buf.append( "\tat " ).append( msg ).append( CR );
//					}
//					else if( cnt++ < 5 ) {
//						buf.append( "\tat " ).append( msg ).append( CR );
//					}
//					else if( cnt++ == 5 ) {
//						buf.append( "\t   ......" ).append( CR );
//					}
//				}
//			}
//			buf.append( "\t   ... more ..." ).append( CR );
//		}
//		return buf;
//	}
}
