org.wso2.developerstudio.eclipse.distribution.project.ui.wizard.DistributionProjectExportWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.developerstudio.eclipse.distribution.project.ui.wizard.DistributionProjectExportWizardPage.java

Source

/*
 * Copyright (c) 2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.wso2.developerstudio.eclipse.distribution.project.ui.wizard;

import java.util.HashMap;
import java.util.Map;

import org.apache.maven.model.Dependency;
import org.apache.maven.project.MavenProject;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.wso2.developerstudio.eclipse.distribution.project.model.DependencyData;
import org.wso2.developerstudio.eclipse.distribution.project.model.NodeData;
import org.wso2.developerstudio.eclipse.distribution.project.util.DistProjectUtils;
import org.wso2.developerstudio.eclipse.platform.core.utils.SWTResourceManager;

public class DistributionProjectExportWizardPage extends WizardPage {
    private MavenProject mavenProject;
    private Map<String, Dependency> dependencyList;
    private Map<String, DependencyData> projectList;
    private Map<String, Dependency> missingDependencyList;
    private Map<String, String> serverRoleList = new HashMap<String, String>();
    private Tree trDependencies;
    private TreeEditor editor;
    private Map<String, TreeItem> nodesWithSubNodes = new HashMap<String, TreeItem>();
    private boolean pageDirty = false;
    private boolean controlCreated = false;
    // need to get the server roles via an extension point without hard-coding
    private final String[] serverRoles = new String[] { "GovernanceRegistry", "BusinessProcessServer",
            "GadgetServer", "EnterpriseServiceBus", "MashupServer", "ApplicationServer", "DataServicesServer",
            "BusinessRulesServer", "IdentityServer", "BusinessActivityMonitor" };

    public Map<String, Dependency> getDependencyList() {
        return dependencyList;
    }

    public Map<String, DependencyData> getProjectList() {
        return projectList;
    }

    public Map<String, Dependency> getMissingDependencyList() {
        return missingDependencyList;
    }

    public void setDependencyList(Map<String, Dependency> dependencyList) {
        this.dependencyList = dependencyList;
    }

    public void setServerRoleList(Map<String, String> serverRoleList) {
        this.serverRoleList = serverRoleList;
    }

    public Map<String, String> getServerRoleList() {
        return serverRoleList;
    }

    public void setProjectList(Map<String, DependencyData> projectList) {
        this.projectList = projectList;
    }

    public void setMissingDependencyList(Map<String, Dependency> missingDependencyList) {
        this.missingDependencyList = missingDependencyList;
    }

    /**
     * Create the wizard.
     */
    public DistributionProjectExportWizardPage(MavenProject project) {
        super("WSO2 Platform Distribution");
        this.mavenProject = project;
        setTitle("WSO2 Platform Distribution");
        setDescription("Create an deployable CAR file");
    }

    /**
     * Create contents of the wizard.
     * @param parent
     */
    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);
        container.setLayout(new GridLayout(3, false));

        Label lblstaticText1 = new Label(container, SWT.NONE);
        lblstaticText1.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
        lblstaticText1.setText("Artifacts to include in the CAR");
        new Label(container, SWT.NONE);

        trDependencies = new Tree(container, SWT.CHECK | SWT.V_SCROLL | SWT.BORDER);
        GridData gridData = new GridData(SWT.LEFT, SWT.CENTER, true, true, 3, 1);
        gridData.heightHint = 300;
        trDependencies.setLayoutData(gridData);
        trDependencies.setHeaderVisible(true);

        TreeColumn trclmnArtifact = new TreeColumn(trDependencies, SWT.NONE);
        trclmnArtifact.setWidth(400);
        trclmnArtifact.setText("Artifact");

        TreeColumn trclmnServerRole = new TreeColumn(trDependencies, SWT.NONE);
        trclmnServerRole.setWidth(200);
        trclmnServerRole.setText("Server Role");

        TreeColumn trclmnVersion = new TreeColumn(trDependencies, SWT.NONE);
        trclmnVersion.setWidth(80);
        trclmnVersion.setText("Version");

        editor = new TreeEditor(trDependencies);
        editor.horizontalAlignment = SWT.LEFT;
        editor.grabHorizontal = true;

        trDependencies.addSelectionListener(new SelectionListener() {

            public void widgetSelected(SelectionEvent evt) {
                final TreeItem item = (TreeItem) evt.item;
                if (item != null) {
                    if (evt.detail == SWT.CHECK) {
                        handleTreeItemChecked(item);
                    } else {
                        handleTreeItemEdit(item);
                    }
                }
                validate();
            }

            public void widgetDefaultSelected(SelectionEvent evt) {

            }
        });
        createTreeContent();

        GridData gdBtn = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gdBtn.widthHint = 100;

        Button btnSelectAll = new Button(container, SWT.NONE);
        btnSelectAll.setText("Select All");
        btnSelectAll.setLayoutData(gdBtn);
        btnSelectAll.addListener(SWT.MouseDown, new Listener() {
            public void handleEvent(Event evt) {
                TreeItem[] items = trDependencies.getItems();
                for (TreeItem item : items) {
                    if (!item.getChecked() || item.getGrayed()) {
                        item.setChecked(true);
                        handleTreeItemChecked(item);
                    }
                }
            }
        });

        Button btnDeselectAll = new Button(container, SWT.NONE);
        btnDeselectAll.setText("Deselect All");
        btnDeselectAll.setLayoutData(gdBtn);

        btnDeselectAll.addListener(SWT.MouseDown, new Listener() {
            public void handleEvent(Event evt) {
                TreeItem[] items = trDependencies.getItems();
                for (TreeItem item : items) {
                    item.setChecked(false);
                    handleTreeItemChecked(item);
                }
            }
        });

        Label lblEmpty = new Label(container, SWT.NONE);
        GridData gdEmpty = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
        lblEmpty.setLayoutData(gdEmpty);

        setControl(container);
        controlCreated = true;
        validate();
    }

    /**
     * Update state of treeItem
     * @param item Selected tree item
     */
    private void updateCheckState(TreeItem item) {
        if (item != null) {
            TreeItem[] subItems = item.getItems();
            int i = 0;
            for (TreeItem subItem : subItems) {
                if (subItem.getChecked())
                    i++;
            }
            if (i == item.getItemCount()) {
                item.setGrayed(false);
                item.setChecked(true);
            } else if (i < item.getItemCount() && i > 0) {
                item.setChecked(true);
                item.setGrayed(true);

            } else {
                item.setGrayed(false);
                item.setChecked(false);
            }
            setPageDirtyState(true);
        }
    }

    private void setPageDirtyState(boolean value) {
        if (controlCreated) {
            pageDirty = value;
        }
    }

    public boolean isPageDirty() {
        return pageDirty;
    }

    /**
     * Create content of tree control 
     */
    protected void createTreeContent() {
        trDependencies.removeAll();
        nodesWithSubNodes.clear();
        for (String project : getProjectList().keySet()) {
            DependencyData dependencyData = getProjectList().get(project);
            Object parent = dependencyData.getParent();
            Object self = dependencyData.getSelf();
            if ((parent == null) && (self != null)) {
                if (self instanceof IProject) {
                    createNode(trDependencies, dependencyData.getDependency(), true);
                }
            } else if (parent != null) {
                if (parent instanceof IProject) {
                    IProject prj = (IProject) parent;
                    TreeItem parentNode = null;
                    if (nodesWithSubNodes.containsKey(prj.getName())) {
                        parentNode = nodesWithSubNodes.get(prj.getName());
                    } else {
                        parentNode = createNode(trDependencies, prj);
                        nodesWithSubNodes.put(prj.getName(), parentNode);
                    }
                    if (parentNode != null) {
                        createNode(parentNode, dependencyData.getDependency(), true);
                    }
                    updateCheckState(parentNode);
                }
            }
        }

        if (getMissingDependencyList().size() > 0) {
            for (String dependency : getMissingDependencyList().keySet()) {
                createNode(trDependencies, getMissingDependencyList().get(dependency), false);
            }
        }
        trDependencies.layout();
    }

    /**
     * Create a subItem for a project
     * @param parent Parent treeItem
     * @param project Project dependency
     * @param available available of dependency in workspace  
     * @return new TreeItem
     */
    TreeItem createNode(TreeItem parent, final Dependency project, boolean available) {
        TreeItem item = new TreeItem(parent, SWT.NONE);
        String artifactInfo = DistProjectUtils.getArtifactInfoAsString(project);
        String serverRole = DistProjectUtils.getDefaultServerRole(getProjectList(), artifactInfo)
                .replaceAll("^capp/", "");
        String version = project.getVersion();

        item.setText(0, DistProjectUtils.getMavenInfoAsString(artifactInfo));

        item.setText(2, version);
        NodeData nodeData = new NodeData(project);
        nodeData.setServerRole(serverRole);
        item.setData(nodeData);

        if (getDependencyList().containsKey(artifactInfo)) {
            item.setChecked(true);
            String role = DistProjectUtils.getServerRole(mavenProject, getDependencyList().get(artifactInfo))
                    .replaceAll("^capp/", "");
            item.setText(1, role);
        } else {
            item.setText(1, serverRole);
        }

        if (getMissingDependencyList().containsKey(artifactInfo)) {
            getMissingDependencyList().remove(artifactInfo);
        }
        item.setImage(0, SWTResourceManager.getImage(this.getClass(), "/icons/artifact.png"));

        return item;
    }

    /**
     * Create a Item for a dependency
     * @param parent Parent tree control
     * @param project Project dependency
     * @param available available of dependency in workspace  
     * @return new TreeItem
     */
    TreeItem createNode(Tree parent, final Dependency project, boolean available) {
        TreeItem item = new TreeItem(parent, SWT.NONE);
        final String artifactInfo = DistProjectUtils.getArtifactInfoAsString(project);
        final String serverRole = DistProjectUtils.getDefaultServerRole(getProjectList(), artifactInfo)
                .replaceAll("^capp/", "");
        final String version = project.getVersion();

        item.setText(0, DistProjectUtils.getMavenInfoAsString(artifactInfo));

        item.setText(2, version);

        NodeData nodeData = new NodeData(project);
        nodeData.setServerRole(serverRole);

        item.setData(nodeData);

        if (available) {
            if (getDependencyList().containsKey(artifactInfo)) {
                item.setChecked(true);
                String role = DistProjectUtils.getServerRole(mavenProject, getDependencyList().get(artifactInfo))
                        .replaceAll("^capp/", "");
                item.setText(1, role);
            } else {
                item.setText(1, serverRole);
            }
            if (getMissingDependencyList().containsKey(artifactInfo)) {
                getMissingDependencyList().remove(artifactInfo);
            }

        } else {
            if (getDependencyList().containsKey(artifactInfo)) {
                getDependencyList().remove(artifactInfo);
            }
        }
        if (available) {
            item.setImage(0, SWTResourceManager.getImage(this.getClass(), "/icons/artifact.png"));
        } else {
            item.setImage(0, SWTResourceManager.getImage(this.getClass(), "/icons/cancel_16.png"));
        }
        return item;

    }

    /**
     * Create a tree Item for a project
     * @param parent  Parent tree control
     * @param project eclipse project
     * @return  new TreeItem
     */
    TreeItem createNode(Tree parent, final IProject project) {
        TreeItem item = new TreeItem(parent, SWT.NONE);
        MavenProject mavenProject;
        try {
            mavenProject = DistProjectUtils.getMavenProject(project);
            item.setText(0, project.getName());
            item.setText(1, "--");
            item.setText(2, mavenProject.getModel().getVersion());
            NodeData nodeData = new NodeData(project);
            item.setData(project);

            nodeData.setHaschildren(true);
            item.setData(nodeData);

            item.setImage(0, SWTResourceManager.getImage(this.getClass(), "/icons/projects.gif"));
        } catch (Exception e) {
            return null;
        }
        return item;

    }

    /**
     * handle tree item check event
     * @param item Selected tree item
     */
    private void handleTreeItemChecked(TreeItem item) {
        boolean select = item.getChecked();
        NodeData nodeData = (NodeData) item.getData();
        if (nodeData.hasChildren()) {
            TreeItem[] subItems = item.getItems();
            if (select) {
                boolean conflict = false;
                for (TreeItem subitem : subItems) {
                    if (!subitem.getChecked()) {
                        NodeData subNodeData = (NodeData) subitem.getData();
                        if (!isNameConflict(subNodeData)) {
                            subitem.setChecked(true);
                            addDependency(subNodeData);
                        } else {
                            conflict = true;
                        }
                    }
                }
                if (conflict) {
                    MessageDialog.openWarning(new Shell(), "Add dependencies",
                            "Cannot add multiple dependencies with same identity");
                }
            } else {
                for (TreeItem subitem : subItems) {
                    if (subitem.getChecked()) {
                        subitem.setChecked(false);
                        NodeData subNodeData = (NodeData) subitem.getData();
                        removeDependency(subNodeData);
                    }
                }
            }
            updateCheckState(item);
        } else {
            TreeItem parentItem = item.getParentItem();
            if (select) {
                if (!isNameConflict(nodeData)) {
                    addDependency(nodeData);
                } else {
                    item.setChecked(false);
                    MessageDialog.openWarning(new Shell(), "Add dependencies",
                            "Cannot add multiple dependencies with same identity");
                }
            } else {
                removeDependency(nodeData);
            }
            updateCheckState(parentItem);
        }
    }

    /**
     * Check for conflicts
     * @param nodeData
     * @return
     */
    private boolean isNameConflict(NodeData nodeData) {
        Dependency dependency = nodeData.getDependency();
        for (Dependency entry : getDependencyList().values()) {
            if (entry.getArtifactId().equalsIgnoreCase(dependency.getArtifactId())) {
                return true;
            }
        }
        return false;
    }

    /**
     * handle tree item edit events
     * @param item Selected tree item
     */
    private void handleTreeItemEdit(final TreeItem item) {
        final NodeData nodeData = (NodeData) item.getData();
        Control lastCtrl = editor.getEditor();
        if (lastCtrl != null) {
            lastCtrl.dispose();
        }
        if (nodeData.hasChildren() || !item.getChecked())
            return;
        final String artifactInfo = DistProjectUtils.getArtifactInfoAsString(nodeData.getDependency());
        final Combo cmbServerRole = new Combo(trDependencies, SWT.SINGLE);
        cmbServerRole.setItems(serverRoles);
        cmbServerRole.setText(item.getText(1));
        cmbServerRole.setFocus();
        editor.setEditor(cmbServerRole, item, 1);
        trDependencies.redraw();

        cmbServerRole.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event e) {
                String role = cmbServerRole.getText();
                item.setText(1, role);
                nodeData.setServerRole(role);
                if (getDependencyList().containsKey(artifactInfo)) {
                    serverRoleList.put(artifactInfo, "capp/" + role);
                    setPageDirtyState(true);
                }
            }
        });
        //temporary commented out, eclipse freezes when handling dispose()
        //      cmbServerRole.addFocusListener(new FocusAdapter() {
        //         public void focusLost(FocusEvent e) {
        //            String role = cmbServerRole.getText();
        //            cmbServerRole.dispose();
        //            item.setText(1, role);
        //            nodeData.setServerRole(role);
        //            if (getDependencyList().containsKey(artifactInfo)) {
        //               getDependencyList().get(artifactInfo).setScope("capp/" + role);
        //            }
        //         }
        //      });
    }

    /**
     * Remove a project dependencies from the maven model
     * @param nodeData NodeData of selected treeitem
     */
    private void removeDependency(NodeData nodeData) {
        Dependency project = nodeData.getDependency();
        String artifactInfo = DistProjectUtils.getArtifactInfoAsString(project);

        if (getDependencyList().containsKey(artifactInfo)) {
            getDependencyList().remove(artifactInfo);
            if (serverRoleList.containsKey(artifactInfo)) {
                serverRoleList.remove(artifactInfo);
            }
        }
    }

    /**
     * Add a project dependencies to the maven model
     * @param nodeData NodeData of selected treeitem
     */
    private void addDependency(NodeData nodeData) {
        Dependency project = nodeData.getDependency();
        String serverRole = nodeData.getServerRole();
        String artifactInfo = DistProjectUtils.getArtifactInfoAsString(project);

        if (!getDependencyList().containsKey(artifactInfo)) {

            Dependency dependency = new Dependency();
            dependency.setArtifactId(project.getArtifactId());
            dependency.setGroupId(project.getGroupId());
            dependency.setVersion(project.getVersion());
            dependency.setType(project.getType());
            if (!serverRoleList.containsKey(artifactInfo)) {
                serverRoleList.put(artifactInfo, "capp/" + serverRole);
            }
            getDependencyList().put(artifactInfo, dependency);
        }
    }

    private void validate() {
        if (getDependencyList().size() == 0) {
            setErrorMessage("Please tick/check atleast one artifact from the list");
            setPageComplete(false);
            return;
        }
        setErrorMessage(null);
        setPageComplete(true);
    }

}