// Path: im-log-stats-project/src/main/java/net/mikaboshi/intra_mart/tools/log_stats/util/LogStringUtil.java
// public final class LogStringUtil {
// 
// 	private static final Pattern LINE_SPLIT_PATTERN = Pattern.compile("\\r?\\n");
// 
// 	private static final String[] ENPTY_STRING_ARRAY = new String[0];
// 
// 	private static final Pattern TRUNCATE_URL_PATTERN = Pattern.compile("(?:[^(\\:/)]+\\:)?//(?:[^(\\:/)]+)(?:\\:\\d+)?(/.+)");
// 
// 	private LogStringUtil() {}
// 
// 	/**
// 	 * 引数を改行コードで分割する。
// 	 *
// 	 * @param s
// 	 * @return 引数を分割した文字列の配列。引数がnullの場合は、空の配列を返す。
// 	 */
// 	public static String[] lines(CharSequence s) {
// 
// 		if (s == null) {
// 			return ENPTY_STRING_ARRAY;
// 		}
// 
// 		return LINE_SPLIT_PATTERN.split(s);
// 	}
// 
// 	/**
// 	 * URLからスキーム、ホスト、ポートを削除する。
// 	 * @param url
// 	 * @return
// 	 */
// 	public static String truncateUrl(String url) {
// 
// 		if (url == null) {
// 			return StringUtils.EMPTY;
// 		}
// 
// 		Matcher matcher = TRUNCATE_URL_PATTERN.matcher(url);
// 
// 		if (matcher.matches()) {
// 			return matcher.group(1);
// 		} else {
// 			return url;
// 		}
// 	}
// 
// 	/**
// 	 * セッションID、ユーザIDが有効ならばtrueを返す。
// 	 * @since 1.0.21
// 	 * @param id
// 	 * @return
// 	 */
// 	public static boolean isValidId(String id) {
// 		return StringUtils.isNotBlank(id) && !"-".equals(id.trim());
// 	}
// 
// }


import net.mikaboshi.intra_mart.tools.log_stats.util.LogStringUtil;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
/*
 * 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 net.mikaboshi.intra_mart.tools.log_stats.entity;



/**
 * 例外ログ
 *
 * @version 1.0.9
 * @author <a href="https://github.com/cwan">cwan</a>
 */
public class ExceptionLog extends Log {

	/**
	 * 例外のグルーピングを何で行うか
	 *
	 * @since 1.0.8
	 */
	public static enum GroupingType {

		/** スタックトレースの1行目 */
		FIEST_LINE,

		/** スタックトレースの一番下のCaused by */
		CAUSE;
	}

	/**
	 * スタックトレース
	 */
	public String stackTrace = null;

	/**
	 * 例外のグルーピングを何で行うか
	 */
	public GroupingType groupingType = GroupingType.CAUSE;

	/**
	 * スタックトレースの1行目を取得する。
	 * @return
	 */
	public String getFirstLineOfStackTrace() {

		if (this.stackTrace == null) {
			return null;
		}

		for (int i = 0; i < this.stackTrace.length(); i++) {

			char c = this.stackTrace.charAt(i);

			if (c == '\r' || c == '\n' || c == '\t') {
				return this.stackTrace.substring(0, i);
			}
		}

		return this.stackTrace;
	}

	/**
	 * スタックトレースの発端のCause行を取得する。
	 * @return
	 * @since 1.0.8
	 */
	public String getCauseLineOfStackTrace() {

		if (this.stackTrace == null) {
			return null;
		}

		String cause = null;
		final String prefix = "Caused by: ";

// Path: im-log-stats-project/src/main/java/net/mikaboshi/intra_mart/tools/log_stats/util/LogStringUtil.java
// public final class LogStringUtil {
// 
// 	private static final Pattern LINE_SPLIT_PATTERN = Pattern.compile("\\r?\\n");
// 
// 	private static final String[] ENPTY_STRING_ARRAY = new String[0];
// 
// 	private static final Pattern TRUNCATE_URL_PATTERN = Pattern.compile("(?:[^(\\:/)]+\\:)?//(?:[^(\\:/)]+)(?:\\:\\d+)?(/.+)");
// 
// 	private LogStringUtil() {}
// 
// 	/**
// 	 * 引数を改行コードで分割する。
// 	 *
// 	 * @param s
// 	 * @return 引数を分割した文字列の配列。引数がnullの場合は、空の配列を返す。
// 	 */
// 	public static String[] lines(CharSequence s) {
// 
// 		if (s == null) {
// 			return ENPTY_STRING_ARRAY;
// 		}
// 
// 		return LINE_SPLIT_PATTERN.split(s);
// 	}
// 
// 	/**
// 	 * URLからスキーム、ホスト、ポートを削除する。
// 	 * @param url
// 	 * @return
// 	 */
// 	public static String truncateUrl(String url) {
// 
// 		if (url == null) {
// 			return StringUtils.EMPTY;
// 		}
// 
// 		Matcher matcher = TRUNCATE_URL_PATTERN.matcher(url);
// 
// 		if (matcher.matches()) {
// 			return matcher.group(1);
// 		} else {
// 			return url;
// 		}
// 	}
// 
// 	/**
// 	 * セッションID、ユーザIDが有効ならばtrueを返す。
// 	 * @since 1.0.21
// 	 * @param id
// 	 * @return
// 	 */
// 	public static boolean isValidId(String id) {
// 		return StringUtils.isNotBlank(id) && !"-".equals(id.trim());
// 	}
// 
// }


// Path: im-log-stats-project/src/main/java/net/mikaboshi/intra_mart/tools/log_stats/entity/ExceptionLog.java
import net.mikaboshi.intra_mart.tools.log_stats.util.LogStringUtil;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

/*
 * 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 net.mikaboshi.intra_mart.tools.log_stats.entity;



/**
 * 例外ログ
 *
 * @version 1.0.9
 * @author <a href="https://github.com/cwan">cwan</a>
 */
public class ExceptionLog extends Log {

	/**
	 * 例外のグルーピングを何で行うか
	 *
	 * @since 1.0.8
	 */
	public static enum GroupingType {

		/** スタックトレースの1行目 */
		FIEST_LINE,

		/** スタックトレースの一番下のCaused by */
		CAUSE;
	}

	/**
	 * スタックトレース
	 */
	public String stackTrace = null;

	/**
	 * 例外のグルーピングを何で行うか
	 */
	public GroupingType groupingType = GroupingType.CAUSE;

	/**
	 * スタックトレースの1行目を取得する。
	 * @return
	 */
	public String getFirstLineOfStackTrace() {

		if (this.stackTrace == null) {
			return null;
		}

		for (int i = 0; i < this.stackTrace.length(); i++) {

			char c = this.stackTrace.charAt(i);

			if (c == '\r' || c == '\n' || c == '\t') {
				return this.stackTrace.substring(0, i);
			}
		}

		return this.stackTrace;
	}

	/**
	 * スタックトレースの発端のCause行を取得する。
	 * @return
	 * @since 1.0.8
	 */
	public String getCauseLineOfStackTrace() {

		if (this.stackTrace == null) {
			return null;
		}

		String cause = null;
		final String prefix = "Caused by: ";

		for (String line : LogStringUtil.lines(this.stackTrace)) {