001: /*
002: * Copyright 2006 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.http;
018:
019: import java.io.IOException;
020:
021: import org.apache.commons.httpclient.Credentials;
022: import org.apache.commons.httpclient.HttpClient;
023: import org.apache.commons.httpclient.HttpConnectionManager;
024: import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
025: import org.apache.commons.httpclient.NTCredentials;
026: import org.apache.commons.httpclient.UsernamePasswordCredentials;
027: import org.apache.commons.httpclient.auth.AuthScope;
028: import org.apache.commons.httpclient.methods.PostMethod;
029: import org.springframework.beans.factory.DisposableBean;
030: import org.springframework.beans.factory.InitializingBean;
031: import org.springframework.util.Assert;
032: import org.springframework.ws.transport.WebServiceConnection;
033:
034: /**
035: * <code>WebServiceMessageSender</code> implementation that uses <a href="http://jakarta.apache.org/commons/httpclient">Jakarta
036: * Commons HttpClient</a> to execute POST requests.
037: * <p/>
038: * Allows to use a preconfigured HttpClient instance, potentially with authentication, HTTP connection pooling, etc.
039: * Authentication can also be set by injecting a {@link Credentials} instance (such as the {@link
040: * UsernamePasswordCredentials}).
041: *
042: * @author Arjen Poutsma
043: * @see HttpUrlConnectionMessageSender
044: * @see HttpClient
045: * @see #setCredentials(Credentials)
046: * @since 1.0.0
047: */
048: public class CommonsHttpMessageSender extends
049: AbstractHttpWebServiceMessageSender implements
050: InitializingBean, DisposableBean {
051:
052: private HttpClient httpClient;
053:
054: private Credentials credentials;
055:
056: private AuthScope authScope;
057:
058: /**
059: * Create a new instance of the <code>CommonsHttpMessageSender</code> with a default {@link HttpClient} that uses a
060: * default {@link MultiThreadedHttpConnectionManager}.
061: */
062: public CommonsHttpMessageSender() {
063: httpClient = new HttpClient(
064: new MultiThreadedHttpConnectionManager());
065: }
066:
067: /**
068: * Create a new instance of the <code>CommonsHttpMessageSender</code> with the given {@link HttpClient} instance.
069: *
070: * @param httpClient the HttpClient instance to use for this sender
071: */
072: public CommonsHttpMessageSender(HttpClient httpClient) {
073: Assert.notNull(httpClient, "httpClient must not be null");
074: this .httpClient = httpClient;
075: }
076:
077: /** Returns the <code>HttpClient</code> used by this message sender. */
078: public HttpClient getHttpClient() {
079: return httpClient;
080: }
081:
082: /** Set the <code>HttpClient</code> used by this message sender. */
083: public void setHttpClient(HttpClient httpClient) {
084: this .httpClient = httpClient;
085: }
086:
087: /** Returns the credentials to be used. */
088: public Credentials getCredentials() {
089: return credentials;
090: }
091:
092: /**
093: * Sets the credentials to be used. If not set, no authentication is done.
094: *
095: * @see UsernamePasswordCredentials
096: * @see NTCredentials
097: */
098: public void setCredentials(Credentials credentials) {
099: this .credentials = credentials;
100: }
101:
102: /**
103: * Returns the authentication scope to be used. Only used when the <code>credentials</code> property has been set.
104: * <p/>
105: * By default, the {@link AuthScope#ANY} is returned.
106: */
107: public AuthScope getAuthScope() {
108: return authScope != null ? authScope : AuthScope.ANY;
109: }
110:
111: /**
112: * Sets the authentication scope to be used. Only used when the <code>credentials</code> property has been set.
113: * <p/>
114: * By default, the {@link AuthScope#ANY} is used.
115: *
116: * @see #setCredentials(Credentials)
117: */
118: public void setAuthScope(AuthScope authScope) {
119: this .authScope = authScope;
120: }
121:
122: public void afterPropertiesSet() throws Exception {
123: if (getCredentials() != null) {
124: getHttpClient().getState().setCredentials(getAuthScope(),
125: getCredentials());
126: }
127: }
128:
129: public void destroy() throws Exception {
130: HttpConnectionManager connectionManager = getHttpClient()
131: .getHttpConnectionManager();
132: if (connectionManager instanceof MultiThreadedHttpConnectionManager) {
133: ((MultiThreadedHttpConnectionManager) connectionManager)
134: .shutdown();
135: }
136: }
137:
138: public WebServiceConnection createConnection(String uri)
139: throws IOException {
140: PostMethod postMethod = new PostMethod(uri);
141: if (isAcceptGzipEncoding()) {
142: postMethod.addRequestHeader(HTTP_HEADER_ACCEPT_ENCODING,
143: ENCODING_GZIP);
144: }
145: return new CommonsHttpConnection(getHttpClient(), postMethod);
146: }
147:
148: }
|