/* This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 *
 * http://www.gnu.org/copyleft/gpl.html
 */
package net.sf.l2j.custom;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author  JOJO
 */
public class CallTree
{
	static final DateFormat date_time = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

	// 完全指定のドメイン名は長すぎて邪魔なので、大文字で始まるクラス名より後を取り出す。
	// 例：【】部分を取り出す⇒group(1)
	//  "net.sf.l2j.gameserver.clientpackets.【RequestRestart.runImpl(RequestRestart.java:145)】"
	static final Pattern pattern1 = Pattern.compile("^.*\\.([A-Z].*)$");

	/**
	 * 関数呼び出しをツリー状に表示する。
	 * StackTraceElement[] の中身は java のバージョンやプラットフォームによって違うかもしれないので
	 * 自分の環境にあわせてください。どうせデバッグ用の使い捨てですから。
	 */
	public static void print()
	{
		System.out.println(date_time.format(new Date()));
		String indent = "|";
		String ksen = "└ ";
		StackTraceElement[] elements = Thread.currentThread().getStackTrace();
			// elements[length-1] <<ここから〜
			// elements[3] 
			// elements[2] 〜ここまで>> ・・・表示
			// elements[1] CallTree.print()・・・捨てる
			// elements[0] getStackTrace()・・・捨てる
		for (int i = elements.length; --i >= 2; ) {
			StackTraceElement element = elements[i];
			Matcher m = pattern1.matcher(element.toString()); // if ($elements[i] =~ m/$pattern1/)
			if (! m.matches()) continue;
			String S1 = m.group(1); // = $1
			if (S1.indexOf(".java:") < 0) continue;	// ソースコード不明は捨てる
//			if (S1.startsWith("CallTree.")) continue;	// 自分自身は捨てる
			System.out.println(indent + ksen + S1);
			indent += "   ";
		//	ksen    = "└ ";
		}
	}
	
	/**
	 * 大文字ではじまるクラス名を取り出す。
	 * @param: getClassName(this)
	 */
	public static String getClassName(Object _this)
	{
		String str = _this.getClass().getName();
		Matcher m = pattern1.matcher(str);
		if (m.matches()) str = m.group(1);	// if ($str =~ m/$pattern1/) { $str = $1 }
		return "<"+_this.hashCode()+">" + str;
	}
}
