| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.apache.axis2.saaj; |
| |
| import org.apache.axiom.om.OMComment; |
| import org.apache.axiom.om.OMDocument; |
| import org.apache.axiom.om.OMElement; |
| import org.apache.axiom.om.OMException; |
| import org.apache.axiom.om.OMInformationItem; |
| import org.apache.axiom.om.OMText; |
| import org.apache.axiom.soap.SOAPBody; |
| import org.apache.axiom.soap.SOAPEnvelope; |
| import org.apache.axiom.soap.SOAPFault; |
| import org.apache.axiom.soap.SOAPFaultDetail; |
| import org.apache.axiom.soap.SOAPFaultNode; |
| import org.apache.axiom.soap.SOAPHeader; |
| import org.apache.axiom.soap.SOAPHeaderBlock; |
| import org.w3c.dom.Attr; |
| import org.w3c.dom.DOMException; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.NamedNodeMap; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.NodeList; |
| import org.w3c.dom.TypeInfo; |
| import org.w3c.dom.UserDataHandler; |
| |
| import javax.xml.soap.SOAPElement; |
| import javax.xml.soap.SOAPException; |
| |
| /** |
| * A representation of a node (element) in a DOM representation of an XML document that provides |
| * some tree manipulation methods. This interface provides methods for getting the value of a node, |
| * for getting and setting the parent of a node, and for removing a node. |
| */ |
| public abstract class ProxyNode<T extends org.w3c.dom.Node, S extends OMInformationItem> implements Node { |
| protected final T target; |
| protected final S omTarget; |
| static final String SAAJ_NODE = "saaj.node"; |
| |
| public ProxyNode(T target, S omTarget) { |
| this.target = target; |
| this.omTarget = omTarget; |
| target.setUserData(SAAJ_NODE, this, null); |
| } |
| |
| public final T getTarget() { |
| return target; |
| } |
| |
| public final S getOMTarget() { |
| return omTarget; |
| } |
| |
| /** |
| * Notifies the implementation that this <code>Node</code> object is no longer being used by the |
| * application and that the implementation is free to reuse this object for nodes that may be |
| * created later. |
| * <p/> |
| * Calling the method <code>recycleNode</code> implies that the method <code>detachNode</code> |
| * has been called previously. |
| */ |
| public void recycleNode() { |
| // No corresponding implementation in OM |
| // There is no implementation in Axis 1.2 also |
| } |
| |
| public void setType(int nodeType) throws OMException { |
| throw new UnsupportedOperationException("TODO"); |
| } |
| |
| public int getType() { |
| return this.getNodeType(); |
| } |
| |
| public TypeInfo getSchemaTypeInfo() { |
| // TODO - Fixme. |
| throw new UnsupportedOperationException("TODO"); |
| } |
| |
| public void setIdAttribute(String name, boolean isId) throws DOMException { |
| // TODO - Fixme. |
| throw new UnsupportedOperationException("TODO"); |
| } |
| |
| public void setIdAttributeNS(String namespaceURI, String localName, boolean isId) |
| throws DOMException { |
| // TODO - Fixme. |
| throw new UnsupportedOperationException("TODO"); |
| } |
| |
| public void setIdAttributeNode(Attr idAttr, boolean isId) throws DOMException { |
| // TODO - Fixme. |
| throw new UnsupportedOperationException("TODO"); |
| } |
| |
| /** |
| * Converts or extracts the SAAJ node from the given DOM Node (domNode) |
| * |
| * @param domNode |
| * @return the SAAJ Node corresponding to the domNode |
| */ |
| Node toSAAJNode(Node domNode) { |
| return toSAAJNode(domNode, this); |
| } |
| |
| /** |
| * Converts or extracts the SAAJ node from the given DOM Node (domNode) |
| * |
| * @param domNode |
| * @return the SAAJ Node corresponding to the domNode |
| */ |
| static Node toSAAJNode(Node domNode, Node parentNode) { |
| if (domNode == null) { |
| return null; |
| } |
| Node saajNode = (Node)domNode.getUserData(SAAJ_NODE); |
| if (saajNode == null) { // if SAAJ node has not been set in userData, try to construct it |
| return toSAAJNode2(domNode, parentNode); |
| } |
| return saajNode; |
| } |
| |
| private static Node toSAAJNode2(Node domNode, Node parentNode) { |
| if (domNode == null) { |
| return null; |
| } |
| if (domNode instanceof org.w3c.dom.Text) { |
| return new TextImplEx((OMText)domNode); |
| } else if (domNode instanceof org.w3c.dom.Comment) { |
| return new CommentImpl((OMComment)domNode); |
| } else if (domNode instanceof SOAPBody) { |
| javax.xml.soap.SOAPBody saajSOAPBody = |
| new org.apache.axis2.saaj.SOAPBodyImpl((SOAPBody)domNode); |
| domNode.setUserData(SAAJ_NODE, saajSOAPBody, null); |
| return saajSOAPBody; |
| } else if (domNode instanceof SOAPEnvelope) { |
| javax.xml.soap.SOAPEnvelope saajEnvelope |
| = new org.apache.axis2.saaj.SOAPEnvelopeImpl((SOAPEnvelope)domNode); |
| domNode.setUserData(SAAJ_NODE, saajEnvelope, null); |
| return saajEnvelope; |
| } else if (domNode instanceof SOAPFaultNode) { |
| javax.xml.soap.SOAPFaultElement saajSOAPFaultEle |
| = new org.apache.axis2.saaj.SOAPFaultElementImpl<SOAPFaultNode>((SOAPFaultNode)domNode); |
| domNode.setUserData(SAAJ_NODE, saajSOAPFaultEle, null); |
| return saajSOAPFaultEle; |
| } else if (domNode instanceof SOAPFaultDetail) { |
| javax.xml.soap.Detail saajDetail |
| = new org.apache.axis2.saaj.DetailImpl((SOAPFaultDetail)domNode); |
| domNode.setUserData(SAAJ_NODE, saajDetail, null); |
| return saajDetail; |
| } else if (domNode instanceof SOAPFault) { |
| javax.xml.soap.SOAPFault saajSOAPFault |
| = new org.apache.axis2.saaj.SOAPFaultImpl((SOAPFault)domNode); |
| domNode.setUserData(SAAJ_NODE, saajSOAPFault, null); |
| return saajSOAPFault; |
| } else if (domNode instanceof SOAPHeaderBlock) { |
| javax.xml.soap.SOAPHeaderElement saajSOAPHeaderEle |
| = new org.apache.axis2.saaj.SOAPHeaderElementImpl((SOAPHeaderBlock)domNode); |
| domNode.setUserData(SAAJ_NODE, saajSOAPHeaderEle, null); |
| return saajSOAPHeaderEle; |
| } else if (domNode instanceof SOAPHeader) { |
| javax.xml.soap.SOAPHeader saajSOAPHeader |
| = new org.apache.axis2.saaj.SOAPHeaderImpl((SOAPHeader)domNode); |
| domNode.setUserData(SAAJ_NODE, saajSOAPHeader, null); |
| return saajSOAPHeader; |
| } else if (domNode instanceof Document) { |
| return new SAAJDocument((OMDocument)domNode); |
| } else { // instanceof org.apache.axis2.om.impl.dom.ElementImpl |
| SOAPElementImpl<OMElement> saajSOAPElement = new SOAPElementImpl<OMElement>((OMElement)domNode); |
| domNode.setUserData(SAAJ_NODE, saajSOAPElement, null); |
| return saajSOAPElement; |
| } |
| } |
| |
| public org.w3c.dom.Node getParentNode() { |
| return toSAAJNode(target.getParentNode()); |
| } |
| |
| public final boolean hasAttributes() { |
| return target.hasAttributes(); |
| } |
| |
| public final boolean isSupported(String feature, String version) { |
| return target.isSupported(feature, version); |
| } |
| |
| public final String getBaseURI() { |
| return target.getBaseURI(); |
| } |
| |
| public final String getNodeValue() throws DOMException { |
| return target.getNodeValue(); |
| } |
| |
| public final void setNodeValue(String nodeValue) throws DOMException { |
| target.setNodeValue(nodeValue); |
| } |
| |
| public final org.w3c.dom.Node insertBefore(org.w3c.dom.Node newChild, org.w3c.dom.Node refChild) throws DOMException { |
| return target.insertBefore(newChild, refChild); |
| } |
| |
| public final org.w3c.dom.Node replaceChild(org.w3c.dom.Node newChild, org.w3c.dom.Node oldChild) throws DOMException { |
| return target.replaceChild(newChild, oldChild); |
| } |
| |
| public final org.w3c.dom.Node cloneNode(boolean deep) { |
| return target.cloneNode(deep); |
| } |
| |
| public final void normalize() { |
| target.normalize(); |
| } |
| |
| public final void setPrefix(String prefix) throws DOMException { |
| target.setPrefix(prefix); |
| } |
| |
| public final short compareDocumentPosition(org.w3c.dom.Node other) throws DOMException { |
| return target.compareDocumentPosition(other); |
| } |
| |
| public final void setTextContent(String textContent) throws DOMException { |
| target.setTextContent(textContent); |
| } |
| |
| public final boolean isSameNode(org.w3c.dom.Node other) { |
| return target.isSameNode(other); |
| } |
| |
| public final String lookupPrefix(String namespaceURI) { |
| return target.lookupPrefix(namespaceURI); |
| } |
| |
| public final boolean isDefaultNamespace(String namespaceURI) { |
| return target.isDefaultNamespace(namespaceURI); |
| } |
| |
| public final String lookupNamespaceURI(String prefix) { |
| return null; |
| } |
| |
| public final boolean isEqualNode(org.w3c.dom.Node arg) { |
| return target.isEqualNode(arg); |
| } |
| |
| public final Object getFeature(String feature, String version) { |
| return target.getFeature(feature, version); |
| } |
| |
| public final Object setUserData(String key, Object data, UserDataHandler handler) { |
| return target.setUserData(key, data, handler); |
| } |
| |
| public final Object getUserData(String key) { |
| return target.getUserData(key); |
| } |
| |
| public final org.w3c.dom.Node removeChild(org.w3c.dom.Node oldChild) throws DOMException { |
| if (oldChild instanceof ProxyNode) { |
| oldChild = ((ProxyNode<?,?>)oldChild).getTarget(); |
| } |
| return target.removeChild(oldChild); |
| } |
| |
| public final String getNodeName() { |
| return target.getNodeName(); |
| } |
| |
| public final short getNodeType() { |
| return target.getNodeType(); |
| } |
| |
| public final Document getOwnerDocument() { |
| return (Document)toSAAJNode(target.getOwnerDocument()); |
| } |
| |
| public final String getLocalName() { |
| return target.getLocalName(); |
| } |
| |
| public final String getNamespaceURI() { |
| return target.getNamespaceURI(); |
| } |
| |
| public final String getPrefix() { |
| return target.getPrefix(); |
| } |
| |
| public final org.w3c.dom.Node getFirstChild() { |
| return toSAAJNode(target.getFirstChild()); |
| } |
| |
| public final boolean hasChildNodes() { |
| return target.hasChildNodes(); |
| } |
| |
| public final org.w3c.dom.Node getLastChild() { |
| return toSAAJNode(target.getLastChild()); |
| } |
| |
| protected final NodeList toSAAJNodeList(NodeList nodes) { |
| NodeListImpl result = new NodeListImpl(); |
| for (int i = 0; i < nodes.getLength(); i++) { |
| result.addNode(toSAAJNode(nodes.item(i))); |
| } |
| return result; |
| } |
| |
| public final NodeList getChildNodes() { |
| return toSAAJNodeList(target.getChildNodes()); |
| } |
| |
| public final org.w3c.dom.Node appendChild(org.w3c.dom.Node child) throws DOMException { |
| if (getOwnerDocument() != child.getOwnerDocument()) { |
| throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, "Wrong document"); |
| } |
| try { |
| if (child instanceof Element) { |
| return appendElement((Element)child); |
| } else { |
| target.appendChild(((ProxyNode<?,?>)child).target); |
| return child; |
| } |
| } catch (SOAPException e) { |
| DOMException ex = |
| new DOMException(DOMException.HIERARCHY_REQUEST_ERR, e.getMessage()); |
| ex.initCause(e); |
| throw ex; |
| } |
| } |
| |
| protected Element appendElement(Element child) throws SOAPException { |
| String namespaceURI = child.getNamespaceURI(); |
| String prefix = child.getPrefix(); |
| |
| SOAPElementImpl<OMElement> childEle = (SOAPElementImpl<OMElement>)child; |
| |
| childEle.target.setUserData(SAAJ_NODE, childEle, null); |
| if (namespaceURI != null && namespaceURI.trim().length() > 0) { |
| childEle.omTarget.setNamespace(childEle.omTarget.declareNamespace(namespaceURI, prefix)); |
| } |
| target.appendChild(childEle.target); |
| childEle.target.getParentNode().setUserData(SAAJ_NODE, this, null); |
| childEle.setParentElement((SOAPElement)this); |
| return childEle; |
| } |
| |
| public final String getTextContent() throws DOMException { |
| return target.getTextContent(); |
| } |
| |
| public final NamedNodeMap getAttributes() { |
| return target.getAttributes(); |
| } |
| |
| public final org.w3c.dom.Node getNextSibling() { |
| return toSAAJNode(target.getNextSibling()); |
| } |
| |
| public final org.w3c.dom.Node getPreviousSibling() { |
| return toSAAJNode(target.getPreviousSibling()); |
| } |
| } |