/**
* Copyright (C) 2008-2010, Squale Project - http://www.squale.org
*
* This file is part of Squale.
*
* Squale 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 any later version.
*
* Squale 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 General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Squale. If not, see <http://www.gnu.org/licenses/>.
*/
package org.squale.squalerest.client;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.squale.squalerest.exception.SqualeRestException;
import org.squale.squalerest.root.Applications;
import org.squale.squalerest.root.ByApplication;
import com.thoughtworks.xstream.XStream;
/**
* The squale rest http client
*
* @author bfranchet
*/
public class SqualeRestHttpClient
{
/**
* the user login
*/
private String user;
/**
* The user password
*/
private String password;
/**
* The server host
*/
private String host;
/**
* The server port
*/
private int port;
/**
* The server contextroot
*/
private String contextRoot;
/**
* Constructor
*/
public SqualeRestHttpClient()
{
}
/**
* Initialize the http client
*
* @param pUser The user login
* @param pPassword The user password
* @param pHost The server host
* @param pPort The server port
* @param pContextRoot The server contextRoot
*/
public void initialize( String pUser, String pPassword, String pHost, int pPort, String pContextRoot )
{
user = pUser;
password = pPassword;
host = pHost;
port = pPort;
if ( pContextRoot != null && pContextRoot.startsWith( "/" ) )
{
contextRoot = pContextRoot;
}
else
{
contextRoot = "/" + pContextRoot;
}
}
/**
* This method recovers the applications available for the current user. It returns only applications with at least
* one successful audit. Moreover, the user should have rights on the application or the application should be
* public
*
* @return The list of available applications
* @throws SqualeRestException Exception occurs during the search
*/
public Applications getApplications()
throws SqualeRestException
{
String path = contextRoot + "/rest/applications";
XStream xstream = new XStream();
xstream.processAnnotations( Applications.class );
Applications applications = (Applications) execute( path, xstream );
return applications;
}
/**
* This method recovers the applications available for the current user. It returns only applications with at least
* one successful audit. Moreover, the user should have rights on the application or the application should be
* public. This method retrieves many informations on the applications
*
* @return The list of available applications
* @throws SqualeRestException Exception occurs during the search
*/
public Applications getApplicationsFull()
throws SqualeRestException
{
String path = contextRoot + "/rest/applications_full";
XStream xstream = new XStream();
xstream.processAnnotations( Applications.class );
Applications applications = (Applications) execute( path, xstream );
return applications;
}
/**
* This method recovers the data of the application linked to the application id given in argument. The current user
* should have rights on this application (or the application should be public) in order to have the informations.
* The informations returns are
* <ul>
* <li>The list of all the successful audit for this application</li>
* <li>For the last successful audit, the module involve in this audit and their factors mark.</li>
* </ul>
*
* @param applicationId The application id
* @return The data linked to the application
* @throws SqualeRestException Exception occurs during the search
*/
public ByApplication getApplication( int applicationId )
throws SqualeRestException
{
String path = contextRoot + "/rest/application/" + applicationId;
XStream xstream = new XStream();
xstream.processAnnotations( ByApplication.class );
ByApplication application = (ByApplication) execute( path, xstream );
return application;
}
/**
* This method returns the data linked to the audit id given in argument. That means the application and the modukle
* and their factors marks for the current audit. The current user should have rights on the application linked to
* the audit (or the application should be public) in order to have the informations.
*
* @param auditId The audit id
* @return The data linked to the audit
* @throws SqualeRestException Exception occurs during the search
*/
public ByApplication getAudit( int auditId )
throws SqualeRestException
{
String path = contextRoot + "/rest/audit/" + auditId;
XStream xstream = new XStream();
xstream.processAnnotations( ByApplication.class );
ByApplication app = (ByApplication) execute( path, xstream );
return app;
}
/**
* This method executes the search
*
* @param path The query
* @param xstream The xstream processor
* @return The object result of the query
* @throws SqualeRestException Exception occurs during the serach
*/
private Object execute( String path, XStream xstream )
throws SqualeRestException
{
Object objectToReturn = null;
DefaultHttpClient httpclient = null;
try
{
httpclient = new DefaultHttpClient();
// Create credentials
UsernamePasswordCredentials creds = new UsernamePasswordCredentials( user, password );
httpclient.getCredentialsProvider().setCredentials( AuthScope.ANY, creds );
// Define the host
HttpHost targetHost = new HttpHost( host, port );
// Define the get method
HttpGet httpget = new HttpGet( path );
// Execute the request
HttpResponse response = httpclient.execute( targetHost, httpget );
if ( response.getStatusLine().getStatusCode() == HttpStatus.SC_OK )
{
HttpEntity entity = response.getEntity();
if ( entity != null )
{
InputStream is = null;
try
{
// Transform the xml stream into java object
is = entity.getContent();
objectToReturn = xstream.fromXML( is );
}
finally
{
// In all case close the input stream
if ( is != null )
{
is.close();
}
}
}
}
else
{
throw new SqualeRestException( response.getStatusLine().getStatusCode() + " : "
+ response.getStatusLine().getReasonPhrase() );
}
}
catch ( ClientProtocolException e )
{
throw new SqualeRestException( e );
}
catch ( IOException e )
{
throw new SqualeRestException( e );
}
finally
{
httpclient.getConnectionManager().shutdown();
}
return objectToReturn;
}
}