buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsClient.java
author wbernard
Fri, 13 Aug 2010 14:59:05 +0300
changeset 628 7c4a911dc066
parent 588 c7c26511138f
permissions -rw-r--r--
helium_11.0.0-e00f171ca185

/*
 * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the License "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description:  
 *
 */

package com.nokia.helium.diamonds;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.FileRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.nokia.helium.core.EmailDataSender;
import com.nokia.helium.core.EmailSendException;

/**
 * Diamonds client used to connect to get build id and also to send the build results
 * 
 */
public class DiamondsClient {

    private static final int INT_SERV_ERROR = 500;

    private static final int SERV_NOT_FOUND = 404;

    private static final int SERV_OK = 200;

    private boolean isRecordOnly;

    private Logger log = Logger.getLogger(DiamondsClient.class);

    private String host;

    private String port;

    private String path;

    private String emailID;

    private HttpClient httpClient;

    public DiamondsClient(String hst, String prt, String pth, String mailID) {
        host = hst;
        port = prt;
        path = pth;
        emailID = mailID;
        httpClient = new HttpClient();
    }

    private int executeMethod(PostMethod postMethod) throws DiamondsException {
        int result = 0;
        try {
            result = httpClient.executeMethod(postMethod);
        }
        catch (IOException e) {
            isRecordOnly = true;
            throw new DiamondsException("IOException while sending http request." + e.getMessage());
            // e.printStackTrace();
        }
        return result;
    }

    private String checkForProtocol(String url) throws DiamondsException {
        String retURL = url;
        if (!StringUtils.containsIgnoreCase(url, "http://")) {
            retURL = "http://" + url;
        }
        return retURL;
    }

    private String getURL() throws DiamondsException {
        return getURL(null);
    }

    private String getURL(String subPath) throws DiamondsException {
        String urlPath = path;
        if (subPath != null) {
            urlPath = subPath;
        }
        return checkForProtocol("http://" + host + ":" + port + urlPath);
    }

    private PostMethod getPostMethod(String fileName, String urlPath) {

        // Get the Diamonds XML-file which is to be exported
        File input = new File(fileName);

        // Prepare HTTP post
        PostMethod post = new PostMethod(urlPath);

        // Request content will be retrieved directly
        // from the input stream

        RequestEntity entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1");
        post.setRequestEntity(entity);
        return post;
    }

    private int processPostMethodResult(int result) {
        // Log status code
        switch (result) {
            case INT_SERV_ERROR:
                // log.error("Internal server error");
                break;
            case SERV_NOT_FOUND:
                // log.error("Server not found");
                break;
            case SERV_OK:
                // log.info("Connection to diamonds server - OK");
                break;
            default:
                // log.debug("Response code: " + result);
        }
        return result;
    }
    
    public String getBuildId(InputStream stream) throws DiamondsException {
        String diamondsBuildID = null;
        PostMethod postMethod = null;
        try {
            if (!isRecordOnly) {
                String strURL = getURL();
                log.debug("strURL:" + strURL);
                postMethod = getPostMethod(stream, strURL);
                log.debug("postmethod:" + postMethod);
                int postMethodResult = httpClient.executeMethod(postMethod);
                log.debug("postmethod-result:" + postMethodResult);

                int result = processPostMethodResult(postMethodResult);

                if (result == SERV_OK) {
                    // Display and save response code which functions as a id for
                    // the build.
                    diamondsBuildID = postMethod.getResponseBodyAsString();
                    log.debug("diamondsBuildID: " + diamondsBuildID);
                }
                else {
                    isRecordOnly = true;
                    log.error("Diamonds data not sent, because of connection failure.");
                    // throw new DiamondsException("Connection Failed");
                }
            }
        }
        catch (HttpException ex) {
            isRecordOnly = true;
            log.debug("Diamonds data not sent:s", ex);
            log.error("Diamonds data not sent: " + ex.getMessage());
        }
        catch (IOException ex) {
            isRecordOnly = true;
            log.debug("Diamonds data not sent:", ex);
            log.error("Diamonds data not sent: " + ex.getMessage());
        }
        finally {
            // Release current connection to the connection pool once you are
            // done
            if (postMethod != null) {
                postMethod.releaseConnection();
            }
        }
        return diamondsBuildID;
    }

