1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws.soap.axiom;
18
19 import java.util.ArrayList;
20 import java.util.Iterator;
21 import java.util.List;
22 import java.util.Locale;
23 import javax.xml.namespace.QName;
24
25 import org.springframework.util.StringUtils;
26 import org.springframework.ws.soap.axiom.support.AxiomUtils;
27 import org.springframework.ws.soap.soap12.Soap12Fault;
28 import org.springframework.xml.namespace.QNameUtils;
29
30 import org.apache.axiom.om.OMNamespace;
31 import org.apache.axiom.soap.SOAPFactory;
32 import org.apache.axiom.soap.SOAPFault;
33 import org.apache.axiom.soap.SOAPFaultCode;
34 import org.apache.axiom.soap.SOAPFaultNode;
35 import org.apache.axiom.soap.SOAPFaultReason;
36 import org.apache.axiom.soap.SOAPFaultSubCode;
37 import org.apache.axiom.soap.SOAPFaultText;
38 import org.apache.axiom.soap.SOAPFaultValue;
39 import org.apache.axiom.soap.SOAPProcessingException;
40
41
42 class AxiomSoap12Fault extends AxiomSoapFault implements Soap12Fault {
43
44 AxiomSoap12Fault(SOAPFault axiomFault, SOAPFactory axiomFactory) {
45 super(axiomFault, axiomFactory);
46 }
47
48 public QName getFaultCode() {
49 return getAxiomFault().getCode().getValue().getTextAsQName();
50 }
51
52 public Iterator<QName> getFaultSubcodes() {
53 List<QName> subcodes = new ArrayList<QName>();
54 SOAPFaultSubCode subcode = getAxiomFault().getCode().getSubCode();
55 while (subcode != null) {
56 subcodes.add(subcode.getValue().getTextAsQName());
57 subcode = subcode.getSubCode();
58 }
59 return subcodes.iterator();
60 }
61
62 public void addFaultSubcode(QName subcode) {
63 SOAPFaultCode faultCode = getAxiomFault().getCode();
64 SOAPFaultSubCode faultSubCode = null;
65 if (faultCode.getSubCode() == null) {
66 faultSubCode = getAxiomFactory().createSOAPFaultSubCode(faultCode);
67 }
68 else {
69 faultSubCode = faultCode.getSubCode();
70 while (true) {
71 if (faultSubCode.getSubCode() != null) {
72 faultSubCode = faultSubCode.getSubCode();
73 }
74 else {
75 faultSubCode = getAxiomFactory().createSOAPFaultSubCode(faultSubCode);
76 break;
77 }
78 }
79 }
80 SOAPFaultValue faultValue = getAxiomFactory().createSOAPFaultValue(faultSubCode);
81 setValueText(subcode, faultValue);
82 }
83
84 private void setValueText(QName code, SOAPFaultValue faultValue) {
85 String prefix = QNameUtils.getPrefix(code);
86 if (StringUtils.hasLength(code.getNamespaceURI()) && StringUtils.hasLength(prefix)) {
87 OMNamespace namespace = getAxiomFault().findNamespaceURI(prefix);
88 if (namespace == null) {
89 getAxiomFault().declareNamespace(code.getNamespaceURI(), prefix);
90 }
91 }
92 else if (StringUtils.hasLength(code.getNamespaceURI())) {
93 OMNamespace namespace = getAxiomFault().findNamespace(code.getNamespaceURI(), null);
94 if (namespace == null) {
95 throw new IllegalArgumentException("Could not resolve namespace of code [" + code + "]");
96 }
97 code = QNameUtils.createQName(code.getNamespaceURI(), code.getLocalPart(), namespace.getPrefix());
98 }
99 faultValue.setText(prefix + ":" + code.getLocalPart());
100 }
101
102 public String getFaultNode() {
103 SOAPFaultNode faultNode = getAxiomFault().getNode();
104 if (faultNode == null) {
105 return null;
106 }
107 else {
108 return faultNode.getFaultNodeValue();
109 }
110 }
111
112 public void setFaultNode(String uri) {
113 try {
114 SOAPFaultNode faultNode = getAxiomFactory().createSOAPFaultNode(getAxiomFault());
115 faultNode.setFaultNodeValue(uri);
116 getAxiomFault().setNode(faultNode);
117 }
118 catch (SOAPProcessingException ex) {
119 throw new AxiomSoapFaultException(ex);
120 }
121 }
122
123 public String getFaultStringOrReason() {
124 return getFaultReasonText(Locale.getDefault());
125 }
126
127 public String getFaultReasonText(Locale locale) {
128 SOAPFaultReason faultReason = getAxiomFault().getReason();
129 String language = AxiomUtils.toLanguage(locale);
130 SOAPFaultText faultText = faultReason.getSOAPFaultText(language);
131 return faultText != null ? faultText.getText() : null;
132 }
133
134 public void setFaultReasonText(Locale locale, String text) {
135 SOAPFaultReason faultReason = getAxiomFault().getReason();
136 String language = AxiomUtils.toLanguage(locale);
137 try {
138 SOAPFaultText faultText = getAxiomFactory().createSOAPFaultText(faultReason);
139 faultText.setLang(language);
140 faultText.setText(text);
141 }
142 catch (SOAPProcessingException ex) {
143 throw new AxiomSoapFaultException(ex);
144 }
145 }
146
147 }