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>'].