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/03/16 17:19:44 UTC

[cxf] branch master updated: [CXF-7669/CXF-7520] Fix problems of double escaping characters

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 2b6a0ec  [CXF-7669/CXF-7520] Fix problems of double escaping characters
2b6a0ec is described below

commit 2b6a0ec92851ec2b89e65d04b6d7ffed798565b5
Author: Daniel Kulp <dk...@apache.org>
AuthorDate: Fri Mar 16 13:18:54 2018 -0400

    [CXF-7669/CXF-7520] Fix problems of double escaping characters
---
 .../java/org/apache/cxf/common/jaxb/JAXBUtils.java  | 20 +++++++++-----------
 .../java/org/apache/cxf/jaxb/JAXBDataBinding.java   | 21 ++++++++++++++++-----
 .../java/org/apache/cxf/jaxb/io/DataWriterImpl.java | 14 +++++---------
 .../src/test/resources/deserializationTests.js      |  2 +-
 .../org/apache/cxf/ws/addressing/soap/MAPCodec.java |  1 -
 5 files changed, 31 insertions(+), 27 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 352fc92..fa28ee2 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
@@ -1550,21 +1550,14 @@ public final class JAXBUtils {
         if (jaxbMinimumEscapeHandler == null) {
             jaxbMinimumEscapeHandler = Optional.ofNullable(createMininumEscapeHandler(marshaller.getClass()));
         }
-        //if escape handler class is not loaded
-        if (jaxbMinimumEscapeHandler.isPresent()) {
-            setEscapeHandler(marshaller, jaxbMinimumEscapeHandler.get());
-        }
-
+        jaxbMinimumEscapeHandler.ifPresent(p -> setEscapeHandler(marshaller, p));
     }
 
