blob: 55943300359deba3d862a15d32aeafb919e1d12f [file] [log] [blame]
/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed 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.OMContainer;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMException;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.impl.dom.ElementImpl;
import org.apache.axiom.om.impl.dom.NodeImpl;
import org.apache.axiom.soap.impl.dom.SOAPBodyImpl;
import org.apache.axiom.soap.impl.dom.SOAPEnvelopeImpl;
import org.w3c.dom.Attr;
import org.w3c.dom.Comment;
import org.w3c.dom.DOMException;
import org.w3c.dom.Text;
import org.w3c.dom.TypeInfo;
import javax.xml.soap.Node;
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 NodeImplEx extends NodeImpl implements Node {
/**
* @param ownerDocument
* @param factory
*/
protected NodeImplEx(OMFactory factory) {
super(factory);
}
protected SOAPElement parentElement;
static final String SAAJ_NODE = "saaj.node";
/**
* Removes this <code>Node</code> object from the tree. Once
* removed, this node can be garbage collected if there are no
* application references to it.
*/
public void detachNode() {
this.detach();
}
public OMNode detach() {
parentElement = null;
return null;
}
/**
* Removes this <code>Node</code> object from the tree. Once
* removed, this node can be garbage collected if there are no
* application references to it.
*/
public SOAPElement getParentElement() {
return this.parentElement;
}
public OMContainer getParent() {
return (OMContainer) this.parentElement;
}
/* public OMNode getOMNode() {
return omNode;
}*/
/**
* Returns the the value of the immediate child of this <code>Node</code>
* object if a child exists and its valu e is text.
*
* @return a <code>String</code> with the text of the immediate child of
* this <code>Node</code> object if (1) there is a child and
* (2) the child is a <code>Text</code> object;
* <code>null</code> otherwise
*/
public String getValue() {
if (this.getNodeType() == Node.TEXT_NODE) {
return this.getNodeValue();
} else if (this.getNodeType() == Node.ELEMENT_NODE) {
return ((NodeImplEx) (((OMElement) this).getFirstOMChild())).getValue();
}
return null;
}
/**
* 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
}
/**
* Sets the parent of this <code>Node</code> object to the given
* <code>SOAPElement</code> object.
*
* @param parent the <code>SOAPElement</code> object to be set as
* the parent of this <code>Node</code> object
* @throws SOAPException if there is a problem in setting the
* parent to the given element
* @see #getParentElement() getParentElement()
*/
public void setParentElement(SOAPElement parent) throws SOAPException {
this.parentElement = parent;
}
public void setType(int nodeType) throws OMException {
throw new UnsupportedOperationException("TODO");
}
public int getType() {
return this.getNodeType();
}
public TypeInfo getSchemaTypeInfo() {
// TODO TODO
throw new UnsupportedOperationException("TODO");
}
public void setIdAttribute(String name, boolean isId) throws DOMException {
// TODO TODO
throw new UnsupportedOperationException("TODO");
}
public void setIdAttributeNS(String namespaceURI, String localName, boolean isId) throws DOMException {
// TODO TODO
throw new UnsupportedOperationException("TODO");
}
public void setIdAttributeNode(Attr idAttr, boolean isId) throws DOMException {
// TODO TODO
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
*/
javax.xml.soap.Node toSAAJNode(org.w3c.dom.Node domNode) {
if (domNode == null) {
return null;
}
if (domNode instanceof org.w3c.dom.Text || domNode instanceof org.w3c.dom.Comment) {
org.w3c.dom.Node prevSiblingDOMNode = domNode.getPreviousSibling();
org.w3c.dom.Node nextSiblingDOMNode = domNode.getNextSibling();
TextImplEx saajTextNode = (TextImplEx) ((NodeImpl) domNode).getUserData(SAAJ_NODE);
if (saajTextNode == null){
// if SAAJ node has not been set in userData, try to construct it
return toSAAJNode2(domNode);
}
saajTextNode.setPreviousSibling(prevSiblingDOMNode);
saajTextNode.setNextSibling(nextSiblingDOMNode);
return saajTextNode;
}
Node saajNode = (Node) ((NodeImpl) domNode).getUserData(SAAJ_NODE);
if (saajNode == null) { // if SAAJ node has not been set in userData, try to construct it
return toSAAJNode2(domNode);
}
return saajNode;
}
private javax.xml.soap.Node toSAAJNode2(org.w3c.dom.Node domNode) {
if (domNode == null) {
return null;
}
if (domNode instanceof org.w3c.dom.Text) {
Text text = (Text) domNode;
org.w3c.dom.Node prevSiblingDOMNode = text.getPreviousSibling();
org.w3c.dom.Node nextSiblingDOMNode = text.getNextSibling();
SOAPElementImpl parent = new SOAPElementImpl((ElementImpl) domNode.getParentNode());
TextImplEx saajTextNode =
new TextImplEx(text.getData(), parent, prevSiblingDOMNode, nextSiblingDOMNode);
((NodeImpl) domNode).setUserData(SAAJ_NODE, saajTextNode, null);
return saajTextNode;
} else if (domNode instanceof org.w3c.dom.Comment) {
Comment comment = (Comment) domNode;
org.w3c.dom.Node prevSiblingDOMNode = comment.getPreviousSibling();
org.w3c.dom.Node nextSiblingDOMNode = comment.getNextSibling();
SOAPElementImpl parent = new SOAPElementImpl((ElementImpl) domNode.getParentNode());
TextImplEx saajTextNode = new TextImplEx("<!--" +
comment.getData() +
"-->",
parent, prevSiblingDOMNode, nextSiblingDOMNode);
((NodeImpl) domNode).setUserData(SAAJ_NODE, saajTextNode, null);
return saajTextNode;
} else if (domNode instanceof org.apache.axiom.soap.impl.dom.SOAPBodyImpl) {
org.apache.axiom.soap.impl.dom.SOAPBodyImpl doomSOAPBody = (SOAPBodyImpl) domNode;
javax.xml.soap.SOAPBody saajSOAPBody =
new org.apache.axis2.saaj.SOAPBodyImpl(doomSOAPBody);
doomSOAPBody.setUserData(SAAJ_NODE, saajSOAPBody, null);
return saajSOAPBody;
} else if (domNode instanceof org.apache.axiom.soap.impl.dom.SOAPEnvelopeImpl) {
org.apache.axiom.soap.impl.dom.SOAPEnvelopeImpl doomSOAPEnv
= (SOAPEnvelopeImpl) domNode;
javax.xml.soap.SOAPEnvelope saajEnvelope
= new org.apache.axis2.saaj.SOAPEnvelopeImpl(doomSOAPEnv);
doomSOAPEnv.setUserData(SAAJ_NODE, saajEnvelope, null);
return saajEnvelope;
} else if (domNode instanceof org.apache.axiom.soap.impl.dom.SOAPFaultNodeImpl) {
org.apache.axiom.soap.impl.dom.SOAPFaultNodeImpl doomSOAPFaultNode
= (org.apache.axiom.soap.impl.dom.SOAPFaultNodeImpl) domNode;
javax.xml.soap.SOAPFaultElement saajSOAPFaultEle
= new org.apache.axis2.saaj.SOAPFaultElementImpl(doomSOAPFaultNode);
doomSOAPFaultNode.setUserData(SAAJ_NODE, saajSOAPFaultEle, null);
return saajSOAPFaultEle;
} else if (domNode instanceof org.apache.axiom.soap.impl.dom.SOAPFaultDetailImpl) {
org.apache.axiom.soap.impl.dom.SOAPFaultDetailImpl doomSOAPFaultDetail
= (org.apache.axiom.soap.impl.dom.SOAPFaultDetailImpl) domNode;
javax.xml.soap.Detail saajDetail
= new org.apache.axis2.saaj.DetailImpl(doomSOAPFaultDetail);
doomSOAPFaultDetail.setUserData(SAAJ_NODE, saajDetail, null);
return saajDetail;
} else if (domNode instanceof org.apache.axiom.soap.impl.dom.SOAPFaultImpl) {
org.apache.axiom.soap.impl.dom.SOAPFaultImpl doomSOAPFault
= (org.apache.axiom.soap.impl.dom.SOAPFaultImpl) domNode;
javax.xml.soap.SOAPFault saajSOAPFault
= new org.apache.axis2.saaj.SOAPFaultImpl(doomSOAPFault);
doomSOAPFault.setUserData(SAAJ_NODE, saajSOAPFault, null);
return saajSOAPFault;
} else if (domNode instanceof org.apache.axiom.soap.impl.dom.SOAPHeaderBlockImpl) {
org.apache.axiom.soap.impl.dom.SOAPHeaderBlockImpl doomSOAPHeaderBlock
= (org.apache.axiom.soap.impl.dom.SOAPHeaderBlockImpl) domNode;
javax.xml.soap.SOAPHeaderElement saajSOAPHeaderEle
= new org.apache.axis2.saaj.SOAPHeaderElementImpl(doomSOAPHeaderBlock);
doomSOAPHeaderBlock.setUserData(SAAJ_NODE, saajSOAPHeaderEle, null);
return saajSOAPHeaderEle;
} else if (domNode instanceof org.apache.axiom.soap.impl.dom.SOAPHeaderImpl) {
org.apache.axiom.soap.impl.dom.SOAPHeaderImpl doomSOAPHeader
= (org.apache.axiom.soap.impl.dom.SOAPHeaderImpl) domNode;
javax.xml.soap.SOAPHeader saajSOAPHeader
= new org.apache.axis2.saaj.SOAPHeaderImpl(doomSOAPHeader);
doomSOAPHeader.setUserData(SAAJ_NODE, saajSOAPHeader, null);
return saajSOAPHeader;
} else { // instanceof org.apache.axis2.om.impl.dom.ElementImpl
ElementImpl doomElement = (ElementImpl) domNode;
SOAPElementImpl saajSOAPElement = new SOAPElementImpl(doomElement);
doomElement.setUserData(SAAJ_NODE, saajSOAPElement, null);
return saajSOAPElement;
}
}
}