package org.mobicents.eclipslee.servicecreation.importing.wizard;
/*******************************************************************************
* @author Paolo Costa
*
*******************************************************************************/
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.wizards.datatransfer.ArchiveFileManipulations;
import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
import org.eclipse.ui.internal.wizards.datatransfer.IDataTransferHelpContextIds;
import org.eclipse.ui.internal.wizards.datatransfer.TarException;
import org.eclipse.ui.internal.wizards.datatransfer.TarFile;
import org.eclipse.ui.internal.wizards.datatransfer.TarLeveledStructureProvider;
import org.eclipse.ui.internal.wizards.datatransfer.ZipLeveledStructureProvider;
import org.eclipse.ui.internal.wizards.datatransfer.ILeveledImportStructureProvider;
import org.eclipse.ui.model.AdaptableList;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.wizards.datatransfer.ImportOperation;
import org.eclipse.ui.wizards.datatransfer.ZipFileStructureProvider;
//import org.eclipse.ui.internal.wizards.datatransfer.*;
/**
* Note that importing from .jar is identical to importing from .zip, so
* all references to .zip in this class are equally applicable to .jar
* references.
* This class is a elaboration of the page 1
* of the base resource import-from-zip Wizard
*/
public class ArchivePage extends SLEEImportPage {
ILeveledImportStructureProvider currentProvider;
// constants
private static final String[] FILE_IMPORT_MASK = { "*.jar;*.zip;*.tar;*.tar.gz;*.tgz", "*.*" }; //$NON-NLS-1$ //$NON-NLS-2$
// dialog store id constants
private final static String STORE_SOURCE_NAMES_ID = "SLEEImportArchivePage.STORE_SOURCE_NAMES_ID";//$NON-NLS-1$
private final static String STORE_OVERWRITE_EXISTING_RESOURCES_ID = "SLEEImportArchivePage.STORE_OVERWRITE_EXISTING_RESOURCES_ID";//$NON-NLS-1$
private final static String STORE_CREATE_CONTAINER_STRUCTURE_ID = "SLEEImportArchivePage.STORE_CREATE_CONTAINER_STRUCTURE_ID";//$NON-NLS-1$
private final static String STORE_SELECTED_TYPES_ID = "SLEEImportArchivePage.STORE_SELECTED_TYPES_ID"; //$NON-NLS-1$
/**
* Creates an instance of this class
* @param aWorkbench IWorkbench
* @param selection IStructuredSelection
*/
public ArchivePage(IWorkbench aWorkbench, IStructuredSelection selection) {
super("archivePage", aWorkbench, selection); //$NON-NLS-1$
}
/**
* Called when the user presses the Cancel button. Return a boolean
* indicating permission to close the wizard.
*
* @return boolean
*/
public boolean cancel() {
clearProviderCache();
return true;
}
/**
* Clears the cached structure provider after first finalizing
* it properly.
*/
protected void clearProviderCache() {
ArchiveFileManipulations.closeStructureProvider(currentProvider, getShell());
currentProvider= null;
}
/**
* Attempts to close the passed zip file, and answers a boolean indicating success.
*/
protected boolean closeZipFile(ZipFile file) {
try {
file.close();
} catch (IOException e) {
displayErrorDialog(NLS.bind(DataTransferMessages.ZipImport_couldNotClose, file.getName()));
return false;
}
return true;
}
/** (non-Javadoc)
* Method declared on IDialogPage.
*/
public void createControl(Composite parent) {
super.createControl(parent);
//PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IDataTransferHelpContextIds.ZIP_FILE_IMPORT_WIZARD_PAGE);
// TODO Add help support
}
/**
* Create the options specification widgets. There is only one
* in this case so create no group.
*
* @param parent org.eclipse.swt.widgets.Composite
*/
protected void createOptionsGroup(Composite parent) {
// overwrite... checkbox
overwriteExistingResourcesCheckbox = new Button(parent, SWT.CHECK);
overwriteExistingResourcesCheckbox.setText(DataTransferMessages.FileImport_overwriteExisting);
overwriteExistingResourcesCheckbox.setFont(parent.getFont());
}
private boolean validateSourceFile(String fileName) {
if(ArchiveFileManipulations.isTarFile(fileName)) {
TarFile tarFile = getSpecifiedTarSourceFile(fileName);
return (tarFile != null);
}
ZipFile zipFile = getSpecifiedZipSourceFile(fileName);
if(zipFile != null) {
ArchiveFileManipulations.closeZipFile(zipFile, getContainer()
.getShell());
return true;
}
return false;
}
/**
* Answer a boolean indicating whether the specified source currently exists
* and is valid (ie.- proper format)
*/
private boolean ensureZipSourceIsValid() {
ZipFile specifiedFile = getSpecifiedZipSourceFile();
if (specifiedFile == null) {
return false;
}
return ArchiveFileManipulations.closeZipFile(specifiedFile,
getContainer().getShell());
}
private boolean ensureTarSourceIsValid() {
TarFile specifiedFile = getSpecifiedTarSourceFile();
if( specifiedFile == null ) {
return false;
}
return true;
}
/**
* Answer a boolean indicating whether the specified source currently exists
* and is valid (ie.- proper format)
*/
protected boolean ensureSourceIsValid() {
if (ArchiveFileManipulations.isTarFile(sourceNameField.getText())) {
return ensureTarSourceIsValid();
}
return ensureZipSourceIsValid();
}
/**
* The Finish button was pressed. Try to do the required work now and answer
* a boolean indicating success. If <code>false</code> is returned then the
* wizard will not close.
*
* @return boolean
*/
public boolean finish() {
if (!super.finish())
return false;
clearProviderCache();
return true;
}
/**
* Returns a content provider for <code>FileSystemElement</code>s that returns
* only files as children.
*/
protected ITreeContentProvider getFileProvider() {
return new WorkbenchContentProvider() {
public Object[] getChildren(Object o) {
if (o instanceof MinimizedFileSystemElement) {
MinimizedFileSystemElement element = (MinimizedFileSystemElement) o;
AdaptableList l;
l = element.getFiles(currentProvider);
return l.getChildren(element);
}
return new Object[0];
}
};
}
/**
* Answer the root FileSystemElement that represents the contents of the
* currently-specified .zip file. If this FileSystemElement is not
* currently defined then create and return it.
*/
protected MinimizedFileSystemElement getFileSystemTree() {
if(ArchiveFileManipulations.isTarFile(sourceNameField.getText())) {
TarFile sourceTarFile = getSpecifiedTarSourceFile();
if (sourceTarFile == null) {
//Clear out the provider as well
currentProvider = null;
return null;
}
ILeveledImportStructureProvider provider = new TarLeveledStructureProvider(sourceTarFile);
currentProvider = provider;
return selectFiles(provider.getRoot(), provider);
}
ZipFile sourceFile = getSpecifiedZipSourceFile();
if (sourceFile == null) {
//Clear out the provider as well
currentProvider = null;
return null;
}
ILeveledImportStructureProvider provider = new ZipLeveledStructureProvider(sourceFile);
currentProvider = provider;
return selectFiles(provider.getRoot(), provider);
}
/**
* Returns a content provider for <code>FileSystemElement</code>s that returns
* only folders as children.
*/
protected ITreeContentProvider getFolderProvider() {
return new WorkbenchContentProvider() {
public Object[] getChildren(Object o) {
if (o instanceof MinimizedFileSystemElement) {
MinimizedFileSystemElement element = (MinimizedFileSystemElement) o;
AdaptableList l;
l = element.getFolders(currentProvider);
return l.getChildren(element);
}
return new Object[0];
}
public boolean hasChildren(Object o) {
if (o instanceof MinimizedFileSystemElement) {
MinimizedFileSystemElement element = (MinimizedFileSystemElement) o;
if (element.isPopulated())
return getChildren(element).length > 0;
//If we have not populated then wait until asked
return true;
}
return false;
}
};
}
/**
* Answer the string to display as the label for the source specification field
*/
protected String getSourceLabel() {
return DataTransferMessages.ArchiveImport_fromFile;
}
/**
* Answer a handle to the zip file currently specified as being the source.
* Return null if this file does not exist or is not of valid format.
*/
protected ZipFile getSpecifiedZipSourceFile() {
return getSpecifiedZipSourceFile(sourceNameField.getText());
}
/**
* Answer a handle to the zip file currently specified as being the source.
* Return null if this file does not exist or is not of valid format.
*/
private ZipFile getSpecifiedZipSourceFile(String fileName) {
if (fileName.length() == 0)
return null;
try {
return new ZipFile(fileName);
} catch (ZipException e) {
displayErrorDialog(DataTransferMessages.ZipImport_badFormat);
} catch (IOException e) {
displayErrorDialog(DataTransferMessages.ZipImport_couldNotRead);
}
sourceNameField.setFocus();
return null;
}
/**
* Answer a handle to the zip file currently specified as being the source.
* Return null if this file does not exist or is not of valid format.
*/
protected TarFile getSpecifiedTarSourceFile() {
return getSpecifiedTarSourceFile(sourceNameField.getText());
}
/**
* Answer a handle to the zip file currently specified as being the source.
* Return null if this file does not exist or is not of valid format.
*/
private TarFile getSpecifiedTarSourceFile(String fileName) {
if (fileName.length() == 0)
return null;
try {
return new TarFile(fileName);
} catch (TarException e) {
displayErrorDialog(DataTransferMessages.TarImport_badFormat);
} catch (IOException e) {
displayErrorDialog(DataTransferMessages.ZipImport_couldNotRead);
}
sourceNameField.setFocus();
return null;
}
/**
* Open a FileDialog so that the user can specify the source
* file to import from
*/
protected void handleSourceBrowseButtonPressed() {
String selectedFile = queryZipFileToImport();
if (selectedFile != null) {
//Be sure it is valid before we go setting any names
if (!selectedFile.equals(sourceNameField.getText())
&& validateSourceFile(selectedFile)) {
setSourceName(selectedFile);
selectionGroup.setFocus();
}
}
}
/**
* Import the resources with extensions as specified by the user
*/
protected boolean importResources(List fileSystemObjects) {
boolean result = false;
if (ArchiveFileManipulations.isTarFile(sourceNameField.getText())) {
if( ensureTarSourceIsValid()) {
TarFile tarFile = getSpecifiedTarSourceFile();
TarLeveledStructureProvider structureProvider = new TarLeveledStructureProvider(tarFile);
ImportOperation operation = new ImportOperation(getContainerFullPath(),
structureProvider.getRoot(), structureProvider, this,
fileSystemObjects);
operation.setContext(getShell());
return executeImportOperation(operation);
}
}
if(ensureZipSourceIsValid()) {
ZipFile zipFile = getSpecifiedZipSourceFile();
ZipLeveledStructureProvider structureProvider = new ZipLeveledStructureProvider(zipFile);
ImportOperation operation = new ImportOperation(
getContainerFullPath(), structureProvider.getRoot(),
structureProvider, this, fileSystemObjects);
operation.setContext(getShell());
result = executeImportOperation(operation);
closeZipFile(zipFile);
}
return result;
}
/**
* Opens a file selection dialog and returns a string representing the
* selected file, or <code>null</code> if the dialog was canceled.
*/
protected String queryZipFileToImport() {
FileDialog dialog = new FileDialog(sourceNameField.getShell(), SWT.OPEN);
dialog.setFilterExtensions(FILE_IMPORT_MASK);
dialog.setText(DataTransferMessages.ArchiveImportSource_title);
String currentSourceString = sourceNameField.getText();
int lastSeparatorIndex = currentSourceString
.lastIndexOf(File.separator);
if (lastSeparatorIndex != -1)
dialog.setFilterPath(currentSourceString.substring(0,
lastSeparatorIndex));
return dialog.open();
}
/**
* Repopulate the view based on the currently entered directory.
*/
protected void resetSelection() {
super.resetSelection();
setAllSelections(true); //TODO only Java & XML?
}
/**
* Use the dialog store to restore widget values to the values that they held
* last time this wizard was used to completion
*/
protected void restoreWidgetValues() {
IDialogSettings settings = getDialogSettings();
if (settings != null) {
String[] sourceNames = settings.getArray(STORE_SOURCE_NAMES_ID);
if (sourceNames == null)
return; // ie.- no settings stored
// set filenames history
for (int i = 0; i < sourceNames.length; i++)
sourceNameField.add(sourceNames[i]);
// radio buttons and checkboxes
overwriteExistingResourcesCheckbox.setSelection(settings
.getBoolean(STORE_OVERWRITE_EXISTING_RESOURCES_ID));
}
}
/**
* Since Finish was pressed, write widget values to the dialog store so that they
* will persist into the next invocation of this wizard page.
*
* Note that this method is identical to the one that appears in the superclass.
* This is necessary because proper overriding of instance variables is not occurring.
*/
public void saveWidgetValues() {
IDialogSettings settings = getDialogSettings();
if (settings != null) {
// update source names history
String[] sourceNames = settings.getArray(STORE_SOURCE_NAMES_ID);
if (sourceNames == null)
sourceNames = new String[0];
sourceNames = addToHistory(sourceNames, sourceNameField.getText());
settings.put(STORE_SOURCE_NAMES_ID, sourceNames);
// update specific types to import history
String[] selectedTypesNames = settings
.getArray(STORE_SELECTED_TYPES_ID);
if (selectedTypesNames == null)
selectedTypesNames = new String[0];
settings.put(STORE_OVERWRITE_EXISTING_RESOURCES_ID,
overwriteExistingResourcesCheckbox.getSelection());
}
}
/**
* Answer a boolean indicating whether self's source specification
* widgets currently all contain valid values.
*/
protected boolean validateSourceGroup() {
//If there is nothing being provided to the input then there is a problem
if (currentProvider == null) {
setMessage(SOURCE_EMPTY_MESSAGE);
enableButtonGroup(false);
return false;
}
enableButtonGroup(true);
return true;
}
public String selfDescript() {
return "Import JAIN SLEE components created externally to the EclipSLEE plugin from a JAR file.";
}
}