Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorslewis2007-12-10 18:58:59 +0000
committerslewis2007-12-10 18:58:59 +0000
commit260e1d515d2cb9df0b8f4668ca57a1894dfd3780 (patch)
tree777939d5b0228c82531738fc9e32aa31e1004ea9 /providers
parentf470bb2f21f503b15385ffceaa8f29af1c43add0 (diff)
downloadorg.eclipse.ecf-260e1d515d2cb9df0b8f4668ca57a1894dfd3780.tar.gz
org.eclipse.ecf-260e1d515d2cb9df0b8f4668ca57a1894dfd3780.tar.xz
org.eclipse.ecf-260e1d515d2cb9df0b8f4668ca57a1894dfd3780.zip
Additions to outgoingfiletransfercontainer adapter API and implementation.
Diffstat (limited to 'providers')
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.filetransfer/META-INF/MANIFEST.MF4
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/internal/provider/filetransfer/Messages.java1
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/internal/provider/filetransfer/messages.properties1
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/outgoing/AbstractOutgoingFileTransfer.java334
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/AbstractRetrieveFileTransfer.java8
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/UrlConnectionRetrieveFileTransfer.java1
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/util/JREProxyHelper.java (renamed from providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/JREProxyHelper.java)2
7 files changed, 346 insertions, 5 deletions
diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer/META-INF/MANIFEST.MF b/providers/bundles/org.eclipse.ecf.provider.filetransfer/META-INF/MANIFEST.MF
index 0f65aa530..007d59fc0 100644
--- a/providers/bundles/org.eclipse.ecf.provider.filetransfer/META-INF/MANIFEST.MF
+++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer/META-INF/MANIFEST.MF
@@ -23,4 +23,6 @@ Import-Package: org.eclipse.core.net.proxy;resolution:=optional,
Bundle-ClassPath: .
Export-Package: org.eclipse.ecf.internal.provider.filetransfer;x-internal:=true,
org.eclipse.ecf.provider.filetransfer.identity;x-internal:=false,
- org.eclipse.ecf.provider.filetransfer.retrieve;x-internal:=false
+ org.eclipse.ecf.provider.filetransfer.outgoing,
+ org.eclipse.ecf.provider.filetransfer.retrieve;x-internal:=false,
+ org.eclipse.ecf.provider.filetransfer.util
diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/internal/provider/filetransfer/Messages.java b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/internal/provider/filetransfer/Messages.java
index 6766d35ce..b90bec4cd 100644
--- a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/internal/provider/filetransfer/Messages.java
+++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/internal/provider/filetransfer/Messages.java
@@ -18,6 +18,7 @@ import org.eclipse.osgi.util.NLS;
*/
public class Messages extends NLS {
private static final String BUNDLE_NAME = "org.eclipse.ecf.internal.provider.filetransfer.messages"; //$NON-NLS-1$
+ public static String AbstractOutgoingFileTransfer_EXCEPTION_FILE_TRANSFER_INFO_NOT_NULL;
public static String AbstractRetrieveFileTransfer_MalformedURLException;
public static String AbstractRetrieveFileTransfer_Progress_Data;
public static String AbstractRetrieveFileTransfer_Exception_User_Cancelled;
diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/internal/provider/filetransfer/messages.properties b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/internal/provider/filetransfer/messages.properties
index e5fb869f1..a1533e66e 100644
--- a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/internal/provider/filetransfer/messages.properties
+++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/internal/provider/filetransfer/messages.properties
@@ -9,6 +9,7 @@
# Composent, Inc. - initial API and implementation
################################################################################
+AbstractOutgoingFileTransfer_EXCEPTION_FILE_TRANSFER_INFO_NOT_NULL=File transfer info cannot be null.
AbstractRetrieveFileTransfer_Progress_Data=\ - data
AbstractRetrieveFileTransfer_Exception_User_Cancelled=Cancelled by user
AbstractRetrieveFileTransfer_Status_Transfer_Completed_OK=Transfer Completed OK
diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/outgoing/AbstractOutgoingFileTransfer.java b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/outgoing/AbstractOutgoingFileTransfer.java
new file mode 100644
index 000000000..92b1c7e14
--- /dev/null
+++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/outgoing/AbstractOutgoingFileTransfer.java
@@ -0,0 +1,334 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Composent, Inc. 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: Composent, Inc. - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.ecf.provider.filetransfer.outgoing;
+
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Map;
+import org.eclipse.core.net.proxy.IProxyData;
+import org.eclipse.core.net.proxy.IProxyService;
+import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.ecf.core.identity.IDFactory;
+import org.eclipse.ecf.core.identity.Namespace;
+import org.eclipse.ecf.core.util.Proxy;
+import org.eclipse.ecf.core.util.ProxyAddress;
+import org.eclipse.ecf.filetransfer.*;
+import org.eclipse.ecf.filetransfer.events.*;
+import org.eclipse.ecf.filetransfer.identity.IFileID;
+import org.eclipse.ecf.internal.provider.filetransfer.Activator;
+import org.eclipse.ecf.internal.provider.filetransfer.Messages;
+import org.eclipse.ecf.provider.filetransfer.identity.FileTransferNamespace;
+import org.eclipse.osgi.util.NLS;
+
+public abstract class AbstractOutgoingFileTransfer implements IOutgoingFileTransfer {
+
+ public static final int DEFAULT_BUF_LENGTH = 4096;
+
+ private static final int FILETRANSFER_ERRORCODE = 1001;
+
+ protected Job job;
+
+ protected URL remoteFileURL;
+
+ protected IFileID remoteFileID;
+
+ protected IFileTransferListener listener;
+
+ protected int buff_length = DEFAULT_BUF_LENGTH;
+
+ protected boolean done = false;
+
+ protected long bytesSent = 0;
+
+ protected InputStream localFileContents;
+
+ protected OutputStream remoteFileContents;
+
+ protected Exception exception;
+
+ protected IFileTransferInfo fileTransferInfo;
+
+ protected Map options = null;
+
+ protected Proxy proxy;
+
+ protected URL getRemoteFileURL() {
+ return remoteFileURL;
+ }
+
+ protected void setInputStream(InputStream ins) {
+ localFileContents = ins;
+ }
+
+ protected void setOutputStream(OutputStream outs) {
+ remoteFileContents = outs;
+ }
+
+ protected Map getOptions() {
+ return options;
+ }
+
+ public AbstractOutgoingFileTransfer() {
+ //
+ }
+
+ public class FileTransferJob extends Job {
+
+ public FileTransferJob(String name) {
+ super(name);
+ }
+
+ protected IStatus run(IProgressMonitor monitor) {
+ final byte[] buf = new byte[buff_length];
+ final long totalWork = ((fileTransferInfo.getFileSize() == -1) ? 100 : fileTransferInfo.getFileSize());
+ double factor = (totalWork > Integer.MAX_VALUE) ? (((double) Integer.MAX_VALUE) / ((double) totalWork)) : 1.0;
+ int work = (totalWork > Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int) totalWork;
+ monitor.beginTask(getRemoteFileURL().toString() + Messages.AbstractRetrieveFileTransfer_Progress_Data, work);
+ try {
+ while (!isDone()) {
+ if (monitor.isCanceled())
+ throw new UserCancelledException(Messages.AbstractRetrieveFileTransfer_Exception_User_Cancelled);
+ final int bytes = localFileContents.read(buf);
+ if (bytes != -1) {
+ bytesSent += bytes;
+ remoteFileContents.write(buf, 0, bytes);
+ fireTransferSendDataEvent();
+ monitor.worked((int) Math.round(factor * bytes));
+ } else
+ done = true;
+ }
+ } catch (final Exception e) {
+ exception = e;
+ done = true;
+ } finally {
+ hardClose();
+ monitor.done();
+ fireTransferSendDoneEvent();
+ }
+ return getFinalStatus(exception);
+ }
+
+ }
+
+ protected IStatus getFinalStatus(Throwable exception1) {
+ if (exception1 == null)
+ return new Status(IStatus.OK, Activator.getDefault().getBundle().getSymbolicName(), 0, Messages.AbstractRetrieveFileTransfer_Status_Transfer_Completed_OK, null);
+ else if (exception1 instanceof UserCancelledException)
+ return new Status(IStatus.CANCEL, Activator.PLUGIN_ID, FILETRANSFER_ERRORCODE, Messages.AbstractRetrieveFileTransfer_Exception_User_Cancelled, exception1);
+ else
+ return new Status(IStatus.ERROR, Activator.PLUGIN_ID, FILETRANSFER_ERRORCODE, Messages.AbstractRetrieveFileTransfer_Status_Transfer_Exception, exception1);
+ }
+
+ protected void hardClose() {
+ try {
+ if (remoteFileContents != null)
+ remoteFileContents.close();
+ } catch (final IOException e) {
+ Activator.getDefault().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR, "hardClose", e)); //$NON-NLS-1$
+ }
+ try {
+ if (localFileContents != null)
+ localFileContents.close();
+ } catch (final IOException e) {
+ Activator.getDefault().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR, "hardClose", e)); //$NON-NLS-1$
+ }
+ job = null;
+ remoteFileContents = null;
+ localFileContents = null;
+ }
+
+ protected void fireTransferSendDoneEvent() {
+ listener.handleTransferEvent(new IOutgoingFileTransferSendDoneEvent() {
+
+ private static final long serialVersionUID = -2686266564645210722L;
+
+ public IOutgoingFileTransfer getSource() {
+ return AbstractOutgoingFileTransfer.this;
+ }
+
+ public Exception getException() {
+ return AbstractOutgoingFileTransfer.this.getException();
+ }
+
+ public String toString() {
+ final StringBuffer sb = new StringBuffer("IOutgoingFileTransferSendDoneEvent["); //$NON-NLS-1$
+ sb.append("bytesSent=").append(bytesSent) //$NON-NLS-1$
+ .append(";fileLength=").append(fileTransferInfo.getFileSize()).append(";exception=").append(getException()) //$NON-NLS-1$ //$NON-NLS-2$
+ .append("]"); //$NON-NLS-1$
+ return sb.toString();
+ }
+ });
+ }
+
+ protected void fireTransferSendDataEvent() {
+ listener.handleTransferEvent(new IOutgoingFileTransferSendDataEvent() {
+
+ private static final long serialVersionUID = -2916500675859842392L;
+
+ public IOutgoingFileTransfer getSource() {
+ return AbstractOutgoingFileTransfer.this;
+ }
+
+ public String toString() {
+ final StringBuffer sb = new StringBuffer("IOutgoingFileTransferSendDataEvent["); //$NON-NLS-1$
+ sb.append("bytesSent=").append(bytesSent) //$NON-NLS-1$
+ .append(";fileLength=").append(fileTransferInfo.getFileSize()) //$NON-NLS-1$
+ .append("]"); //$NON-NLS-1$
+ return sb.toString();
+ }
+ });
+ }
+
+ public long getBytesSent() {
+ return bytesSent;
+ }
+
+ public void cancel() {
+ if (job != null)
+ job.cancel();
+ }
+
+ public Exception getException() {
+ return exception;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ecf.filetransfer.IFileTransfer#getPercentComplete()
+ */
+ public double getPercentComplete() {
+ long fileLength = fileTransferInfo.getFileSize();
+ if (fileLength == -1 || fileLength == 0)
+ return fileLength;
+ return ((double) bytesSent / (double) fileLength);
+ }
+
+ public boolean isDone() {
+ return done;
+ }
+
+ public Object getAdapter(Class adapter) {
+ if (adapter == null)
+ return null;
+ if (adapter.isInstance(this)) {
+ return this;
+ }
+ final IAdapterManager adapterManager = Activator.getDefault().getAdapterManager();
+ return (adapterManager == null) ? null : adapterManager.loadAdapter(this, adapter.getName());
+ }
+
+ /**
+ * Open incoming and outgoing streams associated with this file transfer.
+ * Subclasses must implement this method to open input and output streams.
+ * The <code>remoteFileContents</code> and <code>localFileContent</code>
+ * must be non-<code>null</code> after successful completion of the
+ * implementation of this method.
+ *
+ * @throws OutgoingFileTransferException
+ */
+ protected abstract void openStreams() throws OutgoingFileTransferException;
+
+ public Namespace getOutgoingNamespace() {
+ return IDFactory.getDefault().getNamespaceByName(FileTransferNamespace.PROTOCOL);
+ }
+
+ public IFileTransferListener getListener() {
+ return listener;
+ }
+
+ protected void setupAndScheduleJob() {
+ job = new FileTransferJob(getRemoteFileURL().toString());
+ job.schedule();
+ }
+
+ protected void fireSendStartEvent() {
+ listener.handleTransferEvent(new IOutgoingFileTransferResponseEvent() {
+
+ private static final long serialVersionUID = 2171381825030082432L;
+
+ public String toString() {
+ final StringBuffer sb = new StringBuffer("IOutgoingFileTransferResponseEvent["); //$NON-NLS-1$
+ sb.append("isdone=").append(done).append(";"); //$NON-NLS-1$ //$NON-NLS-2$
+ sb.append("bytesSent=").append(bytesSent) //$NON-NLS-1$
+ .append("]"); //$NON-NLS-1$
+ return sb.toString();
+ }
+
+ public boolean requestAccepted() {
+ return true;
+ }
+
+ public IOutgoingFileTransfer getSource() {
+ return AbstractOutgoingFileTransfer.this;
+ }
+
+ });
+ }
+
+ protected abstract void setupProxy(Proxy proxy);
+
+ protected void setupProxies() {
+ // If it's been set directly (via ECF API) then this overrides platform settings
+ try {
+ if (proxy == null) {
+ IProxyService proxyService = Activator.getDefault().getProxyService();
+ // Only do this if platform service exists
+ if (proxyService != null) {
+ // Setup via proxyService entry
+ URL target = getRemoteFileURL();
+ String type = IProxyData.SOCKS_PROXY_TYPE;
+ if (target.getProtocol().equalsIgnoreCase(IProxyData.HTTP_PROXY_TYPE)) {
+ type = IProxyData.HTTP_PROXY_TYPE;
+ } else if (target.getProtocol().equalsIgnoreCase(IProxyData.HTTPS_PROXY_TYPE)) {
+ type = IProxyData.HTTPS_PROXY_TYPE;
+ }
+ final IProxyData proxyData = proxyService.getProxyDataForHost(target.getHost(), type);
+ if (proxyData != null) {
+ proxy = new Proxy(((type.equalsIgnoreCase(IProxyData.SOCKS_PROXY_TYPE)) ? Proxy.Type.SOCKS : Proxy.Type.HTTP), new ProxyAddress(proxyData.getHost(), proxyData.getPort()), proxyData.getUserId(), proxyData.getPassword());
+ }
+ }
+ }
+ if (proxy != null)
+ setupProxy(proxy);
+ } catch (Exception e) {
+ // If we don't even have the classes for this (i.e. the org.eclipse.core.net plugin not available)
+ // then we simply log and ignore
+ Activator.getDefault().log(new Status(IStatus.WARNING, Activator.PLUGIN_ID, IStatus.ERROR, "Warning: Platform proxy API not available", e)); //$NON-NLS-1$
+ }
+ }
+
+ public void sendOutgoingRequest(IFileID targetReceiver, IFileTransferInfo localFileToSend, IFileTransferListener transferListener, Map ops) throws OutgoingFileTransferException {
+ Assert.isNotNull(targetReceiver, Messages.AbstractRetrieveFileTransfer_RemoteFileID_Not_Null);
+ Assert.isNotNull(transferListener, Messages.AbstractRetrieveFileTransfer_TransferListener_Not_Null);
+ Assert.isNotNull(localFileToSend, Messages.AbstractOutgoingFileTransfer_EXCEPTION_FILE_TRANSFER_INFO_NOT_NULL);
+ this.done = false;
+ this.bytesSent = 0;
+ this.exception = null;
+ this.fileTransferInfo = localFileToSend;
+ this.remoteFileID = targetReceiver;
+ this.options = ops;
+
+ try {
+ this.remoteFileURL = targetReceiver.getURL();
+ } catch (final MalformedURLException e) {
+ throw new OutgoingFileTransferException(NLS.bind(Messages.AbstractRetrieveFileTransfer_MalformedURLException, targetReceiver), e);
+ }
+ this.listener = transferListener;
+ setupProxies();
+ openStreams();
+ }
+
+ public void sendOutgoingRequest(IFileID targetReceiver, final File localFileToSend, IFileTransferListener transferListener, Map ops) throws OutgoingFileTransferException {
+ sendOutgoingRequest(targetReceiver, new FileTransferInfo(localFileToSend, null, null), transferListener, ops);
+ }
+
+}
diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/AbstractRetrieveFileTransfer.java b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/AbstractRetrieveFileTransfer.java
index 4aae88146..104bf7bfb 100644
--- a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/AbstractRetrieveFileTransfer.java
+++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/AbstractRetrieveFileTransfer.java
@@ -103,8 +103,10 @@ public abstract class AbstractRetrieveFileTransfer implements IIncomingFileTrans
protected IStatus run(IProgressMonitor monitor) {
final byte[] buf = new byte[buff_length];
- final int totalWork = ((fileLength == -1) ? 100 : (int) fileLength);
- monitor.beginTask(getRemoteFileURL().toString() + Messages.AbstractRetrieveFileTransfer_Progress_Data, totalWork);
+ final long totalWork = ((fileLength == -1) ? 100 : fileLength);
+ double factor = (totalWork > Integer.MAX_VALUE) ? (((double) Integer.MAX_VALUE) / ((double) totalWork)) : 1.0;
+ int work = (totalWork > Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int) totalWork;
+ monitor.beginTask(getRemoteFileURL().toString() + Messages.AbstractRetrieveFileTransfer_Progress_Data, work);
try {
while (!isDone() && !isPaused()) {
if (monitor.isCanceled())
@@ -114,7 +116,7 @@ public abstract class AbstractRetrieveFileTransfer implements IIncomingFileTrans
bytesReceived += bytes;
localFileContents.write(buf, 0, bytes);
fireTransferReceiveDataEvent();
- monitor.worked(bytes);
+ monitor.worked((int) Math.round(factor * bytes));
} else
done = true;
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/UrlConnectionRetrieveFileTransfer.java b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/UrlConnectionRetrieveFileTransfer.java
index dffde6f07..c1e28764b 100644
--- a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/UrlConnectionRetrieveFileTransfer.java
+++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/UrlConnectionRetrieveFileTransfer.java
@@ -16,6 +16,7 @@ import org.eclipse.ecf.core.util.Proxy;
import org.eclipse.ecf.filetransfer.*;
import org.eclipse.ecf.filetransfer.identity.IFileID;
import org.eclipse.ecf.internal.provider.filetransfer.Messages;
+import org.eclipse.ecf.provider.filetransfer.util.JREProxyHelper;
import org.eclipse.osgi.util.NLS;
public class UrlConnectionRetrieveFileTransfer extends AbstractRetrieveFileTransfer {
diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/JREProxyHelper.java b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/util/JREProxyHelper.java
index 8bddd2475..611a32e2b 100644
--- a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/JREProxyHelper.java
+++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/util/JREProxyHelper.java
@@ -9,7 +9,7 @@
* Composent, Inc. - initial API and implementation
*****************************************************************************/
-package org.eclipse.ecf.provider.filetransfer.retrieve;
+package org.eclipse.ecf.provider.filetransfer.util;
import java.net.Authenticator;
import java.net.PasswordAuthentication;

Back to the top