1 /*
2  * Copyright (c) 1997, 2012, 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_1;
31 
32 import java.util.Iterator;
33 import java.util.Locale;
34 import java.util.logging.Logger;
35 import java.util.logging.Level;
36 
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;
44 
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;
51 
52 
53 public class Fault1_1Impl extends FaultImpl {
54 
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");
59 
Fault1_1Impl(SOAPDocumentImpl ownerDocument, String prefix)60     public Fault1_1Impl(SOAPDocumentImpl ownerDocument, String prefix) {
61        super(ownerDocument, NameImpl.createFault1_1Name(prefix));
62     }
63 
getDetailName()64     protected NameImpl getDetailName() {
65         return NameImpl.createDetail1_1Name();
66     }
67 
getFaultCodeName()68     protected NameImpl getFaultCodeName() {
69         return NameImpl.createFromUnqualifiedName("faultcode");
70     }
71 
getFaultStringName()72     protected NameImpl getFaultStringName() {
73         return NameImpl.createFromUnqualifiedName("faultstring");
74     }
75 
getFaultActorName()76     protected NameImpl getFaultActorName() {
77         return NameImpl.createFromUnqualifiedName("faultactor");
78     }
79 
createDetail()80     protected DetailImpl createDetail() {
81         return new Detail1_1Impl(
82                        ((SOAPDocument) getOwnerDocument()).getDocument());
83     }
84 
createSOAPFaultElement(String localName)85     protected FaultElementImpl createSOAPFaultElement(String localName) {
86         return new FaultElement1_1Impl(
87                        ((SOAPDocument) getOwnerDocument()).getDocument(),
88                        localName);
89     }
90 
checkIfStandardFaultCode(String faultCode, String uri)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     }
97 
finallySetFaultCode(String faultcode)98     protected void finallySetFaultCode(String faultcode) throws SOAPException {
99         this.faultCodeElement.addTextNode(faultcode);
100     }
101 
getFaultCode()102     public String getFaultCode() {
103         if (this.faultCodeElement == null)
104             findFaultCodeElement();
105         return this.faultCodeElement.getValue();
106     }
107 
getFaultCodeAsName()108     public Name getFaultCodeAsName() {
109 
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         }
123 
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     }
131 
getFaultCodeAsQName()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     }
141 
setFaultString(String faultString)142     public void setFaultString(String faultString) throws SOAPException {
143 
144         if (this.faultStringElement == null)
145             findFaultStringElement();
146 
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         }
154 
155         this.faultStringElement.addTextNode(faultString);
156     }
157 
getFaultString()158     public String getFaultString() {
159         if (this.faultStringElement == null)
160             findFaultStringElement();
161         return this.faultStringElement.getValue();
162 
163     }
164 
getFaultStringLocale()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     }
177 
setFaultString(String faultString, Locale locale)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     }
185 
isStandardFaultElement(String localName)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     }
195 
appendFaultSubcode(QName subcode)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     }
203 
removeAllFaultSubcodes()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     }
211 
getFaultSubcodes()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     }
219 
getFaultReasonText(Locale locale)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     }
227 
getFaultReasonTexts()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     }
235 
getFaultReasonLocales()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     }
243 
addFaultReasonText(String text, java.util.Locale locale)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     }
252 
getFaultRole()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     }
260 
setFaultRole(String uri)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     }
268 
getFaultNode()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     }
276 
setFaultNode(String uri)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     }
284 
getDefaultFaultCode()285     protected QName getDefaultFaultCode() {
286         return new QName(SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE, "Server");
287     }
288 
addChildElement(SOAPElement element)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     }
300 
createSOAPFaultElement(QName qname)301     protected FaultElementImpl createSOAPFaultElement(QName qname) {
302          return new FaultElement1_1Impl(
303                        ((SOAPDocument) getOwnerDocument()).getDocument(),
304                        qname);
305     }
306 
createSOAPFaultElement(Name qname)307     protected FaultElementImpl createSOAPFaultElement(Name qname) {
308          return new FaultElement1_1Impl(
309                        ((SOAPDocument) getOwnerDocument()).getDocument(),
310                        (NameImpl)qname);
311     }
312 
setFaultCode(String faultCode, String prefix, String uri)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         }
323 
324         if (this.faultCodeElement == null)
325             findFaultCodeElement();
326 
327         if (this.faultCodeElement == null)
328             this.faultCodeElement = addFaultCodeElement();
329         else
330             this.faultCodeElement.removeContents();
331 
332         if (uri == null || "".equals(uri)) {
333             if (prefix != null && !"".equals("prefix")) {
334                 uri = this.faultCodeElement.getNamespaceURI(prefix);
335             }
336         }
337 
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         }
347 
348         checkIfStandardFaultCode(faultCode, uri);
349         ((FaultElementImpl) this.faultCodeElement).ensureNamespaceIsDeclared(prefix, uri);
350 
351         if (prefix == null || "".equals(prefix)) {
352             finallySetFaultCode(faultCode);
353         } else {
354             finallySetFaultCode(prefix + ":" + faultCode);
355         }
356     }
357 
standardFaultCode(String faultCode)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     }
369 
setFaultActor(String faultActor)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);
385 
386     }
387 }
388