CXF-6604 - Sporadic ClassCastException in AsymmetricBindingHandler#doSignBeforeEncrypt
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/66e97c77 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/66e97c77 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/66e97c77 Branch: refs/heads/CXF-6882.nio Commit: 66e97c77eaa43ab3a2cd95f0edc6a27e7445e8ce Parents: a644c5d Author: Colm O hEigeartaigh <cohei...@apache.org> Authored: Fri Dec 2 13:30:06 2016 +0000 Committer: Colm O hEigeartaigh <cohei...@apache.org> Committed: Fri Dec 2 13:30:06 2016 +0000 ---------------------------------------------------------------------- .../java/org/apache/cxf/staxutils/StaxUtils.java | 2 +- .../policyhandlers/AbstractBindingBuilder.java | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/66e97c77/core/src/main/java/org/apache/cxf/staxutils/StaxUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/cxf/staxutils/StaxUtils.java b/core/src/main/java/org/apache/cxf/staxutils/StaxUtils.java index d307b04..7f29345 100644 --- a/core/src/main/java/org/apache/cxf/staxutils/StaxUtils.java +++ b/core/src/main/java/org/apache/cxf/staxutils/StaxUtils.java @@ -95,7 +95,7 @@ import org.apache.cxf.helpers.DOMUtils; import org.apache.cxf.message.Message; public final class StaxUtils { - // System properies for defaults, but also contextual properties usable + // System properties for defaults, but also contextual properties usable // for StaxInInterceptor public static final String MAX_CHILD_ELEMENTS = "org.apache.cxf.stax.maxChildElements"; http://git-wip-us.apache.org/repos/asf/cxf/blob/66e97c77/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/policyhandlers/AbstractBindingBuilder.java ---------------------------------------------------------------------- diff --git a/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/policyhandlers/AbstractBindingBuilder.java b/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/policyhandlers/AbstractBindingBuilder.java index cf4333d..66de78c 100644 --- a/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/policyhandlers/AbstractBindingBuilder.java +++ b/rt/ws/security/src/main/java/org/apache/cxf/ws/security/wss4j/policyhandlers/AbstractBindingBuilder.java @@ -41,6 +41,8 @@ import javax.xml.namespace.QName; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; @@ -48,6 +50,7 @@ import javax.xml.xpath.XPathFactory; import org.w3c.dom.Attr; import org.w3c.dom.Document; +import org.w3c.dom.DocumentFragment; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -63,6 +66,8 @@ import org.apache.cxf.interceptor.Fault; import org.apache.cxf.message.MessageUtils; import org.apache.cxf.rt.security.utils.SecurityUtils; import org.apache.cxf.service.model.EndpointInfo; +import org.apache.cxf.staxutils.StaxUtils; +import org.apache.cxf.staxutils.W3CDOMStreamWriter; import org.apache.cxf.ws.policy.AssertionInfo; import org.apache.cxf.ws.policy.AssertionInfoMap; import org.apache.cxf.ws.policy.PolicyConstants; @@ -608,8 +613,18 @@ public abstract class AbstractBindingBuilder extends AbstractCommonBindingHandle } protected Element cloneElement(Element el) { - if (!secHeader.getSecurityHeaderElement().getOwnerDocument().equals(el.getOwnerDocument())) { - return (Element)secHeader.getSecurityHeaderElement().getOwnerDocument().importNode(el, true); + Document doc = secHeader.getSecurityHeaderElement().getOwnerDocument(); + if (!doc.equals(el.getOwnerDocument())) { + + XMLStreamReader reader = StaxUtils.createXMLStreamReader(el); + DocumentFragment fragment = doc.createDocumentFragment(); + W3CDOMStreamWriter writer = new W3CDOMStreamWriter(fragment); + try { + StaxUtils.copy(reader, writer); + return (Element)fragment.getFirstChild(); + } catch (XMLStreamException ex) { + LOG.log(Level.FINE, "Error cloning security element", ex); + } } return el; }