/******************************************************************************* * Copyright (c) 2010 the CHISEL group and contributors. * 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: * Del Myers - initial API and implementation *******************************************************************************/ /** * */ package ca.uvic.chisel.logging.eclipse.internal.network; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; 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.apache.commons.httpclient.methods.multipart.StringPart; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.ui.IMemento; import ca.uvic.chisel.logging.eclipse.WorkbenchLoggingPlugin; import ca.uvic.chisel.logging.eclipse.internal.Log; import ca.uvic.chisel.logging.eclipse.internal.LoggingCategory; /** * Uploads the data in a log to its category's server. * @author Del * */ public class LogUploadRunnable implements IRunnableWithProgress { private Log log; public LogUploadRunnable(Log log) { super(); this.log = log; } /* (non-Javadoc) * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) */ public void run(IProgressMonitor sendMonitor) throws InterruptedException, InvocationTargetException{ File[] filesToUpload = log.getCategory().getFilesToUpload(); sendMonitor.beginTask("Uploading Log " + log.getCategory().getName(), filesToUpload.length); LoggingCategory category = log.getCategory(); IMemento memento = category.getMemento(); for (File file : filesToUpload) { if (sendMonitor.isCanceled()) { throw new InterruptedException(); } PostMethod post = new PostMethod(category.getURL().toString()); try { Part[] parts = { new StringPart("KIND", "workbench-log"), new StringPart("CATEGORY", category.getCategoryID()), new StringPart("USER", WorkbenchLoggingPlugin.getDefault().getLocalUser()), new FilePart("WorkbenchLogger", file.getName(), file, "application/zip", null) }; post.setRequestEntity(new MultipartRequestEntity(parts, post.getParams())); HttpClient client = new HttpClient(); int status = client.executeMethod(post); String resp = getData(post.getResponseBodyAsStream()); if (status != 200 || !resp.startsWith("Status: 200 Success")) { IOException ex = new IOException(resp); throw (ex); } memento.putString("lastUpload", file.getName()); file.delete(); } catch (IOException e) { throw new InvocationTargetException(e); } finally { sendMonitor.worked(1); } } sendMonitor.done(); } private static String getData(InputStream i) { String s = ""; String data = ""; BufferedReader br = new BufferedReader(new InputStreamReader(i)); try { while ((s = br.readLine()) != null) data += s; } catch (IOException e) { WorkbenchLoggingPlugin.getDefault().log(e); } return data; } }