View Javadoc

1   /*
2    * Copyright 2007 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.springframework.ws.transport;
18  
19  import java.io.IOException;
20  import java.io.InputStream;
21  import java.io.OutputStream;
22  import java.util.Iterator;
23  
24  /**
25   * Abstract base class for {@link WebServiceConnection} implementations used for sending requests.
26   *
27   * @author Arjen Poutsma
28   * @since 1.0.0
29   */
30  public abstract class AbstractSenderConnection extends AbstractWebServiceConnection {
31  
32      private TransportOutputStream requestOutputStream;
33  
34      private TransportInputStream responseInputStream;
35  
36      protected final TransportOutputStream createTransportOutputStream() throws IOException {
37          if (requestOutputStream == null) {
38              requestOutputStream = new RequestTransportOutputStream();
39          }
40          return requestOutputStream;
41      }
42  
43      protected final TransportInputStream createTransportInputStream() throws IOException {
44          if (hasResponse()) {
45              if (responseInputStream == null) {
46                  responseInputStream = new ResponseTransportInputStream();
47              }
48              return responseInputStream;
49          }
50          else {
51              return null;
52          }
53      }
54  
55      /**
56       * Template method invoked from {@link #close()}. Default implementation is empty.
57       *
58       * @throws IOException if an I/O error occurs when closing this connection
59       */
60      protected void onClose() throws IOException {
61      }
62  
63      /** Indicates whether this connection has a response. */
64      protected abstract boolean hasResponse() throws IOException;
65  
66      /**
67       * Adds a request header with the given name and value. This method can be called multiple times, to allow for
68       * headers with multiple values.
69       *
70       * @param name  the name of the header
71       * @param value the value of the header
72       */
73      protected abstract void addRequestHeader(String name, String value) throws IOException;
74  
75      /** Returns the output stream to write the request to. */
76      protected abstract OutputStream getRequestOutputStream() throws IOException;
77  
78      /**
79       * Returns an iteration over all the header names this request contains. Returns an empty <code>Iterator</code> if
80       * there areno headers.
81       */
82      protected abstract Iterator getResponseHeaderNames() throws IOException;
83  
84      /**
85       * Returns an iteration over all the string values of the specified header. Returns an empty <code>Iterator</code>
86       * if there are no headers of the specified name.
87       */
88      protected abstract Iterator getResponseHeaders(String name) throws IOException;
89  
90      /** Returns the input stream to read the response from. */
91      protected abstract InputStream getResponseInputStream() throws IOException;
92  
93      /** Implementation of <code>TransportInputStream</code> for receiving-side connections. */
94      class RequestTransportOutputStream extends TransportOutputStream {
95  
96          public void addHeader(String name, String value) throws IOException {
97              addRequestHeader(name, value);
98          }
99  
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 }