Tue, 06 Mar 2012 16:09:35 -0800
7150322: Stop using drop source bundles in jaxws
Reviewed-by: darcy, ohrstrom
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 */
26 /**
27 *
28 * @author SAAJ RI Development Team
29 */
30 package com.sun.xml.internal.messaging.saaj.soap.ver1_1;
32 import java.util.Iterator;
33 import java.util.Locale;
34 import java.util.logging.Logger;
35 import java.util.logging.Level;
37 import javax.xml.namespace.QName;
38 import javax.xml.soap.SOAPElement;
39 import javax.xml.soap.SOAPFaultElement;
40 import javax.xml.soap.SOAPException;
41 import javax.xml.soap.SOAPConstants;
42 import javax.xml.soap.Name;
43 import javax.xml.soap.Name;
45 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument;
46 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl;
47 import com.sun.xml.internal.messaging.saaj.soap.impl.*;
48 import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
49 import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
50 import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
53 public class Fault1_1Impl extends FaultImpl {
55 protected static final Logger log =
56 Logger.getLogger(
57 LogDomainConstants.SOAP_VER1_1_DOMAIN,
58 "com.sun.xml.internal.messaging.saaj.soap.ver1_1.LocalStrings");
60 public Fault1_1Impl(SOAPDocumentImpl ownerDocument, String prefix) {
61 super(ownerDocument, NameImpl.createFault1_1Name(prefix));
62 }
64 protected NameImpl getDetailName() {
65 return NameImpl.createDetail1_1Name();
66 }
68 protected NameImpl getFaultCodeName() {
69 return NameImpl.createFromUnqualifiedName("faultcode");
70 }
72 protected NameImpl getFaultStringName() {
73 return NameImpl.createFromUnqualifiedName("faultstring");
74 }
76 protected NameImpl getFaultActorName() {
77 return NameImpl.createFromUnqualifiedName("faultactor");
78 }
80 protected DetailImpl createDetail() {
81 return new Detail1_1Impl(
82 ((SOAPDocument) getOwnerDocument()).getDocument());
83 }
85 protected FaultElementImpl createSOAPFaultElement(String localName) {
86 return new FaultElement1_1Impl(
87 ((SOAPDocument) getOwnerDocument()).getDocument(),
88 localName);
89 }
91 protected void checkIfStandardFaultCode(String faultCode, String uri)
92 throws SOAPException {
93 // SOAP 1.1 doesn't seem to mandate using faultcode from a particular
94 // set of values.
95 // Also need to be backward compatible.
96 }
98 protected void finallySetFaultCode(String faultcode) throws SOAPException {
99 this.faultCodeElement.addTextNode(faultcode);
100 }
102 public String getFaultCode() {
103 if (this.faultCodeElement == null)
104 findFaultCodeElement();
105 return this.faultCodeElement.getValue();
106 }
108 public Name getFaultCodeAsName() {
110 String faultcodeString = getFaultCode();
111 if (faultcodeString == null) {
112 return null;
113 }
114 int prefixIndex = faultcodeString.indexOf(':');
115 if (prefixIndex == -1) {
116 // Not a valid SOAP message, but we return the unqualified name
117 // anyway since some apps do not strictly conform to SOAP
118 // specs. A message that does not contain a <faultcode>
119 // element itself is also not valid in which case we return
120 // null instead of throwing an exception so this is consistent.
121 return NameImpl.createFromUnqualifiedName(faultcodeString);
122 }
124 // Get the prefix and map it to a namespace name (AKA namespace URI)
125 String prefix = faultcodeString.substring(0, prefixIndex);
126 if (this.faultCodeElement == null)
127 findFaultCodeElement();
128 String nsName = this.faultCodeElement.getNamespaceURI(prefix);
129 return NameImpl.createFromQualifiedName(faultcodeString, nsName);
130 }
132 public QName getFaultCodeAsQName() {
133 String faultcodeString = getFaultCode();
134 if (faultcodeString == null) {
135 return null;
136 }
137 if (this.faultCodeElement == null)
138 findFaultCodeElement();
139 return convertCodeToQName(faultcodeString, this.faultCodeElement);
140 }
142 public void setFaultString(String faultString) throws SOAPException {
144 if (this.faultStringElement == null)
145 findFaultStringElement();
147 if (this.faultStringElement == null)
148 this.faultStringElement = addSOAPFaultElement("faultstring");
149 else {
150 this.faultStringElement.removeContents();
151 //this.faultStringElement.removeAttributeNS("http://www.w3.org/XML/1998/namespace", "lang");
152 this.faultStringElement.removeAttribute("xml:lang");
153 }
155 this.faultStringElement.addTextNode(faultString);
156 }
158 public String getFaultString() {
159 if (this.faultStringElement == null)
160 findFaultStringElement();
161 return this.faultStringElement.getValue();
163 }
165 public Locale getFaultStringLocale() {
166 if (this.faultStringElement == null)
167 findFaultStringElement();
168 if (this.faultStringElement != null) {
169 String xmlLangAttr =
170 this.faultStringElement.getAttributeValue(
171 NameImpl.createFromUnqualifiedName("xml:lang"));
172 if (xmlLangAttr != null)
173 return xmlLangToLocale(xmlLangAttr);
174 }
175 return null;
176 }
178 public void setFaultString(String faultString, Locale locale)
179 throws SOAPException {
180 setFaultString(faultString);
181 this.faultStringElement.addAttribute(
182 NameImpl.createFromTagName("xml:lang"),
183 localeToXmlLang(locale));
184 }
186 protected boolean isStandardFaultElement(String localName) {
187 if (localName.equalsIgnoreCase("detail") ||
188 localName.equalsIgnoreCase("faultcode") ||
189 localName.equalsIgnoreCase("faultstring") ||
190 localName.equalsIgnoreCase("faultactor")) {
191 return true;
192 }
193 return false;
194 }
196 public void appendFaultSubcode(QName subcode) {
197 log.log(
198 Level.SEVERE,
199 "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
200 "appendFaultSubcode");
201 throw new UnsupportedOperationException("Not supported in SOAP 1.1");
202 }
204 public void removeAllFaultSubcodes() {
205 log.log(
206 Level.SEVERE,
207 "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
208 "removeAllFaultSubcodes");
209 throw new UnsupportedOperationException("Not supported in SOAP 1.1");
210 }
212 public Iterator getFaultSubcodes() {
213 log.log(
214 Level.SEVERE,
215 "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
216 "getFaultSubcodes");
217 throw new UnsupportedOperationException("Not supported in SOAP 1.1");
218 }
220 public String getFaultReasonText(Locale locale) {
221 log.log(
222 Level.SEVERE,
223 "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
224 "getFaultReasonText");
225 throw new UnsupportedOperationException("Not supported in SOAP 1.1");
226 }
228 public Iterator getFaultReasonTexts() {
229 log.log(
230 Level.SEVERE,
231 "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
232 "getFaultReasonTexts");
233 throw new UnsupportedOperationException("Not supported in SOAP 1.1");
234 }
236 public Iterator getFaultReasonLocales() {
237 log.log(
238 Level.SEVERE,
239 "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
240 "getFaultReasonLocales");
241 throw new UnsupportedOperationException("Not supported in SOAP 1.1");
242 }
244 public void addFaultReasonText(String text, java.util.Locale locale)
245 throws SOAPException {
246 log.log(
247 Level.SEVERE,
248 "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
249 "addFaultReasonText");
250 throw new UnsupportedOperationException("Not supported in SOAP 1.1");
251 }
253 public String getFaultRole() {
254 log.log(
255 Level.SEVERE,
256 "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
257 "getFaultRole");
258 throw new UnsupportedOperationException("Not supported in SOAP 1.1");
259 }
261 public void setFaultRole(String uri) {
262 log.log(
263 Level.SEVERE,
264 "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
265 "setFaultRole");
266 throw new UnsupportedOperationException("Not supported in SOAP 1.1");
267 }
269 public String getFaultNode() {
270 log.log(
271 Level.SEVERE,
272 "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
273 "getFaultNode");
274 throw new UnsupportedOperationException("Not supported in SOAP 1.1");
275 }
277 public void setFaultNode(String uri) {
278 log.log(
279 Level.SEVERE,
280 "SAAJ0303.ver1_1.msg.op.unsupported.in.SOAP1.1",
281 "setFaultNode");
282 throw new UnsupportedOperationException("Not supported in SOAP 1.1");
283 }
285 protected QName getDefaultFaultCode() {
286 return new QName(SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE, "Server");
287 }
289 public SOAPElement addChildElement(SOAPElement element)
290 throws SOAPException {
291 String localName = element.getLocalName();
292 if ("Detail".equalsIgnoreCase(localName)) {
293 if (hasDetail()) {
294 log.severe("SAAJ0305.ver1_2.detail.exists.error");
295 throw new SOAPExceptionImpl("Cannot add Detail, Detail already exists");
296 }
297 }
298 return super.addChildElement(element);
299 }
301 protected FaultElementImpl createSOAPFaultElement(QName qname) {
302 return new FaultElement1_1Impl(
303 ((SOAPDocument) getOwnerDocument()).getDocument(),
304 qname);
305 }
307 protected FaultElementImpl createSOAPFaultElement(Name qname) {
308 return new FaultElement1_1Impl(
309 ((SOAPDocument) getOwnerDocument()).getDocument(),
310 (NameImpl)qname);
311 }
313 public void setFaultCode(String faultCode, String prefix, String uri)
314 throws SOAPException {
315 if (prefix == null || "".equals(prefix)) {
316 if (uri != null && !"".equals(uri)) {
317 prefix = getNamespacePrefix(uri);
318 if (prefix == null || "".equals(prefix)) {
319 prefix = "ns0";
320 }
321 }
322 }
324 if (this.faultCodeElement == null)
325 findFaultCodeElement();
327 if (this.faultCodeElement == null)
328 this.faultCodeElement = addFaultCodeElement();
329 else
330 this.faultCodeElement.removeContents();
332 if (uri == null || "".equals(uri)) {
333 if (prefix != null && !"".equals("prefix")) {
334 uri = this.faultCodeElement.getNamespaceURI(prefix);
335 }
336 }
338 if (uri == null || "".equals(uri)) {
339 if (prefix != null && !"".equals(prefix)) {
340 //cannot allow an empty URI for a non-Empty prefix
341 log.log(Level.SEVERE, "SAAJ0307.impl.no.ns.URI", new Object[]{prefix + ":" + faultCode});
342 throw new SOAPExceptionImpl("Empty/Null NamespaceURI specified for faultCode \"" + prefix + ":" + faultCode + "\"");
343 } else {
344 uri = "";
345 }
346 }
348 checkIfStandardFaultCode(faultCode, uri);
349 ((FaultElementImpl) this.faultCodeElement).ensureNamespaceIsDeclared(prefix, uri);
351 if (prefix == null || "".equals(prefix)) {
352 finallySetFaultCode(faultCode);
353 } else {
354 finallySetFaultCode(prefix + ":" + faultCode);
355 }
356 }
358 private boolean standardFaultCode(String faultCode) {
359 if (faultCode.equals("VersionMismatch") || faultCode.equals("MustUnderstand")
360 || faultCode.equals("Client") || faultCode.equals("Server")) {
361 return true;
362 }
363 if (faultCode.startsWith("VersionMismatch.") || faultCode.startsWith("MustUnderstand.")
364 || faultCode.startsWith("Client.") || faultCode.startsWith("Server.")) {
365 return true;
366 }
367 return false;
368 }
370 public void setFaultActor(String faultActor) throws SOAPException {
371 if (this.faultActorElement == null)
372 findFaultActorElement();
373 if (this.faultActorElement != null)
374 this.faultActorElement.detachNode();
375 if (faultActor == null)
376 return;
377 this.faultActorElement =
378 createSOAPFaultElement(getFaultActorName());
379 this.faultActorElement.addTextNode(faultActor);
380 if (hasDetail()) {
381 insertBefore(this.faultActorElement, this.detail);
382 return;
383 }
384 addNode(this.faultActorElement);
386 }
387 }