001: /**
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */package org.apache.cxf.binding.soap;
019:
020: import java.util.HashMap;
021: import java.util.Map;
022: import java.util.ResourceBundle;
023:
024: import javax.xml.namespace.QName;
025:
026: import org.apache.cxf.common.i18n.Message;
027: import org.apache.cxf.common.util.StringUtils;
028: import org.apache.cxf.interceptor.Fault;
029:
030: public class SoapFault extends Fault {
031:
032: public static final QName ATTACHMENT_IO = new QName(
033: Soap12.SOAP_NAMESPACE, "AttachmentIOError");
034:
035: /**
036: * "The message was incorrectly formed or did not contain the appropriate
037: * information in order to succeed." -- SOAP 1.2 Spec
038: */
039:
040: /**
041: * A SOAP 1.2 only fault code. <p/> "The message could not be processed for
042: * reasons attributable to the processing of the message rather than to the
043: * contents of the message itself." -- SOAP 1.2 Spec <p/> If this message is
044: * used in a SOAP 1.1 Fault it will most likely (depending on the
045: * FaultHandler) be mapped to "Sender" instead.
046: */
047:
048: private QName subCode;
049: private String role;
050: private String node;
051: private Map<String, String> namespaces = new HashMap<String, String>();
052:
053: public SoapFault(Message message, Throwable throwable,
054: QName faultCode) {
055: super (message, throwable, faultCode);
056: }
057:
058: public SoapFault(Message message, QName faultCode) {
059: super (message, faultCode);
060: }
061:
062: public SoapFault(String message, QName faultCode) {
063: super (new Message(message, (ResourceBundle) null), faultCode);
064: }
065:
066: public String getCodeString(String prefix, String defaultPrefix) {
067: return getFaultCodeString(prefix, defaultPrefix, getFaultCode());
068: }
069:
070: public String getSubCodeString(String prefix, String defaultPrefix) {
071: return getFaultCodeString(prefix, defaultPrefix, subCode);
072: }
073:
074: private String getFaultCodeString(String prefix,
075: String defaultPrefix, QName fCode) {
076: String codePrefix = null;
077: if (StringUtils.isEmpty(prefix)) {
078: codePrefix = fCode.getPrefix();
079: if (StringUtils.isEmpty(codePrefix)) {
080: codePrefix = defaultPrefix;
081: }
082: } else {
083: codePrefix = prefix;
084: }
085:
086: return codePrefix + ":" + fCode.getLocalPart();
087: }
088:
089: public String getReason() {
090: return getMessage();
091: }
092:
093: /**
094: * Returns the fault actor.
095: *
096: * @return the fault actor.
097: */
098: public String getRole() {
099: return role;
100: }
101:
102: /**
103: * Sets the fault actor.
104: *
105: * @param actor the actor.
106: */
107: public void setRole(String actor) {
108: this .role = actor;
109: }
110:
111: public String getNode() {
112: return node;
113: }
114:
115: public void setNode(String n) {
116: this .node = n;
117: }
118:
119: /**
120: * Returns the SubCode for the Fault Code.
121: *
122: * @return The SubCode element as detailed by the SOAP 1.2 spec.
123: */
124: public QName getSubCode() {
125: return subCode;
126: }
127:
128: /**
129: * Sets the SubCode for the Fault Code.
130: *
131: * @param subCode The SubCode element as detailed by the SOAP 1.2 spec.
132: */
133: public void setSubCode(QName subCode) {
134: this .subCode = subCode;
135: }
136:
137: public Map<String, String> getNamespaces() {
138: return namespaces;
139: }
140:
141: public void setNamespaces(Map<String, String> namespaces) {
142: this .namespaces = namespaces;
143: }
144:
145: public static SoapFault createFault(Fault f, SoapVersion v) {
146: if (f instanceof SoapFault) {
147: return (SoapFault) f;
148: }
149:
150: QName fc = f.getFaultCode();
151: if (Fault.FAULT_CODE_CLIENT.equals(fc)) {
152: fc = v.getSender();
153: } else if (Fault.FAULT_CODE_SERVER.equals(fc)) {
154: fc = v.getReceiver();
155: }
156: SoapFault soapFault = new SoapFault(new Message(f.getMessage(),
157: (ResourceBundle) null), f.getCause(), fc);
158:
159: soapFault.setDetail(f.getDetail());
160: return soapFault;
161: }
162: }
|