001: /*
002: * Copyright 2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.ws.transport;
018:
019: import java.io.IOException;
020: import java.io.InputStream;
021: import java.io.OutputStream;
022: import java.util.Iterator;
023:
024: /**
025: * Abstract base class for {@link WebServiceConnection} implementations used for sending requests.
026: *
027: * @author Arjen Poutsma
028: * @since 1.0.0
029: */
030: public abstract class AbstractSenderConnection extends
031: AbstractWebServiceConnection {
032:
033: private TransportOutputStream requestOutputStream;
034:
035: private TransportInputStream responseInputStream;
036:
037: protected final TransportOutputStream createTransportOutputStream()
038: throws IOException {
039: if (requestOutputStream == null) {
040: requestOutputStream = new RequestTransportOutputStream();
041: }
042: return requestOutputStream;
043: }
044:
045: protected final TransportInputStream createTransportInputStream()
046: throws IOException {
047: if (hasResponse()) {
048: if (responseInputStream == null) {
049: responseInputStream = new ResponseTransportInputStream();
050: }
051: return responseInputStream;
052: } else {
053: return null;
054: }
055: }
056:
057: /** Indicates whether this connection has a response. */
058: protected abstract boolean hasResponse() throws IOException;
059:
060: /**
061: * Adds a request header with the given name and value. This method can be called multiple times, to allow for
062: * headers with multiple values.
063: *
064: * @param name the name of the header
065: * @param value the value of the header
066: */
067: protected abstract void addRequestHeader(String name, String value)
068: throws IOException;
069:
070: /** Returns the output stream to write the request to. */
071: protected abstract OutputStream getRequestOutputStream()
072: throws IOException;
073:
074: /**
075: * Returns an iteration over all the header names this request contains. Returns an empty <code>Iterator</code> if
076: * there areno headers.
077: */
078: protected abstract Iterator getResponseHeaderNames()
079: throws IOException;
080:
081: /**
082: * Returns an iteration over all the string values of the specified header. Returns an empty <code>Iterator</code>
083: * if there are no headers of the specified name.
084: */
085: protected abstract Iterator getResponseHeaders(String name)
086: throws IOException;
087:
088: /** Returns the input stream to read the response from. */
089: protected abstract InputStream getResponseInputStream()
090: throws IOException;
091:
092: /** Implementation of <code>TransportInputStream</code> for receiving-side connections. */
093: class RequestTransportOutputStream extends TransportOutputStream {
094:
095: public void addHeader(String name, String value)
096: throws IOException {
097: addRequestHeader(name, value);
098: }
099:
100: protected OutputStream createOutputStream() throws IOException {
101: return getRequestOutputStream();
102: }
103: }
104:
105: /** Implementation of {@link TransportInputStream} for client-side HTTP. */
106: class ResponseTransportInputStream extends TransportInputStream {
107:
108: protected InputStream createInputStream() throws IOException {
109: return getResponseInputStream();
110: }
111:
112: public Iterator getHeaderNames() throws IOException {
113: return getResponseHeaderNames();
114: }
115:
116: public Iterator getHeaders(String name) throws IOException {
117: return getResponseHeaders(name);
118: }
119:
120: }
121:
122: }
|