Java tutorial
/******************************************************************************* * Copyright (C) 2015 Obeo. * * 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 *******************************************************************************/ package org.eclipse.emf.compare.ide.ui.tests.merge; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.io.File; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.mapping.ModelProvider; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.egit.core.Activator; import org.eclipse.egit.core.GitCorePreferences; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin; import org.eclipse.emf.compare.ide.ui.internal.logical.EMFModelProvider; import org.eclipse.emf.compare.ide.ui.internal.logical.resolver.CrossReferenceResolutionScope; import org.eclipse.emf.compare.ide.ui.internal.preferences.EMFCompareUIPreferences; import org.eclipse.emf.compare.ide.ui.tests.CompareTestCase; import org.eclipse.emf.compare.ide.ui.tests.egit.fixture.GitTestRepository; import org.eclipse.emf.compare.ide.ui.tests.egit.fixture.MockSystemReader; import org.eclipse.emf.compare.ide.ui.tests.workspace.TestProject; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jgit.api.ResetCommand.ResetType; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.util.FileUtils; import org.eclipse.jgit.util.SystemReader; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /** * Tests with EGit shared models. * * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a> */ @SuppressWarnings({ "restriction", "nls" }) public class RemoteNewProjectTests extends CompareTestCase { private static final String MASTER = Constants.R_HEADS + Constants.MASTER; private static final String BRANCH_1 = Constants.R_HEADS + "branch1"; private static final String BRANCH_2 = Constants.R_HEADS + "branch2"; private static final String BRANCH_3 = Constants.R_HEADS + "branch3"; protected GitTestRepository repository; // The ".git" folder of the test repository private File gitDir; private static String deafultResolutionScope; @BeforeClass public static void setUpClass() { // suppress auto-ignoring and auto-sharing to avoid interference IEclipsePreferences eGitPreferences = InstanceScope.INSTANCE.getNode(Activator.getPluginId()); eGitPreferences.put(GitCorePreferences.core_preferredMergeStrategy, "model recursive"); eGitPreferences.putBoolean(GitCorePreferences.core_autoShareProjects, false); // This is actually the value of "GitCorePreferences.core_autoIgnoreDerivedResources"... but it was // not in Egit 2.1 eGitPreferences.putBoolean("core_autoIgnoreDerivedResources", false); final IPreferenceStore store = EMFCompareIDEUIPlugin.getDefault().getPreferenceStore(); deafultResolutionScope = store.getString(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE); store.setValue(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE, CrossReferenceResolutionScope.WORKSPACE.name()); } @AfterClass public static void tearDownClass() { final IPreferenceStore store = EMFCompareIDEUIPlugin.getDefault().getPreferenceStore(); store.setValue(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE, deafultResolutionScope); } @Override @Before public void setUp() throws Exception { // ensure there are no shared Repository instances left // when starting a new test Activator.getDefault().getRepositoryCache().clear(); final MockSystemReader mockSystemReader = new MockSystemReader(); SystemReader.setInstance(mockSystemReader); final IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); String gitRepoPath = workspaceRoot.getRawLocation().toFile() + File.separator + "repo"; mockSystemReader.setProperty(Constants.GIT_CEILING_DIRECTORIES_KEY, workspaceRoot.getLocation().toFile().getParentFile().getAbsoluteFile().toString()); gitDir = new File(gitRepoPath, Constants.DOT_GIT); repository = new GitTestRepository(gitDir); repository.ignore(workspaceRoot.getRawLocation().append(".metadata").toFile()); } @Override @After public void tearDown() throws Exception { final EMFModelProvider emfModelProvider = (EMFModelProvider) ModelProvider .getModelProviderDescriptor(EMFModelProvider.PROVIDER_ID).getModelProvider(); emfModelProvider.clear(); repository.dispose(); Activator.getDefault().getRepositoryCache().clear(); if (gitDir.exists()) { File gitRoot = gitDir.getParentFile(); if (gitRoot.exists()) { FileUtils.delete(gitRoot, FileUtils.RECURSIVE | FileUtils.RETRY); } } } /** * Merge of a new remote project that contains a new fragment of a model. The projects are at the root of * the git repository. The controlled model is at the root of its project. * * @throws Exception */ @Test public void testCollaborativeModeling_UseCase001_MergeFragmentFromRemoteProject() throws Exception { ResourceSetImpl resourceSet = new ResourceSetImpl(); File workingDirectory = repository.getRepository().getWorkTree(); TestProject testProject1 = new TestProject("Project1", workingDirectory.getAbsolutePath()); IProject iProject = testProject1.getProject(); repository.connect(iProject); File file1 = testProject1.getOrCreateFile(iProject, "file1.ecore"); IFile iFile1 = testProject1.getIFile(iProject, file1); Resource resource1 = connectResource(iFile1, resourceSet); // 1st commit: // One project at the root of the git repository // One model with a root package containing another package. // The model is at the root of the project. EPackage root = createPackage(null, "parent"); EPackage child = createPackage(root, "child"); createClass(child, "C1"); resource1.getContents().add(root); save(resource1); repository.addAllAndCommit("1st-commit"); repository.createBranch(MASTER, BRANCH_1); TestProject testProject2 = new TestProject("Project2", workingDirectory.getAbsolutePath()); IProject iProject2 = testProject2.getProject(); repository.connect(iProject2); File file2 = testProject2.getOrCreateFile(iProject2, "file2.ecore"); IFile iFile2 = testProject2.getIFile(iProject2, file2); File file22 = testProject2.getOrCreateFile(iProject2, "file22.txt"); IFile iFile22 = testProject2.getIFile(iProject2, file22); Resource resource2 = connectResource(iFile2, resourceSet); // 2nd commit: // Control the sub-package in a new project at the root of the git repository. // The controlled model is at the root of its project. // Also add a simple file in this new project. resource2.getContents().add(child); resource1.getContents().clear(); resource1.getContents().add(root); save(resource2); save(resource1); repository.addAllAndCommit("2nd-commit"); repository.createBranch(MASTER, BRANCH_2); // Back to 1st commit repository.reset(BRANCH_1, ResetType.HARD); // 3rd commit: // Add a new Package child2 under Package root. resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); root = (EPackage) resource1.getContents().get(0); EPackage child2 = createPackage(root, "child2"); save(resource1); repository.addAllAndCommit("3rd-commit"); repository.createBranch(MASTER, BRANCH_3); // Merge repository.mergeLogicalWithNewCommit(BRANCH_2); // No conflicts assertTrue(repository.status().getConflicting().isEmpty()); // The project2 is not accessible. assertTrue(iProject.isAccessible()); assertFalse(iProject2.isAccessible()); // After the merge, the repository should contain all files from 2nd commit. assertTrue(iFile1.exists()); assertFalse(iFile2.exists()); assertFalse(iFile22.exists()); assertTrue(file2.exists()); assertTrue(file22.exists()); // Check the contents resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); resource2 = resourceSet.getResource(URI.createFileURI(file2.getAbsolutePath()), true); // The proxy of child element has the following form : "platform:/resource/..." // So we have to update the uri of the resource2 resource2.setURI(URI.createPlatformResourceURI(iFile2.getFullPath().toString(), true)); EcoreUtil.resolveAll(resourceSet); root = (EPackage) resource1.getContents().get(0); assertEquals("parent", root.getName()); // The sub-packages must be "child", and "child2" from the 3rd commit. child = root.getESubpackages().get(0); assertEquals("child", child.getName()); assertSame(resource2, ((InternalEObject) child).eDirectResource()); EClass testC1 = (EClass) child.getEClassifiers().get(0); assertEquals("C1", testC1.getName()); child2 = root.getESubpackages().get(1); assertEquals("child2", child2.getName()); testProject1.dispose(); testProject2.dispose(); } /** * Merge of a new remote project that contains a new fragment of a model. The projects are at the root of * the git repository. The controlled model is at the root of its project. * * @throws Exception */ @Test public void testCollaborativeModeling_UseCase002_MergeFragmentContainingRenameFromRemoteProject() throws Exception { ResourceSetImpl resourceSet = new ResourceSetImpl(); File workingDirectory = repository.getRepository().getWorkTree(); TestProject testProject1 = new TestProject("Project1", workingDirectory.getAbsolutePath()); IProject iProject = testProject1.getProject(); repository.connect(iProject); File file1 = testProject1.getOrCreateFile(iProject, "file1.ecore"); IFile iFile1 = testProject1.getIFile(iProject, file1); Resource resource1 = connectResource(iFile1, resourceSet); // 1st commit: // One project at the root of the git repository // One model with a root package containing another package. // The model is at the root of the project. EPackage root = createPackage(null, "parent"); EPackage child = createPackage(root, "child"); createClass(child, "C1"); resource1.getContents().add(root); save(resource1); repository.addAllAndCommit("1st-commit"); repository.createBranch(MASTER, BRANCH_1); TestProject testProject2 = new TestProject("Project2", workingDirectory.getAbsolutePath()); IProject iProject2 = testProject2.getProject(); repository.connect(iProject2); File file2 = testProject2.getOrCreateFile(iProject2, "file2.ecore"); IFile iFile2 = testProject2.getIFile(iProject2, file2); File file22 = testProject2.getOrCreateFile(iProject2, "file22.txt"); IFile iFile22 = testProject2.getIFile(iProject2, file22); Resource resource2 = connectResource(iFile2, resourceSet); // 2nd commit: // Control the sub-package in a new project at the root of the git repository. // The controlled model is at the root of its project. // Also add a simple file in this new project. resource2.getContents().add(child); resource1.getContents().clear(); resource1.getContents().add(root); save(resource2); save(resource1); repository.addAllAndCommit("2nd-commit"); repository.createBranch(MASTER, BRANCH_2); // Back to 1st commit repository.reset(BRANCH_1, ResetType.HARD); // 3rd commit: // Change the name of the sub-package. resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); root = (EPackage) resource1.getContents().get(0); child = root.getESubpackages().get(0); child.setName("newChild"); save(resource1); repository.addAllAndCommit("3rd-commit"); repository.createBranch(MASTER, BRANCH_3); // Merge repository.mergeLogicalWithNewCommit(BRANCH_2); // No conflicts assertTrue(repository.status().getConflicting().isEmpty()); // The project2 is not accessible. assertTrue(iProject.isAccessible()); assertFalse(iProject2.isAccessible()); // After the merge, the repository should contain all files from 2nd commit. assertTrue(iFile1.exists()); assertFalse(iFile2.exists()); assertFalse(iFile22.exists()); assertTrue(file2.exists()); assertTrue(file22.exists()); // Check the contents resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); resource2 = resourceSet.getResource(URI.createFileURI(file2.getAbsolutePath()), true); // The proxy of child element has the following form : "platform:/resource/..." // So we have to update the uri of the resource2 resource2.setURI(URI.createPlatformResourceURI(iFile2.getFullPath().toString(), true)); EcoreUtil.resolveAll(resourceSet); root = (EPackage) resource1.getContents().get(0); assertEquals("parent", root.getName()); // The sub-package must be "newChild" from the 3rd commit. child = root.getESubpackages().get(0); assertEquals("newChild", child.getName()); assertSame(resource2, ((InternalEObject) child).eDirectResource()); EClass testC1 = (EClass) child.getEClassifiers().get(0); assertEquals("C1", testC1.getName()); testProject1.dispose(); testProject2.dispose(); } /** * Merge of a model that reference an object from a project outside of the repository. The project outside * of the repository is in the workspace. * * @throws Exception */ @Test public void testCollaborativeModeling_UseCase003_MergeFragmentFromOutsideRepository() throws Exception { ResourceSetImpl resourceSet = new ResourceSetImpl(); File workingDirectory = repository.getRepository().getWorkTree(); TestProject testProject1 = new TestProject("Project1", workingDirectory.getAbsolutePath()); IProject iProject = testProject1.getProject(); repository.connect(iProject); File file1 = testProject1.getOrCreateFile(iProject, "file1.ecore"); IFile iFile1 = testProject1.getIFile(iProject, file1); Resource resource1 = connectResource(iFile1, resourceSet); // 1st commit: // One project at the root of the git repository // One model with a root package containing a class. // The model is at the root of the project. EPackage root = createPackage(null, "parent"); resource1.getContents().add(root); EClass c1 = createClass(root, "C1"); save(resource1); repository.addAllAndCommit("1st-commit"); repository.createBranch(MASTER, BRANCH_1); TestProject testProject2 = new TestProject("Project2", ResourcesPlugin.getWorkspace().getRoot().getLocation().toString()); IProject iProject2 = testProject2.getProject(); File file2 = testProject2.getOrCreateFile(iProject2, "file2.ecore"); IFile iFile2 = testProject2.getIFile(iProject2, file2); File file22 = testProject2.getOrCreateFile(iProject2, "file22.txt"); IFile iFile22 = testProject2.getIFile(iProject2, file22); Resource resource2 = connectResource(iFile2, resourceSet); EPackage root2 = createPackage(null, "parent2"); EClass c2 = createClass(root2, "C2"); resource2.getContents().add(root2); save(resource2); // 2nd commit: // One project not shared in the git repository. // One model with a root package. // The model is at the root of the project. // Add C2 as a new supertype of C1 c1.getESuperTypes().add(c2); save(resource1); repository.addAllAndCommit("2nd-commit"); repository.createBranch(MASTER, BRANCH_2); // Back to 1st commit repository.reset(BRANCH_1, ResetType.HARD); // 3rd commit: // Add a new attribute under C1 resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); root = (EPackage) resource1.getContents().get(0); c1 = (EClass) root.getEClassifiers().get(0); EAttribute att1 = createAttribute(c1, "attribute1", null); save(resource1); repository.addAllAndCommit("3rd-commit"); repository.createBranch(MASTER, BRANCH_3); // Merge repository.mergeLogicalWithNewCommit(BRANCH_2); // No conflicts assertTrue(repository.status().getConflicting().isEmpty()); // The project are accessible. assertTrue(iProject.isAccessible()); assertTrue(iProject2.isAccessible()); // After the merge, the repository should contain all files from 2nd commit. assertTrue(iFile1.exists()); assertTrue(iFile2.exists()); assertTrue(iFile22.exists()); assertTrue(file2.exists()); assertTrue(file22.exists()); // Check the contents resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); resource2 = resourceSet.getResource(URI.createPlatformResourceURI(iFile2.getFullPath().toString(), true), true); root = (EPackage) resource1.getContents().get(0); assertEquals("parent", root.getName()); c1 = (EClass) root.getEClassifiers().get(0); assertEquals("C1", c1.getName()); att1 = c1.getEAttributes().get(0); assertEquals("attribute1", att1.getName()); root2 = (EPackage) resource2.getContents().get(0); assertEquals("parent2", root2.getName()); c2 = (EClass) root2.getEClassifiers().get(0); assertEquals("C2", c2.getName()); assertEquals(c2, c1.getESuperTypes().get(0)); testProject1.dispose(); testProject2.dispose(); } /** * Merge of a new remote project that contains a new fragment of a model. The projects are NOT at the root * of the git repository. The controlled model is NOT at the root of its project. * * @throws Exception */ @Test public void testCollaborativeModeling_UseCase004_MergeFragmentFromRemoteProject_NotAtRepoRoot() throws Exception { ResourceSetImpl resourceSet = new ResourceSetImpl(); File workingDirectory = repository.getRepository().getWorkTree(); TestProject testProject1 = new TestProject("Project1", workingDirectory.getAbsolutePath() + "/a/b/c/d/e/f/g/"); IProject iProject = testProject1.getProject(); repository.connect(iProject); File file1 = testProject1.getOrCreateFile(iProject, "folder1/folder2/folder3/file1.ecore"); IFile iFile1 = testProject1.getIFile(iProject, file1); Resource resource1 = connectResource(iFile1, resourceSet); // 1st commit: // One project at the root of the git repository // One model with a root package containing another package. // The model is at the root of the project. EPackage root = createPackage(null, "parent"); EPackage child = createPackage(root, "child"); createClass(child, "C1"); resource1.getContents().add(root); save(resource1); repository.addAllAndCommit("1st-commit"); repository.createBranch(MASTER, BRANCH_1); TestProject testProject2 = new TestProject("Project2", workingDirectory.getAbsolutePath() + "/h/i/j/"); IProject iProject2 = testProject2.getProject(); repository.connect(iProject2); File file2 = testProject2.getOrCreateFile(iProject2, "folder1/folder2/folder3/folder4/file2.ecore"); IFile iFile2 = testProject2.getIFile(iProject2, file2); File file22 = testProject2.getOrCreateFile(iProject2, "folder1/folder2/file22.txt"); IFile iFile22 = testProject2.getIFile(iProject2, file22); Resource resource2 = connectResource(iFile2, resourceSet); // 2nd commit: // Control the sub-package in a new project at the root of the git repository. // The controlled model is at the root of its project. // Also add a simple file in this new project. resource2.getContents().add(child); resource1.getContents().clear(); resource1.getContents().add(root); save(resource2); save(resource1); repository.addAllAndCommit("2nd-commit"); repository.createBranch(MASTER, BRANCH_2); // Back to 1st commit repository.reset(BRANCH_1, ResetType.HARD); // 3rd commit: // Change the name of the sub-package. resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createFileURI(file1.getAbsolutePath()), true); root = (EPackage) resource1.getContents().get(0); child = root.getESubpackages().get(0); child.setName("newChild"); save(resource1); repository.addAllAndCommit("3rd-commit"); repository.createBranch(MASTER, BRANCH_3); // Merge repository.mergeLogicalWithNewCommit(BRANCH_2); // No conflicts assertTrue(repository.status().getConflicting().isEmpty()); // The project2 is not accessible. assertTrue(iProject.isAccessible()); assertFalse(iProject2.isAccessible()); // After the merge, the repository should contain all files from 2nd commit. assertTrue(iFile1.exists()); assertFalse(iFile2.exists()); assertFalse(iFile22.exists()); assertTrue(file2.exists()); assertTrue(file22.exists()); // Check the contents resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); resource2 = resourceSet.getResource(URI.createFileURI(file2.getAbsolutePath()), true); // The proxy of child element has the following form : "platform:/resource/..." // So we have to update the uri of the resource2 resource2.setURI(URI.createPlatformResourceURI(iFile2.getFullPath().toString(), true)); EcoreUtil.resolveAll(resourceSet); root = (EPackage) resource1.getContents().get(0); assertEquals("parent", root.getName()); // The sub-package must be "newChild" from the 3rd commit. child = root.getESubpackages().get(0); assertEquals("newChild", child.getName()); assertSame(resource2, ((InternalEObject) child).eDirectResource()); EClass testC1 = (EClass) child.getEClassifiers().get(0); assertEquals("C1", testC1.getName()); } /** * Merge of a new remote project that contains a new fragment of a model. The new remote project is * contained in another project. * * @throws Exception */ @Test public void testCollaborativeModeling_UseCase005_MergeFragmentFromRemoteProjectInsideAnotherProject() throws Exception { ResourceSetImpl resourceSet = new ResourceSetImpl(); File workingDirectory = repository.getRepository().getWorkTree(); TestProject testProject1 = new TestProject("Project1", workingDirectory.getAbsolutePath()); IProject iProject = testProject1.getProject(); repository.connect(iProject); File file1 = testProject1.getOrCreateFile(iProject, "file1.ecore"); IFile iFile1 = testProject1.getIFile(iProject, file1); Resource resource1 = connectResource(iFile1, resourceSet); // 1st commit: // One project at the root of the git repository // One model with a root package containing another package. // The model is at the root of the project. EPackage root = createPackage(null, "parent"); EPackage child = createPackage(root, "child"); createClass(child, "C1"); resource1.getContents().add(root); save(resource1); repository.addAllAndCommit("1st-commit"); repository.createBranch(MASTER, BRANCH_1); TestProject testProject2 = new TestProject("Project2", workingDirectory.getAbsolutePath() + "/Project1/a/"); IProject iProject2 = testProject2.getProject(); repository.connect(iProject2); File file2 = testProject2.getOrCreateFile(iProject2, "file2.ecore"); IFile iFile2 = testProject2.getIFile(iProject2, file2); File file22 = testProject2.getOrCreateFile(iProject2, "folder1/folder2/file22.txt"); IFile iFile22 = testProject2.getIFile(iProject2, file22); Resource resource2 = connectResource(iFile2, resourceSet); // 2nd commit: // Control the sub-package in a new project at the root of the git repository. // The controlled model is at the root of its project. // Also add a simple file in this new project. resource2.getContents().add(child); resource1.getContents().clear(); resource1.getContents().add(root); save(resource2); save(resource1); repository.addAllAndCommit("2nd-commit"); repository.createBranch(MASTER, BRANCH_2); // Back to 1st commit repository.reset(BRANCH_1, ResetType.HARD); // 3rd commit: // Change the name of the sub-package. resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createFileURI(file1.getAbsolutePath()), true); root = (EPackage) resource1.getContents().get(0); child = root.getESubpackages().get(0); child.setName("newChild"); save(resource1); repository.addAllAndCommit("3rd-commit"); repository.createBranch(MASTER, BRANCH_3); // Merge repository.mergeLogicalWithNewCommit(BRANCH_2); // No conflicts assertTrue(repository.status().getConflicting().isEmpty()); // The project2 is not accessible. assertTrue(iProject.isAccessible()); assertFalse(iProject2.isAccessible()); // After the merge, the repository should contain all files from 2nd commit. assertTrue(iFile1.exists()); assertFalse(iFile2.exists()); assertFalse(iFile22.exists()); assertTrue(file2.exists()); assertTrue(file22.exists()); // Check the contents resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); resource2 = resourceSet.getResource(URI.createFileURI(file2.getAbsolutePath()), true); // The proxy of child element has the following form : "platform:/resource/..." // So we have to update the uri of the resource2 resource2.setURI(URI.createPlatformResourceURI(iFile2.getFullPath().toString(), true)); EcoreUtil.resolveAll(resourceSet); root = (EPackage) resource1.getContents().get(0); assertEquals("parent", root.getName()); // The sub-package must be "newChild" from the 3rd commit. child = root.getESubpackages().get(0); assertEquals("newChild", child.getName()); assertSame(resource2, ((InternalEObject) child).eDirectResource()); EClass testC1 = (EClass) child.getEClassifiers().get(0); assertEquals("C1", testC1.getName()); } /** * Merge of a new remote project that contains two new fragments of a model. The projects are at the root * of the git repository. The controlled models (fragments) are at the root of their project. The first * fragment doesn't reference the second fragment. * * @throws Exception */ @Test public void testCollaborativeModeling_UseCase006_MergeMultipleIndependentFragmentsFromRemoteProject() throws Exception { ResourceSetImpl resourceSet = new ResourceSetImpl(); File workingDirectory = repository.getRepository().getWorkTree(); TestProject testProject1 = new TestProject("Project1", workingDirectory.getAbsolutePath()); IProject iProject = testProject1.getProject(); repository.connect(iProject); File file1 = testProject1.getOrCreateFile(iProject, "file1.ecore"); IFile iFile1 = testProject1.getIFile(iProject, file1); Resource resource1 = connectResource(iFile1, resourceSet); // 1st commit: // One project at the root of the git repository // One model with a root package containing another package. // The model is at the root of the project. EPackage root = createPackage(null, "parent"); EPackage child1 = createPackage(root, "child1"); createClass(child1, "C1"); EPackage child2 = createPackage(root, "child2"); createClass(child2, "C2"); resource1.getContents().add(root); save(resource1); repository.addAllAndCommit("1st-commit"); repository.createBranch(MASTER, BRANCH_1); TestProject testProject2 = new TestProject("Project2", workingDirectory.getAbsolutePath()); IProject iProject2 = testProject2.getProject(); repository.connect(iProject2); File file2 = testProject2.getOrCreateFile(iProject2, "file2.ecore"); IFile iFile2 = testProject2.getIFile(iProject2, file2); File file3 = testProject2.getOrCreateFile(iProject2, "file3.ecore"); IFile iFile3 = testProject2.getIFile(iProject2, file3); File file22 = testProject2.getOrCreateFile(iProject2, "file22.txt"); IFile iFile22 = testProject2.getIFile(iProject2, file22); Resource resource2 = connectResource(iFile2, resourceSet); Resource resource3 = connectResource(iFile3, resourceSet); // 2nd commit: // Control the sub-packages in a new project at the root of the git repository. // The controlled models are at the root of its project. // Also add a simple file in this new project. resource2.getContents().add(child1); resource3.getContents().add(child2); resource1.getContents().clear(); resource1.getContents().add(root); save(resource3); save(resource2); save(resource1); repository.addAllAndCommit("2nd-commit"); repository.createBranch(MASTER, BRANCH_2); // Back to 1st commit repository.reset(BRANCH_1, ResetType.HARD); // 3rd commit: // Change the name of the sub-packages. resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); root = (EPackage) resource1.getContents().get(0); child1 = root.getESubpackages().get(0); child1.setName("newChild1"); child2 = root.getESubpackages().get(1); child2.setName("newChild2"); save(resource1); repository.addAllAndCommit("3rd-commit"); repository.createBranch(MASTER, BRANCH_3); // Merge repository.mergeLogicalWithNewCommit(BRANCH_2); // No conflicts assertTrue(repository.status().getConflicting().isEmpty()); // The project2 is not accessible. assertTrue(iProject.isAccessible()); assertFalse(iProject2.isAccessible()); // After the merge, the repository should contain all files from 2nd commit. assertTrue(iFile1.exists()); assertFalse(iFile2.exists()); assertFalse(iFile3.exists()); assertFalse(iFile22.exists()); assertTrue(file2.exists()); assertTrue(file3.exists()); assertTrue(file22.exists()); // Check the contents resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); resource2 = resourceSet.getResource(URI.createFileURI(file2.getAbsolutePath()), true); resource3 = resourceSet.getResource(URI.createFileURI(file3.getAbsolutePath()), true); // The proxy of child element has the following form : "platform:/resource/..." // So we have to update the uri of the resource2 resource2.setURI(URI.createPlatformResourceURI(iFile2.getFullPath().toString(), true)); resource3.setURI(URI.createPlatformResourceURI(iFile3.getFullPath().toString(), true)); EcoreUtil.resolveAll(resourceSet); root = (EPackage) resource1.getContents().get(0); assertEquals("parent", root.getName()); // The first sub-package must be "newChild1" from the 3rd commit. child1 = root.getESubpackages().get(0); assertEquals("newChild1", child1.getName()); assertSame(resource2, ((InternalEObject) child1).eDirectResource()); EClass testC1 = (EClass) child1.getEClassifiers().get(0); assertEquals("C1", testC1.getName()); // The second sub-package must be "newChild2" from the 3rd commit. child2 = root.getESubpackages().get(1); assertEquals("newChild2", child2.getName()); assertSame(resource3, ((InternalEObject) child2).eDirectResource()); EClass testC2 = (EClass) child2.getEClassifiers().get(0); assertEquals("C2", testC2.getName()); testProject1.dispose(); testProject2.dispose(); } /** * Merge of a new remote project that contains two new fragments of a model. The projects are at the root * of the git repository. The controlled models (fragments) are at the root of their project. The first * fragment reference the second fragment. * * @throws Exception */ @Test public void testCollaborativeModeling_UseCase007_MergeMultipleDependentFragmentsFromRemoteProject() throws Exception { ResourceSetImpl resourceSet = new ResourceSetImpl(); File workingDirectory = repository.getRepository().getWorkTree(); TestProject testProject1 = new TestProject("Project1", workingDirectory.getAbsolutePath()); IProject iProject = testProject1.getProject(); repository.connect(iProject); File file1 = testProject1.getOrCreateFile(iProject, "file1.ecore"); IFile iFile1 = testProject1.getIFile(iProject, file1); Resource resource1 = connectResource(iFile1, resourceSet); // 1st commit: // One project at the root of the git repository // One model with a root package containing another package. // The model is at the root of the project. EPackage root = createPackage(null, "parent"); EPackage child1 = createPackage(root, "child1"); createClass(child1, "C1"); EPackage child2 = createPackage(child1, "child1"); createClass(child2, "C2"); resource1.getContents().add(root); save(resource1); repository.addAllAndCommit("1st-commit"); repository.createBranch(MASTER, BRANCH_1); TestProject testProject2 = new TestProject("Project2", workingDirectory.getAbsolutePath()); IProject iProject2 = testProject2.getProject(); repository.connect(iProject2); File file2 = testProject2.getOrCreateFile(iProject2, "file2.ecore"); IFile iFile2 = testProject2.getIFile(iProject2, file2); File file3 = testProject2.getOrCreateFile(iProject2, "file3.ecore"); IFile iFile3 = testProject2.getIFile(iProject2, file3); File file22 = testProject2.getOrCreateFile(iProject2, "file22.txt"); IFile iFile22 = testProject2.getIFile(iProject2, file22); Resource resource2 = connectResource(iFile2, resourceSet); Resource resource3 = connectResource(iFile3, resourceSet); // 2nd commit: // Control the sub-packages in a new project at the root of the git repository. // The controlled models are at the root of its project. // Also add a simple file in this new project. resource3.getContents().add(child2); resource2.getContents().add(child1); resource1.getContents().clear(); resource1.getContents().add(root); save(resource3); save(resource2); save(resource1); repository.addAllAndCommit("2nd-commit"); repository.createBranch(MASTER, BRANCH_2); // Back to 1st commit repository.reset(BRANCH_1, ResetType.HARD); // 3rd commit: // Change the name of the sub-packages. resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); root = (EPackage) resource1.getContents().get(0); child1 = root.getESubpackages().get(0); child1.setName("newChild1"); child2 = child1.getESubpackages().get(0); child2.setName("newChild2"); save(resource1); repository.addAllAndCommit("3rd-commit"); repository.createBranch(MASTER, BRANCH_3); // Merge repository.mergeLogicalWithNewCommit(BRANCH_2); // No conflicts assertTrue(repository.status().getConflicting().isEmpty()); // The project2 is not accessible. assertTrue(iProject.isAccessible()); assertFalse(iProject2.isAccessible()); // After the merge, the repository should contain all files from 2nd commit. assertTrue(iFile1.exists()); assertFalse(iFile2.exists()); assertFalse(iFile3.exists()); assertFalse(iFile22.exists()); assertTrue(file2.exists()); assertTrue(file3.exists()); assertTrue(file22.exists()); // Check the contents resourceSet.getResources().clear(); resource3 = resourceSet.getResource(URI.createFileURI(file3.getAbsolutePath()), true); resource2 = resourceSet.getResource(URI.createFileURI(file2.getAbsolutePath()), true); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); // The proxy of child element has the following form : "platform:/resource/..." // So we have to update the uri of the resource2 resource2.setURI(URI.createPlatformResourceURI(iFile2.getFullPath().toString(), true)); EcoreUtil.resolveAll(resourceSet); root = (EPackage) resource1.getContents().get(0); assertEquals("parent", root.getName()); // The sub-package of root must be "newChild1" from the 3rd commit. child1 = root.getESubpackages().get(0); assertEquals("newChild1", child1.getName()); assertSame(resource2, ((InternalEObject) child1).eDirectResource()); EClass testC1 = (EClass) child1.getEClassifiers().get(0); assertEquals("C1", testC1.getName()); // The sub-package of child1 must be "newChild2" from the 3rd commit. child2 = child1.getESubpackages().get(0); assertEquals("newChild2", child2.getName()); assertSame(resource3, ((InternalEObject) child2).eDirectResource()); EClass testC2 = (EClass) child2.getEClassifiers().get(0); assertEquals("C2", testC2.getName()); testProject1.dispose(); testProject2.dispose(); } /** * Merge a new fragment of a model in the same project. The project is at the root of the git repository. * The controlled model is at the root of its project. * * @throws Exception */ @Test public void testCollaborativeModeling_UseCase008_MergeFragmentFromSameProject() throws Exception { ResourceSetImpl resourceSet = new ResourceSetImpl(); File workingDirectory = repository.getRepository().getWorkTree(); TestProject testProject1 = new TestProject("Project1", workingDirectory.getAbsolutePath()); IProject iProject = testProject1.getProject(); repository.connect(iProject); File file1 = testProject1.getOrCreateFile(iProject, "file1.ecore"); IFile iFile1 = testProject1.getIFile(iProject, file1); Resource resource1 = connectResource(iFile1, resourceSet); // 1st commit: // One project at the root of the git repository // One model with a root package containing another package. // The model is at the root of the project. EPackage root = createPackage(null, "parent"); EPackage child = createPackage(root, "child"); createClass(child, "C1"); resource1.getContents().add(root); save(resource1); repository.addAllAndCommit("1st-commit"); repository.createBranch(MASTER, BRANCH_1); File file2 = testProject1.getOrCreateFile(iProject, "file2.ecore"); IFile iFile2 = testProject1.getIFile(iProject, file2); File file22 = testProject1.getOrCreateFile(iProject, "file22.txt"); IFile iFile22 = testProject1.getIFile(iProject, file22); Resource resource2 = connectResource(iFile2, resourceSet); // 2nd commit: // Control the sub-package in a the same project. // The controlled model is at the root of its project. // Also add a simple file in this new project. resource2.getContents().add(child); resource1.getContents().clear(); resource1.getContents().add(root); save(resource2); save(resource1); repository.addAllAndCommit("2nd-commit"); repository.createBranch(MASTER, BRANCH_2); // Back to 1st commit repository.reset(BRANCH_1, ResetType.HARD); // 3rd commit: // Change the name of the sub-package. resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); root = (EPackage) resource1.getContents().get(0); child = root.getESubpackages().get(0); child.setName("newChild"); save(resource1); repository.addAllAndCommit("3rd-commit"); repository.createBranch(MASTER, BRANCH_3); // Merge repository.mergeLogicalWithNewCommit(BRANCH_2); // No conflicts assertTrue(repository.status().getConflicting().isEmpty()); // The project is accessible. assertTrue(iProject.isAccessible()); // After the merge, the repository should contain all files from 2nd commit. assertTrue(iFile1.exists()); assertTrue(iFile2.exists()); assertTrue(iFile22.exists()); // Check the contents resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); resource2 = resourceSet.getResource(URI.createFileURI(file2.getAbsolutePath()), true); // The proxy of child element has the following form : "platform:/resource/..." // So we have to update the uri of the resource2 resource2.setURI(URI.createPlatformResourceURI(iFile2.getFullPath().toString(), true)); EcoreUtil.resolveAll(resourceSet); root = (EPackage) resource1.getContents().get(0); assertEquals("parent", root.getName()); // The sub-package must be "newChild" from the 3rd commit. child = root.getESubpackages().get(0); assertEquals("newChild", child.getName()); assertSame(resource2, ((InternalEObject) child).eDirectResource()); EClass testC1 = (EClass) child.getEClassifiers().get(0); assertEquals("C1", testC1.getName()); testProject1.dispose(); } /** * Merge of a new remote project that contains a new fragment of a model. The projects are at the root of * the git repository. The controlled model is at the root of its project. * * @throws Exception */ @Test public void testCollaborativeModeling_UseCase009_MergeFragmentFromLocalProject() throws Exception { ResourceSetImpl resourceSet = new ResourceSetImpl(); File workingDirectory = repository.getRepository().getWorkTree(); TestProject testProject1 = new TestProject("Project1", workingDirectory.getAbsolutePath()); IProject iProject = testProject1.getProject(); repository.connect(iProject); File file1 = testProject1.getOrCreateFile(iProject, "file1.ecore"); IFile iFile1 = testProject1.getIFile(iProject, file1); Resource resource1 = connectResource(iFile1, resourceSet); // 1st commit: // One project at the root of the git repository // One model with a root package containing another package. // The model is at the root of the project. EPackage root = createPackage(null, "parent"); EPackage child = createPackage(root, "child"); createClass(child, "C1"); resource1.getContents().add(root); save(resource1); repository.addAllAndCommit("1st-commit"); repository.createBranch(MASTER, BRANCH_1); // 2nd commit: // Change the name of the sub-package. child.setName("newChild"); save(resource1); repository.addAllAndCommit("2nd-commit"); repository.createBranch(MASTER, BRANCH_2); // Back to 1st commit repository.reset(BRANCH_1, ResetType.HARD); resourceSet.getResources().clear(); TestProject testProject2 = new TestProject("Project2", workingDirectory.getAbsolutePath()); IProject iProject2 = testProject2.getProject(); repository.connect(iProject2); File file2 = testProject2.getOrCreateFile(iProject2, "file2.ecore"); IFile iFile2 = testProject2.getIFile(iProject2, file2); File file22 = testProject2.getOrCreateFile(iProject2, "file22.txt"); IFile iFile22 = testProject2.getIFile(iProject2, file22); Resource resource2 = connectResource(iFile2, resourceSet); // 3rd commit: // Control the sub-package in a new project at the root of the git repository. // The controlled model is at the root of its project. // Also add a simple file in this new project. child.setName("child"); resource2.getContents().add(child); save(resource2); save(resource1); repository.addAllAndCommit("3rd-commit"); repository.createBranch(MASTER, BRANCH_3); // Merge repository.mergeLogicalWithNewCommit(BRANCH_2); // No conflicts assertTrue(repository.status().getConflicting().isEmpty()); // The project2 is accessible. assertTrue(iProject.isAccessible()); assertTrue(iProject2.isAccessible()); // After the merge, the repository should contain all files from 2nd commit. assertTrue(iFile1.exists()); assertTrue(iFile2.exists()); assertTrue(iFile22.exists()); // Check the contents resourceSet.getResources().clear(); resource1 = resourceSet.getResource(URI.createPlatformResourceURI(iFile1.getFullPath().toString(), true), true); resource2 = resourceSet.getResource(URI.createPlatformResourceURI(iFile2.getFullPath().toString(), true), true); // The proxy of child element has the following form : "platform:/resource/..." // So we have to update the uri of the resource2 // resource2.setURI(URI.createPlatformResourceURI(iFile2.getFullPath().toString(), true)); EcoreUtil.resolveAll(resourceSet); root = (EPackage) resource1.getContents().get(0); assertEquals("parent", root.getName()); // The sub-package must be "newChild" from the 3rd commit. child = root.getESubpackages().get(0); assertEquals("newChild", child.getName()); assertSame(resource2, ((InternalEObject) child).eDirectResource()); EClass testC1 = (EClass) child.getEClassifiers().get(0); assertEquals("C1", testC1.getName()); testProject1.dispose(); testProject2.dispose(); } }