org.sonar.report.pdf.util.SonarAccess.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.report.pdf.util.SonarAccess.java

Source

/*
 * Sonar PDF Report (Maven plugin)
 * Copyright (C) 2010 klicap - ingenieria del puzle
 * dev@sonar.codehaus.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
 */

package org.sonar.report.pdf.util;

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.sonar.report.pdf.entity.exception.ReportException;

public class SonarAccess {

    /**
     * Sonar URL (i.e. http://localhost:9000/sonar).
     */
    private String sonarUrl;

    /**
     * Username for access Sonar WS API. Null for no authentication.
     */
    private String username;

    /**
     * Password for access Sonar WS API. Only used if username != null.
     */
    private String password;

    private String host;

    private int port;

    // TODO: provide POST method
    public SonarAccess(String sonarUrl, String username, String password) throws ReportException {
        if (!sonarUrl.endsWith("/")) {
            this.sonarUrl = sonarUrl;
        } else {
            this.sonarUrl = sonarUrl.substring(0, sonarUrl.length() - 1);
        }
        this.username = username;
        this.password = password;
        if (sonarUrl.startsWith("http://")) {
            String withoutProtocol = sonarUrl.substring(7);
            if (withoutProtocol.contains(":")) {
                this.host = withoutProtocol.substring(0, withoutProtocol.indexOf(':'));
            } else if (withoutProtocol.contains("/")) {
                this.host = withoutProtocol.substring(0, withoutProtocol.indexOf('/'));
            } else {
                this.host = withoutProtocol;
            }
            if (withoutProtocol.contains(":")) {
                if (withoutProtocol.contains("/")) {
                    this.port = Integer.valueOf(withoutProtocol.substring(withoutProtocol.indexOf(':') + 1,
                            withoutProtocol.indexOf('/')));
                } else {
                    this.port = Integer.valueOf(withoutProtocol.substring(withoutProtocol.indexOf(':') + 1));
                }
            } else {
                this.port = 80;
            }
        } else if (sonarUrl.startsWith("https://")) {
            throw new ReportException("SSL not supported yet: " + sonarUrl);
        } else {
            throw new ReportException("Unknown URL format: " + sonarUrl + " (forgot http:// before host?)");
        }
    }

    public Document getUrlAsDocument(String urlPath) throws HttpException, IOException, DocumentException {
        HttpClient client = new HttpClient();
        HttpMethod method = new GetMethod(this.sonarUrl + urlPath);
        int status = 0;

        Logger.debug("HTTP Request: " + this.sonarUrl + urlPath);
        if (this.username != null) {
            Logger.debug("Setting authentication with username: " + this.username);
            client.getParams().setAuthenticationPreemptive(true);
            client.getState().setCredentials(new AuthScope(this.host, this.port),
                    new UsernamePasswordCredentials(this.username, this.password));
            method.setDoAuthentication(true);
        }
        status = client.executeMethod(method);
        if (!(status == HttpStatus.SC_OK)) {
            Logger.error("Cant access to Sonar or project doesn't exist on Sonar instance. HTTP KO to "
                    + this.sonarUrl + urlPath);
            throw new IOException("Cant access to Sonar or project doesn't exist on Sonar instance.");
        }
        Logger.debug("Received response.");
        SAXReader reader = new SAXReader();
        return reader.read(method.getResponseBodyAsStream());
    }
}