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 2018/01/19 19:09:45 UTC
[cxf] branch master updated: Optimize the escape handler a bit
This is an automated email from the ASF dual-hosted git repository.
dkulp pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/master by this push:
new 8d1ac98 Optimize the escape handler a bit
8d1ac98 is described below
commit 8d1ac984896439b10947add38070650e1947ecff
Author: Daniel Kulp <dk...@apache.org>
AuthorDate: Fri Jan 19 13:22:27 2018 -0500
Optimize the escape handler a bit
---
.../java/org/apache/cxf/common/jaxb/JAXBUtils.java | 69 +++++++++++++---------
.../java/org/apache/cxf/jaxb/JAXBDataBinding.java | 6 ++
.../org/apache/cxf/jaxb/io/DataWriterImpl.java | 2 +-
3 files changed, 47 insertions(+), 30 deletions(-)
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 685cb07..fb2d51f 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
@@ -30,7 +30,6 @@ import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
@@ -125,8 +124,8 @@ public final class JAXBUtils {
private static final Map<String, String> BUILTIN_DATATYPES_MAP;
private static final Map<String, Class<?>> HOLDER_TYPES_MAP;
private static ClassLoader jaxbXjcLoader;
- private static Object jaxbEscapeHandler;
-
+ private static volatile Object jaxbEscapeHandler;
+
static {
BUILTIN_DATATYPES_MAP = new HashMap<>();
BUILTIN_DATATYPES_MAP.put("string", "java.lang.String");
@@ -1534,43 +1533,55 @@ public final class JAXBUtils {
return ReflectionInvokationHandler.createProxyWrapper(o, JAXBBeanInfo.class);
}
- public static void setMinimumEscapeHandler(Marshaller marshaller) {
- String postFix = "";
- if (marshaller.getClass().getName().contains("com.sun.xml.internal")
- || marshaller.getClass().getName().contains("eclipse")) {
+ private static String getPostfix(Class<?> cls) {
+ if (cls.getName().contains("com.sun.xml.internal")
+ || cls.getName().contains("eclipse")) {
//eclipse moxy accepts sun package CharacterEscapeHandler
- postFix = ".internal";
- } else if (marshaller.getClass().getName().contains("com.sun.xml.bind")) {
- postFix = "";
- } else {
- LOG.log(Level.WARNING, "Failed to set MinumEscapeHandler for unknown jaxb marshaller:"
- + marshaller);
- return;
+ return ".internal";
+ } else if (cls.getName().contains("com.sun.xml.bind")) {
+ return "";
+ }
+ return null;
+ }
+ public static void setMinimumEscapeHandler(Marshaller marshaller) {
+ if (jaxbEscapeHandler == null) {
+ jaxbEscapeHandler = createEscapeHandler(marshaller.getClass());
+ }
+ setMinimumEscapeHandler(marshaller, jaxbEscapeHandler);
+ }
+ public static void setMinimumEscapeHandler(Marshaller marshaller, Object escapeHandler) {
+ try {
+ String postFix = getPostfix(marshaller.getClass());
+ marshaller.setProperty("com.sun.xml" + postFix + ".bind.characterEscapeHandler", escapeHandler);
+ } catch (PropertyException e) {
+ e.printStackTrace();
+ LOG.log(Level.INFO, "Failed to set MinumEscapeHandler to jaxb marshaller", e);
}
+ }
+
+ public static Object createEscapeHandler(Class<?> cls) {
try {
+ String postFix = getPostfix(cls);
+ if (postFix == null) {
+ LOG.log(Level.WARNING, "Failed to create MinumEscapeHandler for unknown jaxb class:"
+ + cls);
+ return null;
+ }
Class<?> handlerClass = ClassLoaderUtils.loadClass("com.sun.xml" + postFix
+ ".bind.marshaller.MinimumEscapeHandler",
- marshaller.getClass());
+ cls);
Class<?> handlerInterface = ClassLoaderUtils
.loadClass("com.sun.xml" + postFix + ".bind.marshaller.CharacterEscapeHandler",
- marshaller.getClass());
+ cls);
Object targetHandler = ReflectionUtil.getDeclaredField(handlerClass, "theInstance").get(null);
- Object escapeHandler = getEscapeHandlerInstance(marshaller.getClass().getClassLoader(),
- new Class[] {handlerInterface},
- new EscapeHandlerInvocationHandler(targetHandler));
- marshaller.setProperty("com.sun.xml" + postFix + ".bind.characterEscapeHandler", escapeHandler);
+ return ProxyHelper.getProxy(cls.getClassLoader(),
+ new Class[] {handlerInterface},
+ new EscapeHandlerInvocationHandler(targetHandler));
} catch (Exception e) {
e.printStackTrace();
- LOG.log(Level.INFO, "Failed to set MinumEscapeHandler to jaxb marshaller", e);
+ LOG.log(Level.INFO, "Failed to create MinumEscapeHandler", e);
}
- }
-
- private static synchronized Object getEscapeHandlerInstance(ClassLoader loader, Class<?>[] interfaces,
- InvocationHandler handler) {
- if (jaxbEscapeHandler == null) {
- jaxbEscapeHandler = ProxyHelper.getProxy(loader, interfaces, handler);
- }
- return jaxbEscapeHandler;
+ return null;
}
diff --git a/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java b/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
index 928974c..6a9648d 100644
--- a/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
+++ b/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
@@ -204,6 +204,7 @@ public class JAXBDataBinding extends AbstractInterceptorProvidingDataBinding
private Unmarshaller.Listener unmarshallerListener;
private Marshaller.Listener marshallerListener;
private ValidationEventHandler validationEventHandler;
+ private Object escapeHandler;
private boolean unwrapJAXBElement = true;
private boolean scanPackages = true;
@@ -249,8 +250,13 @@ public class JAXBDataBinding extends AbstractInterceptorProvidingDataBinding
public final void setContext(JAXBContext ctx) {
context = ctx;
+ escapeHandler = JAXBUtils.createEscapeHandler(ctx.getClass());
}
+ public Object getEscapeHandler() {
+ return escapeHandler;
+ }
+
@SuppressWarnings("unchecked")
public <T> DataWriter<T> createWriter(Class<T> c) {
diff --git a/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java b/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java
index 992e292..a8ae15a 100644
--- a/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java
+++ b/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java
@@ -130,7 +130,7 @@ public class DataWriterImpl<T> extends JAXBDataBase implements DataWriter<T> {
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE);
marshaller.setListener(databinding.getMarshallerListener());
- JAXBUtils.setMinimumEscapeHandler(marshaller);
+ JAXBUtils.setMinimumEscapeHandler(marshaller, databinding.getEscapeHandler());
if (setEventHandler) {
ValidationEventHandler h = veventHandler;
--
To stop receiving notification emails like this one, please contact
['"commits@cxf.apache.org" <co...@cxf.apache.org>'].