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>stringItem")
+ if(bean.getStringItem() != "bean1>stringItem") // && bean.getStringItem() != "bean1>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.