    /**
     * 
     * @param fileName Filename to export to Diamonds
     * @return diamonds build id
     */
    public String getBuildId(String fileName) throws DiamondsException {
        String diamondsBuildID = null;
        PostMethod postMethod = null;

        // Get HTTP client
        // MyHttpClient httpclient = createHttpClient();

        // Execute post request
        try {
            if (!isRecordOnly) {
                String strURL = getURL();
                log.debug("strURL:" + strURL);
                postMethod = getPostMethod(fileName, strURL);
                log.debug("postmethod:" + postMethod);
                int postMethodResult = httpClient.executeMethod(postMethod);
                log.debug("postmethod-result:" + postMethodResult);

                int result = processPostMethodResult(postMethodResult);

                if (result == SERV_OK) {
                    // Display and save response code which functions as a id for
                    // the build.
                    diamondsBuildID = postMethod.getResponseBodyAsString();
                    log.debug("diamondsBuildID: " + diamondsBuildID);
                }
                else {
                    isRecordOnly = true;
                    log.error("Diamonds data not sent, because of connection failure.");
                    // throw new DiamondsException("Connection Failed");
                }
            }
        }
        catch (HttpException ex) {
            isRecordOnly = true;
            log.debug("Diamonds data not sent:s", ex);
            log.error("Diamonds data not sent: " + ex.getMessage());
        }
        catch (IOException ex) {
            isRecordOnly = true;
            log.debug("Diamonds data not sent:", ex);
            log.error("Diamonds data not sent: " + ex.getMessage());
        }
        finally {
            // Release current connection to the connection pool once you are
            // done
            if (postMethod != null) {
                postMethod.releaseConnection();
            }
        }
        return diamondsBuildID;
    }

    private PostMethod getPostMethod(InputStream stream, String urlPath) {

        // Get the Diamonds XML-file which is to be exported
        //File input = new File(fileName);

        // Prepare HTTP post
        PostMethod post = new PostMethod(urlPath);

        RequestEntity entity = new InputStreamRequestEntity(stream, "text/xml");
        post.setRequestEntity(entity);
        return post;
    }

    public int sendData(InputStream stream, String urlPath) {
        PostMethod postMethod = null;
        int result = -1;
        if (urlPath != null && !isRecordOnly) {
            try {
                String strURL = getURL(urlPath);
                postMethod = getPostMethod(stream, strURL);
                result = processPostMethodResult(httpClient.executeMethod(postMethod));
            }
            catch (IllegalArgumentException e) {
                // Catching this exception is needed because it is raised by httpclient
                // library if the server is under update.
                log.error("sendData:The final data via http not sent because errors:IllegalArgumentException ", e);
            }
            catch (DiamondsException e) {
                log.error("sendData:The final data via http not sent because errors:DiamondsException ", e);
            }
            catch (IOException e) {
                log.error("sendData:The final data via http not sent because errors:IOException ", e);
            }
        }
        return result;
    }
    
    public int sendData(String fileName, String urlPath) {
        PostMethod postMethod = null;
        int result = -1;
        if (urlPath != null && !isRecordOnly) {
            try {
                String strURL = getURL(urlPath);
                postMethod = getPostMethod(fileName, strURL);
                result = processPostMethodResult(httpClient.executeMethod(postMethod));
            }
            catch (IllegalArgumentException e) {
                // Catching this exception is needed because it is raised by httpclient
                // library if the server is under update.
                log.error("sendData:The final data via http not sent because errors:IllegalArgumentException ", e);
            }
            catch (DiamondsException e) {
                log.error("sendData:The final data via http not sent because errors:DiamondsException ", e);
            }
            catch (IOException e) {
                log.error("sendData:The final data via http not sent because errors:IOException ", e);
            }
        }
        return result;
    }

    public int sendDataByMail(String fileName, String smtpServer, String ldapServer) throws EmailSendException {
        log.debug("DiamondsClient:sendDataByEmail:emailID" + emailID);
        EmailDataSender emailSender = new EmailDataSender(emailID, smtpServer, ldapServer);
        log.debug("DiamondsClient:sendDataByEmail: " + fileName);
        emailSender.sendData("diamonds", new File(fileName), "application/xml", "[DIAMONDS_DATA]", null);
        log.debug("DiamondsClient:sendDataByEmail:succeeds");
        return 0;
    }
}