You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ia...@apache.org on 2004/01/02 17:27:29 UTC
cvs commit: ws-axis/java/src/org/apache/axis/message SOAPDocumentImpl.java
ias 2004/01/02 08:27:29
Added: java/src/org/apache/axis/message SOAPDocumentImpl.java
Log:
Initial check-in and fix for Bug 22981 - The SAAJ 1.2 Preliminary Upgrade
Thanks to Dr. Ahn, Heejune.
Note:
-This change passed all-tests.
Revision Changes Path
1.1 ws-axis/java/src/org/apache/axis/message/SOAPDocumentImpl.java
Index: SOAPDocumentImpl.java
===================================================================
package org.apache.axis.message;
/**
* Not Part of AXIS Project
*
* Heejune :
*
*/
import javax.xml.soap.SOAPException;
import org.apache.axis.AxisFault;
import org.apache.axis.Constants;
import org.apache.axis.SOAPPart;
import org.w3c.dom.Attr;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.DOMException;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.ProcessingInstruction;
/**
* SOAPDcoumentImpl implements the Document API for SOAPPART.
* At the moment, it again delgate the XERCES DOM Implementation
* Here is my argument on it:
* I guess that there is 3 way to implement this.
* - fully implement the DOM API here myself.
* => This is too much and duplicated work.
* - extends XERCES Implementation
* => this makes we are fixed to one Implementation
* - choose delgate depends on the user's parser preference
* => This is the practically best solution I have now
*
* @author Heejune Ahn (cityboy@tmax.co.kr)
*
*/
public class SOAPDocumentImpl
implements org.w3c.dom.Document, java.io.Serializable
{
// Depending on the user's parser preference
org.w3c.dom.Document delegate = null;
SOAPPart soapPart = null;
/**
* Construct the Document
* @param soapPart
*/
public SOAPDocumentImpl(SOAPPart sp)
{
delegate = new org.apache.xerces.dom.CoreDocumentImpl();
soapPart = sp;
}
/**
* @todo : link with SOAP
*
* @return
*/
public DocumentType getDoctype()
{
return delegate.getDoctype();
}
public DOMImplementation getImplementation()
{
return delegate.getImplementation();
}
/**
* should not be called, the method will be handled in SOAPPart
* @return
*/
public Element getDocumentElement()
{
return soapPart.getDocumentElement();
}
/**
* based on the tagName, we will make different kind SOAP Elements Instance
* Is really we can determine the Type by the Tagname???
*
* @todo : verify this method
*
* @param tagName
* @return
* @throws DOMException
*/
public org.w3c.dom.Element createElement(String tagName) throws DOMException
{
int index = tagName.indexOf(":");
String prefix, localname;
if(index < 0){
prefix = "";
localname = tagName;
}else{
prefix = tagName.substring(0,index);
localname = tagName.substring(index +1);
}
try{
SOAPEnvelope soapenv = (org.apache.axis.message.SOAPEnvelope)soapPart.getEnvelope();
if(soapenv != null){
if(tagName.equalsIgnoreCase(Constants.ELEM_ENVELOPE))
// return new SOAPEnvelope();
new SOAPEnvelope();
if(tagName.equalsIgnoreCase(Constants.ELEM_HEADER))
return new SOAPHeader(soapenv, soapenv.getSOAPConstants());
if(tagName.equalsIgnoreCase(Constants.ELEM_BODY))
return new SOAPBody(soapenv,soapenv.getSOAPConstants());
if(tagName.equalsIgnoreCase(Constants.ELEM_FAULT))
return new SOAPEnvelope();
if(tagName.equalsIgnoreCase(Constants.ELEM_FAULT_DETAIL))
return new SOAPFault( new AxisFault(tagName));
else{
return new MessageElement("", prefix, localname);
}
}else{
return new MessageElement("", prefix, localname);
}
}catch(SOAPException se){
throw new DOMException(DOMException.INVALID_STATE_ERR, "" ) ;
}
}
/**
*
* Creates an empty <code>DocumentFragment</code> object.
* @todo not implemented yet
* @return A new <code>DocumentFragment</code>.
*/
public DocumentFragment createDocumentFragment()
{
return delegate.createDocumentFragment();
}
/**
* Creates a <code>Text</code> node given the specified string.
* @param data The data for the node.
* @return The new <code>Text</code> object.
*/
public org.w3c.dom.Text createTextNode(String data)
{
// return new org.apache.axis.message.Text(data);
org.apache.axis.message.Text me = new org.apache.axis.message.Text(data);
me.setOwnerDocument(soapPart);
return me;
}
/**
* Creates a <code>Comment</code> node given the specified string.
* @param data The data for the node.
* @return The new <code>Comment</code> object.
*/
public Comment createComment(String data)
{
return new org.apache.axis.message.CommentImpl(data);
}
/**
* Creates a <code>CDATASection</code> node whose value is the specified
* string.
* @param data The data for the <code>CDATASection</code> contents.
* @return The new <code>CDATASection</code> object.
* @exception DOMException
* NOT_SUPPORTED_ERR: Raised if this document is an HTML document.
*/
public CDATASection createCDATASection(String data)
throws DOMException
{
return new CDATAImpl(data);
}
/**
* Creates a <code>ProcessingInstruction</code> node given the specified
* name and data strings.
* @param target The target part of the processing instruction.
* @param data The data for the node.
* @return The new <code>ProcessingInstruction</code> object.
* @exception DOMException
* INVALID_CHARACTER_ERR: Raised if the specified target contains an
* illegal character.
* <br>NOT_SUPPORTED_ERR: Raised if this document is an HTML document.
*/
public ProcessingInstruction createProcessingInstruction(String target,
String data)
throws DOMException
{
//Thread.dumpStack();
throw new java.lang.UnsupportedOperationException("createProcessingInstruction");
// return delegate.createProcessingInstruction(target,data);
}
/**
* @todo: How Axis will maintain the Attribute representation ?
*/
public Attr createAttribute(String name)
throws DOMException
{
//Thread.dumpStack();
//throw new java.lang.UnsupportedOperationException("createAttribute");
return delegate.createAttribute(name);
}
/**
*
* @param name
* @return
* @throws DOMException
*/
public EntityReference createEntityReference(String name)
throws DOMException
{
//Thread.dumpStack();
throw new java.lang.UnsupportedOperationException("createEntityReference");
// return delegate.createEntityReference(name);
}
public Node importNode(Node importedNode, boolean deep) throws DOMException
{
//Thread.dumpStack();
throw new java.lang.UnsupportedOperationException("importNode");
//return delegate.importNode(importedNode, deep);
}
/**
* Return SOAPElements (what if they want SOAPEnvelope or Header/Body?)
*
* @param namespaceURI
* @param qualifiedName
* @return
* @throws DOMException
*/
public Element createElementNS(String namespaceURI,
String qualifiedName)
throws DOMException
{
// return new MessageElement(qualifiedName.substring(qualifiedName.indexOf(":")),
// qualifiedName.substring(0,qualifiedName.indexOf(":")),
// namespaceURI);
// try{
org.apache.axis.soap.SOAPConstants soapConstants = null;
if(Constants.URI_SOAP11_ENV.equals(namespaceURI)){
soapConstants = org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS;
}else if(Constants.URI_SOAP12_ENV.equals(namespaceURI)){
soapConstants = org.apache.axis.soap.SOAPConstants.SOAP12_CONSTANTS;
}
// For special SOAP Element
MessageElement me = null;
if(soapConstants != null){
if(qualifiedName.equals(Constants.ELEM_ENVELOPE)){
me = new SOAPEnvelope(soapConstants); //TODO: confirm SOAP 1.1!
}else if(qualifiedName.equals(Constants.ELEM_HEADER)){
me = new SOAPHeader(null,soapConstants); // Dummy SOAPEnv required?
}else if(qualifiedName.equals(Constants.ELEM_BODY)){
me = new SOAPBody(null,soapConstants);
}else if(qualifiedName.equals(Constants.ELEM_FAULT)){
me = null;
//return new SOAPFault(null,soapConstants);
}else if(qualifiedName.equals(Constants.ELEM_FAULT_DETAIL)){
me = null; // todo
}else{
throw new DOMException(DOMException.INVALID_STATE_ERR, "No such Localname for SOAP URI" ) ;
}
return null; // todo ???
// general Elements
}else{
me = new MessageElement(namespaceURI, qualifiedName);
}
if(me != null)
me.setOwnerDocument(soapPart);
return me;
// catch(SOAPException se)
// {
// throw new DOMException(DOMException.INVALID_STATE_ERR, "" ) ;
// }
}
/**
* Attribute�� SAAJ���� Ư���� �ٸ��� �ٷ��� �ʴ´�.
*
*/
public Attr createAttributeNS(String namespaceURI,
String qualifiedName)
throws DOMException
{
//Thread.dumpStack();
//throw new java.lang.UnsupportedOperationException("createAttributeNS");
return delegate.createAttributeNS(namespaceURI, qualifiedName);
}
/**
* search the SOAPPart in order of SOAPHeader and SOAPBody for the requested
* Element name
*
*/
public NodeList getElementsByTagNameNS(String namespaceURI,
String localName)
{
try{
if(soapPart != null){
SOAPEnvelope soapEnv = (org.apache.axis.message.SOAPEnvelope) soapPart.getEnvelope();
SOAPHeader header = (org.apache.axis.message.SOAPHeader)soapEnv.getHeader();
if(header != null){
return header.getElementsByTagNameNS(namespaceURI, localName);
}
SOAPBody body = (org.apache.axis.message.SOAPBody)soapEnv.getHeader();
if(body != null){
return header.getElementsByTagNameNS(namespaceURI, localName);
}
}
return null;
}catch(SOAPException se){
throw new DOMException(DOMException.INVALID_STATE_ERR, "" ) ;
}
}
/**
* search the SOAPPart in order of SOAPHeader and SOAPBody for the requested
* Element name
*
*/
public NodeList getElementsByTagName(String localName)
{
try{
if(soapPart != null){
SOAPEnvelope soapEnv = (org.apache.axis.message.SOAPEnvelope) soapPart.getEnvelope();
SOAPHeader header = (org.apache.axis.message.SOAPHeader)soapEnv.getHeader();
if(header != null){
return header.getElementsByTagName(localName);
}
SOAPBody body = (org.apache.axis.message.SOAPBody)soapEnv.getHeader();
if(body != null){
return header.getElementsByTagName(localName);
}
}
return null;
}catch(SOAPException se){
throw new DOMException(DOMException.INVALID_STATE_ERR, "" ) ;
}
}
/**
* Returns the <code>Element</code> whose <code>ID</code> is given by
* <code>elementId</code>. If no such element exists, returns
* <code>null</code>. Behavior is not defined if more than one element
* has this <code>ID</code>. The DOM implementation must have
* information that says which attributes are of type ID. Attributes
* with the name "ID" are not of type ID unless so defined.
* Implementations that do not know whether attributes are of type ID or
* not are expected to return <code>null</code>.
* @param elementId The unique <code>id</code> value for an element.
* @return The matching element.
* @since DOM Level 2
*/
public Element getElementById(String elementId)
{
return delegate.getElementById(elementId);
}
/**
* Node Implementation
*
*/
public String getNodeName()
{
return null;
}
public String getNodeValue() throws DOMException
{
throw new DOMException(DOMException.NO_DATA_ALLOWED_ERR, "Cannot use TextNode.get in " + this);
}
public void setNodeValue(String nodeValue) throws DOMException{
throw new DOMException(DOMException.NO_DATA_ALLOWED_ERR, "Cannot use TextNode.set in " + this);
}
/**
* override it in sub-classes
* @return
*/
public short getNodeType() {
return Node.DOCUMENT_NODE;
}
public Node getParentNode() {
return null;
}
public NodeList getChildNodes() {
// if(soapPart != null)
// return (org.apache.axis.message.SOAPEnvelope)soapPart.getEnvelope();
// else
// return null;
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
/**
* Do we have to count the Attributes as node ????
*
* @return
*/
public Node getFirstChild(){
try{
if(soapPart != null)
return (org.apache.axis.message.SOAPEnvelope)soapPart.getEnvelope();
else
return null;
}catch(SOAPException se){
throw new DOMException(DOMException.INVALID_STATE_ERR, "" ) ;
}
}
/**
*
* @return
*/
public Node getLastChild(){
try{
if(soapPart != null)
return (org.apache.axis.message.SOAPEnvelope)soapPart.getEnvelope();
else
return null;
}catch(SOAPException se){
throw new DOMException(DOMException.INVALID_STATE_ERR, "" ) ;
}
}
public Node getPreviousSibling() {
return null;
}
public Node getNextSibling(){
return null;
}
public NamedNodeMap getAttributes(){
return null;
}
/**
*
* we have to have a link to them...
*/
public Document getOwnerDocument()
{
return null;
}
/**
*/
public Node insertBefore(Node newChild, Node refChild) throws DOMException
{
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
public Node replaceChild(Node newChild, Node oldChild) throws DOMException
{
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
public Node removeChild(Node oldChild) throws DOMException{
try{
Node envNode;
if(soapPart != null){
envNode = soapPart.getEnvelope();
if(envNode.equals(oldChild)){
return envNode;
}
}
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}catch(SOAPException se){
throw new DOMException(DOMException.INVALID_STATE_ERR, "" ) ;
}
}
public Node appendChild(Node newChild)
throws DOMException{
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
public boolean hasChildNodes(){
try{
if(soapPart != null){
if(soapPart.getEnvelope() != null){
return true;
}
}
return false;
}catch(SOAPException se){
throw new DOMException(DOMException.INVALID_STATE_ERR, "" ) ;
}
}
/**
* @toddo: Study it more.... to implement the deep mode correctly.
*
*/
public Node cloneNode(boolean deep){
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
/**
* @todo: is it OK to simply call the superclass?
*
*/
public void normalize(){
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
private String[] features = {"jdkfjdk", "dlfkdlfk"};
private String version = "version 2.0";
public boolean isSupported(String feature,
String version){
if(!version.equalsIgnoreCase(version))
return false;
else
return true;
}
public String getPrefix() {
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
public void setPrefix(String prefix) {
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
public String getNamespaceURI() {
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
public void setNamespaceURI(String nsURI) {
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
public String getLocalName(){
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
public boolean hasAttributes(){
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "" ) ;
}
}