001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2009 SonarSource SA
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.wsclient.connectors;
021
022 import org.apache.commons.httpclient.*;
023 import org.apache.commons.httpclient.auth.AuthScope;
024 import org.apache.commons.httpclient.methods.GetMethod;
025 import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
026 import org.apache.commons.httpclient.util.URIUtil;
027 import org.sonar.wsclient.Host;
028 import org.sonar.wsclient.services.Query;
029
030 import java.io.BufferedReader;
031 import java.io.IOException;
032 import java.io.InputStream;
033 import java.io.InputStreamReader;
034
035 public class HttpClient3Connector implements Connector {
036
037 private static final int TIMEOUT_MS = 30000;
038 private static final int MAX_TOTAL_CONNECTIONS = 40;
039 private static final int MAX_HOST_CONNECTIONS = 4;
040
041 private final Host server;
042 private HttpClient httpClient;
043
044 public HttpClient3Connector(final Host server) {
045 this.server = server;
046 createClient();
047 }
048
049 public HttpClient3Connector(Host server, HttpClient httpClient) {
050 this.httpClient = httpClient;
051 this.server = server;
052 }
053
054 private void createClient() {
055 final HttpConnectionManagerParams params = new HttpConnectionManagerParams();
056 params.setConnectionTimeout(TIMEOUT_MS);
057 params.setDefaultMaxConnectionsPerHost(MAX_HOST_CONNECTIONS);
058 params.setMaxTotalConnections(MAX_TOTAL_CONNECTIONS);
059 final MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
060 connectionManager.setParams(params);
061 this.httpClient = new HttpClient(connectionManager);
062 configureCredentials();
063 }
064
065 private void configureCredentials() {
066 if (server.getUsername() != null) {
067 httpClient.getParams().setAuthenticationPreemptive(true);
068 Credentials defaultcreds = new UsernamePasswordCredentials(server.getUsername(), server.getPassword());
069 httpClient.getState().setCredentials(AuthScope.ANY, defaultcreds);
070 }
071 }
072
073 public String execute(Query query) {
074 GetMethod method = null;
075 String url = null;
076 String json = null;
077 try {
078 url = server.getHost() + URIUtil.encodeQuery(query.getUrl());
079 method = new GetMethod(url);
080 method.setRequestHeader("Accept", "application/json");
081 httpClient.executeMethod(method);
082 if (method.getStatusCode() == HttpStatus.SC_OK) {
083 json = getResponseBodyAsString(method);
084
085 } else if (method.getStatusCode() != HttpStatus.SC_NOT_FOUND) {
086 throw new ConnectionException("HTTP error: " + method.getStatusCode() + ", msg: " + method.getStatusText() + ", query: " + url);
087 }
088
089 } catch (HttpException e) {
090 throw new ConnectionException("Query: " + url, e);
091
092 } catch (IOException e) {
093 throw new ConnectionException("Query: " + url, e);
094
095 } finally {
096 if (method != null) {
097 method.releaseConnection();
098 }
099 }
100 return json;
101 }
102
103 private String getResponseBodyAsString(HttpMethod method) {
104 BufferedReader reader = null;
105 try {
106 final InputStream inputStream = method.getResponseBodyAsStream();
107 reader = new BufferedReader(new InputStreamReader(inputStream));
108 final StringBuilder sb = new StringBuilder();
109 String line;
110
111 while ((line = reader.readLine()) != null) {
112 sb.append(line).append("\n");
113 }
114 return sb.toString();
115
116 } catch (IOException e) {
117 throw new ConnectionException("Can not read response", e);
118
119 } finally {
120 if (reader != null) {
121 try {
122 reader.close();
123
124 } catch (Exception e) {
125 // TODO
126 }
127 }
128 }
129 }
130 }