com.ebmwebsourcing.petals.services.sa.editor.SaEditionComposite.java Source code

Java tutorial

Introduction

Here is the source code for com.ebmwebsourcing.petals.services.sa.editor.SaEditionComposite.java

Source

/******************************************************************************
 * Copyright (c) 2009-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.sa.editor;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.databinding.edit.EMFEditObservables;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.MoveCommand;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
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.graphics.Color;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.dialogs.ListSelectionDialog;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledPageBook;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.model.WorkbenchLabelProvider;

import com.ebmwebsourcing.petals.common.internal.provisional.formeditor.ISharedEdition;
import com.ebmwebsourcing.petals.common.internal.provisional.misc.IProjectComparator;
import com.ebmwebsourcing.petals.common.internal.provisional.swt.DefaultSelectionListener;
import com.ebmwebsourcing.petals.common.internal.provisional.swt.DefaultTreeContentProvider;
import com.ebmwebsourcing.petals.common.internal.provisional.utils.PetalsImages;
import com.ebmwebsourcing.petals.common.internal.provisional.utils.StringUtils;
import com.ebmwebsourcing.petals.common.internal.provisional.utils.SwtFactory;
import com.ebmwebsourcing.petals.services.Messages;
import com.ebmwebsourcing.petals.services.editor.ServicesLabelProvider;
import com.ebmwebsourcing.petals.services.su.jbiproperties.PetalsSPPropertiesManager;
import com.ebmwebsourcing.petals.services.utils.ServiceProjectRelationUtils;
import com.sun.java.xml.ns.jbi.Identification;
import com.sun.java.xml.ns.jbi.JbiFactory;
import com.sun.java.xml.ns.jbi.JbiPackage;
import com.sun.java.xml.ns.jbi.ServiceAssembly;
import com.sun.java.xml.ns.jbi.ServiceUnit;
import com.sun.java.xml.ns.jbi.Target;

/**
 * The composite to display in the JBI form editor for service assemblies.
 * @author Vincent Zurczak - EBM WebSourcing
 */
public class SaEditionComposite extends SashForm {

    private final ISharedEdition ise;
    private EObject viewerSelection;

    private final Color blueFont;
    private TreeViewer viewer;
    private LabelProvider labelProvider;
    private ScrolledPageBook pageBook;
    private Text saNameText, saDescText, suNameText, suDescText, suArtifactsText, suComponentText;

    /**
     * Constructor.
     * @param parent
     */
    public SaEditionComposite(Composite parent, ISharedEdition ise) {
        super(parent, SWT.NONE);
        this.ise = ise;
        this.blueFont = getDisplay().getSystemColor(SWT.COLOR_DARK_BLUE);

        setLayoutData(new GridData(GridData.FILL_BOTH));
        ise.getFormToolkit().adapt(this);
        ise.getFormToolkit().paintBordersFor(this);

        createLeftWidgets();
        createRightWidgets();
        setWeights(new int[] { 1, 1 });

        this.viewer.getTree().setFocus();
        this.viewer.setSelection(new StructuredSelection(ise.getJbiModel().getServiceAssembly()));
        this.viewer.getTree().notifyListeners(SWT.Selection, new Event());
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.swt.widgets.Widget
     * #dispose()
     */
    @Override
    public void dispose() {
        if (this.labelProvider != null)
            this.labelProvider.dispose();

        if (this.blueFont != null && !this.blueFont.isDisposed())
            this.blueFont.dispose();

        super.dispose();
    }

    /**
     * Initializes the widgets on the left side.
     */
    protected void createLeftWidgets() {

        FormToolkit toolkit = this.ise.getFormToolkit();
        Composite container = toolkit.createComposite(this);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginTop = 11;
        layout.marginRight = 7;
        container.setLayout(layout);
        container.setLayoutData(new GridData(GridData.FILL_BOTH));

        Section section = toolkit.createSection(container,
                Section.DESCRIPTION | ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED);
        section.setLayoutData(new GridData(GridData.FILL_BOTH));
        section.clientVerticalSpacing = 10;
        section.setText("Service Assembly's Content");
        section.setDescription("Select the elements to edit.");

        container = toolkit.createComposite(section);
        layout = new GridLayout(2, false);
        layout.marginWidth = 0;
        container.setLayout(layout);
        container.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
        section.setClient(container);

        // Add the tree
        Tree tree = toolkit.createTree(container, SWT.BORDER | SWT.MULTI);
        this.viewer = new TreeViewer(tree);
        this.viewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));

