1 /*
   2  * Copyright (c) 1997, 2017, 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.ver1_2;
  31 
  32 import java.util.logging.Logger;
  33 import java.util.logging.Level;
  34 
  35 import javax.xml.namespace.QName;
  36 import javax.xml.soap.*;
  37 
  38 import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
  39 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl;
  40 import com.sun.xml.internal.messaging.saaj.soap.impl.EnvelopeImpl;
  41 import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
  42 import org.w3c.dom.Element;
  43 
  44 public class Envelope1_2Impl extends EnvelopeImpl {
  45 
  46     protected static final Logger log =
  47         Logger.getLogger(Envelope1_2Impl.class.getName(),
  48                          "com.sun.xml.internal.messaging.saaj.soap.ver1_2.LocalStrings");
  49 
  50     public Envelope1_2Impl(SOAPDocumentImpl ownerDoc, String prefix) {
  51         super(ownerDoc, NameImpl.createEnvelope1_2Name(prefix));
  52     }
  53 
  54     public Envelope1_2Impl(SOAPDocumentImpl ownerDoc, Element domElement) {
  55         super(ownerDoc, domElement);
  56     }
  57 
  58     public Envelope1_2Impl(
  59         SOAPDocumentImpl ownerDoc,
  60         String prefix,
  61         boolean createHeader,
  62         boolean createBody)
  63         throws SOAPException {
  64         super(
  65             ownerDoc,
  66             NameImpl.createEnvelope1_2Name(prefix),
  67             createHeader,
  68             createBody);
  69     }
  70 
  71     @Override
  72     protected NameImpl getBodyName(String prefix) {
  73         return NameImpl.createBody1_2Name(prefix);
  74     }
  75 
  76     @Override
  77     protected NameImpl getHeaderName(String prefix) {
  78         return NameImpl.createHeader1_2Name(prefix);
  79     }
  80 
  81     /*
  82      * Override setEncodingStyle of ElementImpl to restrict adding encodingStyle
  83      * attribute to SOAP Envelope (SOAP 1.2 spec, part 1, section 5.1.1)
  84      */
  85     @Override
  86     public void setEncodingStyle(String encodingStyle) throws SOAPException {
  87         log.severe("SAAJ0404.ver1_2.no.encodingStyle.in.envelope");
  88         throw new SOAPExceptionImpl("encodingStyle attribute cannot appear on Envelope");
  89     }
  90 
  91     /*
  92      * Override addAttribute of ElementImpl to restrict adding encodingStyle
  93      * attribute to SOAP Envelope (SOAP 1.2 spec, part 1, section 5.1.1)
  94      */
  95     @Override
  96     public SOAPElement addAttribute(Name name, String value)
  97         throws SOAPException {
  98         if (name.getLocalName().equals("encodingStyle")
  99             && name.getURI().equals(SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE)) {
 100             setEncodingStyle(value);
 101         }
 102         return super.addAttribute(name, value);
 103     }
 104 
 105     @Override
 106     public SOAPElement addAttribute(QName name, String value)
 107         throws SOAPException {
 108         if (name.getLocalPart().equals("encodingStyle")
 109             && name.getNamespaceURI().equals(SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE)) {
 110             setEncodingStyle(value);
 111         }
 112         return super.addAttribute(name, value);
 113     }
 114 
 115 
 116     /*
 117      * Override addChildElement method to ensure that no element
 118      * is added after body in SOAP 1.2.
 119      */
 120     @Override
 121     public SOAPElement addChildElement(Name name) throws SOAPException {
 122         // check if body already exists
 123         if (getBody() != null) {
 124             log.severe("SAAJ0405.ver1_2.body.must.last.in.envelope");
 125             throw new SOAPExceptionImpl(
 126                 "Body must be the last element in" + " SOAP Envelope");
 127         }
 128         return super.addChildElement(name);
 129     }
 130 
 131     @Override
 132     public SOAPElement addChildElement(QName name) throws SOAPException {
 133         // check if body already exists
 134         if (getBody() != null) {
 135             log.severe("SAAJ0405.ver1_2.body.must.last.in.envelope");
 136             throw new SOAPExceptionImpl(
 137                 "Body must be the last element in" + " SOAP Envelope");
 138         }
 139         return super.addChildElement(name);
 140     }
 141 
 142 
 143     /*
 144      * Ideally we should be overriding other addChildElement() methods as well
 145      * but we are not adding them here since internally all those call the
 146      * method addChildElement(Name name).
 147      * In future, if this behaviour changes, then we would need to override
 148      * all the rest of them as well.
 149      *
 150      */
 151 
 152     @Override
 153     public SOAPElement addTextNode(String text) throws SOAPException {
 154         log.log(
 155             Level.SEVERE,
 156             "SAAJ0416.ver1_2.adding.text.not.legal",
 157             getElementQName());
 158         throw new SOAPExceptionImpl("Adding text to SOAP 1.2 Envelope is not legal");
 159     }
 160 }