001 /**
002 *
003 * Copyright 2004 Protique Ltd
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 *
017 **/
018 package org.codehaus.activesoap.soap;
019
020 import org.codehaus.activesoap.SoapFault;
021
022 import javax.xml.namespace.QName;
023 import javax.xml.stream.XMLStreamException;
024 import javax.xml.stream.XMLStreamWriter;
025 import java.io.PrintWriter;
026 import java.io.StringWriter;
027
028 /**
029 * Represents the SOAP 1.2 version
030 *
031 * @version $Revision: 1.6 $
032 */
033 public class Soap12 implements SoapVersion {
034 public static final String XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace";
035
036 private static Soap12 instance = new Soap12();
037
038 private double version = 1.2;
039 private String namespace = "http://www.w3.org/2003/05/soap-envelope";
040 private String prefix = "env";
041 private String noneRole = namespace + "/role/none";
042 private String ultimateReceiverRole = namespace + "/role/ultimateReceiver";
043 private String nextRole = namespace + "/role/next";
044 private String soapEncodingStyle = "http://www.w3.org/2003/05/soap-encoding";
045
046 private QName envelope = new QName(namespace, "Envelope", prefix);
047 private QName header = new QName(namespace, "Header", prefix);
048 private QName body = new QName(namespace, "Body", prefix);
049 private boolean debug = false;
050
051
052 public static Soap12 getInstance() {
053 return instance;
054 }
055
056 public void writeStartElement(XMLStreamWriter out, String localName) throws XMLStreamException {
057 out.writeStartElement(prefix, localName, namespace);
058 }
059
060 public void writeFault(XMLStreamWriter out, SoapFault fault) throws XMLStreamException {
061 writeStartElement(out, "Fault");
062
063 String code = fault.getCode();
064 if (code != null) {
065 writeStartElement(out, "Code");
066 writeStartElement(out, "Value");
067 out.writeCharacters(prefix + ":" + code);
068 out.writeEndElement();
069 String subcode = fault.getSubcode();
070 if (subcode != null) {
071 writeStartElement(out, "Subcode");
072 writeStartElement(out, "Value");
073 out.writeCharacters(subcode);
074 out.writeEndElement();
075 out.writeEndElement();
076 }
077 out.writeEndElement();
078 }
079 String reason = fault.getReason();
080 if (reason == null) {
081 reason = fault.getCause().toString();
082 }
083 writeStartElement(out, "Reason");
084 writeStartElement(out, "Text");
085 out.writeAttribute("xml", XML_NAMESPACE, "lang", "en-US");
086 out.writeCharacters(reason);
087 out.writeEndElement();
088 out.writeEndElement();
089
090 String node = fault.getNode();
091 if (node != null) {
092 writeStartElement(out, "Node");
093 out.writeCharacters(node);
094 out.writeEndElement();
095 }
096
097 String role = fault.getRole();
098 if (role != null) {
099 writeStartElement(out, "Role");
100 out.writeCharacters(role);
101 out.writeEndElement();
102 }
103
104 if (debug) {
105 StringWriter buffer = new StringWriter();
106 fault.printStackTrace(new PrintWriter(buffer));
107 out.writeStartElement("StackTrace");
108 out.writeCharacters(buffer.toString());
109 out.writeEndElement();
110 }
111 }
112
113 public double getVersion() {
114 return version;
115 }
116
117 public String getNamespace() {
118 return namespace;
119 }
120
121 public String getPrefix() {
122 return prefix;
123 }
124
125 public QName getEnvelope() {
126 return envelope;
127 }
128
129 public QName getHeader() {
130 return header;
131 }
132
133 public QName getBody() {
134 return body;
135 }
136
137
138 public String getSoapEncodingStyle() {
139 return soapEncodingStyle;
140 }
141
142 // Role URIs
143 //-------------------------------------------------------------------------
144 public String getNoneRole() {
145 return noneRole;
146 }
147
148 public String getUltimateReceiverRole() {
149 return ultimateReceiverRole;
150 }
151
152 public String getNextRole() {
153 return nextRole;
154 }
155 }