-    public static void setNoEscapeHandler(Marshaller marshaller) {
+    public static void setNoEscapeHandler(final 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());
-        }
+        jaxbNoEscapeHandler.ifPresent(p -> setEscapeHandler(marshaller, p));
     }
     
     public static void setEscapeHandler(Marshaller marshaller, Object escapeHandler) {
@@ -1603,7 +1596,12 @@ public final class JAXBUtils {
                                         new Class[] {handlerInterface},
                                         new EscapeHandlerInvocationHandler(targetHandler));
         } catch (Exception e) {
-            LOG.log(Level.INFO, "Failed to create " + simpleClassName);
+            if ("NoEscapeHandler".equals(simpleClassName)) {
+                //this class doesn't exist in JAXB 2.2 so expected
+                LOG.log(Level.FINER, "Failed to create " + simpleClassName);
+            } else {
+                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 e2a1a45..48eebcb 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
@@ -37,6 +37,7 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Consumer;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -205,6 +206,7 @@ public class JAXBDataBinding extends AbstractInterceptorProvidingDataBinding
     private Marshaller.Listener marshallerListener;
     private ValidationEventHandler validationEventHandler;
     private Object escapeHandler;
+    private Object noEscapeHandler;
 
     private boolean unwrapJAXBElement = true;
     private boolean scanPackages = true;
@@ -252,6 +254,7 @@ public class JAXBDataBinding extends AbstractInterceptorProvidingDataBinding
         context = ctx;
         //create default MininumEscapeHandler
         escapeHandler = JAXBUtils.createMininumEscapeHandler(ctx.getClass());
+        noEscapeHandler = JAXBUtils.createNoEscapeHandler(ctx.getClass());
     }
 
     public Object getEscapeHandler() {
@@ -260,28 +263,36 @@ public class JAXBDataBinding extends AbstractInterceptorProvidingDataBinding
     
     public void setEscapeHandler(Object handler) {
         escapeHandler = handler;
-        
     }
     
+    public void applyEscapeHandler(boolean escape, Consumer<Object> consumer) {
+        if (escape) {
+            consumer.accept(escapeHandler);
+        } else if (noEscapeHandler != null) {
+            consumer.accept(noEscapeHandler);
+        }
+    }
+    
+    
     @SuppressWarnings("unchecked")
     public <T> DataWriter<T> createWriter(Class<T> c) {
 
         Integer mtomThresholdInt = Integer.valueOf(getMtomThreshold());
         if (c == XMLStreamWriter.class) {
             DataWriterImpl<XMLStreamWriter> r
-                = new DataWriterImpl<XMLStreamWriter>(this);
+                = new DataWriterImpl<XMLStreamWriter>(this, true);
             r.setMtomThreshold(mtomThresholdInt);
             return (DataWriter<T>)r;
         } else if (c == OutputStream.class) {
-            DataWriterImpl<OutputStream> r = new DataWriterImpl<OutputStream>(this);
+            DataWriterImpl<OutputStream> r = new DataWriterImpl<OutputStream>(this, false);
             r.setMtomThreshold(mtomThresholdInt);
             return (DataWriter<T>)r;
         } else if (c == XMLEventWriter.class) {
-            DataWriterImpl<XMLEventWriter> r = new DataWriterImpl<XMLEventWriter>(this);
+            DataWriterImpl<XMLEventWriter> r = new DataWriterImpl<XMLEventWriter>(this, true);
             r.setMtomThreshold(mtomThresholdInt);
             return (DataWriter<T>)r;
         } else if (c == Node.class) {
-            DataWriterImpl<Node> r = new DataWriterImpl<Node>(this);
+            DataWriterImpl<Node> r = new DataWriterImpl<Node>(this, false);
             r.setMtomThreshold(mtomThresholdInt);
             return (DataWriter<T>)r;
         }
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 b342c32..cd1803f 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
@@ -63,8 +63,12 @@ public class DataWriterImpl<T> extends JAXBDataBase implements DataWriter<T> {
     private JAXBDataBinding databinding;
 
     public DataWriterImpl(JAXBDataBinding binding) {
+        this(binding, false);
+    }
+    public DataWriterImpl(JAXBDataBinding binding, boolean noEsc) {
         super(binding.getContext());
         databinding = binding;
+        noEscape = noEsc;
     }
 
     public void write(Object obj, T output) {
@@ -80,10 +84,6 @@ 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;
-            }
         }
     }
 
@@ -135,11 +135,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());
-            if (noEscape || databinding.getEscapeHandler() == null) {
-                JAXBUtils.setNoEscapeHandler(marshaller);
-            } else {
-                JAXBUtils.setEscapeHandler(marshaller, databinding.getEscapeHandler());
-            }
+            databinding.applyEscapeHandler(!noEscape, eh -> JAXBUtils.setEscapeHandler(marshaller, eh));
 
             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 5c0d10c..117e52e 100644
--- a/rt/javascript/javascript-tests/src/test/resources/deserializationTests.js
+++ b/rt/javascript/javascript-tests/src/test/resources/deserializationTests.js
@@ -35,7 +35,7 @@ function deserializeTestBean3_1(xmlString)
 	var dom = parseXml(xmlString);
 	var bean = org_apache_cxf_javascript_testns_testBean1_deserialize(jsutils, dom);
  	//since jdk1.8_161 and jdk9 escape '>' character
- 	if(bean.getStringItem() != "bean1>stringItem" && bean.getStringItem() != "bean1&gt;stringItem")
+ 	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());
diff --git a/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java b/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
index a829b41..e4995af 100644
--- a/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
+++ b/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
@@ -716,7 +716,6 @@ public class MAPCodec extends AbstractSoapInterceptor {
                                  JAXBContext ctx,
                                  boolean mustUnderstand) throws JAXBException {
         JAXBDataBinding jaxbDataBinding = new JAXBDataBinding(ctx);
-        jaxbDataBinding.setEscapeHandler(null);
         SoapHeader h = new SoapHeader(qname, new JAXBElement<T>(qname, clz, value),
                                       jaxbDataBinding);
         h.setMustUnderstand(mustUnderstand);

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