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;
019
020 import org.codehaus.activesoap.util.XMLStreamHelper;
021 import org.codehaus.activesoap.util.DocumentFilterXMLStreamWriter;
022
023 import javax.xml.stream.XMLStreamException;
024 import javax.xml.stream.XMLStreamReader;
025 import javax.xml.stream.XMLStreamWriter;
026 import java.util.HashMap;
027 import java.util.Map;
028 import java.util.Set;
029
030
031 /**
032 * Represents the context of the processing of a single message, providing
033 * access to the current REST or SOAP service on which the message is invoked
034 * and providing access to pre-request properties which can be used to communicate
035 * among {@link Handler} instances.
036 *
037 * @version $Revision: 1.3 $
038 */
039 public class MessageExchange {
040 private RestService service;
041
042 private XMLStreamReader in;
043 private XMLStreamWriter out;
044
045 // only ever accessed in 1 thread during the processing of 1 message
046 // so no need to synchonize
047 private Map properties;
048
049 public MessageExchange(RestService service, XMLStreamReader in, XMLStreamWriter out) {
050 this(service, in, out, new HashMap());
051 }
052
053 public MessageExchange(RestService service, XMLStreamReader in, XMLStreamWriter out, Map properties) {
054 this.service = service;
055 this.in = in;
056 this.out = out;
057 this.properties = properties;
058 }
059
060
061 /**
062 * Creates a new message exchange with different input and output
063 */
064 public MessageExchange newInstance(XMLStreamReader in, XMLStreamWriter out) {
065 if (this.in == in && this.out == out) {
066 // no need to create a new instance
067 return this;
068 }
069 return new MessageExchange(service, in, out, properties);
070 }
071
072 // Access to message context properties
073 //-------------------------------------------------------------------------
074
075 /**
076 * Looks up the property for the given key which is typically a String or QName
077 * or a QName returning the value or null if it is not present.
078 *
079 * @param name is typically a String or a QName
080 * @return the value or null if there is no property defined for the given name
081 */
082 public Object getProperty(Object name) {
083 return properties.get(name);
084 }
085
086 /**
087 * Sets the value of the given property name (which is typically a String or a QName)
088 * to the value.
089 *
090 * @param name is the name of the property which is usually a String or a QName but could be any object
091 * @param value the value of the new attribute
092 */
093 public void setProperty(Object name, Object value) {
094 if (value == null) {
095 properties.remove(value);
096 }
097 else {
098 properties.put(name, value);
099 }
100 }
101
102 /**
103 * Return a collection of the available property names which are typically String or QName instances
104 */
105 public Set getPropertyNames() {
106 return properties.keySet();
107 }
108
109
110 // Access to input and output
111 //-------------------------------------------------------------------------
112 public XMLStreamReader getIn() {
113 return in;
114 }
115
116 public XMLStreamWriter getOut() {
117 return out;
118 }
119
120 /**
121 * A helper method which streams the input to the output
122 */
123 public void copy(XMLStreamReader in, XMLStreamWriter out) throws XMLStreamException {
124 boolean repairing = service.isRepairingNamespace();
125 XMLStreamHelper.copy(in, out, repairing);
126
127 }
128
129
130 // Helper methods
131 //-------------------------------------------------------------------------
132
133 public boolean isRepairingNamespace() {
134 return service.isRepairingNamespace();
135 }
136
137 /**
138 * Returns the current service instance which is processing the message
139 * so that we can access the details such as the handler registry
140 */
141 public RestService getService() {
142 return service;
143 }
144
145 /**
146 * Returns the current SOAP service instance, if we are using the SOAP protocol
147 * so that you can access the SOAP details such as available roles, SOAP version,
148 * intermidate mode etc.
149 *
150 * @return the SOAP service if the current service or null if the current service is
151 * a pure REST service and does not use the SOAP protocol.
152 */
153 public SoapService getSoapService() {
154 if (service instanceof SoapService) {
155 return (SoapService) service;
156 }
157 return null;
158 }
159 }