001: package com.protomatter.util;
002:
003: /**
004: * {{{ The Protomatter Software License, Version 1.0
005: * derived from The Apache Software License, Version 1.1
006: *
007: * Copyright (c) 1998-2002 Nate Sammons. All rights reserved.
008: *
009: * Redistribution and use in source and binary forms, with or without
010: * modification, are permitted provided that the following conditions
011: * are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution,
022: * if any, must include the following acknowledgment:
023: * "This product includes software developed for the
024: * Protomatter Software Project
025: * (http://protomatter.sourceforge.net/)."
026: * Alternately, this acknowledgment may appear in the software itself,
027: * if and wherever such third-party acknowledgments normally appear.
028: *
029: * 4. The names "Protomatter" and "Protomatter Software Project" must
030: * not be used to endorse or promote products derived from this
031: * software without prior written permission. For written
032: * permission, please contact support@protomatter.com.
033: *
034: * 5. Products derived from this software may not be called "Protomatter",
035: * nor may "Protomatter" appear in their name, without prior written
036: * permission of the Protomatter Software Project
037: * (support@protomatter.com).
038: *
039: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
040: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
041: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
042: * DISCLAIMED. IN NO EVENT SHALL THE PROTOMATTER SOFTWARE PROJECT OR
043: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
044: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
045: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
046: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
047: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
048: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
049: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
050: * SUCH DAMAGE. }}}
051: */
052:
053: /**
054: * A utility class describing a position in a method call stack.
055: */
056: public class StackTraceInfo {
057: /**
058: * Calling method line number is unknown.
059: */
060: public static int LINE_NUMBER_UNKNOWN = -1;
061:
062: /**
063: * The full class name.
064: */
065: public String className = null;
066:
067: /**
068: * The method name.
069: */
070: public String methodName = null;
071:
072: /**
073: * The line number, if known.
074: */
075: public int lineNumber = LINE_NUMBER_UNKNOWN;
076:
077: /**
078: * Default constructor.
079: */
080: public StackTraceInfo() {
081: this (null, null, LINE_NUMBER_UNKNOWN);
082: }
083:
084: /**
085: * Utility constructor.
086: */
087: public StackTraceInfo(String className, String methodName) {
088: this (className, methodName, LINE_NUMBER_UNKNOWN);
089: }
090:
091: /**
092: * Utility constructor.
093: */
094: public StackTraceInfo(String className, String methodName, int line) {
095: this .className = className;
096: this .methodName = methodName;
097: this .lineNumber = line;
098: }
099:
100: /**
101: * Generate a nice display of the stack location.
102: * Output looks like this: "<TT>full.class.Name.methodName():line</TT>"
103: * if the line number is known, and like
104: * "<TT>full.class.Name.methodName()</TT>"
105: * if the line number isn't known.<P>
106: *
107: * This is suitable for doing things like
108: * <NOBR>"<TT>Syslog.debug(this, "I'm right here: " + StackTraceUtil.whereAmI());</TT>"</NOBR>
109: * for good debugging statements. This is
110: * also the format used for when the
111: * <tt><a href="../syslog/Syslog.html#crumb(java.lang.Object)">Syslog.crumb()</a></tt> and
112: * <tt><a href="../syslog/Channel.html#crumb(java.lang.Object)">Channel.crumb()</a></tt>
113: * tracing methods work.
114: */
115: public String toString() {
116: StringBuffer b = new StringBuffer(128);
117: if (className != null) {
118: b.append(className);
119: if (methodName != null) {
120: b.append(".");
121: b.append(methodName);
122: b.append("()");
123: if (lineNumber != LINE_NUMBER_UNKNOWN) {
124: b.append(":");
125: b.append(lineNumber);
126: }
127: }
128: } else {
129: b
130: .append(UtilResources
131: .getResourceString(MessageConstants.STACK_TRACE_INFO_UNKNOWN));
132: }
133: return b.toString();
134: }
135:
136: public String getClassAndMethod() {
137: return className + "." + methodName + "()";
138: }
139:
140: public String getShortClassAndMethod() {
141: return trimFromLastPeriod(className) + "." + methodName + "()";
142: }
143:
144: private String trimFromLastPeriod(String s) {
145: int index = s.lastIndexOf(".");
146: if (index != -1)
147: return s.substring(index + 1);
148: return s;
149: }
150: }
|