package com.tibco.as.spacebar.ui.wizards.transfer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWizard;
import com.tibco.as.spacebar.ui.Image;
import com.tibco.as.spacebar.ui.SpaceBarPlugin;
import com.tibco.as.spacebar.ui.transfer.MetaspaceTransferJob;
import com.tibco.as.io.IMetaspaceTransfer;
import com.tibco.as.io.AbstractTransfer;
public abstract class AbstractTransferWizard<S, T, U> extends Wizard implements
IWorkbenchWizard {
private IStructuredSelection selection;
private String windowTitle;
private Image image;
private AbstractTransferWizardPage mainPage;
private AbstractTransfer defaultTransfer;
public AbstractTransferWizard(String sectionName, String windowTitle,
Image image) {
IDialogSettings workbenchSettings = SpaceBarPlugin.getDefault()
.getDialogSettings();
IDialogSettings section = workbenchSettings.getSection(sectionName);
if (section == null) {
section = workbenchSettings.addNewSection(sectionName);
}
setDialogSettings(section);
this.windowTitle = windowTitle;
this.image = image;
}
protected IStructuredSelection getSelection() {
return selection;
}
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
this.selection = selection;
List<S> selectedResources = computeSelectedResources(selection);
if (!selectedResources.isEmpty()) {
this.selection = new StructuredSelection(selectedResources);
}
if (selection.isEmpty() && workbench.getActiveWorkbenchWindow() != null) {
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
if (page != null) {
IEditorPart editor = page.getActiveEditor();
if (editor != null) {
IEditorInput input = editor.getEditorInput();
Object resource = input.getAdapter(getType());
if (resource != null) {
this.selection = new StructuredSelection(resource);
}
}
}
}
setWindowTitle(windowTitle);
setDefaultPageImageDescriptor(SpaceBarPlugin.getDefault()
.getImageDescriptor(image));
setNeedsProgressMonitor(true);
}
@SuppressWarnings("unchecked")
private List<S> computeSelectedResources(IStructuredSelection selection) {
List<S> resources = null;
Iterator<?> iterator = selection.iterator();
while (iterator.hasNext()) {
Object next = (Object) iterator.next();
S resource = null;
Class<S> type = getType();
if (type.isAssignableFrom(next.getClass())) {
resource = (S) next;
} else if (next instanceof IAdaptable) {
resource = (S) ((IAdaptable) next).getAdapter(type);
}
if (resource != null) {
if (resources == null) {
resources = new ArrayList<S>(selection.size());
}
resources.add(resource);
}
}
if (resources == null) {
return Collections.emptyList();
}
return resources;
}
protected abstract Class<S> getType();
protected AbstractTransferWizardPage getMainPage() {
return mainPage;
}
@Override
public void addPages() {
super.addPages();
mainPage = getMainPage(selection);
addPage(mainPage);
defaultTransfer = createTransfer();
IWizardPage configurationPage = getConfigurationPage(defaultTransfer);
if (configurationPage != null) {
addPage(configurationPage);
}
addTransferOptionsPage(defaultTransfer);
}
protected IWizardPage getConfigurationPage(AbstractTransfer transfer) {
return null;
}
protected abstract AbstractTransfer createTransfer();
protected abstract AbstractTransferWizardPage getMainPage(
IStructuredSelection selection);
@Override
public boolean performFinish() {
Collection<IMetaspaceTransfer> transfers = getTransfers(defaultTransfer);
if (transfers == null) {
return false;
}
for (IMetaspaceTransfer transfer : transfers) {
new MetaspaceTransferJob(getJobName(), getTaskName(transfer),
transfer, getErrorMessage(transfer)).schedule();
}
mainPage.finish();
return true;
}
protected abstract Collection<IMetaspaceTransfer> getTransfers(
AbstractTransfer defaultTransfer);
protected abstract String getJobName();
protected abstract String getTaskName(IMetaspaceTransfer transfer);
protected abstract String getErrorMessage(IMetaspaceTransfer transfer);
protected abstract void addTransferOptionsPage(AbstractTransfer transfer);
}