/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.wizards.exampleproject;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.IDialogPage;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.osgi.framework.Bundle;
import de.rcenvironment.core.configuration.ConfigurationService;
import de.rcenvironment.core.configuration.ConfigurationService.ConfigurablePathId;
import de.rcenvironment.core.utils.common.StringUtils;
import de.rcenvironment.core.utils.incubator.ServiceRegistry;
import de.rcenvironment.core.utils.incubator.ServiceRegistryAccess;
/**
* The wizard GUI page. The only input element is a field for choosing a project name.
*
* @author Robert Mischke
* @author Sascha Zur
*/
public class NewExampleProjectWizardPage extends WizardPage {
/**
* constant.
*/
public static final int COPY_EXAMPLE_TOOL = 1;
/**
* constant.
*/
public static final int DONT_COPY_EXAMPLE_TOOL = 0;
/**
* constant.
*/
public static final int RED_X_CANCELD = -1;
private static final int MINIMUM_HEIGHT = 250;
private static final int MINIMUM_WIDTH = 500;
private static final String ASTERISK = "*";
private static final int MINUS_ONE = -1;
private Text textFieldProjectName;
private NewExampleProjectWizard newExampleProjectWizard;
private Button createExampleIntegratedToolButton;
private final Log log = LogFactory.getLog(getClass());
/**
* Constructor for SampleNewWizardPage.
*
* @param newExampleProjectWizard
*
* @param pageName
*/
public NewExampleProjectWizardPage(ISelection selection, NewExampleProjectWizard newExampleProjectWizard) {
super("wizardPage");
setTitle("Create Workflow Examples Project");
setDescription("This wizard generates an example project containing a workflow template.");
this.newExampleProjectWizard = newExampleProjectWizard;
}
/**
* @see IDialogPage#createControl(Composite)
* @param parent :
*/
@Override
public void createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
container.setLayout(layout);
layout.numColumns = 2;
layout.verticalSpacing = 9;
Label label = new Label(container, SWT.NULL);
label.setText("Project &Name:");
textFieldProjectName = new Text(container, SWT.BORDER | SWT.SINGLE);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
textFieldProjectName.setLayoutData(gd);
textFieldProjectName.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
dialogChanged();
}
});
createExampleIntegratedToolButton = new Button(container, SWT.CHECK);
createExampleIntegratedToolButton.setText("Integrate example tool");
GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
gd2.horizontalSpan = 2;
createExampleIntegratedToolButton.setLayoutData(gd2);
initialize();
dialogChanged();
setControl(container);
getShell().setMinimumSize(MINIMUM_WIDTH, MINIMUM_HEIGHT);
}
private void initialize() {
textFieldProjectName.setText(newExampleProjectWizard.getProjectDefaultName());
}
/**
* Ensures that both text fields are set.
*/
private void dialogChanged() {
final String newProjectName = textFieldProjectName.getText();
if (newProjectName.length() == 0) {
updateStatus("Please chose a name for the new project");
return;
}
IProject existingProject = ResourcesPlugin.getWorkspace().getRoot()
.getProject(newProjectName);
if (existingProject != null && existingProject.exists()) {
updateStatus("This project name is already in use");
return;
}
// FIXME validate name structure
updateStatus(null);
}
private void updateStatus(String message) {
setErrorMessage(message);
setPageComplete(message == null);
}
public String getNewProjectName() {
return textFieldProjectName.getText();
}
/**
*
* Checks if the example tool should be integrated and if it already exists.
*
* @return Integrate Example tool
* @throws IOException
*/
public int getCreateTIExample() {
boolean isSelected = createExampleIntegratedToolButton.getSelection();
try {
if (isSelected && checkOrDeleteExampleTool(false)) {
// returns 1 for keep and 0 for replace
MessageDialog dialog = new MessageDialog(this.getShell(), "Overwrite Example Tool Confirmation", null,
"An integrated tool named 'Example' already exists.\n"
+ "Replace or keep it?",
MessageDialog.WARNING, new String[] { "Replace", "Keep" }, 1);
int overwrite = dialog.open();
if (overwrite == 0) {
checkOrDeleteExampleTool(true);
return COPY_EXAMPLE_TOOL;
} else if (overwrite == 1) {
return DONT_COPY_EXAMPLE_TOOL;
} else {
return RED_X_CANCELD;
}
}
} catch (IOException e) {
log.error("Could not verify existence of example tool (I/O Error)", e);
return DONT_COPY_EXAMPLE_TOOL;
}
if (isSelected) {
return COPY_EXAMPLE_TOOL;
} else {
return DONT_COPY_EXAMPLE_TOOL;
}
}
private boolean checkOrDeleteExampleTool(boolean delete) throws IOException {
Bundle bundle = Platform.getBundle(newExampleProjectWizard.getPluginID());
ServiceRegistryAccess serviceRegistryAccess = ServiceRegistry.createAccessFor(this);
ConfigurationService configurationService = serviceRegistryAccess.getService(ConfigurationService.class);
File integrationFolder = configurationService.getConfigurablePath(ConfigurablePathId.PROFILE_INTEGRATION_DATA);
File commonsFolder = new File(new File(integrationFolder, "tools"), "common");
boolean exampleToolExists = false;
if (!commonsFolder.exists()) {
return exampleToolExists;
}
@SuppressWarnings("rawtypes") final Enumeration toolFiles =
bundle.findEntries("templates/" + "integration_example", ASTERISK, true);
while (toolFiles.hasMoreElements()) {
final URL elementURL = (URL) toolFiles.nextElement();
final String rawPath = elementURL.getPath();
final String targetPath = rawPath.replaceFirst("^/templates/\\w+/", "");
final File target = new File(commonsFolder, targetPath);
if (!delete && target.exists() && (!target.isDirectory() || !rawPath.endsWith("/"))) {
InputStream downloadStream = elementURL.openStream();
InputStream oldFileStream = FileUtils.openInputStream(target);
BufferedInputStream bDownloadStream = new BufferedInputStream(downloadStream);
BufferedInputStream bOldFileStream = new BufferedInputStream(oldFileStream);
int data;
while ((data = bDownloadStream.read()) != MINUS_ONE) {
if (data != bOldFileStream.read()) {
exampleToolExists = true;
}
}
// different file size
if (bOldFileStream.read() != MINUS_ONE) {
exampleToolExists = true;
}
} else if (delete && target.exists() && target.isDirectory()) {
try {
FileUtils.deleteDirectory(target);
} catch (IOException e) {
log.info(StringUtils.format("Could not delete directory %s, maybe already deleted.", target));
}
}
}
return exampleToolExists;
}
}