| /******************************************************************************* |
| * Copyright (c) 2004, 2007 Mylyn project committers 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 |
| *******************************************************************************/ |
| package org.eclipse.mylyn.examples.monitor.study; |
| |
| import java.io.File; |
| import java.lang.reflect.InvocationTargetException; |
| import java.net.NoRouteToHostException; |
| import java.net.UnknownHostException; |
| import java.util.Calendar; |
| |
| import org.apache.commons.httpclient.HttpClient; |
| 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.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.dialogs.ProgressMonitorDialog; |
| import org.eclipse.jface.operation.IRunnableWithProgress; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.wizard.Wizard; |
| import org.eclipse.mylyn.commons.core.DateUtil; |
| import org.eclipse.mylyn.commons.core.StatusHandler; |
| import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin; |
| import org.eclipse.mylyn.internal.monitor.usage.wizards.UsageSubmissionWizard; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.INewWizard; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.plugin.AbstractUIPlugin; |
| |
| /** |
| * A wizard for uploading the Mylyn statistics to a website |
| * |
| * @author Shawn Minto |
| * @author Mik Kersten |
| */ |
| public class FeedbackWizard extends Wizard implements INewWizard { |
| |
| private final SubmitFeedbackPage feedbackPage; |
| |
| /** |
| * Constructor for SampleNewWizard. |
| */ |
| public FeedbackWizard(UsageSubmissionWizard wizard) { |
| super(); |
| setNeedsProgressMonitor(true); |
| |
| feedbackPage = new SubmitFeedbackPage(wizard); |
| } |
| |
| public FeedbackWizard() { |
| super(); |
| setNeedsProgressMonitor(true); |
| super.setDefaultPageImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(UiUsageMonitorPlugin.PLUGIN_ID, |
| "icons/wizban/banner-user.gif")); |
| super.setWindowTitle("Mylyn Feedback"); |
| feedbackPage = new SubmitFeedbackPage(null); |
| } |
| |
| @Override |
| public boolean performFinish() { |
| File f = feedbackPage.createFeedbackFile(); |
| if (f == null) { |
| return true; |
| } |
| upload(f, feedbackPage.getStringUid()); |
| if (f.exists()) { |
| f.delete(); |
| } |
| return true; |
| } |
| |
| private int status; |
| |
| /** |
| * Method to upload a file to a cgi script |
| * |
| * @param f |
| * The file to upload |
| */ |
| private void upload(File f, String uid) { |
| String uploadScript; |
| |
| // XXX: unimplemented |
| uploadScript = "<unimplemented>"; |
| // uploadScript = |
| // MylynUsageMonitorPlugin.getDefault().getStudyParameters().getScriptsUrl() |
| // + |
| // MylynUsageMonitorPlugin.getDefault().getStudyParameters().getScriptsQuestionnaire(); |
| |
| if (f.length() == 0) { |
| return; |
| } |
| |
| try { |
| final PostMethod filePost = new PostMethod(uploadScript); |
| |
| Part[] parts; |
| Part[] p = { new FilePart("MYLYN" + uid, UiUsageMonitorPlugin.UPLOAD_FILE_LABEL + "-" |
| + UiUsageMonitorPlugin.VERSION + "-" + "feedback" + "-" + uid + "-" |
| + DateUtil.getIsoFormattedDateTime(Calendar.getInstance()) + ".txt", f) }; |
| parts = p; |
| |
| filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams())); |
| |
| final HttpClient client = new HttpClient(); |
| UiUsageMonitorPlugin.getDefault().configureProxy(client, uploadScript); |
| |
| ProgressMonitorDialog pmd = new ProgressMonitorDialog(Display.getCurrent().getActiveShell()); |
| pmd.run(false, false, new IRunnableWithProgress() { |
| public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { |
| try { |
| status = client.executeMethod(filePost); |
| filePost.releaseConnection(); |
| |
| } 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 uploading the feedback" + ": \n" |
| + "No network connection. Please try again later"); |
| } else { |
| MessageDialog.openError(null, "Error Uploading", |
| "There was an error uploading the feedback" + ": \n" |
| + e.getClass().getCanonicalName()); |
| ; |
| } |
| } |
| monitor.worked(1); |
| monitor.done(); |
| } |
| }); |
| |
| if (status == 401) { |
| // The uid was incorrect so inform the user |
| MessageDialog.openError(null, "Error Uploading", "There was an error uploading the feedback: \n" |
| + "Your uid was incorrect: " + uid + "\n"); |
| } else if (status == 407) { |
| MessageDialog.openError(null, "Error Uploading", |
| "Could not upload because proxy server authentication failed. Please check your proxy server settings."); |
| } else if (status != 200) { |
| // there was a problem with the file upload so throw up an error |
| // dialog to inform the user |
| MessageDialog.openError(null, "Error Uploading", "There was an error uploading the feedback: \n" |
| + "HTTP Response Code " + status + "\n" + "Please try again later"); |
| } else { |
| // the file was uploaded successfully |
| } |
| |
| } catch (Exception e) { |
| StatusHandler.log(new Status(IStatus.ERROR, MylynUserStudyExamplePlugin.ID_PLUGIN, "Error uploading", 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) { |
| MessageDialog.openError(null, "Error Uploading", "There was an error uploading the feedback: \n" |
| + "No network connection. Please try again later"); |
| } else { |
| MessageDialog.openError(null, "Error Uploading", "There was an error uploading the feedback: \n" |
| + e.getClass().getCanonicalName()); |
| } |
| } finally { |
| f.delete(); |
| } |
| } |
| |
| /** |
| * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, |
| * org.eclipse.jface.viewers.IStructuredSelection) |
| */ |
| public void init(IWorkbench workbench, IStructuredSelection selection) { |
| // don't need to do any initialization |
| } |
| |
| @Override |
| public void addPages() { |
| addPage(feedbackPage); |
| } |
| } |