1 /*
   2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 /**
  27 *
  28 * @author SAAJ RI Development Team
  29 */
  30 package com.sun.xml.internal.messaging.saaj.soap;
  31 
  32 import java.util.logging.Logger;
  33 
  34 import com.sun.org.apache.xerces.internal.dom.DocumentImpl;
  35 import org.w3c.dom.*;
  36 
  37 import com.sun.xml.internal.messaging.saaj.soap.impl.*;
  38 import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
  39 import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
  40 
  41 public class SOAPDocumentImpl extends DocumentImpl implements SOAPDocument {
  42 
  43     private static final String XMLNS = "xmlns".intern();
  44     protected static final Logger log =
  45         Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
  46                          "com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
  47 
  48     SOAPPartImpl enclosingSOAPPart;
  49 
  50     public SOAPDocumentImpl(SOAPPartImpl enclosingDocument) {
  51         this.enclosingSOAPPart = enclosingDocument;
  52     }
  53 
  54     //    public SOAPDocumentImpl(boolean grammarAccess) {
  55     //        super(grammarAccess);
  56     //    }
  57     //
  58     //    public SOAPDocumentImpl(DocumentType doctype) {
  59     //        super(doctype);
  60     //    }
  61     //
  62     //    public SOAPDocumentImpl(DocumentType doctype, boolean grammarAccess) {
  63     //        super(doctype, grammarAccess);
  64     //    }
  65 
  66     public SOAPPartImpl getSOAPPart() {
  67         if (enclosingSOAPPart == null) {
  68             log.severe("SAAJ0541.soap.fragment.not.bound.to.part");
  69             throw new RuntimeException("Could not complete operation. Fragment not bound to SOAP part.");
  70         }
  71         return enclosingSOAPPart;
  72     }
  73 
  74     public SOAPDocumentImpl getDocument() {
  75         return this;
  76     }
  77 
  78     public DocumentType getDoctype() {
  79         // SOAP means no DTD, No DTD means no doctype (SOAP 1.2 only?)
  80         return null;
  81     }
  82 
  83     public DOMImplementation getImplementation() {
  84         return super.getImplementation();
  85     }
  86 
  87     public Element getDocumentElement() {
  88         // This had better be an Envelope!
  89         getSOAPPart().doGetDocumentElement();
  90         return doGetDocumentElement();
  91     }
  92 
  93     protected Element doGetDocumentElement() {
  94         return super.getDocumentElement();
  95     }
  96 
  97     public Element createElement(String tagName) throws DOMException {
  98         return ElementFactory.createElement(
  99             this,
 100             NameImpl.getLocalNameFromTagName(tagName),
 101             NameImpl.getPrefixFromTagName(tagName),
 102             null);
 103     }
 104 
 105     public DocumentFragment createDocumentFragment() {
 106         return new SOAPDocumentFragment(this);
 107     }
 108 
 109     public org.w3c.dom.Text createTextNode(String data) {
 110         return new TextImpl(this, data);
 111     }
 112 
 113     public Comment createComment(String data) {
 114         return new CommentImpl(this, data);
 115     }
 116 
 117     public CDATASection createCDATASection(String data) throws DOMException {
 118         return new CDATAImpl(this, data);
 119     }
 120 
 121     public ProcessingInstruction createProcessingInstruction(
 122         String target,
 123         String data)
 124         throws DOMException {
 125         log.severe("SAAJ0542.soap.proc.instructions.not.allowed.in.docs");
 126         throw new UnsupportedOperationException("Processing Instructions are not allowed in SOAP documents");
 127     }
 128 
 129     public Attr createAttribute(String name) throws DOMException {
 130         boolean isQualifiedName = (name.indexOf(":") > 0);
 131         if (isQualifiedName) {
 132             String nsUri = null;
 133             String prefix = name.substring(0, name.indexOf(":"));
 134             //cannot do anything to resolve the URI if prefix is not
 135             //XMLNS.
 136             if (XMLNS.equals(prefix)) {
 137                 nsUri = ElementImpl.XMLNS_URI;
 138                 return createAttributeNS(nsUri, name);
 139             }
 140         }
 141 
 142         return super.createAttribute(name);
 143     }
 144 
 145     public EntityReference createEntityReference(String name)
 146         throws DOMException {
 147             log.severe("SAAJ0543.soap.entity.refs.not.allowed.in.docs");
 148             throw new UnsupportedOperationException("Entity References are not allowed in SOAP documents");
 149     }
 150 
 151     public NodeList getElementsByTagName(String tagname) {
 152         return super.getElementsByTagName(tagname);
 153     }
 154 
 155     public org.w3c.dom.Node importNode(Node importedNode, boolean deep)
 156         throws DOMException {
 157         return super.importNode(importedNode, deep);
 158     }
 159 
 160     public Element createElementNS(String namespaceURI, String qualifiedName)
 161         throws DOMException {
 162         return ElementFactory.createElement(
 163             this,
 164             NameImpl.getLocalNameFromTagName(qualifiedName),
 165             NameImpl.getPrefixFromTagName(qualifiedName),
 166             namespaceURI);
 167     }
 168 
 169     public Attr createAttributeNS(String namespaceURI, String qualifiedName)
 170         throws DOMException {
 171         return super.createAttributeNS(namespaceURI, qualifiedName);
 172     }
 173 
 174     public NodeList getElementsByTagNameNS(
 175         String namespaceURI,
 176         String localName) {
 177         return super.getElementsByTagNameNS(namespaceURI, localName);
 178     }
 179 
 180     public Element getElementById(String elementId) {
 181         return super.getElementById(elementId);
 182     }
 183 
 184     public Node cloneNode(boolean deep) {
 185         SOAPPartImpl newSoapPart = getSOAPPart().doCloneNode();
 186         super.cloneNode(newSoapPart.getDocument(), deep);
 187         return newSoapPart;
 188     }
 189 
 190     public void cloneNode(SOAPDocumentImpl newdoc, boolean deep) {
 191         super.cloneNode(newdoc, deep);
 192     }
 193 }