Java tutorial
/****************************************************************************** * Copyright (c) 2010-2013, Linagora * * 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: * Linagora - initial API and implementation *******************************************************************************/ package com.ebmwebsourcing.petals.services.wizards; import java.io.File; import java.util.Properties; import java.util.Set; import java.util.SortedSet; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.resource.ImageDescriptor; 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.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.plugin.AbstractUIPlugin; import com.ebmwebsourcing.petals.common.internal.provisional.emf.InvalidJbiXmlException; import com.ebmwebsourcing.petals.common.internal.provisional.utils.JbiXmlUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.PetalsConstants; import com.ebmwebsourcing.petals.common.internal.provisional.utils.StringUtils; import com.ebmwebsourcing.petals.services.PetalsServicesPlugin; import com.ebmwebsourcing.petals.services.sa.nature.SaNature; import com.ebmwebsourcing.petals.services.su.extensions.ExtensionManager; import com.ebmwebsourcing.petals.services.su.jbiproperties.PetalsSPPropertiesManager; import com.ebmwebsourcing.petals.services.su.nature.SuNature; import com.sun.java.xml.ns.jbi.Jbi; /** * @author Vincent Zurczak - EBM WebSourcing */ public class FileStructureImportWizardPage extends WizardPage { private boolean jbiXmlFileExists = false, jbiXmlValid; private boolean addJavaNature = false, addOtherNature = false, copyProject = false; private String otherNature, projectName, projectLocation; private String componentName, componentFunction, componentVersion; private Image suImg, saImg, componentImg, slImg; /** * Constructor. */ public FileStructureImportWizardPage() { super("FileStructureImportWizardPage"); setTitle("Petals File Structure Import"); setDescription("Create a Petals project from a Maven file structure for Petals."); try { ImageDescriptor desc = PetalsServicesPlugin.getImageDescriptor("icons/obj16/service_unit.png"); if (desc != null) this.suImg = desc.createImage(); desc = PetalsServicesPlugin.getImageDescriptor("icons/obj16/service_assembly.png"); if (desc != null) this.saImg = desc.createImage(); desc = AbstractUIPlugin.imageDescriptorFromPlugin("com.ebmwebsourcing.petals.component", "icons/component.png"); if (desc != null) this.componentImg = desc.createImage(); desc = AbstractUIPlugin.imageDescriptorFromPlugin("com.ebmwebsourcing.petals.component", "icons/shared_library_16x16.png"); if (desc != null) this.slImg = desc.createImage(); } catch (Exception e) { PetalsServicesPlugin.log(e, IStatus.WARNING); } } /* * (non-Jsdoc) * @see org.eclipse.jface.dialogs.DialogPage * #dispose() */ @Override public void dispose() { if (this.suImg != null && !this.suImg.isDisposed()) this.suImg.dispose(); if (this.saImg != null && !this.saImg.isDisposed()) this.saImg.dispose(); if (this.componentImg != null && !this.componentImg.isDisposed()) this.componentImg.dispose(); if (this.slImg != null && !this.slImg.isDisposed()) this.slImg.dispose(); super.dispose(); } /* * (non-Jsdoc) * @see org.eclipse.jface.dialogs.IDialogPage * #createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); container.setLayout(new GridLayout()); container.setLayoutData(new GridData(GridData.FILL_BOTH)); setControl(container); // Project location new Label(container, SWT.NONE).setText("Select the root of the directory to import as a project:"); Composite subContainer = new Composite(container, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginHeight = 0; layout.marginWidth = 0; subContainer.setLayout(layout); subContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); final Text directoryLocationText = new Text(subContainer, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY); directoryLocationText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Button browseButton = new Button(subContainer, SWT.PUSH); browseButton.setText("Browse..."); // Project properties subContainer = new Composite(container, SWT.NONE); layout = new GridLayout(3, false); layout.marginHeight = 18; layout.marginWidth = 0; subContainer.setLayout(layout); subContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); new Label(subContainer, SWT.NONE).setText("Project type:"); final Label projectImgLabel = new Label(subContainer, SWT.NONE); final Label projectTypeLabel = new Label(subContainer, SWT.NONE); projectTypeLabel.setText("Unknown"); new Label(subContainer, SWT.NONE).setText("Project name:"); final Text projectNameText = new Text(subContainer, SWT.BORDER | SWT.SINGLE); GridData layoutData = new GridData(GridData.FILL_HORIZONTAL); layoutData.horizontalSpan = 2; projectNameText.setLayoutData(layoutData); projectNameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { FileStructureImportWizardPage.this.projectName = projectNameText.getText(); validate(); } }); // Options final Button copyDirectoryButton = new Button(container, SWT.CHECK); copyDirectoryButton.setText("Copy the directory in the workspace as a new project"); copyDirectoryButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } @Override public void widgetDefaultSelected(SelectionEvent e) { FileStructureImportWizardPage.this.copyProject = copyDirectoryButton.getSelection(); validate(); } }); final Button addJavaNatureButton = new Button(container, SWT.CHECK); addJavaNatureButton.setText("Add the Java nature to the project"); addJavaNatureButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } @Override public void widgetDefaultSelected(SelectionEvent e) { FileStructureImportWizardPage.this.addJavaNature = addJavaNatureButton.getSelection(); } }); final Button addOtherNatureButton = new Button(container, SWT.CHECK); addOtherNatureButton.setText(""); // SU properties subContainer = new Composite(container, SWT.NONE); layout = new GridLayout(2, false); layout.marginHeight = 18; layout.marginWidth = 0; subContainer.setLayout(layout); subContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label l = new Label(subContainer, SWT.NONE); l.setText("Service Unit projects need the following information to be complete:"); layoutData = new GridData(); layoutData.horizontalSpan = 2; l.setLayoutData(layoutData); new Label(subContainer, SWT.NONE).setText("Component name:"); final Combo nameCombo = new Combo(subContainer, SWT.BORDER | SWT.DROP_DOWN); nameCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); nameCombo.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { FileStructureImportWizardPage.this.componentName = nameCombo.getText(); validate(); } }); Set<String> componentNames = ExtensionManager.INSTANCE.findAllComponentNames(); String[] _componentNames = new String[componentNames.size()]; nameCombo.setItems(componentNames.toArray(_componentNames)); nameCombo.setVisibleItemCount(componentNames.size()); new Label(subContainer, SWT.NONE).setText("Component function:"); final Combo functionCombo = new Combo(subContainer, SWT.BORDER | SWT.DROP_DOWN); functionCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); functionCombo.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { FileStructureImportWizardPage.this.componentFunction = functionCombo.getText(); validate(); } }); new Label(subContainer, SWT.NONE).setText("Component version:"); final Combo versionCombo = new Combo(subContainer, SWT.BORDER | SWT.DROP_DOWN); versionCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); versionCombo.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { FileStructureImportWizardPage.this.componentVersion = versionCombo.getText(); validate(); } }); nameCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(SelectionEvent e) { String componentName = nameCombo.getText(); functionCombo.add(ExtensionManager.INSTANCE.findComponentAlias(componentName)); functionCombo.setVisibleItemCount(1); if (functionCombo.getItemCount() > 0) functionCombo.select(0); SortedSet<String> versions = ExtensionManager.INSTANCE.findComponentVersions(componentName); String[] _versions = new String[versions.size()]; versionCombo.setItems(versions.toArray(_versions)); versionCombo.setVisibleItemCount(versions.size() > 1 ? versions.size() : 1); if (versionCombo.getItemCount() > 0) versionCombo.select(0); validate(); } }); // Widget visibility and the most important listener addOtherNatureButton.setVisible(false); subContainer.setVisible(false); addOtherNatureButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } @Override public void widgetDefaultSelected(SelectionEvent e) { FileStructureImportWizardPage.this.addOtherNature = addOtherNatureButton.getSelection(); nameCombo.getParent().setVisible(FileStructureImportWizardPage.this.addOtherNature && SuNature.NATURE_ID.equals(FileStructureImportWizardPage.this.otherNature)); validate(); } }); browseButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } @Override public void widgetDefaultSelected(SelectionEvent e) { DirectoryDialog dlg = new DirectoryDialog(getShell()); dlg.setText("Directory Selection"); dlg.setMessage("Select the directory to import as a project."); if (directoryLocationText.getText().length() > 0) dlg.setFilterPath(directoryLocationText.getText()); String loc = dlg.open(); if (loc != null) { // Update the UI directoryLocationText.setText(loc); FileStructureImportWizardPage.this.projectLocation = loc; File projectDirectory = new File(loc); File jbiXmlFile = new File(loc, PetalsConstants.LOC_JBI_FILE); FileStructureImportWizardPage.this.jbiXmlFileExists = jbiXmlFile.exists(); // Parse the jbi.xml String projectType = "Not a Petals project"; String projectName = ""; FileStructureImportWizardPage.this.jbiXmlValid = true; FileStructureImportWizardPage.this.otherNature = null; Image img = null; if (FileStructureImportWizardPage.this.jbiXmlFileExists) { projectName = projectDirectory.getName(); try { Jbi jbi = JbiXmlUtils.getJbiXmlModel(jbiXmlFile); if (jbi.getServices() != null) { // Same properties than the other possibilities projectType = "Service Unit"; img = FileStructureImportWizardPage.this.suImg; addOtherNatureButton.setText("Add the SU nature to the project"); addOtherNatureButton.setVisible(true); FileStructureImportWizardPage.this.otherNature = SuNature.NATURE_ID; // A specific treatment for SU properties File suPropertiesFile = new File(loc, PetalsSPPropertiesManager.PROPERTIES_FILENAME); if (suPropertiesFile.exists()) { Properties prop = PetalsSPPropertiesManager.getProperties(suPropertiesFile); nameCombo.setText( prop.getProperty(PetalsSPPropertiesManager.COMPONENT_NAME, "")); versionCombo.setText( prop.getProperty(PetalsSPPropertiesManager.COMPONENT_VERSION, "")); functionCombo.setText( prop.getProperty(PetalsSPPropertiesManager.COMPONENT_FUNCTION, "")); } else { nameCombo.setText(""); versionCombo.setText(""); functionCombo.setText(""); } } else if (jbi.getServiceAssembly() != null) { projectType = "Service Assembly"; img = FileStructureImportWizardPage.this.saImg; addOtherNatureButton.setText("Add the SA nature to the project"); addOtherNatureButton.setVisible(true); FileStructureImportWizardPage.this.otherNature = SaNature.NATURE_ID; } else if (jbi.getComponent() != null) { projectType = "JBI Component"; img = FileStructureImportWizardPage.this.componentImg; addOtherNatureButton.setVisible(false); } else if (jbi.getSharedLibrary() != null) { projectType = "Shared Library"; img = FileStructureImportWizardPage.this.slImg; addOtherNatureButton.setVisible(false); } else { FileStructureImportWizardPage.this.jbiXmlValid = false; } addJavaNatureButton.getParent().layout(); } catch (InvalidJbiXmlException e1) { FileStructureImportWizardPage.this.jbiXmlValid = false; } } // Update the rest of the UI projectImgLabel.setImage(img); projectTypeLabel.setText(projectType); projectNameText.setText(projectName); projectImgLabel.getParent().layout(); // Properties should be visible if and only if the SU nature is added // Otherwise, the component information will not be used nameCombo.getParent().setVisible(FileStructureImportWizardPage.this.addOtherNature && SuNature.NATURE_ID.equals(FileStructureImportWizardPage.this.otherNature)); validate(); } } }); // Force the shell size setErrorMessage(null); Point size = getShell().computeSize(600, 560); getShell().setSize(size); Rectangle rect = Display.getCurrent().getBounds(); getShell().setLocation((rect.width - size.x) / 2, (rect.height - size.y) / 2); } /** * Validates the page data. */ private void validate() { String msg = null; if (!this.jbiXmlFileExists) msg = "This directory does not contain a src/main/jbi/jbi.xml file."; else if (!this.jbiXmlValid) msg = "The jbi.xml is not valid. The project type could not be determined."; else if (StringUtils.isEmpty(this.projectName)) msg = "You have to specify the project name."; else if (new File(this.projectLocation, ".project").exists()) msg = "This directory points to an Eclipse project and thus should be imported with the usual wizard."; else { IWorkspaceRoot wr = ResourcesPlugin.getWorkspace().getRoot(); if (wr.getProject(this.projectName).exists()) msg = "There is already a project called " + this.projectName + " in the workspace."; else if (this.copyProject && wr.getLocation().append(this.projectName).toFile().exists()) msg = "The directory cannot be copied in the workspace. A directory with this name already exists."; else if (SuNature.NATURE_ID.equals(this.otherNature)) { if (StringUtils.isEmpty(this.componentName)) msg = "You have to specify the name of the target component."; else if (StringUtils.isEmpty(this.componentFunction)) msg = "You have to specify the function of the target component (e.g. SOAP)."; else if (StringUtils.isEmpty(this.componentVersion)) msg = "You have to specify the version of the target component."; } } setErrorMessage(msg); setPageComplete(msg == null); } /** * @return the addJavaNature */ public boolean isAddJavaNature() { return this.addJavaNature; } /** * @return the addOtherNature */ public boolean isAddOtherNature() { return this.addOtherNature; } /** * @return the copyProject */ public boolean isCopyProject() { return this.copyProject; } /** * @return the otherNature */ public String getOtherNature() { return this.otherNature; } /** * @return the projectName */ public String getProjectName() { return this.projectName; } /** * @return the componentName */ public String getComponentName() { return this.componentName; } /** * @return the componentFunction */ public String getComponentFunction() { return this.componentFunction; } /** * @return the componentVersion */ public String getComponentVersion() { return this.componentVersion; } /** * @return the projectLocation */ public String getProjectLocation() { return this.projectLocation; } }