You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by em...@apache.org on 2018/01/29 14:06:56 UTC

[cxf] 01/02: [CXF-7520]:Set NoEscapeHandler for fastinfoset content type to fix couple of test failures; Fix javascript test

This is an automated email from the ASF dual-hosted git repository.

ema pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit 4d5e77d6be0f39b298840a033d82cc173d590bbf
Author: Jim Ma <em...@apache.org>
AuthorDate: Fri Jan 26 13:26:46 2018 +0800

    [CXF-7520]:Set NoEscapeHandler for fastinfoset content type to fix couple of test failures; Fix javascript test
---
 .../java/org/apache/cxf/common/jaxb/JAXBUtils.java | 46 ++++++++++++++++------
 .../java/org/apache/cxf/jaxb/JAXBDataBinding.java  |  2 +-
 .../org/apache/cxf/jaxb/io/DataWriterImpl.java     | 12 +++++-
 .../src/test/resources/deserializationTests.js     |  5 ++-
 4 files changed, 50 insertions(+), 15 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 fb2d51f..352fc92 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
@@ -46,6 +46,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.logging.Level;
@@ -124,7 +125,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 volatile Object jaxbEscapeHandler;
+    private static volatile Optional<Object> jaxbMinimumEscapeHandler;
+    private static volatile Optional<Object> jaxbNoEscapeHandler;
     
     static {
         BUILTIN_DATATYPES_MAP = new HashMap<>();
@@ -1543,32 +1545,55 @@ public final class JAXBUtils {
         }
         return null;
     }
+
     public static void setMinimumEscapeHandler(Marshaller marshaller) {
-        if (jaxbEscapeHandler == null) {
-            jaxbEscapeHandler = createEscapeHandler(marshaller.getClass());
+        if (jaxbMinimumEscapeHandler == null) {
+            jaxbMinimumEscapeHandler = Optional.ofNullable(createMininumEscapeHandler(marshaller.getClass()));
+        }
+        //if escape handler class is not loaded
+        if (jaxbMinimumEscapeHandler.isPresent()) {
+            setEscapeHandler(marshaller, jaxbMinimumEscapeHandler.get());
+        }
+
+    }
+
+    public static void setNoEscapeHandler(Marshaller marshaller) {
+        if (jaxbNoEscapeHandler == null) {
+            jaxbNoEscapeHandler = Optional.ofNullable(createNoEscapeHandler(marshaller.getClass()));
+        }
+        //if escape handler class is not loaded
+        if (jaxbNoEscapeHandler.isPresent()) {
+            setEscapeHandler(marshaller, jaxbNoEscapeHandler.get());
         }
-        setMinimumEscapeHandler(marshaller, jaxbEscapeHandler);
     }
-    public static void setMinimumEscapeHandler(Marshaller marshaller, Object escapeHandler) {
+    
+    public static void setEscapeHandler(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) {
+    public static Object createMininumEscapeHandler(Class<?> cls) {
+        return createEscapeHandler(cls, "MinimumEscapeHandler");
+    }
+    
+    public static Object createNoEscapeHandler(Class<?> cls) {
+        return createEscapeHandler(cls, "NoEscapeHandler");
+    }
+    
+    private static Object createEscapeHandler(Class<?> cls, String simpleClassName) {
         try {
             String postFix = getPostfix(cls);
             if (postFix == null) {
-                LOG.log(Level.WARNING, "Failed to create MinumEscapeHandler for unknown jaxb class:"
+                LOG.log(Level.WARNING, "Failed to create" + simpleClassName + " for unknown jaxb class:"
                     + cls);
                 return null;
             }
             Class<?> handlerClass = ClassLoaderUtils.loadClass("com.sun.xml" + postFix
-                                                                   + ".bind.marshaller.MinimumEscapeHandler",
+                                                                   + ".bind.marshaller." + simpleClassName,
                                                                cls);
             Class<?> handlerInterface = ClassLoaderUtils
                 .loadClass("com.sun.xml" + postFix + ".bind.marshaller.CharacterEscapeHandler",
@@ -1578,8 +1603,7 @@ public final class JAXBUtils {
                                         new Class[] {handlerInterface},
                                         new EscapeHandlerInvocationHandler(targetHandler));
         } catch (Exception e) {
-            e.printStackTrace();
-            LOG.log(Level.INFO, "Failed to create MinumEscapeHandler", e);
+            LOG.log(Level.INFO, "Failed to create " + simpleClassName);
         }
         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 6a9648d..98e0635 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
@@ -250,7 +250,7 @@ public class JAXBDataBinding extends AbstractInterceptorProvidingDataBinding
 
     public final void setContext(JAXBContext ctx) {
         context = ctx;
-        escapeHandler = JAXBUtils.createEscapeHandler(ctx.getClass());
+        escapeHandler = JAXBUtils.createMininumEscapeHandler(ctx.getClass());
     }
 
     public Object getEscapeHandler() {
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 a8ae15a..db7c424 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
@@ -59,6 +59,7 @@ public class DataWriterImpl<T> extends JAXBDataBase implements DataWriter<T> {
 
     ValidationEventHandler veventHandler;
     boolean setEventHandler = true;
+    boolean noEscape;
     private JAXBDataBinding databinding;
 
     public DataWriterImpl(JAXBDataBinding binding) {
@@ -79,6 +80,10 @@ public class DataWriterImpl<T> extends JAXBDataBase implements DataWriter<T> {
             }
             setEventHandler = MessageUtils.getContextualBoolean(m,
                     JAXBDataBinding.SET_VALIDATION_EVENT_HANDLER, true);
+            Object contentType = m.get(org.apache.cxf.message.Message.CONTENT_TYPE);
+            if (contentType != null && contentType.toString().contains("fastinfoset")) {
+                noEscape = true;
+            }
         }
     }
 
@@ -130,7 +135,12 @@ 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, databinding.getEscapeHandler());
+            if (noEscape) {
+                JAXBUtils.setNoEscapeHandler(marshaller);
+            } else {
+                JAXBUtils.setEscapeHandler(marshaller, databinding.getEscapeHandler());
+
+            }
 
             if (setEventHandler) {
                 ValidationEventHandler h = veventHandler;
diff --git a/rt/javascript/javascript-tests/src/test/resources/deserializationTests.js b/rt/javascript/javascript-tests/src/test/resources/deserializationTests.js
index c42c26d..5c0d10c 100644
--- a/rt/javascript/javascript-tests/src/test/resources/deserializationTests.js
+++ b/rt/javascript/javascript-tests/src/test/resources/deserializationTests.js
@@ -34,8 +34,9 @@ function deserializeTestBean3_1(xmlString)
 {
 	var dom = parseXml(xmlString);
 	var bean = org_apache_cxf_javascript_testns_testBean1_deserialize(jsutils, dom);
-	if(bean.getStringItem() != "bean1>stringItem")
-		assertionFailed("deserializeTestBean3_1 stringItem " + bean.getStringItem());
+ 	//since jdk1.8_161 and jdk9 escape '>' character
+ 	if(bean.getStringItem() != "bean1>stringItem" && bean.getStringItem() != "bean1&gt;stringItem")
+  		assertionFailed("deserializeTestBean3_1 stringItem " + bean.getStringItem());
 	if(bean.getIntItem() != 43)
 		assertionFailed("deserializeTestBean3_1 intItem " + bean.getIntItem());
 	if(bean.getLongItem() != 0)

-- 
To stop receiving notification emails like this one, please contact
ema@apache.org.