package fr.inria.atlanmod.collaboro.ui.wizards; import java.lang.reflect.InvocationTargetException; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.net4j.CDONet4jUtil; import org.eclipse.emf.cdo.net4j.CDOSessionConfiguration; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.cdo.util.CommitException; import org.eclipse.emf.cdo.view.CDOAdapterPolicy; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EcoreFactory; 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.wizard.WizardPage; import org.eclipse.net4j.Net4jUtil; import org.eclipse.net4j.connector.IConnector; import org.eclipse.net4j.tcp.TCPUtil; import org.eclipse.net4j.util.container.ContainerUtil; import org.eclipse.net4j.util.container.IManagedContainer; import org.eclipse.net4j.util.om.OMPlatform; import org.eclipse.net4j.util.om.log.PrintLogHandler; import org.eclipse.net4j.util.om.trace.PrintTraceHandler; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; 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.actions.WorkspaceModifyOperation; import org.eclipse.ui.dialogs.WizardNewProjectCreationPage; import fr.inria.atlanmod.collaboro.Synchronization.EventList; import fr.inria.atlanmod.collaboro.Synchronization.SynchronizationFactory; 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; import fr.inria.atlanmod.collaboro.ui.ModelManager; public class NewRemoteCollaboroProjectWizard extends NewLocalCollaboroProjectWizard { protected CDOConfiguration newCDOConfigurationPage; private CDOTransaction generalTransaction; private CDOSession session = null; private IManagedContainer container = null; private IConnector connector = null; private String abstractSyntaxPath; private String historyPath; private String concreteSyntaxPath; private EPackage ePackage; private Definition concreteSyntaxDefinition; private History history; private String synchronizationPath; private EventList synchronization; public NewRemoteCollaboroProjectWizard() { } public class CDOConfiguration extends WizardPage { protected CDOConfiguration(String pageName) { super(pageName); } Text serverDescriptionText; Text repositoryNameText; @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 serverDescription = new Group(composite, SWT.NONE); serverDescription.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 2; serverDescription.setLayout(gridLayout); serverDescription.setText("Server Description"); Label label = new Label(serverDescription, SWT.NONE); label.setText("Server description:"); label.setLayoutData(new GridData(GridData.BEGINNING, GridData.FILL, false, true)); serverDescriptionText = new Text(serverDescription, SWT.BORDER); serverDescriptionText.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true)); serverDescriptionText.setText("localhost:2036"); Label label2 = new Label(serverDescription, SWT.NONE); label2.setText("Repository:"); label2.setLayoutData(new GridData(GridData.BEGINNING, GridData.FILL, false, true)); repositoryNameText = new Text(serverDescription, SWT.BORDER); repositoryNameText.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true)); repositoryNameText.setText("repo1"); setControl(composite); } public String getRepositoryName() { return repositoryNameText.getText(); } public String getServerDescription() { return serverDescriptionText.getText(); } } @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); newCDOConfigurationPage = new CDOConfiguration("CDO Configuration"); newCDOConfigurationPage.setTitle("CDO configuration"); newCDOConfigurationPage.setDescription("Prepare CDO connection"); addPage(newCDOConfigurationPage); } private boolean initializeCDO() { CDOUtil.setLegacyModeDefault(true); if(session != null) { session.close(); } if(connector != null) { connector.close(); } if(container != null) { container.deactivate(); } // Enable logging and tracing OMPlatform.INSTANCE.setDebugging(true); OMPlatform.INSTANCE.addLogHandler(PrintLogHandler.CONSOLE); OMPlatform.INSTANCE.addTraceHandler(PrintTraceHandler.CONSOLE); // Prepare container container = ContainerUtil.createContainer(); Net4jUtil.prepareContainer(container); // Register Net4j factories TCPUtil.prepareContainer(container); // Register TCP factories CDONet4jUtil.prepareContainer(container); // Register CDO factories container.activate(); // Create connector connector = TCPUtil.getConnector(container, this.newCDOConfigurationPage.getServerDescription()); //$NON-NLS-1$ // Create configuration CDOSessionConfiguration configuration = CDONet4jUtil.createSessionConfiguration(); configuration.setConnector(connector); configuration.setRepositoryName(this.newCDOConfigurationPage.getRepositoryName()); //$NON-NLS-1$ // Open session session = configuration.openSession(); String path = "/"+this.newProjectPage.getProjectName()+"/"+this.newProjectPage.getProjectName()+ModelManager.ECORE_EXTENSION; abstractSyntaxPath = "/"+this.newProjectPage.getProjectName()+"/"+this.newProjectPage.getProjectName()+"."+ModelManager.ECORE_EXTENSION; historyPath = "/"+this.newProjectPage.getProjectName()+"/"+this.newProjectPage.getProjectName() +"."+ ModelManager.HISTORY_EXTENSION; concreteSyntaxPath = "/"+this.newProjectPage.getProjectName()+"/"+this.newProjectPage.getProjectName() + "." + ModelManager.NOTATION_EXTENSION; synchronizationPath = "/"+this.newProjectPage.getProjectName()+"/"+this.newProjectPage.getProjectName() + ".sync"; System.out.println(abstractSyntaxPath + " " + historyPath + " " + concreteSyntaxPath); generalTransaction = session.openTransaction(); createHistory(); createEcoreModel(); createNotation(); createSynchronization(); List<User> users = newUsersPage.getUsers(); if(users != null) history.getUsers().addAll(users); // generalTransaction.addObjectHandler(new CDOObjectHandler() { // @Override // public void objectStateChanged(CDOView view, CDOObject object, // CDOState oldState, CDOState newState) { // System.out.println("Object: " + object.toString() // + " transitioned to " + newState); // // } // }); // generalTransaction.addListener(new IListener() { // @Override // public void notifyEvent(IEvent arg0) { // System.out.println("EVENT " + arg0.toString()); // Controller.INSTANCE.refreshVersionView(); //// Workbench.getInstance().getDisplay().syncExec(new Runnable() { //// @Override //// public void run() { //// MessageBox message = new MessageBox(Workbench.getInstance().getDisplay().getActiveShell()); //// message.setMessage("change"); //// message.open(); //// } //// }); // } // }); generalTransaction.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.CDO); try { generalTransaction.commit(); } catch (CommitException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } public History createHistory() { // Get or create resource CDOResource resource = generalTransaction.getOrCreateResource(historyPath); //$NON-NLS-1$ history = createInitialHistoryModel(); resource.getContents().add(history); return history; } public Definition createNotation() { // Get or create resource CDOResource resource = generalTransaction.getOrCreateResource(concreteSyntaxPath); //$NON-NLS-1$ concreteSyntaxDefinition = createInitiaNotationModel(); resource.getContents().add(concreteSyntaxDefinition); return concreteSyntaxDefinition; } public EPackage createEcoreModel() { // Get or create resource CDOResource resource = generalTransaction.getOrCreateResource(abstractSyntaxPath); //$NON-NLS-1$ ePackage = createInitiaEcorePackage(this.newProjectPage.getProjectName()); resource.getContents().add(ePackage); return ePackage; } public EventList createSynchronization() { // Get or create resource CDOResource resource = generalTransaction.getOrCreateResource(synchronizationPath); //$NON-NLS-1$ synchronization = SynchronizationFactory.eINSTANCE.createEventList(); resource.getContents().add(synchronization); return synchronization; } @Override public boolean performFinish() { final String projectName = newProjectPage.getProjectName(); initializeCDO(); 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; } 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; } }