src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/impl/HeaderImpl.java

Thu, 31 Aug 2017 15:18:52 +0800

author
aoqi
date
Thu, 31 Aug 2017 15:18:52 +0800
changeset 637
9c07ef4934dd
parent 368
0989ad8c0860
parent 0
373ffda63c9a
permissions
-rw-r--r--

merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation. Oracle designates this
aoqi@0 8 * particular file as subject to the "Classpath" exception as provided
aoqi@0 9 * by Oracle in the LICENSE file that accompanied this code.
aoqi@0 10 *
aoqi@0 11 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 14 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 15 * accompanied this code).
aoqi@0 16 *
aoqi@0 17 * You should have received a copy of the GNU General Public License version
aoqi@0 18 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 20 *
aoqi@0 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 22 * or visit www.oracle.com if you need additional information or have any
aoqi@0 23 * questions.
aoqi@0 24 */
aoqi@0 25
aoqi@0 26 package com.sun.xml.internal.messaging.saaj.soap.impl;
aoqi@0 27
aoqi@0 28 import java.util.*;
aoqi@0 29 import java.util.logging.Level;
aoqi@0 30
aoqi@0 31 import javax.xml.namespace.QName;
aoqi@0 32 import javax.xml.soap.*;
aoqi@0 33
aoqi@0 34 import org.w3c.dom.Element;
aoqi@0 35
aoqi@0 36 import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
aoqi@0 37 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument;
aoqi@0 38 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl;
aoqi@0 39 import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
aoqi@0 40
aoqi@0 41 public abstract class HeaderImpl extends ElementImpl implements SOAPHeader {
aoqi@0 42 protected static final boolean MUST_UNDERSTAND_ONLY = false;
aoqi@0 43
aoqi@0 44 protected HeaderImpl(SOAPDocumentImpl ownerDoc, NameImpl name) {
aoqi@0 45 super(ownerDoc, name);
aoqi@0 46 }
aoqi@0 47
aoqi@0 48 protected abstract SOAPHeaderElement createHeaderElement(Name name)
aoqi@0 49 throws SOAPException;
aoqi@0 50 protected abstract SOAPHeaderElement createHeaderElement(QName name)
aoqi@0 51 throws SOAPException;
aoqi@0 52 protected abstract NameImpl getNotUnderstoodName();
aoqi@0 53 protected abstract NameImpl getUpgradeName();
aoqi@0 54 protected abstract NameImpl getSupportedEnvelopeName();
aoqi@0 55
aoqi@0 56 public SOAPHeaderElement addHeaderElement(Name name) throws SOAPException {
aoqi@0 57 SOAPElement newHeaderElement =
aoqi@0 58 ElementFactory.createNamedElement(
aoqi@0 59 ((SOAPDocument) getOwnerDocument()).getDocument(),
aoqi@0 60 name.getLocalName(),
aoqi@0 61 name.getPrefix(),
aoqi@0 62 name.getURI());
aoqi@0 63 if (newHeaderElement == null
aoqi@0 64 || !(newHeaderElement instanceof SOAPHeaderElement)) {
aoqi@0 65 newHeaderElement = createHeaderElement(name);
aoqi@0 66 }
aoqi@0 67
aoqi@0 68 // header elements must be namespace qualified
aoqi@0 69 // check that URI is not empty, ensuring that the element is NS qualified.
aoqi@0 70 String uri = newHeaderElement.getElementQName().getNamespaceURI();
aoqi@0 71 if ((uri == null) || ("").equals(uri)) {
aoqi@0 72 log.severe("SAAJ0131.impl.header.elems.ns.qualified");
aoqi@0 73 throw new SOAPExceptionImpl("HeaderElements must be namespace qualified");
aoqi@0 74 }
aoqi@0 75 addNode(newHeaderElement);
aoqi@0 76 return (SOAPHeaderElement) newHeaderElement;
aoqi@0 77 }
aoqi@0 78
aoqi@0 79 public SOAPHeaderElement addHeaderElement(QName name) throws SOAPException {
aoqi@0 80 SOAPElement newHeaderElement =
aoqi@0 81 ElementFactory.createNamedElement(
aoqi@0 82 ((SOAPDocument) getOwnerDocument()).getDocument(),
aoqi@0 83 name.getLocalPart(),
aoqi@0 84 name.getPrefix(),
aoqi@0 85 name.getNamespaceURI());
aoqi@0 86 if (newHeaderElement == null
aoqi@0 87 || !(newHeaderElement instanceof SOAPHeaderElement)) {
aoqi@0 88 newHeaderElement = createHeaderElement(name);
aoqi@0 89 }
aoqi@0 90
aoqi@0 91 // header elements must be namespace qualified
aoqi@0 92 // check that URI is not empty, ensuring that the element is NS qualified.
aoqi@0 93 String uri = newHeaderElement.getElementQName().getNamespaceURI();
aoqi@0 94 if ((uri == null) || ("").equals(uri)) {
aoqi@0 95 log.severe("SAAJ0131.impl.header.elems.ns.qualified");
aoqi@0 96 throw new SOAPExceptionImpl("HeaderElements must be namespace qualified");
aoqi@0 97 }
aoqi@0 98 addNode(newHeaderElement);
aoqi@0 99 return (SOAPHeaderElement) newHeaderElement;
aoqi@0 100 }
aoqi@0 101
aoqi@0 102 protected SOAPElement addElement(Name name) throws SOAPException {
aoqi@0 103 return addHeaderElement(name);
aoqi@0 104 }
aoqi@0 105
aoqi@0 106 protected SOAPElement addElement(QName name) throws SOAPException {
aoqi@0 107 return addHeaderElement(name);
aoqi@0 108 }
aoqi@0 109
aoqi@0 110 public Iterator examineHeaderElements(String actor) {
aoqi@0 111 return getHeaderElementsForActor(actor, false, false);
aoqi@0 112 }
aoqi@0 113
aoqi@0 114 public Iterator extractHeaderElements(String actor) {
aoqi@0 115 return getHeaderElementsForActor(actor, true, false);
aoqi@0 116 }
aoqi@0 117
aoqi@0 118 protected Iterator getHeaderElementsForActor(
aoqi@0 119 String actor,
aoqi@0 120 boolean detach,
aoqi@0 121 boolean mustUnderstand) {
aoqi@0 122 if (actor == null || actor.equals("")) {
aoqi@0 123 log.severe("SAAJ0132.impl.invalid.value.for.actor.or.role");
aoqi@0 124 throw new IllegalArgumentException("Invalid value for actor or role");
aoqi@0 125 }
aoqi@0 126 return getHeaderElements(actor, detach, mustUnderstand);
aoqi@0 127 }
aoqi@0 128
aoqi@0 129 protected Iterator getHeaderElements(
aoqi@0 130 String actor,
aoqi@0 131 boolean detach,
aoqi@0 132 boolean mustUnderstand) {
aoqi@0 133 List elementList = new ArrayList();
aoqi@0 134
aoqi@0 135 Iterator eachChild = getChildElements();
aoqi@0 136
aoqi@0 137 Object currentChild = iterate(eachChild);
aoqi@0 138 while (currentChild != null) {
aoqi@0 139 if (!(currentChild instanceof SOAPHeaderElement)) {
aoqi@0 140 currentChild = iterate(eachChild);
aoqi@0 141 } else {
aoqi@0 142 HeaderElementImpl currentElement =
aoqi@0 143 (HeaderElementImpl) currentChild;
aoqi@0 144 currentChild = iterate(eachChild);
aoqi@0 145
aoqi@0 146 boolean isMustUnderstandMatching =
aoqi@0 147 (!mustUnderstand || currentElement.getMustUnderstand());
aoqi@0 148 boolean doAdd = false;
aoqi@0 149 if (actor == null && isMustUnderstandMatching) {
aoqi@0 150 doAdd = true;
aoqi@0 151 } else {
aoqi@0 152 String currentActor = currentElement.getActorOrRole();
aoqi@0 153 if (currentActor == null) {
aoqi@0 154 currentActor = "";
aoqi@0 155 }
aoqi@0 156
aoqi@0 157 if (currentActor.equalsIgnoreCase(actor)
aoqi@0 158 && isMustUnderstandMatching) {
aoqi@0 159 doAdd = true;
aoqi@0 160 }
aoqi@0 161 }
aoqi@0 162
aoqi@0 163 if (doAdd) {
aoqi@0 164 elementList.add(currentElement);
aoqi@0 165 if (detach) {
aoqi@0 166 currentElement.detachNode();
aoqi@0 167 }
aoqi@0 168 }
aoqi@0 169 }
aoqi@0 170 }
aoqi@0 171
aoqi@0 172 return elementList.listIterator();
aoqi@0 173 }
aoqi@0 174
aoqi@0 175 private Object iterate(Iterator each) {
aoqi@0 176 return each.hasNext() ? each.next() : null;
aoqi@0 177 }
aoqi@0 178
aoqi@0 179 public void setParentElement(SOAPElement element) throws SOAPException {
aoqi@0 180 if (!(element instanceof SOAPEnvelope)) {
aoqi@0 181 log.severe("SAAJ0133.impl.header.parent.mustbe.envelope");
aoqi@0 182 throw new SOAPException("Parent of SOAPHeader has to be a SOAPEnvelope");
aoqi@0 183 }
aoqi@0 184 super.setParentElement(element);
aoqi@0 185 }
aoqi@0 186
aoqi@0 187 // overriding ElementImpl's method to ensure that HeaderElements are
aoqi@0 188 // namespace qualified. Holds for both SOAP versions.
aoqi@0 189 // TODO - This check needs to be made for other addChildElement() methods
aoqi@0 190 // as well.
aoqi@0 191 public SOAPElement addChildElement(String localName) throws SOAPException {
aoqi@0 192
aoqi@0 193 SOAPElement element = super.addChildElement(localName);
aoqi@0 194 // check that URI is not empty, ensuring that the element is NS qualified.
aoqi@0 195 String uri = element.getElementName().getURI();
aoqi@0 196 if ((uri == null) || ("").equals(uri)) {
aoqi@0 197 log.severe("SAAJ0134.impl.header.elems.ns.qualified");
aoqi@0 198 throw new SOAPExceptionImpl("HeaderElements must be namespace qualified");
aoqi@0 199 }
aoqi@0 200 return element;
aoqi@0 201 }
aoqi@0 202
aoqi@0 203 public Iterator examineAllHeaderElements() {
aoqi@0 204 return getHeaderElements(null, false, MUST_UNDERSTAND_ONLY);
aoqi@0 205 }
aoqi@0 206
aoqi@0 207 public Iterator examineMustUnderstandHeaderElements(String actor) {
aoqi@0 208 return getHeaderElements(actor, false, true);
aoqi@0 209
aoqi@0 210 }
aoqi@0 211
aoqi@0 212 public Iterator extractAllHeaderElements() {
aoqi@0 213 return getHeaderElements(null, true, false);
aoqi@0 214 }
aoqi@0 215
aoqi@0 216 public SOAPHeaderElement addUpgradeHeaderElement(Iterator supportedSoapUris)
aoqi@0 217 throws SOAPException {
aoqi@0 218 if (supportedSoapUris == null) {
aoqi@0 219 log.severe("SAAJ0411.ver1_2.no.null.supportedURIs");
aoqi@0 220 throw new SOAPException("Argument cannot be null; iterator of supportedURIs cannot be null");
aoqi@0 221 }
aoqi@0 222 if (!supportedSoapUris.hasNext()) {
aoqi@0 223 log.severe("SAAJ0412.ver1_2.no.empty.list.of.supportedURIs");
aoqi@0 224 throw new SOAPException("List of supported URIs cannot be empty");
aoqi@0 225 }
aoqi@0 226 Name upgradeName = getUpgradeName();
aoqi@0 227 SOAPHeaderElement upgradeHeaderElement =
aoqi@0 228 (SOAPHeaderElement) addChildElement(upgradeName);
aoqi@0 229 Name supportedEnvelopeName = getSupportedEnvelopeName();
aoqi@0 230 int i = 0;
aoqi@0 231 while (supportedSoapUris.hasNext()) {
aoqi@0 232 SOAPElement subElement =
aoqi@0 233 upgradeHeaderElement.addChildElement(supportedEnvelopeName);
aoqi@0 234 String ns = "ns" + Integer.toString(i);
aoqi@0 235 subElement.addAttribute(
aoqi@0 236 NameImpl.createFromUnqualifiedName("qname"),
aoqi@0 237 ns + ":Envelope");
aoqi@0 238 subElement.addNamespaceDeclaration(
aoqi@0 239 ns,
aoqi@0 240 (String) supportedSoapUris.next());
aoqi@0 241 i ++;
aoqi@0 242 }
aoqi@0 243 return upgradeHeaderElement;
aoqi@0 244 }
aoqi@0 245
aoqi@0 246 public SOAPHeaderElement addUpgradeHeaderElement(String supportedSoapUri)
aoqi@0 247 throws SOAPException {
aoqi@0 248 return addUpgradeHeaderElement(new String[] {supportedSoapUri});
aoqi@0 249 }
aoqi@0 250
aoqi@0 251 public SOAPHeaderElement addUpgradeHeaderElement(String[] supportedSoapUris)
aoqi@0 252 throws SOAPException {
aoqi@0 253
aoqi@0 254 if (supportedSoapUris == null) {
aoqi@0 255 log.severe("SAAJ0411.ver1_2.no.null.supportedURIs");
aoqi@0 256 throw new SOAPException("Argument cannot be null; array of supportedURIs cannot be null");
aoqi@0 257 }
aoqi@0 258 if (supportedSoapUris.length == 0) {
aoqi@0 259 log.severe("SAAJ0412.ver1_2.no.empty.list.of.supportedURIs");
aoqi@0 260 throw new SOAPException("List of supported URIs cannot be empty");
aoqi@0 261 }
aoqi@0 262 Name upgradeName = getUpgradeName();
aoqi@0 263 SOAPHeaderElement upgradeHeaderElement =
aoqi@0 264 (SOAPHeaderElement) addChildElement(upgradeName);
aoqi@0 265 Name supportedEnvelopeName = getSupportedEnvelopeName();
aoqi@0 266 for (int i = 0; i < supportedSoapUris.length; i ++) {
aoqi@0 267 SOAPElement subElement =
aoqi@0 268 upgradeHeaderElement.addChildElement(supportedEnvelopeName);
aoqi@0 269 String ns = "ns" + Integer.toString(i);
aoqi@0 270 subElement.addAttribute(
aoqi@0 271 NameImpl.createFromUnqualifiedName("qname"),
aoqi@0 272 ns + ":Envelope");
aoqi@0 273 subElement.addNamespaceDeclaration(ns, supportedSoapUris[i]);
aoqi@0 274 }
aoqi@0 275 return upgradeHeaderElement;
aoqi@0 276 }
aoqi@0 277
aoqi@0 278 protected SOAPElement convertToSoapElement(Element element) {
aoqi@0 279 if (element instanceof SOAPHeaderElement) {
aoqi@0 280 return (SOAPElement) element;
aoqi@0 281 } else {
aoqi@0 282 SOAPHeaderElement headerElement;
aoqi@0 283 try {
aoqi@0 284 headerElement =
aoqi@0 285 createHeaderElement(NameImpl.copyElementName(element));
aoqi@0 286 } catch (SOAPException e) {
aoqi@0 287 throw new ClassCastException("Could not convert Element to SOAPHeaderElement: " + e.getMessage());
aoqi@0 288 }
aoqi@0 289 return replaceElementWithSOAPElement(
aoqi@0 290 element,
aoqi@0 291 (ElementImpl) headerElement);
aoqi@0 292 }
aoqi@0 293 }
aoqi@0 294
aoqi@0 295 public SOAPElement setElementQName(QName newName) throws SOAPException {
aoqi@0 296 log.log(Level.SEVERE,
aoqi@0 297 "SAAJ0146.impl.invalid.name.change.requested",
aoqi@0 298 new Object[] {elementQName.getLocalPart(),
aoqi@0 299 newName.getLocalPart()});
aoqi@0 300 throw new SOAPException("Cannot change name for "
aoqi@0 301 + elementQName.getLocalPart() + " to "
aoqi@0 302 + newName.getLocalPart());
aoqi@0 303 }
aoqi@0 304
aoqi@0 305 }

mercurial