[logback-dev] svn commit: r1834 - logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi
noreply.ceki at qos.ch
noreply.ceki at qos.ch
Wed Oct 15 18:25:12 CEST 2008
Author: ceki
Date: Wed Oct 15 18:25:12 2008
New Revision: 1834
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackagingDataCalculator.java
Log:
hunting down the circumstances for NullPointerExcetions thrown in PackagingDataCalculator
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackagingDataCalculator.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackagingDataCalculator.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackagingDataCalculator.java Wed Oct 15 18:25:12 2008
@@ -10,6 +10,7 @@
package ch.qos.logback.classic.spi;
import java.net.URL;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
@@ -31,7 +32,7 @@
HashMap<String, ClassPackagingData> cache = new HashMap<String, ClassPackagingData>();
private static boolean GET_CALLER_CLASS_METHOD_AVAILABLE = false;
-
+
static {
// if either the Reflection class or the getCallerClass method
// are unavailable, then we won't invoke Reflection.getCallerClass()
@@ -41,29 +42,29 @@
try {
Reflection.getCallerClass(2);
GET_CALLER_CLASS_METHOD_AVAILABLE = true;
- } catch(NoClassDefFoundError e) {
- } catch(NoSuchMethodError e) {
- } catch(Throwable e) {
+ } catch (NoClassDefFoundError e) {
+ } catch (NoSuchMethodError e) {
+ } catch (Throwable e) {
System.err.println("Unexpected exception");
e.printStackTrace();
}
}
-
+
public PackagingDataCalculator() {
}
public void calculate(ThrowableDataPoint[] tdpArray) {
int steStart = 0;
StackTraceElementProxy[] stepArray = new StackTraceElementProxy[0];
- do {
- steStart = findSTEStartIndex(tdpArray, steStart+stepArray.length);
+ do {
+ steStart = findSTEStartIndex(tdpArray, steStart + stepArray.length);
stepArray = getSTEPArray(tdpArray, steStart);
populateFrames(stepArray);
- } while(steStart != -1);
+ } while (steStart != -1);
}
void populateFrames(StackTraceElementProxy[] stepArray) {
- // in the initial part of this method we populate package informnation for
+ // in the initial part of this method we populate package informnation for
// common stack frames
final Throwable t = new Throwable("local stack reference");
final StackTraceElement[] localteSTEArray = t.getStackTrace();
@@ -74,20 +75,33 @@
ClassLoader lastExactClassLoader = null;
ClassLoader firsExactClassLoader = null;
-
+
int missfireCount = 0;
for (int i = 0; i < commonFrames; i++) {
Class callerClass = null;
- if(GET_CALLER_CLASS_METHOD_AVAILABLE) {
+ if (GET_CALLER_CLASS_METHOD_AVAILABLE) {
callerClass = Reflection.getCallerClass(localFirstCommon + i
- - missfireCount + 1);
+ - missfireCount + 1);
}
+
+
+
StackTraceElementProxy step = stepArray[stepFirstCommon + i];
String stepClassname = step.ste.getClassName();
+
+ if (callerClass == null) {
+ System.out.println("***********************************");
+ System.out.println("localFirstCommon=" + localFirstCommon + ", i=" + i
+ + ", missfireCount=" + missfireCount);
+ System.out.println("sum=" + (localFirstCommon + i - missfireCount + 1));
+ System.out.println("stepClassname="+stepClassname);
+ t.printStackTrace();
+ System.out.println(Arrays.toString(stepArray));
+ }
if (stepClassname.equals(callerClass.getName())) {
lastExactClassLoader = callerClass.getClassLoader();
- if(firsExactClassLoader == null) {
+ if (firsExactClassLoader == null) {
firsExactClassLoader = callerClass.getClassLoader();
}
ClassPackagingData pi = calculateByExactType(callerClass);
@@ -113,8 +127,9 @@
}
return -1;
}
-
- private StackTraceElementProxy[] getSTEPArray(final ThrowableDataPoint[] tdpArray, final int from) {
+
+ private StackTraceElementProxy[] getSTEPArray(
+ final ThrowableDataPoint[] tdpArray, final int from) {
List<StackTraceElementProxy> stepList = new LinkedList<StackTraceElementProxy>();
int len = tdpArray.length;
if (from < 0 || from >= len) {
@@ -131,9 +146,10 @@
}
return stepList.toArray(STEP_ARRAY_TEMPLATE);
}
-
- void populateUncommonFrames(int commonFrames, StackTraceElementProxy[] stepArray, ClassLoader firstExactClassLoader) {
- int uncommonFrames = stepArray.length-commonFrames;
+
+ void populateUncommonFrames(int commonFrames,
+ StackTraceElementProxy[] stepArray, ClassLoader firstExactClassLoader) {
+ int uncommonFrames = stepArray.length - commonFrames;
for (int i = 0; i < uncommonFrames; i++) {
StackTraceElementProxy step = stepArray[i];
ClassPackagingData pi = computeBySTEP(step, firstExactClassLoader);
@@ -154,7 +170,8 @@
return cpd;
}
- private ClassPackagingData computeBySTEP(StackTraceElementProxy step, ClassLoader lastExactClassLoader) {
+ private ClassPackagingData computeBySTEP(StackTraceElementProxy step,
+ ClassLoader lastExactClassLoader) {
String className = step.ste.getClassName();
ClassPackagingData cpd = cache.get(className);
if (cpd != null) {
@@ -167,8 +184,7 @@
cache.put(className, cpd);
return cpd;
}
-
-
+
String getImplementationVersion(Class type) {
Package aPackage = type.getPackage();
if (aPackage != null) {
@@ -192,7 +208,7 @@
String locationStr = resource.toString();
// now lets remove all but the file name
String result = getCodeLocation(locationStr, '/');
- if(result != null) {
+ if (result != null) {
return result;
}
return getCodeLocation(locationStr, '\\');
@@ -203,13 +219,12 @@
}
return "na";
}
-
private String getCodeLocation(String locationStr, char separator) {
int idx = locationStr.lastIndexOf(separator);
- if(isFolder(idx, locationStr)) {
- idx = locationStr.lastIndexOf(separator, idx-1);
- return locationStr.substring(idx+1);
+ if (isFolder(idx, locationStr)) {
+ idx = locationStr.lastIndexOf(separator, idx - 1);
+ return locationStr.substring(idx + 1);
} else if (idx > 0) {
return locationStr.substring(idx + 1);
}
@@ -217,48 +232,50 @@
}
private boolean isFolder(int idx, String text) {
- return (idx != -1 && idx+1 == text.length());
+ return (idx != -1 && idx + 1 == text.length());
}
-
+
private Class loadClass(ClassLoader cl, String className) {
- if(cl == null) {
+ if (cl == null) {
return null;
}
try {
return cl.loadClass(className);
} catch (ClassNotFoundException e1) {
return null;
- } catch(Exception e) {
+ } catch (Exception e) {
e.printStackTrace(); // this is unexpected
return null;
}
-
+
}
-
+
/**
*
- * @param lastGuaranteedClassLoader may be null
+ * @param lastGuaranteedClassLoader
+ * may be null
* @param className
* @return
*/
- private Class bestEffortLoadClass(ClassLoader lastGuaranteedClassLoader, String className) {
+ private Class bestEffortLoadClass(ClassLoader lastGuaranteedClassLoader,
+ String className) {
Class result = loadClass(lastGuaranteedClassLoader, className);
- if(result != null) {
+ if (result != null) {
return result;
}
ClassLoader tccl = Thread.currentThread().getContextClassLoader();
- if(tccl != lastGuaranteedClassLoader) {
+ if (tccl != lastGuaranteedClassLoader) {
result = loadClass(tccl, className);
}
- if(result != null) {
+ if (result != null) {
return result;
}
-
+
try {
return Class.forName(className);
} catch (ClassNotFoundException e1) {
return null;
- } catch(Exception e) {
+ } catch (Exception e) {
e.printStackTrace(); // this is unexpected
return null;
}
More information about the logback-dev
mailing list