| /******************************************************************************* |
| * 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)); |
| // } |
| // } |
| |
| } |
| } |