/****************************************************************************
* Copyright (c) 2004 Composent, Inc. 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:
* Composent, Inc. - initial API and implementation
*****************************************************************************/
package org.eclipse.ecf.filetransfer.ui.actions;
import java.io.File;
import java.util.Map;
import org.eclipse.core.runtime.*;
import org.eclipse.ecf.core.util.IExceptionHandler;
import org.eclipse.ecf.filetransfer.*;
import org.eclipse.ecf.filetransfer.events.IFileTransferEvent;
import org.eclipse.ecf.filetransfer.events.IOutgoingFileTransferSendDoneEvent;
import org.eclipse.ecf.filetransfer.identity.IFileID;
import org.eclipse.ecf.internal.filetransfer.ui.Activator;
import org.eclipse.ecf.internal.filetransfer.ui.Messages;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
/**
* Action super class for initiating outging file transfers. Subclasses should
* be created to implement {@link #getOutgoingFileTransferAdapter()} and to
* override any desired methods.
*/
public abstract class AbstractFileSendAction extends Action {
protected IFileID targetReceiver;
protected IFileTransferInfo fileTransferInfo;
protected IFileTransferListener fileTransferListener;
protected Map options;
protected IExceptionHandler exceptionHandler = null;
public void setTargetReceiver(IFileID targetReceiver) {
this.targetReceiver = targetReceiver;
}
public IFileID getTargetReceiver() {
return this.targetReceiver;
}
public void setFileTransferInfo(IFileTransferInfo info) {
this.fileTransferInfo = info;
}
public IFileTransferInfo getFileTransferInfo() {
return this.fileTransferInfo;
}
public void setFileToSend(File fileToSend) {
// /this.fileToSend = fileToSend;
this.fileTransferInfo = createFileTransferInfoFromFile(fileToSend);
}
/**
* @param fileToSend
* @return file transfer info for given file.
*/
private IFileTransferInfo createFileTransferInfoFromFile(final File fileToSend) {
return new FileTransferInfo(fileToSend);
}
public File getFileToSend() {
if (this.fileTransferInfo == null)
return null;
return this.fileTransferInfo.getFile();
}
public void setFileTransferListener(IFileTransferListener listener) {
this.fileTransferListener = listener;
}
public IFileTransferListener getFileTransferListener() {
return this.fileTransferListener;
}
public void setFileTransferOptions(Map options) {
this.options = options;
}
public Map getFileTransferOptions() {
return this.options;
}
public void setExceptionHandler(IExceptionHandler exceptionHandler) {
this.exceptionHandler = exceptionHandler;
}
public IExceptionHandler getExceptionhandler() {
return this.exceptionHandler;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#run()
*/
public void run() {
try {
sendFileToTarget();
} catch (Exception e) {
if (exceptionHandler != null)
exceptionHandler.handleException(e);
else
Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR, NLS.bind(Messages.getString("AbstractFileSendAction.EXCEPTION_SENDING_TO_TARGET"), //$NON-NLS-1$
getTargetReceiver()), e));
}
}
/**
* Get the container adapter for actually initiating the file transer
* request.
*
* @return ISendFileTransferContainerAdapter to use for the action
* {@link #run()}. Must not return <code>null</code>.
*/
protected abstract ISendFileTransferContainerAdapter getOutgoingFileTransferAdapter();
protected void sendFileToTarget() throws Exception {
IFileID target = getTargetReceiver();
Assert.isNotNull(target, Messages.getString("AbstractFileSendAction.RECEIVER_NOT_NULL")); //$NON-NLS-1$
ISendFileTransferContainerAdapter adapter = getOutgoingFileTransferAdapter();
Assert.isNotNull(adapter, Messages.getString("AbstractFileSendAction.ADAPTER_NOT_NULL")); //$NON-NLS-1$
IFileTransferListener listener = getFileTransferListener();
if (listener == null)
listener = createDefaultFileTransferListener();
Assert.isNotNull(listener, Messages.getString("AbstractFileSendAction.LISTENER_NOT_NULL")); //$NON-NLS-1$
IFileTransferInfo info = getFileTransferInfo();
Assert.isNotNull(info, Messages.getString("AbstractFileSendAction.FILE_NOT_NULL")); //$NON-NLS-1$
// Now call
adapter.sendOutgoingRequest(target, info, listener, this.options);
}
/**
* @return IFileTransferListener to use as the default listener. Must not be
* <code>null</code>.
*/
protected IFileTransferListener createDefaultFileTransferListener() {
return new IFileTransferListener() {
public void handleTransferEvent(final IFileTransferEvent event) {
// Only handle send done event. If custom UI handling for other
// events is desired...e.g. progress reporting or other handling
// then a custom IFileTransferListener should be provided.
if (event instanceof IOutgoingFileTransferSendDoneEvent) {
final IOutgoingFileTransferSendDoneEvent oftsde = (IOutgoingFileTransferSendDoneEvent) event;
final Exception errorException = oftsde.getSource().getException();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (errorException == null) {
MessageDialog.openInformation(null, Messages.getString("AbstractFileSendAction.TITLE_FILE_TRANSFER_SUCESSFUL"), //$NON-NLS-1$
NLS.bind(Messages.getString("AbstractFileSendAction.MESSAGE_FILE_TRANSFER_SUCCESSFUL"), //$NON-NLS-1$
getFileTransferInfo().getFile().getName()));
} else {
MessageDialog.openError(null, Messages.getString("AbstractFileSendAction.TITLE_FILE_TRANSFER_FAILED"), //$NON-NLS-1$
NLS.bind(Messages.getString("AbstractFileSendAction.MESSAGE_FILE_TRANSFER_FAILED"), //$NON-NLS-1$
errorException.getLocalizedMessage()));
}
}
});
}
}
};
}
}