001    /*
002     * Sonar, open source software quality management tool.
003     * Copyright (C) 2008-2011 SonarSource
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.api.utils;
021    
022    import org.apache.commons.configuration.Configuration;
023    import org.apache.commons.io.IOUtils;
024    import org.apache.commons.lang.StringUtils;
025    import org.sonar.api.BatchComponent;
026    
027    import java.io.IOException;
028    import java.io.InputStream;
029    import java.io.InputStreamReader;
030    import java.io.Reader;
031    import java.net.HttpURLConnection;
032    import java.net.URL;
033    
034    /**
035     * @since 1.10
036     * @deprecated use org.sonar.api.plaform.Server instead
037     */
038    @Deprecated
039    public class ServerHttpClient implements BatchComponent {
040    
041      protected static final String SERVER_API_PATH = "/api/server";
042      private static final String KEY_PATH = SERVER_API_PATH + "/key";
043      private static final String VERSION_PATH = SERVER_API_PATH + "/version";
044      protected static final String MAVEN_PATH = "/deploy/maven";
045      private static final int CONNECT_TIMEOUT_MILLISECONDS = 30000;
046      private static final int READ_TIMEOUT_MILLISECONDS = 60000;
047    
048      private String url;
049      private Integer connectTimeoutMiliseconds = CONNECT_TIMEOUT_MILLISECONDS;
050      private Integer readTimeoutMiliseconds = READ_TIMEOUT_MILLISECONDS;
051    
052      public ServerHttpClient(String remoteServerUrl) {
053        this(remoteServerUrl, null, null);
054      }
055    
056      public ServerHttpClient(String remoteServerUrl, Integer connectTimeoutMiliseconds, Integer readTimeoutMiliseconds) {
057        this.url = StringUtils.chomp(remoteServerUrl, "/");
058        if (connectTimeoutMiliseconds != null) {
059          this.connectTimeoutMiliseconds = connectTimeoutMiliseconds;
060        }
061        if (readTimeoutMiliseconds != null) {
062          this.readTimeoutMiliseconds = readTimeoutMiliseconds;
063        }
064    
065      }
066    
067      public ServerHttpClient(Configuration configuration) {
068        this(configuration.getString("sonar.host.url", "http://localhost:9000"),
069            configuration.getInteger("sonar.host.connectTimeoutMs", CONNECT_TIMEOUT_MILLISECONDS),
070            configuration.getInteger("sonar.host.readTimeoutMs", READ_TIMEOUT_MILLISECONDS));
071    
072      }
073    
074      /**
075       * Throws a runtime ServerConnectionException if it fails to connect Sonar server
076       */
077      public void checkUp() {
078        String exceptionLabel = "Sonar server at " + url +
079            " is unreacheable. Either start it or setup the sonar.host.url setting if the URL is incorrect";
080        if (getId() == null) {
081          throw new ServerConnectionException(exceptionLabel);
082        }
083      }
084    
085      public String getId() {
086        return executeAction(KEY_PATH);
087      }
088    
089      public String getVersion() {
090        return executeAction(VERSION_PATH);
091      }
092    
093      public String getMavenRepositoryUrl() {
094        return this.url + MAVEN_PATH;
095      }
096    
097      protected String executeAction(String action) {
098        String result = getRemoteContent(url + action);
099        if (StringUtils.isBlank(result)) {
100          throw new ServerApiEmptyContentException("Empty " + action + " returned from server");
101        }
102        return result;
103      }
104    
105      protected String getRemoteContent(String url) {
106        HttpURLConnection conn = null;
107        Reader reader = null;
108        try {
109          conn = getConnection(url, "GET");
110          reader = new InputStreamReader((InputStream) conn.getContent());
111    
112          int statusCode = conn.getResponseCode();
113          if (statusCode != HttpURLConnection.HTTP_OK) {
114            throw new ServerConnectionException("Status returned by url : '" + url + "' is invalid : " + statusCode);
115          }
116    
117          return IOUtils.toString(reader);
118        } catch (IOException e) {
119          throw new ServerConnectionException("url=" + url, e);
120    
121        } finally {
122          IOUtils.closeQuietly(reader);
123          if (conn != null) {
124            conn.disconnect();
125          }
126        }
127      }
128    
129      public String getUrl() {
130        return url;
131      }
132    
133      private HttpURLConnection getConnection(String url, String method) throws IOException {
134        URL page = new URL(url);
135        HttpURLConnection conn = (HttpURLConnection) page.openConnection();
136        conn.setConnectTimeout(connectTimeoutMiliseconds);
137        conn.setReadTimeout(readTimeoutMiliseconds);
138    
139        conn.setRequestMethod(method);
140        conn.connect();
141        return conn;
142      }
143    
144      public static class ServerApiEmptyContentException extends SonarException {
145    
146        public ServerApiEmptyContentException(String s) {
147          super(s);
148        }
149      }
150    
151      public static class ServerConnectionException extends SonarException {
152    
153        public ServerConnectionException(String msg) {
154          super(msg);
155        }
156    
157        public ServerConnectionException(String msg, Throwable throwable) {
158          super(msg, throwable);
159        }
160    
161      }
162    }