org.eclipse.mylyn.internal.monitor.usage.UsageUploadManager.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.internal.monitor.usage.UsageUploadManager.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 2010 Tasktop Technologies and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.internal.monitor.usage;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.NoRouteToHostException;
import java.net.UnknownHostException;

import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.net.AbstractWebLocation;
import org.eclipse.mylyn.commons.net.WebLocation;
import org.eclipse.mylyn.commons.net.WebUtil;
import org.eclipse.osgi.util.NLS;

public class UsageUploadManager {

    protected HttpClient httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());

    private static final int SIZE_OF_INT = 8;

    public IStatus uploadFile(final String postUrl, final File file, final int uid, IProgressMonitor monitor) {
        // make sure that we send the uid with all files
        String filename = file.getName();
        if (!filename.startsWith(uid + ".")) { //$NON-NLS-1$
            filename = uid + "-" + filename; //$NON-NLS-1$
        }
        return uploadFile(postUrl, "temp.txt", file, filename, uid, monitor); //$NON-NLS-1$

    }

    public IStatus uploadFile(final String postUrl, final String name, final File file, final String filename,
            final int uid, IProgressMonitor monitor) {

        PostMethod filePost = new PostMethod(postUrl);

        try {
            Part[] parts = { new FilePart(name, filename, file) };
            filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));

            AbstractWebLocation location = new WebLocation(postUrl);
            HostConfiguration hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
            final int status = WebUtil.execute(httpClient, hostConfiguration, filePost, monitor);

            if (status == HttpStatus.SC_UNAUTHORIZED) {
                // The uid was incorrect so inform the user
                return new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, status,
                        NLS.bind(Messages.UsageUploadManager_Error_Uploading_Uid_Incorrect, file.getName(), uid),
                        new Exception());

            } else if (status == HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED) {
                return new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, status,
                        Messages.UsageUploadManager_Error_Uploading_Proxy_Authentication, new Exception());
            } else if (status != 200) {
                // there was a problem with the file upload so throw up an error
                // dialog to inform the user
                return new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, status,
                        NLS.bind(Messages.UsageUploadManager_Error_Uploading_Http_Response, file.getName(), status),
                        new Exception());
            } else {
                // the file was uploaded successfully
                return Status.OK_STATUS;
            }

        } catch (final FileNotFoundException e) {
            return new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
                    NLS.bind(Messages.UsageUploadManager_Error_Uploading_X_Y, file.getName(),
                            e.getClass().getCanonicalName()),
                    e);

        } catch (final IOException e) {
            if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
                return new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
                        NLS.bind(Messages.UsageUploadManager_Error_Uploading_X_No_Network, file.getName()), e);

            } else {
                return new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
                        NLS.bind(Messages.UsageUploadManager_Error_Uploading_X_Y, file.getName(),
                                e.getClass().getCanonicalName()),
                        e);
            }
        } finally {
            filePost.releaseConnection();
        }
    }

    public int getExistingUid(StudyParameters studyParameters, String firstName, String lastName,
            String emailAddress, boolean anonymous, IProgressMonitor monitor) throws UsageDataException {
        // TODO extract url for servlet
        String url = studyParameters.getUserIdServletUrl();
        final GetMethod getUidMethod = new GetMethod(url);

        try {
            NameValuePair first = new NameValuePair("firstName", firstName); //$NON-NLS-1$
            NameValuePair last = new NameValuePair("lastName", lastName); //$NON-NLS-1$
            NameValuePair email = new NameValuePair("email", emailAddress); //$NON-NLS-1$
            NameValuePair job = new NameValuePair("jobFunction", ""); //$NON-NLS-1$ //$NON-NLS-2$
            NameValuePair size = new NameValuePair("companySize", ""); //$NON-NLS-1$ //$NON-NLS-2$
            NameValuePair buisness = new NameValuePair("companyBuisness", ""); //$NON-NLS-1$ //$NON-NLS-2$
            NameValuePair contact = new NameValuePair("contact", ""); //$NON-NLS-1$ //$NON-NLS-2$
            NameValuePair anon = null;
            if (anonymous) {
                anon = new NameValuePair("anonymous", "true"); //$NON-NLS-1$ //$NON-NLS-2$
            } else {
                anon = new NameValuePair("anonymous", "false"); //$NON-NLS-1$ //$NON-NLS-2$
            }

            if (studyParameters.usingContactField()) {
                getUidMethod.setQueryString(
                        new NameValuePair[] { first, last, email, job, size, buisness, anon, contact });
            } else {
                getUidMethod.setQueryString(new NameValuePair[] { first, last, email, job, size, buisness, anon });
            }

            // create a new client and upload the file
            AbstractWebLocation location = new WebLocation(url);
            HostConfiguration hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
            final int status = WebUtil.execute(httpClient, hostConfiguration, getUidMethod, monitor);

            if (status == HttpStatus.SC_OK) {
                InputStream inputStream = WebUtil.getResponseBodyAsStream(getUidMethod, monitor);
                try {
                    String response = getStringFromStream(inputStream);
                    response = response.substring(response.indexOf(":") + 1).trim(); //$NON-NLS-1$
                    int uid = Integer.parseInt(response);
                    return uid;
                } finally {
                    inputStream.close();
                }
            } else {
                throw new UsageDataException(
                        NLS.bind(Messages.UsageUploadManager_Error_Getting_Uid_Http_Response, status));
            }

        } catch (UsageDataException e) {
            throw e;
        } catch (final IOException e) {
            throw new UsageDataException(NLS.bind(Messages.UsageUploadManager_Error_Getting_UidX_Y,
                    e.getClass().getCanonicalName(), e.getMessage()), e);
        } catch (final Exception e) {
            if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
                throw new UsageDataException(Messages.UsageUploadManager_Error_Getting_Uid_No_Network, e);
            } else {
                throw new UsageDataException(NLS.bind(Messages.UsageUploadManager_Error_Getting_Uid_X_Y,
                        e.getClass().getCanonicalName(), e.getMessage()), e);
            }

        } finally {
            getUidMethod.releaseConnection();
        }
    }

    private String getStringFromStream(InputStream i) throws IOException {
        String s = ""; //$NON-NLS-1$
        String data = ""; //$NON-NLS-1$
        BufferedReader br = new BufferedReader(new InputStreamReader(i));
        while ((s = br.readLine()) != null) {
            data += s;
        }

        return data;
    }

    public int getNewUid(StudyParameters studyParameters, IProgressMonitor monitor) throws UsageDataException {
        // TODO extract url for servlet
        String url = studyParameters.getUserIdServletUrl();
        final PostMethod getUserIdMethod = new PostMethod(url);
        try {
            getUserIdMethod.addParameter(new NameValuePair("MylarUserID", "")); //$NON-NLS-1$//$NON-NLS-2$

            AbstractWebLocation location = new WebLocation(url);
            HostConfiguration hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
            final int status = WebUtil.execute(httpClient, hostConfiguration, getUserIdMethod, monitor);

            if (status == HttpStatus.SC_OK) {
                InputStream inputStream = WebUtil.getResponseBodyAsStream(getUserIdMethod, monitor);
                try {
                    byte[] buffer = new byte[SIZE_OF_INT];
                    int numBytesRead = inputStream.read(buffer);
                    int uid = new Integer(new String(buffer, 0, numBytesRead)).intValue();
                    return uid;
                } finally {
                    inputStream.close();
                }
            } else {
                throw new UsageDataException(
                        NLS.bind(Messages.UsageUploadManager_Error_Getting_Uid_Http_Response, status));
            }

        } catch (final IOException e) {
            if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
                throw new UsageDataException(Messages.UsageUploadManager_Error_Getting_Uid_No_Network, e);
            } else {
                throw new UsageDataException(
                        NLS.bind(Messages.UsageUploadManager_Error_Getting_Uid_X, e.getClass().getCanonicalName()),
                        e);

            }
        } finally {
            WebUtil.releaseConnection(getUserIdMethod, monitor);
        }
    }

    public int getNewUid(StudyParameters studyParameters, String firstName, String lastName, String emailAddress,
            boolean anonymous, String jobFunction, String companySize, String companyFunction, boolean contactEmail,
            IProgressMonitor monitor) throws UsageDataException {
        return getNewUid(studyParameters, monitor);
        // TODO add back the code for dealing with creasting a user given a name 
        //         // NameValuePair first = new NameValuePair("firstName", firstName);
        //         // NameValuePair last = new NameValuePair("lastName", lastName);
        //         // NameValuePair email = new NameValuePair("email", emailAddress);
        //         // NameValuePair job = new NameValuePair("jobFunction",
        //         // jobFunction);
        //         // NameValuePair size = new NameValuePair("companySize",
        //         // companySize);
        //         // NameValuePair buisness = new NameValuePair("companyBuisness",
        //         // companyFunction);
        //         // NameValuePair contact = null;
        //         // if (contactEmail) {
        //         // contact = new NameValuePair("contact", "true");
        //         // } else {
        //         // contact = new NameValuePair("contact", "false");
        //         // }
        //         // NameValuePair anon = null;
        //         // if (anonymous) {
        //         // anon = new NameValuePair("anonymous", "true");
        //         // } else {
        //         // anon = new NameValuePair("anonymous", "false");
        //         // }

        //      } catch (Exception e) {
        //         // there was a problem with the file upload so throw up an error
        //         // dialog to inform the user and log the exception
        //         if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
        //            MessageDialog.openError(null, "Error Uploading", "There was an error getting a new user id: \n"
        //                  + "No network connection.  Please try again later");
        //         } else {
        //            MessageDialog.openError(null, "Error Uploading", "There was an error getting a new user id: \n"
        //                  + e.getClass().getCanonicalName());
        //            StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Error uploading", e));
        //         }
        //      }

    }
}