fr.inria.atlanmod.collaboro.ui.wizards.NewLocalCollaboroProjectWizard.java Source code

Java tutorial

Introduction

Here is the source code for fr.inria.atlanmod.collaboro.ui.wizards.NewLocalCollaboroProjectWizard.java

Source

/*******************************************************************************
 * Copyright (c) 2008, 2012
 * 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:
 *    Javier Canovas (javier.canovas@inria.fr) 
 *******************************************************************************/

package fr.inria.atlanmod.collaboro.ui.wizards;

import java.awt.Dialog;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;

import fr.inria.atlanmod.collaboro.history.History;
import fr.inria.atlanmod.collaboro.history.HistoryFactory;
import fr.inria.atlanmod.collaboro.history.HistoryPackage;
import fr.inria.atlanmod.collaboro.history.User;
import fr.inria.atlanmod.collaboro.history.Version;
import fr.inria.atlanmod.collaboro.history.VersionHistory;
import fr.inria.atlanmod.collaboro.history.VersionHistoryType;
import fr.inria.atlanmod.collaboro.notation.Definition;
import fr.inria.atlanmod.collaboro.notation.NotationFactory;
import fr.inria.atlanmod.collaboro.notation.NotationPackage;
import fr.inria.atlanmod.collaboro.ui.Controller;

public class NewLocalCollaboroProjectWizard extends Wizard implements INewWizard {
    private static final String DEFAULT_FILENAME = "defaultHistoryFileName";
    protected IStructuredSelection selection;
    protected IWorkbench workbench;

    protected HistoryNewUsers newUsersPage;
    protected WizardNewProjectCreationPage newProjectPage;

    public class HistoryNewUsers extends WizardPage {
        protected HistoryNewUsers(String pageName) {
            super(pageName);
        }

        private ListViewer userList;
        private List<User> users = new ArrayList<User>();
        Text userNameText;

        @Override
        public void createControl(Composite parent) {
            Composite composite = new Composite(parent, SWT.NONE);
            GridLayout layout = new GridLayout();
            composite.setLayout(layout);
            layout.numColumns = 1;
            composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

            Group newUser = new Group(composite, SWT.NONE);
            newUser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
            GridLayout gridLayout = new GridLayout();
            gridLayout.numColumns = 3;
            newUser.setLayout(gridLayout);
            newUser.setText("Add new user");

            Label label = new Label(newUser, SWT.NONE);
            label.setText("User name:");
            label.setLayoutData(new GridData(GridData.BEGINNING, GridData.FILL, false, true));

            userNameText = new Text(newUser, SWT.BORDER);
            userNameText.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));

            Button addButton = new Button(newUser, SWT.NONE);
            addButton.setLayoutData(new GridData(GridData.END, GridData.FILL, false, true));
            addButton.setText("Add");
            addButton.addSelectionListener(new SelectionListener() {
                @Override
                public void widgetSelected(SelectionEvent e) {
                    User user = HistoryFactory.eINSTANCE.createUser();
                    user.setId(userNameText.getText());
                    users.add(user);
                    userList.refresh();
                    userNameText.setText("");
                }

                @Override
                public void widgetDefaultSelected(SelectionEvent e) {
                }
            });

            Group listGroup = new Group(composite, SWT.NONE);
            listGroup.setBounds(new Rectangle(0, 0, 500, 500));
            listGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
            GridLayout gridLayout2 = new GridLayout();
            gridLayout2.numColumns = 1;
            listGroup.setLayout(gridLayout2);
            listGroup.setText("User list");

            userList = new ListViewer(listGroup, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
            userList.getList().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
            userList.setContentProvider(new IStructuredContentProvider() {
                @Override
                public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                }

                @Override
                public void dispose() {
                }

                @Override
                public Object[] getElements(Object inputElement) {
                    if (inputElement instanceof List) {
                        List list = (List) inputElement;
                        return list.toArray();
                    }
                    return null;
                }
            });
            userList.setLabelProvider(new LabelProvider() {
                @Override
                public String getText(Object element) {
                    if (element instanceof User) {
                        User user = (User) element;
                        return user.getId();
                    }
                    return "User unknown";
                }
            });
            userList.setInput(users);