        // Add the content provider
        this.labelProvider = new ServicesLabelProvider();
        this.viewer.setLabelProvider(this.labelProvider);
        this.viewer.setContentProvider(new DefaultTreeContentProvider() {
            @Override
            public Object[] getElements(Object inputElement) {
                Object o = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly();
                return new Object[] { o };
            }

            @Override
            public boolean hasChildren(Object element) {
                return getChildren(element).length > 0;
            }

            @Override
            public Object getParent(Object element) {
                return null;
            }

            @Override
            public Object[] getChildren(Object parentElement) {

                Object[] result = new Object[0];
                if (parentElement instanceof ServiceAssembly)
                    result = ((ServiceAssembly) parentElement).getServiceUnit().toArray();

                return result;
            }
        });

        this.viewer.setInput(new Object());
        this.viewer.expandAll();

        // Add the buttons
        Composite buttonsComposite = toolkit.createComposite(container);
        layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        buttonsComposite.setLayout(layout);
        buttonsComposite.setLayoutData(new GridData(SWT.DEFAULT, SWT.TOP, false, false));

        Button newSuButton = this.ise.getFormToolkit().createButton(buttonsComposite, "New...", SWT.PUSH);
        newSuButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
        newSuButton.setImage(PetalsImages.INSTANCE.getAdd());
        newSuButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {

                // Select a SU project
                List<IProject> suProjects = ServiceProjectRelationUtils.getAllSuProjects();
                Collections.sort(suProjects, new IProjectComparator());

                // Filter projects
                List<IProject> alreadyPresent = new ArrayList<IProject>();
                IWorkspaceRoot iwr = ResourcesPlugin.getWorkspace().getRoot();
                for (ServiceUnit su : SaEditionComposite.this.ise.getJbiModel().getServiceAssembly()
                        .getServiceUnit()) {
                    if (su.getIdentification() == null)
                        continue;

                    if (StringUtils.isEmpty(su.getIdentification().getName()))
                        continue;

                    IProject p = iwr.getProject(su.getIdentification().getName());
                    if (p.exists())
                        alreadyPresent.add(p);
                }

                suProjects.removeAll(alreadyPresent);

                // Open the selection dialog
                ListSelectionDialog dlg = new ListSelectionDialog(getShell(), suProjects,
                        new ArrayContentProvider(), new WorkbenchLabelProvider(), "Select a Service Unit project.");

                dlg.setTitle("Service Unit Selection");
                if (dlg.open() != Window.OK)
                    return;

                // Create the SU element
                CompoundCommand cc = new CompoundCommand();
                for (Object o : dlg.getResult()) {
                    IProject suProject = (IProject) o;

                    ServiceUnit su = JbiFactory.eINSTANCE.createServiceUnit();
                    Identification id = JbiFactory.eINSTANCE.createIdentification();
                    id.setName(suProject.getName());
                    id.setDescription("");
                    su.setIdentification(id);

                    Target target = JbiFactory.eINSTANCE.createTarget();
                    target.setArtifactsZip(suProject.getName() + ".zip");
                    Properties properties = PetalsSPPropertiesManager.getProperties(suProject);
                    String componentName = properties.getProperty(PetalsSPPropertiesManager.COMPONENT_DEPLOYMENT_ID,
                            "");
                    target.setComponentName(componentName);
                    su.setTarget(target);

                    EList<?> list = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly().getServiceUnit();
                    AddCommand addCommand = new AddCommand(SaEditionComposite.this.ise.getEditingDomain(), list,
                            su);
                    cc.append(addCommand);
                }

                // Execute the command
                SaEditionComposite.this.ise.getEditingDomain().getCommandStack().execute(cc);

                // Update the viewers
                SaEditionComposite.this.viewer.refresh();
                SaEditionComposite.this.viewer.expandAll();
                SaEditionComposite.this.viewer.setSelection(
                        new StructuredSelection(SaEditionComposite.this.ise.getJbiModel().getServiceAssembly()));
                SaEditionComposite.this.viewer.getTree().notifyListeners(SWT.Selection, new Event());
                SaEditionComposite.this.viewer.getTree().setFocus();
            }
        });

        final Button removeProvidesButton = this.ise.getFormToolkit().createButton(buttonsComposite, "Remove",
                SWT.PUSH);
        removeProvidesButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
        removeProvidesButton.setImage(PetalsImages.INSTANCE.getDelete());
        removeProvidesButton.addSelectionListener(new DefaultSelectionListener() {

            /*
             * (non-Javadoc)
             * @see org.eclipse.swt.events.SelectionListener
             * #widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            @Override
            public void widgetSelected(SelectionEvent e) {
                if (MessageDialog.openConfirm(getShell(), Messages.confimeRemoveEndpointTitle,
                        Messages.confimeRemoveEndpointMessage)) {

                    ServiceAssembly sa = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly();
                    Object o = ((IStructuredSelection) SaEditionComposite.this.viewer.getSelection())
                            .getFirstElement();
                    RemoveCommand deleteCommand = new RemoveCommand(SaEditionComposite.this.ise.getEditingDomain(),
                            sa.getServiceUnit(), o);
                    SaEditionComposite.this.ise.getEditingDomain().getCommandStack().execute(deleteCommand);

                    SaEditionComposite.this.pageBook.removePage(o);
                    SaEditionComposite.this.viewer.refresh();
                    SaEditionComposite.this.viewer.expandAll();
                    SaEditionComposite.this.viewer.setSelection(new StructuredSelection(sa));
                    SaEditionComposite.this.viewer.getTree().notifyListeners(SWT.Selection, new Event());
                }
            }
        });

        final Button upProvidesButton = this.ise.getFormToolkit().createButton(buttonsComposite, "", SWT.PUSH);
        upProvidesButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
        upProvidesButton.setText("&Up");
        upProvidesButton.addSelectionListener(new DefaultSelectionListener() {

            /*
             * (non-Javadoc)
             * @see org.eclipse.swt.events.SelectionListener
             * #widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            @Override
            public void widgetSelected(SelectionEvent e) {

                EList<?> list = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly().getServiceUnit();
                Object o = ((IStructuredSelection) SaEditionComposite.this.viewer.getSelection()).getFirstElement();
                MoveCommand moveCommand = new MoveCommand(SaEditionComposite.this.ise.getEditingDomain(), list, o,
                        list.indexOf(o) - 1);
                SaEditionComposite.this.ise.getEditingDomain().getCommandStack().execute(moveCommand);
            }
        });

        final Button downProvidesButton = this.ise.getFormToolkit().createButton(buttonsComposite, "", SWT.PUSH);
        downProvidesButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
        downProvidesButton.setText("&Down");
        downProvidesButton.addSelectionListener(new DefaultSelectionListener() {

            /*
             * (non-Javadoc)
             * @see org.eclipse.swt.events.SelectionListener
             * #widgetSelected(org.eclipse.swt.events.SelectionEvent)
             */
            @Override
            public void widgetSelected(SelectionEvent e) {

                EList<?> list = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly().getServiceUnit();
                Object o = ((IStructuredSelection) SaEditionComposite.this.viewer.getSelection()).getFirstElement();
                MoveCommand moveCommand = new MoveCommand(SaEditionComposite.this.ise.getEditingDomain(), list, o,
                        list.indexOf(o) + 1);
                SaEditionComposite.this.ise.getEditingDomain().getCommandStack().execute(moveCommand);
            }
        });

        this.viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {

                Object o = ((IStructuredSelection) SaEditionComposite.this.viewer.getSelection()).getFirstElement();
                EList<?> sus = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly().getServiceUnit();
                boolean isSa = o instanceof ServiceAssembly;
                boolean isFirst = sus.indexOf(o) == 0;
                boolean isLast = sus.indexOf(o) == sus.size() - 1;

                downProvidesButton.setEnabled(!isSa && !isLast);
                upProvidesButton.setEnabled(!isSa && !isFirst);
                removeProvidesButton.setEnabled(!isSa);
            }
        });
    }

    /**
     * Initializes the widgets on the right side.
     */
    protected void createRightWidgets() {

        this.pageBook = new ScrolledPageBook(this);
        this.pageBook.setLayoutData(new GridData(GridData.FILL_BOTH));

        this.viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {

                if (SaEditionComposite.this.viewer.getSelection().isEmpty())
                    return;

                Object o = ((IStructuredSelection) SaEditionComposite.this.viewer.getSelection()).getFirstElement();
                SaEditionComposite.this.viewerSelection = (EObject) o;

                if (!SaEditionComposite.this.pageBook.hasPage(o)) {
                    Composite parent = SaEditionComposite.this.pageBook.getContainer();
                    if (o instanceof ServiceAssembly)
                        SaEditionComposite.this.pageBook.registerPage(o, createSaSection(parent));
                    else if (o instanceof ServiceUnit)
                        SaEditionComposite.this.pageBook.registerPage(o, createSuSection(parent));
                    else
                        SaEditionComposite.this.pageBook.showEmptyPage();
                }

                SaEditionComposite.this.pageBook.showPage(o);
            }
        });
    }

    /**
     * Creates the section for the properties of a service assembly.
     * @param parent the parent
     * @return a new section
     */
    private Composite createSaSection(Composite parent) {

        // Container
        FormToolkit toolkit = this.ise.getFormToolkit();
        Composite container = toolkit.createComposite(parent);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginTop = 11;
        layout.marginLeft = 3;
        container.setLayout(layout);
        container.setLayoutData(new GridData(GridData.FILL_BOTH));

        Section section = toolkit.createSection(container,
                Section.DESCRIPTION | ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED);
        section.setLayoutData(new GridData(GridData.FILL_BOTH));
        section.clientVerticalSpacing = 10;
        section.setText("Service Assembly's Properties");
        section.setDescription("Edit the properties of the selected service assembly.");

        container = toolkit.createComposite(section, SWT.NONE);
        layout = new GridLayout(2, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.horizontalSpacing = 10;
        container.setLayout(layout);
        container.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
        section.setClient(container);

        // Texts
        final ServiceAssembly sa = (ServiceAssembly) this.viewerSelection;
        Label label = SwtFactory.createLabel(container, "Name:", "The name of the service assembly");
        label.setForeground(this.blueFont);

        this.saNameText = toolkit.createText(container, "", SWT.SINGLE | SWT.BORDER);
        this.saNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        this.saNameText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                SaEditionComposite.this.viewer.refresh(sa, true);
            }
        });

        this.ise.getDataBindingContext().bindValue(SWTObservables.observeText(this.saNameText),
                EMFEditObservables.observeValue(this.ise.getEditingDomain(), sa.getIdentification(),
                        JbiPackage.Literals.IDENTIFICATION__NAME));

        label = SwtFactory.createLabel(container, "Description:", "The description of the service assembly");
        label.setForeground(this.blueFont);
        label.setLayoutData(new GridData(SWT.DEFAULT, SWT.TOP, false, false));

        this.saDescText = toolkit.createText(container, "", SWT.MULTI | SWT.BORDER);
        GridData layoutData = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
        layoutData.heightHint = 60;
        this.saDescText.setLayoutData(layoutData);
        this.ise.getDataBindingContext().bindValue(SWTObservables.observeText(this.saDescText),
                EMFEditObservables.observeValue(this.ise.getEditingDomain(), sa.getIdentification(),
                        JbiPackage.Literals.IDENTIFICATION__DESCRIPTION));

        return section.getParent();
    }

    /**
     * Creates the section for the properties of a service unit.
     * @param parent the parent
     * @return a new section
     */
    private Composite createSuSection(Composite parent) {

        // Container
        FormToolkit toolkit = this.ise.getFormToolkit();
        Composite container = toolkit.createComposite(parent);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginTop = 11;
        layout.marginLeft = 3;
        container.setLayout(layout);
        container.setLayoutData(new GridData(GridData.FILL_BOTH));

        Section section = toolkit.createSection(container,
                Section.DESCRIPTION | ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED);
        section.setLayoutData(new GridData(GridData.FILL_BOTH));
        section.clientVerticalSpacing = 10;
        section.setText("Service Unit's Properties");
        section.setDescription("Edit the properties of the selected service unit.");

        container = toolkit.createComposite(section, SWT.NONE);
        layout = new GridLayout(2, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.horizontalSpacing = 10;
        container.setLayout(layout);
        container.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
        section.setClient(container);

        // Texts
        final ServiceUnit su = (ServiceUnit) this.viewerSelection;
        Label label = SwtFactory.createLabel(container, "Name:", "The name of the service assembly");
        label.setForeground(this.blueFont);

        this.suNameText = toolkit.createText(container, "", SWT.SINGLE | SWT.BORDER);
        this.suNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        this.suNameText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent e) {
                SaEditionComposite.this.viewer.refresh(su, true);
            }
        });

        this.ise.getDataBindingContext().bindValue(SWTObservables.observeText(this.suNameText),
                EMFEditObservables.observeValue(this.ise.getEditingDomain(), su.getIdentification(),
                        JbiPackage.Literals.IDENTIFICATION__NAME));

        label = SwtFactory.createLabel(container, "Description:", "The description of the service assembly");
        label.setForeground(this.blueFont);
        label.setLayoutData(new GridData(SWT.DEFAULT, SWT.TOP, false, false));

        this.suDescText = toolkit.createText(container, "", SWT.MULTI | SWT.BORDER);
        GridData layoutData = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
        layoutData.heightHint = 60;
        this.suDescText.setLayoutData(layoutData);
        this.ise.getDataBindingContext().bindValue(SWTObservables.observeText(this.suDescText),
                EMFEditObservables.observeValue(this.ise.getEditingDomain(), su.getIdentification(),
                        JbiPackage.Literals.IDENTIFICATION__DESCRIPTION));

        label = SwtFactory.createLabel(container, "Zip Artifact:", "The name of the *.zip artifact");
        label.setForeground(this.blueFont);

        this.suArtifactsText = toolkit.createText(container, "", SWT.SINGLE | SWT.BORDER);
        this.suArtifactsText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        this.ise.getDataBindingContext().bindValue(SWTObservables.observeText(this.suArtifactsText),
                EMFEditObservables.observeValue(this.ise.getEditingDomain(), su.getTarget(),
                        JbiPackage.Literals.TARGET__ARTIFACTS_ZIP));

        label = SwtFactory.createLabel(container, "Component name:", "The name of the target component");
        label.setForeground(this.blueFont);

        this.suComponentText = toolkit.createText(container, "", SWT.SINGLE | SWT.BORDER);
        this.suComponentText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        this.ise.getDataBindingContext().bindValue(SWTObservables.observeText(this.suComponentText),
                EMFEditObservables.observeValue(this.ise.getEditingDomain(), su.getTarget(),
                        JbiPackage.Literals.TARGET__COMPONENT_NAME));

        return section.getParent();
    }
}