package org.zend.php.zendserver.deployment.ui.wizards; import java.io.File; import java.io.IOException; import java.text.MessageFormat; import java.util.Arrays; import java.util.Iterator; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.php.internal.core.PHPToolkitUtil; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IExportWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PlatformUI; import org.zend.php.zendserver.deployment.core.DeploymentNature; import org.zend.php.zendserver.deployment.core.sdk.EclipseMappingModelLoader; import org.zend.php.zendserver.deployment.core.sdk.EclipseVariableResolver; import org.zend.php.zendserver.deployment.core.sdk.ProductionPackageBuilder; import org.zend.php.zendserver.deployment.core.sdk.SdkStatus; import org.zend.php.zendserver.deployment.core.sdk.StatusChangeListener; import org.zend.php.zendserver.deployment.ui.Activator; import org.zend.sdklib.application.PackageBuilder; import org.zend.sdklib.mapping.IMappingLoader; public class PackageExportWizard extends Wizard implements IExportWizard { private final class OverwriteRunnable implements Runnable { private final File p; private IStatus result; private OverwriteRunnable(File p) { this.p = p; } public void run() { final String message = MessageFormat.format( Messages.PackageExportWizard_0, p.getAbsolutePath()); final boolean overwrite = MessageDialog.openQuestion(getShell(), Messages.PackageExportWizard_1, message); setResult(overwrite ? Status.OK_STATUS : Status.CANCEL_STATUS); } public IStatus getResult() { return result; } public void setResult(IStatus result) { this.result = result; } } private PackageExportPage parametersPage; public PackageExportWizard() { setDialogSettings(getSettingsSection()); parametersPage = new PackageExportPage(); } public IDialogSettings getSettingsSection() { IDialogSettings master = Activator.getDefault().getDialogSettings(); String name = getClass().getSimpleName(); IDialogSettings settings = master.getSection(name); if (settings == null) { settings = master.addNewSection(name); } return settings; } public void init(IWorkbench workbench, IStructuredSelection selection) { setNeedsProgressMonitor(false); setWindowTitle(Messages.exportWizard_Titile); setDefaultPageImageDescriptor(Activator .getImageDescriptor(Activator.IMAGE_EXPORT_WIZARD)); if (selection != null) { parametersPage.setInitialSelection(getValidSelection(selection)); } } @Override public void addPages() { addPage(parametersPage); } @Override public boolean performFinish() { saveSettings(); if (!PlatformUI.getWorkbench().saveAllEditors(true)) { return false; } final IProject project = parametersPage.getSelectedProject(); final File directory = new File( parametersPage.getDestinationDirectory()); final boolean overwrite = parametersPage.isOverwriteSelected(); final boolean forProduction = parametersPage.isProductionModeSelected(); final String appConfigsPath = parametersPage.getConfigsDirectory(); Job createPackageJob = new Job(Messages.exportWizard_JobTitle) { private StatusChangeListener listener; public IStatus run(IProgressMonitor monitor) { try { addDeploymentSupport(project, monitor); } catch (CoreException e) { return new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); } listener = new StatusChangeListener(monitor); if (monitor.isCanceled()) { return Status.OK_STATUS; } File container = new File(project.getLocation().toOSString()); IMappingLoader mappingLoader = new EclipseMappingModelLoader(); PackageBuilder builder = (forProduction) ? new ProductionPackageBuilder( container, mappingLoader, appConfigsPath) : new PackageBuilder(container, mappingLoader); builder.addStatusChangeListener(listener); builder.setVariableResolver(new EclipseVariableResolver()); if (!overwrite) { IStatus s = shouldOverwrite(directory, builder); if (!s.isOK()) { return s; } } builder.createDeploymentPackage(directory); if (monitor.isCanceled()) { return Status.OK_STATUS; } return new SdkStatus(listener.getStatus()); } protected IStatus shouldOverwrite(final File directory, PackageBuilder builder) { try { final File p = builder.getDeploymentPackageFile(directory); if (p.exists()) { final OverwriteRunnable runnable = new OverwriteRunnable( p); Display.getDefault().syncExec(runnable); return runnable.getResult(); } } catch (IOException e) { return new Status(Status.ERROR, Activator.PLUGIN_ID, e.toString()); } return Status.OK_STATUS; } }; createPackageJob.setUser(true); createPackageJob.schedule(); return true; } private void addDeploymentSupport(IProject project, IProgressMonitor monitor) throws CoreException { if (!project.hasNature(DeploymentNature.ID)) { IProjectDescription description = project.getDescription(); String[] natures = description.getNatureIds(); natures = Arrays.copyOf(natures, natures.length + 1); natures[natures.length - 1] = DeploymentNature.ID; description.setNatureIds(natures); project.setDescription(description, monitor); } } private void saveSettings() { parametersPage.saveSettings(); } protected IProject getValidSelection(IStructuredSelection currentSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) currentSelection; Iterator<?> iter = structuredSelection.iterator(); while (iter.hasNext()) { Object selectedElement = iter.next(); IProject project = null; Object projectAdapter = ((IAdaptable) selectedElement) .getAdapter(IProject.class); if (projectAdapter instanceof IProject) { project = (IProject) projectAdapter; } else if (selectedElement instanceof IContainer) { project = ((IContainer) selectedElement).getProject(); } else if (selectedElement instanceof IFile) { project = ((IFile) selectedElement).getProject(); } try { if (project != null && PHPToolkitUtil.isPhpProject(project)) { return project; } } catch (CoreException e) { Activator.log(e); } } return null; } }