            setControl(composite);

        }

        public List<User> getUsers() {
            return users;
        }

    }

    @Override
    public void addPages() {
        newProjectPage = new WizardNewProjectCreationPage("Creating Collaboro Project");
        newProjectPage.setTitle("Creating Collaboro Project");
        newProjectPage
                .setDescription("A new Collaboro project to develop a DSL collaboratively project will be created");
        addPage(newProjectPage);

        newUsersPage = new HistoryNewUsers("Adding users");
        newUsersPage.setTitle("Community Users");
        newUsersPage.setDescription("Add new users to the community");
        addPage(newUsersPage);
    }

    public NewLocalCollaboroProjectWizard() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void init(IWorkbench workbench, IStructuredSelection selection) {
        this.workbench = workbench;
        this.selection = selection;
    }

    @Override
    public boolean performFinish() {
        final String projectName = newProjectPage.getProjectName();

        WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
            @Override
            protected void execute(IProgressMonitor progressMonitor) {
                progressMonitor.beginTask("Creating Collaboro Project", 10);

                progressMonitor.subTask("Registering packages");
                ResourceSet rset = new ResourceSetImpl();
                rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Controller.HISTORY_EXTENSION,
                        new EcoreResourceFactoryImpl());
                rset.getPackageRegistry().put(HistoryPackage.eNS_URI, HistoryPackage.eINSTANCE);
                rset.getPackageRegistry().put(NotationPackage.eNS_URI, NotationPackage.eINSTANCE);

                rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Controller.MODEL_EXTENSION,
                        new EcoreResourceFactoryImpl());
                rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Controller.NOTATION_EXTENSION,
                        new EcoreResourceFactoryImpl());
                rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Controller.ECORE_EXTENSION,
                        new EcoreResourceFactoryImpl());

                progressMonitor.worked(1);
                progressMonitor.subTask("Creating the project");
                IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
                IProject project = root.getProject(projectName);
                try {
                    project.create(progressMonitor);
                    project.open(progressMonitor);
                } catch (Exception e) {
                    e.printStackTrace();
                    MessageDialog dialog = new MessageDialog(getShell(), "Error", null,
                            "Error when creating the project in the workspace", MessageDialog.ERROR,
                            new String[] { "OK" }, 0);
                    dialog.open();
                    progressMonitor.done();
                    return;
                }

                IFolder modelsFolder = project.getFolder("models");
                try {
                    modelsFolder.create(true, true, progressMonitor);
                } catch (Exception e) {
                    e.printStackTrace();
                    MessageDialog dialog = new MessageDialog(getShell(), "Error", null,
                            "Error when creating the folder 'models' in the project", MessageDialog.ERROR,
                            new String[] { "OK" }, 0);
                    dialog.open();
                    progressMonitor.done();
                    return;
                }

                IFolder examplesFolder = project.getFolder("examples");
                try {
                    examplesFolder.create(true, true, progressMonitor);
                } catch (Exception e) {
                    e.printStackTrace();
                    MessageDialog dialog = new MessageDialog(getShell(), "Error", null,
                            "Error when creating the folder 'examples' in the project", MessageDialog.ERROR,
                            new String[] { "OK" }, 0);
                    dialog.open();
                    progressMonitor.done();
                    return;
                }

                progressMonitor.worked(1);
                progressMonitor.subTask("Creating initial Collaboro model");
                History historyModel = createInitialHistoryModel();

                List<User> users = newUsersPage.getUsers();
                if (users != null)
                    historyModel.getUsers().addAll(users);

                URI collaboroFile = URI.createPlatformResourceURI(
                        modelsFolder.getFullPath().toString() + File.separator + projectName + ".history", true);
                Resource collaboroRes = rset.createResource(collaboroFile);
                collaboroRes.getContents().add(historyModel);
                try {
                    collaboroRes.save(null);
                } catch (Exception exception) {
                    exception.printStackTrace();
                    MessageDialog dialog = new MessageDialog(getShell(), "Error", null,
                            "Error when creating initial Collaboro model", MessageDialog.ERROR,
                            new String[] { "OK" }, 0);
                    dialog.open();
                    progressMonitor.done();
                    return;
                }

                progressMonitor.worked(1);
                progressMonitor.subTask("Creating initial Ecore model");
                EPackage ePackage = createInitiaEcorePackage(projectName);
                URI ePackageFile = URI.createPlatformResourceURI(
                        modelsFolder.getFullPath().toString() + File.separator + projectName + ".ecore", true);
                Resource ePackageRes = rset.createResource(ePackageFile);
                ePackageRes.getContents().add(ePackage);
                try {
                    ePackageRes.save(null);
                } catch (Exception exception) {
                    exception.printStackTrace();
                    MessageDialog dialog = new MessageDialog(getShell(), "Error", null,
                            "Error when creating initial Ecore model", MessageDialog.ERROR, new String[] { "OK" },
                            0);
                    dialog.open();
                    progressMonitor.done();
                    return;
                }

                progressMonitor.worked(1);
                progressMonitor.subTask("Creating initial Notation model");
                Definition notation = createInitiaNotationModel();
                URI notationFile = URI.createPlatformResourceURI(
                        modelsFolder.getFullPath().toString() + File.separator + projectName + ".notation", true);
                Resource notationRes = rset.createResource(notationFile);
                notationRes.getContents().add(notation);
                try {
                    notationRes.save(null);
                } catch (Exception exception) {
                    exception.printStackTrace();
                    MessageDialog dialog = new MessageDialog(getShell(), "Error", null,
                            "Error when creating initial Notation model", MessageDialog.ERROR,
                            new String[] { "OK" }, 0);
                    dialog.open();
                    progressMonitor.done();
                    return;
                }

                progressMonitor.worked(6);
                progressMonitor.done();
            }
        };

        try {
            getContainer().run(false, false, operation);
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return true;
    }

    protected Definition createInitiaNotationModel() {
        Definition definition = NotationFactory.eINSTANCE.createDefinition();
        return definition;
    }

    protected EPackage createInitiaEcorePackage(String mainName) {
        EPackage ePackage = EcoreFactory.eINSTANCE.createEPackage();
        ePackage.setName(mainName);
        ePackage.setNsURI("http://" + mainName);
        ePackage.setNsPrefix(mainName);
        return ePackage;
    }

    protected History createInitialHistoryModel() {
        History history = HistoryFactory.eINSTANCE.createHistory();

        VersionHistory versionHistory = HistoryFactory.eINSTANCE.createVersionHistory();
        versionHistory.setType(VersionHistoryType.TRUNK);
        history.getHistories().add(versionHistory);

        Version version = HistoryFactory.eINSTANCE.createVersion();
        version.setId("0.1");
        versionHistory.getVersions().add(version);

        return history;
    }

}