Title: [2169] branches/v-1.4.x: StackTraceElementConverter uses constructor for StackTraceElement instances in Java 5 and GEA.

Diff

Modified: branches/v-1.4.x/xstream/src/java/com/thoughtworks/xstream/converters/extended/StackTraceElementConverter.java (2168 => 2169)


--- branches/v-1.4.x/xstream/src/java/com/thoughtworks/xstream/converters/extended/StackTraceElementConverter.java	2013-12-03 00:18:20 UTC (rev 2168)
+++ branches/v-1.4.x/xstream/src/java/com/thoughtworks/xstream/converters/extended/StackTraceElementConverter.java	2013-12-03 19:03:07 UTC (rev 2169)
@@ -16,6 +16,7 @@
 
 import com.thoughtworks.xstream.converters.ConversionException;
 import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;
+import com.thoughtworks.xstream.core.JVM;
 
 /**
  * Converter for StackTraceElement (the lines of a stack trace) - JDK 1.4+ only.
@@ -32,10 +33,36 @@
     // (Note group 4 is optional is optional and only present if a colon char exists.)
 
     private static final Pattern PATTERN = Pattern.compile("^(.+)\\.([^\\(]+)\\(([^:]*)(:(\\d+))?\\)$");
-    private static final StackTraceElementFactory FACTORY = new StackTraceElementFactory();
+    private static final StackTraceElementFactory FACTORY;
+    static {
+        StackTraceElementFactory factory = null;
+        if (JVM.is15()) {
+            Class factoryType = JVM.loadClassForName(
+                "com.thoughtworks.xstream.converters.extended.StackTraceElementFactory15",
+                false);
+            try {
+                factory = (StackTraceElementFactory)factoryType.newInstance();
+            } catch (Exception e) {
+                // N/A
+            } catch (LinkageError e) {
+                // N/A
+            }
+        }
+        if (factory == null) {
+            factory = new StackTraceElementFactory();
+        }
+        try {
+            factory.unknownSourceElement("a", "b");
+        } catch (Exception e) {
+            factory = null;
+        } catch (NoClassDefFoundError e) { // GAE
+            factory = null;
+        }
+        FACTORY = factory;
+    }
 
     public boolean canConvert(Class type) {
-        return StackTraceElement.class.equals(type);
+        return StackTraceElement.class.equals(type) && FACTORY != null;
     }
     
     public String toString(Object obj) {

Modified: branches/v-1.4.x/xstream/src/java/com/thoughtworks/xstream/converters/extended/StackTraceElementFactory.java (2168 => 2169)


--- branches/v-1.4.x/xstream/src/java/com/thoughtworks/xstream/converters/extended/StackTraceElementFactory.java	2013-12-03 00:18:20 UTC (rev 2168)
+++ branches/v-1.4.x/xstream/src/java/com/thoughtworks/xstream/converters/extended/StackTraceElementFactory.java	2013-12-03 19:03:07 UTC (rev 2169)
@@ -40,7 +40,7 @@
         return create(declaringClass, methodName, fileName, lineNumber);
     }
 
-    private StackTraceElement create(String declaringClass, String methodName, String fileName, int lineNumber) {
+    protected StackTraceElement create(String declaringClass, String methodName, String fileName, int lineNumber) {
         StackTraceElement result = new Throwable().getStackTrace()[0];
         setField(result, "declaringClass", declaringClass);
         setField(result, "methodName", methodName);

Added: branches/v-1.4.x/xstream/src/java/com/thoughtworks/xstream/converters/extended/StackTraceElementFactory15.java (0 => 2169)


--- branches/v-1.4.x/xstream/src/java/com/thoughtworks/xstream/converters/extended/StackTraceElementFactory15.java	                        (rev 0)
+++ branches/v-1.4.x/xstream/src/java/com/thoughtworks/xstream/converters/extended/StackTraceElementFactory15.java	2013-12-03 19:03:07 UTC (rev 2169)
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2013 XStream Committers.
+ * All rights reserved.
+ *
+ * Created on 03. December 2013 by Joerg Schaible
+ */
+package com.thoughtworks.xstream.converters.extended;
+
+/**
+ * @author Jörg Schaible
+ *
+ * @since upcoming
+ */
+class StackTraceElementFactory15 extends StackTraceElementFactory {
+
+    @Override
+    protected StackTraceElement create(final String declaringClass, final String methodName,
+        final String fileName, final int lineNumber) {
+        return new StackTraceElement(declaringClass, methodName, fileName, lineNumber);
+    }
+}
Property changes on: branches/v-1.4.x/xstream/src/java/com/thoughtworks/xstream/converters/extended/StackTraceElementFactory15.java
___________________________________________________________________

Added: svn:keywords

Added: svn:eol-style

Modified: branches/v-1.4.x/xstream-distribution/src/content/changes.html (2168 => 2169)


--- branches/v-1.4.x/xstream-distribution/src/content/changes.html	2013-12-03 00:18:20 UTC (rev 2168)
+++ branches/v-1.4.x/xstream-distribution/src/content/changes.html	2013-12-03 19:03:07 UTC (rev 2169)
@@ -58,6 +58,7 @@
     		<li>AbstractAttributedCharacterIteratorAttributeConverter (and therefore TextAttributeConverter) will check first if it
     		can access the possible constants of the type by reflection.</li>
     		<li>NoClassDefFoundError raised in GAE accessing the fields of restricted types by reflection will be handled.</li>
+    		<li>StackTraceElementConverter uses constructor for StackTraceElement instances in Java 5 and GEA.</li>
     	</ul>
     	</li>
     	<li>JIRA:XSTR-739 and JIRA:XSTR-746: OrderRetainingMap fails if HashMap.putAll(Map) of Java Runtime is not

To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to