You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2016/01/28 21:17:41 UTC
[2/2] cxf git commit: Add some test cases for CXF-6764 and log a
message if the mapper fails
Add some test cases for CXF-6764 and log a message if the mapper fails
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/25c151ed
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/25c151ed
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/25c151ed
Branch: refs/heads/master
Commit: 25c151ed9fdb2147564f50fb7ec97d3cec6bbd98
Parents: f98785b
Author: Daniel Kulp <dk...@apache.org>
Authored: Thu Jan 28 15:17:11 2016 -0500
Committer: Daniel Kulp <dk...@apache.org>
Committed: Thu Jan 28 15:17:11 2016 -0500
----------------------------------------------------------------------
.../org/apache/cxf/common/jaxb/JAXBUtils.java | 31 ++++---
.../apache/cxf/jaxb/JAXBDataBindingTest.java | 91 +++++++++++++++++---
2 files changed, 97 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/25c151ed/core/src/main/java/org/apache/cxf/common/jaxb/JAXBUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/common/jaxb/JAXBUtils.java b/core/src/main/java/org/apache/cxf/common/jaxb/JAXBUtils.java
index 6440c37..f8a21d0 100644
--- a/core/src/main/java/org/apache/cxf/common/jaxb/JAXBUtils.java
+++ b/core/src/main/java/org/apache/cxf/common/jaxb/JAXBUtils.java
@@ -74,6 +74,7 @@ import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.apache.cxf.common.classloader.ClassLoaderUtils;
+import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.common.util.ASMHelper;
import org.apache.cxf.common.util.ASMHelper.ClassWriter;
import org.apache.cxf.common.util.ASMHelper.FieldVisitor;
@@ -91,6 +92,7 @@ import org.apache.cxf.common.xmlschema.SchemaCollection;
import org.apache.cxf.helpers.JavaUtils;
public final class JAXBUtils {
+ public static final Logger LOG = LogUtils.getL7dLogger(JAXBUtils.class);
public enum IdentifierType {
CLASS,
@@ -623,15 +625,17 @@ public final class JAXBUtils {
public static Object setNamespaceMapper(final Map<String, String> nspref,
Marshaller marshaller) throws PropertyException {
Object mapper = createNamespaceWrapper(marshaller.getClass(), nspref);
- if (marshaller.getClass().getName().contains(".internal.")) {
- marshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper",
- mapper);
- } else if (marshaller.getClass().getName().contains("com.sun")) {
- marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper",
- mapper);
- } else if (marshaller.getClass().getName().contains("eclipse")) {
- marshaller.setProperty("eclipselink.namespace-prefix-mapper",
- mapper);
+ if (mapper != null) {
+ if (marshaller.getClass().getName().contains(".internal.")) {
+ marshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper",
+ mapper);
+ } else if (marshaller.getClass().getName().contains("com.sun")) {
+ marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper",
+ mapper);
+ } else if (marshaller.getClass().getName().contains("eclipse")) {
+ marshaller.setProperty("eclipselink.namespace-prefix-mapper",
+ mapper);
+ }
}
return mapper;
}
@@ -1084,6 +1088,7 @@ public final class JAXBUtils {
String className = "org.apache.cxf.jaxb.NamespaceMapper";
className += postFix;
Class<?> cls = helper.findClass(className, JAXBUtils.class);
+ Throwable t = null;
if (cls == null) {
try {
ClassWriter cw = helper.createClassWriter();
@@ -1092,15 +1097,17 @@ public final class JAXBUtils {
}
} catch (RuntimeException ex) {
// continue
+ t = ex;
}
}
if (cls == null
- && (mcls.getName().contains(".internal.") || mcls.getName().contains("com.sun"))) {
+ && (!mcls.getName().contains(".internal.") && mcls.getName().contains("com.sun"))) {
try {
cls = ClassLoaderUtils.loadClass("org.apache.cxf.common.jaxb.NamespaceMapper",
JAXBUtils.class);
- } catch (ClassNotFoundException ex2) {
+ } catch (Throwable ex2) {
// ignore
+ t = ex2;
}
}
if (cls != null) {
@@ -1108,8 +1115,10 @@ public final class JAXBUtils {
return cls.getConstructor(Map.class).newInstance(map);
} catch (Exception e) {
// ignore
+ t = e;
}
}
+ LOG.log(Level.INFO, "Could not create a NamespaceMapper compatible with Marshaller class " + mcls.getName(), t);
return null;
}
/*
http://git-wip-us.apache.org/repos/asf/cxf/blob/25c151ed/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java
----------------------------------------------------------------------
diff --git a/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java b/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java
index 4621481..980f2de 100644
--- a/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java
+++ b/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java
@@ -38,6 +38,7 @@ import javax.wsdl.Definition;
import javax.wsdl.Service;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLReader;
+import javax.xml.bind.JAXBContext;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
@@ -54,6 +55,8 @@ import org.w3c.dom.Node;
import org.apache.cxf.Bus;
import org.apache.cxf.binding.BindingFactoryManager;
import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.ASMHelper;
+import org.apache.cxf.common.util.ReflectionUtil;
import org.apache.cxf.databinding.DataReader;
import org.apache.cxf.databinding.DataWriter;
import org.apache.cxf.helpers.CastUtils;
@@ -205,32 +208,92 @@ public class JAXBDataBindingTest extends Assert {
assertTrue(xml, xml.contains("uri:ultima:thule"));
}
- @Test
- public void testDeclaredNamespaceMapping() throws Exception {
+ JAXBDataBinding createJaxbContext(boolean internal) throws Exception {
JAXBDataBinding db = new JAXBDataBinding();
Map<String, String> nsMap = new HashMap<String, String>();
nsMap.put("uri:ultima:thule", "greenland");
db.setNamespaceMap(nsMap);
Map<String, Object> contextProperties = new HashMap<String, Object>();
- //contextProperties.put("com.sun.xml.bind.defaultNamespaceRemap", "uri:ultima:thule");
db.setContextProperties(contextProperties);
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(QualifiedBean.class);
- db.setContext(db.createJAXBContext(classes));
- DataWriter<XMLStreamWriter> writer = db.createWriter(XMLStreamWriter.class);
- XMLOutputFactory writerFactory = XMLOutputFactory.newInstance();
- StringWriter stringWriter = new StringWriter();
- XMLStreamWriter xmlWriter = writerFactory.createXMLStreamWriter(stringWriter);
- QualifiedBean bean = new QualifiedBean();
- bean.setAriadne("spider");
- writer.write(bean, xmlWriter);
- xmlWriter.flush();
- String xml = stringWriter.toString();
- assertTrue(xml, xml.contains("greenland=\"uri:ultima:thule"));
+
+ //have to fastboot to avoid conflicts of generated accessors
+ System.setProperty("com.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot", "true");
+ System.setProperty("com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot", "true");
+ if (internal) {
+ System.setProperty(JAXBContext.JAXB_CONTEXT_FACTORY, "com.sun.xml.internal.bind.v2.ContextFactory");
+ db.setContext(db.createJAXBContext(classes));
+ System.clearProperty(JAXBContext.JAXB_CONTEXT_FACTORY);
+ } else {
+ db.setContext(db.createJAXBContext(classes));
+ }
+ System.clearProperty("com.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot");
+ System.clearProperty("com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot");
+ return db;
}
+ void doNamespaceMappingTest(boolean internal, boolean asm) throws Exception {
+ if (internal) {
+ try {
+ Class.forName("com.sun.xml.internal.bind.v2.ContextFactory");
+ } catch (Throwable t) {
+ //on a JVM (likely IBM's) that doesn't rename the ContextFactory package to include "internal"
+ return;
+ }
+ }
+ try {
+ if (!asm) {
+ ReflectionUtil.setAccessible(ReflectionUtil.getDeclaredField(ASMHelper.class, "badASM"))
+ .set(null, Boolean.TRUE);
+ }
+
+ JAXBDataBinding db = createJaxbContext(internal);
+
+ DataWriter<XMLStreamWriter> writer = db.createWriter(XMLStreamWriter.class);
+ XMLOutputFactory writerFactory = XMLOutputFactory.newInstance();
+ StringWriter stringWriter = new StringWriter();
+ XMLStreamWriter xmlWriter = writerFactory.createXMLStreamWriter(stringWriter);
+ QualifiedBean bean = new QualifiedBean();
+ bean.setAriadne("spider");
+ writer.write(bean, xmlWriter);
+ xmlWriter.flush();
+ String xml = stringWriter.toString();
+ assertTrue("Failed to map namespace " + xml, xml.contains("greenland=\"uri:ultima:thule"));
+ } finally {
+ if (!asm) {
+ ReflectionUtil.setAccessible(ReflectionUtil.getDeclaredField(ASMHelper.class, "badASM"))
+ .set(null, Boolean.FALSE);
+ }
+ }
+ }
+
+ @Test
+ public void testDeclaredNamespaceMappingRI() throws Exception {
+ doNamespaceMappingTest(false, true);
+ }
@Test
+ public void testDeclaredNamespaceMappingInternal() throws Exception {
+ doNamespaceMappingTest(true, true);
+ }
+ @Test
+ public void testDeclaredNamespaceMappingRINoAsm() throws Exception {
+ doNamespaceMappingTest(false, false);
+ }
+
+ @Test
+ public void testDeclaredNamespaceMappingInternalNoAsm() throws Exception {
+ try {
+ doNamespaceMappingTest(true, false);
+ fail("Internal needs ASM");
+ } catch (AssertionError er) {
+ er.getMessage().contains("Failed to map namespace");
+ }
+ }
+
+
+ @Test
public void testResursiveType() throws Exception {
Set<Class<?>> classes = new HashSet<Class<?>>();
Collection<Object> typeReferences = new ArrayList<Object>();