blob: c2256cc982c213e05b8500a8854184039c2a7937 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2008-2013 See4sys, itemis and others.
* 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:
* See4sys - Initial API and implementation
* itemis - [400897] ExtendedResourceAdapter's approach of reflectively clearing all EObject fields when performing memory-optimized unloads bears the risk of leaving some EObjects leaked
* itemis - Fixed EObjectUtilTest that was failing since server infrastructure upgrade at Eclipse Foundation
* itemis - [423676] AbstractIntegrationTestCase unable to remove project references that are no longer needed
*
* </copyright>
*/
package org.eclipse.sphinx.tests.emf.integration.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.sphinx.emf.util.EObjectUtil;
import org.eclipse.sphinx.emf.util.EcoreResourceUtil;
import org.eclipse.sphinx.emf.util.WorkspaceTransactionUtil;
import org.eclipse.sphinx.examples.hummingbird20.instancemodel.Application;
import org.eclipse.sphinx.examples.hummingbird20.instancemodel.Component;
import org.eclipse.sphinx.examples.hummingbird20.typemodel.ComponentType;
import org.eclipse.sphinx.examples.hummingbird20.typemodel.Platform;
import org.eclipse.sphinx.examples.hummingbird20.typemodel.Port;
import org.eclipse.sphinx.testutils.integration.referenceworkspace.DefaultIntegrationTestCase;
import org.eclipse.sphinx.testutils.integration.referenceworkspace.DefaultTestReferenceWorkspace;
@SuppressWarnings("nls")
public class EObjectUtilTest2 extends DefaultIntegrationTestCase {
private ComponentType componentType20A_2_1;
private ComponentType componentType20A_2_2;
private Port port20A_2_1;
private Port port20A_2_2;
private Component component20A_3_1;
private Component component20A_3_2;
private Component component21A_4_1;
private ComponentType componentType20D_2_1;
private ComponentType componentType20D_2_2;
private Port port20D_2_1;
private Port port20D_2_2;
private Component component20D_3_1;
private Component component20E_1_1;
public EObjectUtilTest2() {
setRecycleReferenceWorkspaceOfPreviousTestRun(false);
// Set subset of projects to load
Set<String> projectsToLoad = getProjectSubsetToLoad();
projectsToLoad.add(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_10_A);
projectsToLoad.add(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_A);
projectsToLoad.add(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_B);
projectsToLoad.add(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_C);
projectsToLoad.add(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_D);
projectsToLoad.add(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_E);
// Remove all project references except:
// HB_PROJECT_NAME_20_E -> HB_PROJECT_NAME_20_D
Map<String, Set<String>> projectReferences = getProjectReferences();
projectReferences.remove(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_10_E);
projectReferences.remove(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_D);
}
@Override
protected void setUp() throws Exception {
super.setUp();
Resource resource20A_2 = refWks.editingDomain20.getResourceSet().getResource(
URI.createPlatformResourceURI(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_A + "/"
+ DefaultTestReferenceWorkspace.HB_FILE_NAME_20_20A_2, true), false);
assertNotNull(resource20A_2);
assertFalse(resource20A_2.getContents().isEmpty());
assertEquals(1, resource20A_2.getContents().size());
Platform platform20A_2 = (Platform) resource20A_2.getContents().get(0);
assertNotNull(platform20A_2);
assertEquals(2, platform20A_2.getComponentTypes().size());
assertEquals(2, platform20A_2.getInterfaces().size());
componentType20A_2_1 = platform20A_2.getComponentTypes().get(0);
assertFalse(componentType20A_2_1.getPorts().isEmpty());
port20A_2_1 = componentType20A_2_1.getPorts().get(0);
port20A_2_2 = componentType20A_2_1.getPorts().get(1);
componentType20A_2_2 = platform20A_2.getComponentTypes().get(1);
// ---------------------------------
Resource resource20_3 = refWks.editingDomain20.getResourceSet().getResource(
URI.createPlatformResourceURI(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_A + "/"
+ DefaultTestReferenceWorkspace.HB_FILE_NAME_20_20A_3, true), false);
assertNotNull(resource20_3);
assertFalse(resource20_3.getContents().isEmpty());
assertEquals(1, resource20_3.getContents().size());
Application application_20A_3 = (Application) resource20_3.getContents().get(0);
assertNotNull(application_20A_3);
assertEquals(2, application_20A_3.getComponents().size());
component20A_3_1 = application_20A_3.getComponents().get(0);
component20A_3_2 = application_20A_3.getComponents().get(1);
// ---------------------------------
Resource resource21A_4 = refWks.editingDomain20.getResourceSet().getResource(
URI.createPlatformResourceURI(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_A + "/"
+ DefaultTestReferenceWorkspace.HB_FILE_NAME_21_20A_4, true), false);
assertNotNull(resource21A_4);
assertFalse(resource21A_4.getContents().isEmpty());
assertEquals(1, resource21A_4.getContents().size());
Application application_21A_4 = (Application) resource21A_4.getContents().get(0);
assertNotNull(application_21A_4);
assertEquals(2, application_21A_4.getComponents().size());
component21A_4_1 = application_21A_4.getComponents().get(0);
// ---------------------------------
// hbfile20D_2
Resource resource20D_2 = refWks.editingDomain20.getResourceSet().getResource(
URI.createPlatformResourceURI(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_D + "/"
+ DefaultTestReferenceWorkspace.HB_FILE_NAME_20_20D_2, true), false);
assertNotNull(resource20D_2);
assertFalse(resource20D_2.getContents().isEmpty());
assertEquals(1, resource20D_2.getContents().size());
Platform platform20D_2 = (Platform) resource20D_2.getContents().get(0);
assertNotNull(platform20D_2);
assertEquals(2, platform20D_2.getComponentTypes().size());
componentType20D_2_1 = platform20D_2.getComponentTypes().get(0);
assertFalse(componentType20D_2_1.getPorts().isEmpty());
port20D_2_1 = componentType20D_2_1.getPorts().get(0);
port20D_2_2 = componentType20D_2_1.getPorts().get(1);
componentType20D_2_2 = platform20D_2.getComponentTypes().get(1);
// -----------------
// hbfile20D_3
Resource resource20D_3 = refWks.editingDomain20.getResourceSet().getResource(
URI.createPlatformResourceURI(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_D + "/"
+ DefaultTestReferenceWorkspace.HB_FILE_NAME_20_20D_3, true), false);
assertNotNull(resource20D_3);
assertFalse(resource20D_3.getContents().isEmpty());
assertEquals(1, resource20D_3.getContents().size());
Application application_20D_3 = (Application) resource20D_3.getContents().get(0);
assertNotNull(application_20D_3);
assertEquals(2, application_20D_3.getComponents().size());
component20D_3_1 = application_20D_3.getComponents().get(0);
// ----------------------
// hbfile20E_1
Resource resource20E_1 = refWks.editingDomain20.getResourceSet().getResource(
URI.createPlatformResourceURI(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_E + "/"
+ DefaultTestReferenceWorkspace.HB_FILE_NAME_20_20E_1, true), false);
assertNotNull(resource20E_1);
assertFalse(resource20E_1.getContents().isEmpty());
assertEquals(1, resource20E_1.getContents().size());
Application application_20E_1 = (Application) resource20E_1.getContents().get(0);
assertNotNull(application_20E_1);
assertEquals(2, application_20E_1.getComponents().size());
component20E_1_1 = application_20E_1.getComponents().get(0);
}
public void testGetInverseReferences_StandAloneProject() throws OperationCanceledException, ExecutionException {
Collection<EStructuralFeature.Setting> references;
references = EObjectUtil.getInverseReferences(componentType20A_2_1, true);
assertFalse(references.isEmpty());
List<EObject> objects = getEObjects(references);
assertEquals(5, objects.size());
assertTrue(objects.contains(componentType20A_2_1.eContainer()));
assertTrue(objects.contains(component21A_4_1));
assertTrue(objects.contains(component20A_3_1));
assertFalse(objects.contains(component20A_3_2));
assertTrue(objects.contains(port20A_2_1));
assertTrue(objects.contains(port20A_2_2));
assertFalse(objects.contains(component20D_3_1));
assertFalse(objects.contains(componentType20D_2_1));
assertFalse(objects.contains(componentType20D_2_2));
assertFalse(objects.contains(component20E_1_1));
assertFalse(objects.contains(port20D_2_2));
assertFalse(objects.contains(port20D_2_1));
assertFalse(objects.contains(componentType20A_2_2));
// ---------------------
references.clear();
references = EObjectUtil.getInverseReferences(port20A_2_1, true);
assertFalse(references.isEmpty());
objects = getEObjects(references);
assertTrue(objects.contains(componentType20A_2_1));
assertFalse(objects.contains(componentType20A_2_1.eContainer()));
assertFalse(objects.contains(componentType20A_2_2));
assertFalse(objects.contains(component21A_4_1));
assertFalse(objects.contains(component20A_3_1));
assertFalse(objects.contains(component20A_3_2));
assertFalse(objects.contains(port20A_2_1));
assertFalse(objects.contains(port20A_2_2));
}
public void testGetInverseReferences_ProjectWithReferences() throws OperationCanceledException, ExecutionException {
Collection<EStructuralFeature.Setting> references;
assertNotNull(EcoreUtil.getRootContainer(componentType20D_2_1));
assertNotNull(EcoreUtil.getRootContainer(componentType20D_2_1).eResource());
assertNotNull(EcoreUtil.getRootContainer(componentType20D_2_1).eResource().getResourceSet());
references = EObjectUtil.getInverseReferences(componentType20D_2_1, true);
assertFalse(references.isEmpty());
List<EObject> objects = getEObjects(references);
assertFalse(objects.contains(componentType20D_2_2));
assertFalse(objects.contains(component21A_4_1));
assertFalse(objects.contains(component20A_3_1));
assertFalse(objects.contains(port20A_2_1));
assertFalse(objects.contains(port20A_2_2));
EObject container = componentType20D_2_1.eContainer();
assertNotNull(container);
assertTrue(objects.contains(container));
assertTrue(objects.contains(component20D_3_1));
assertTrue(objects.contains(component20E_1_1));
assertTrue(objects.contains(port20D_2_2));
assertTrue(objects.contains(port20D_2_1));
assertEquals(5, objects.size());
}
public void testGetInverseReferences_Proxy() throws OperationCanceledException, ExecutionException {
Collection<EStructuralFeature.Setting> references;
// ==============================================
// Containment
Runnable runnable1 = new Runnable() {
@Override
public void run() {
EcoreUtil.delete(port20D_2_1);
}
};
WorkspaceTransactionUtil.executeInWriteTransaction(refWks.editingDomain20, runnable1, "remove componentType");
waitForModelLoading();
assertTrue(port20D_2_1.eIsProxy());
// deleted element was removed
// with resolved = false
references = EObjectUtil.getInverseReferences(componentType20D_2_1, true);
List<EObject> objects = getEObjects(references);
assertEquals(4, objects.size());
EObject container = componentType20D_2_1.eContainer();
assertNotNull(container);
assertTrue(objects.contains(container));
assertTrue(objects.contains(component20D_3_1));
assertTrue(objects.contains(component20E_1_1));
assertFalse(objects.contains(port20D_2_1));
assertTrue(objects.contains(port20D_2_2));
// with resolved = false
references = EObjectUtil.getInverseReferences(componentType20D_2_1, false);
objects = getEObjects(references);
assertTrue(objects.contains(component20D_3_1));
assertTrue(objects.contains(component20E_1_1));
assertFalse(objects.contains(port20D_2_1));
assertTrue(objects.contains(port20D_2_2));
// ==============================================
// References
Runnable runnable2 = new Runnable() {
@Override
public void run() {
EcoreUtil.delete(component20D_3_1);
EcoreUtil.delete(component20E_1_1);
}
};
WorkspaceTransactionUtil.executeInWriteTransaction(refWks.editingDomain20, runnable2, "remove component referecing to context object");
waitForModelLoading();
assertTrue(component20D_3_1.eIsProxy());
assertTrue(component20E_1_1.eIsProxy());
// with resolved = true
references.clear();
references = EObjectUtil.getInverseReferences(componentType20D_2_1, true);
objects = getEObjects(references);
assertEquals(4, objects.size());
assertTrue(objects.contains(container));
assertTrue(objects.contains(component20D_3_1));
assertTrue(objects.contains(component20E_1_1));
assertFalse(objects.contains(port20D_2_1));
assertTrue(objects.contains(port20D_2_2));
// with resolved = false
references.clear();
references = EObjectUtil.getInverseReferences(componentType20D_2_1, false);
objects = getEObjects(references);
assertEquals(4, objects.size());
assertTrue(objects.contains(container));
assertTrue(objects.contains(component20D_3_1));
assertTrue(objects.contains(component20E_1_1));
assertFalse(objects.contains(port20D_2_1));
assertTrue(objects.contains(port20D_2_2));
}
public void testGetInverseReferences_ResourceSetIsNull() throws OperationCanceledException, ExecutionException {
// -------------------------------------------
// Context Object is NULL
Collection<EStructuralFeature.Setting> references = EObjectUtil.getInverseReferences(null, true);
assertNotNull(references);
assertTrue(references.isEmpty());
// -------------------------------------------
// Resource is NOT NULL, but it does not belong to any ResourceSet
final Resource resource20D_2 = refWks.editingDomain20.getResourceSet().getResource(
URI.createPlatformResourceURI(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_D + "/"
+ DefaultTestReferenceWorkspace.HB_FILE_NAME_20_20D_2, true), false);
assertNotNull(resource20D_2);
assertFalse(resource20D_2.getContents().isEmpty());
final ResourceSet resourceSet = refWks.editingDomain20.getResourceSet();
final EObject modelRoot = componentType20D_2_1.eContainer();
assertNotNull(modelRoot);
Runnable runnable0 = new Runnable() {
@Override
public void run() {
resourceSet.getResources().remove(resource20D_2);
}
};
WorkspaceTransactionUtil.executeInWriteTransaction(refWks.editingDomain20, runnable0, "remove componentType");
waitForModelLoading();
assertNotNull(componentType20D_2_1.eResource());
assertNull(componentType20D_2_1.eResource().getResourceSet());
references = EObjectUtil.getInverseReferences(componentType20D_2_1, true);
List<EObject> objects = getEObjects(references);
assertEquals(3, objects.size());
assertFalse(objects.contains(componentType20D_2_2));
assertTrue(objects.contains(modelRoot));
assertTrue(objects.contains(port20D_2_2));
assertTrue(objects.contains(port20D_2_1));
assertFalse(objects.contains(component21A_4_1));
assertFalse(objects.contains(component20A_3_1));
assertFalse(objects.contains(port20A_2_1));
assertFalse(objects.contains(port20A_2_2));
assertFalse(objects.contains(component20D_3_1));
assertFalse(objects.contains(component20E_1_1));
assertFalse(objects.contains(componentType20D_2_2));
}
public void testGetInverseReferences_ModelRootIsNull() throws OperationCanceledException, ExecutionException {
Collection<EStructuralFeature.Setting> references;
Resource resource20D_2 = refWks.editingDomain20.getResourceSet().getResource(
URI.createPlatformResourceURI(DefaultTestReferenceWorkspace.HB_PROJECT_NAME_20_D + "/"
+ DefaultTestReferenceWorkspace.HB_FILE_NAME_20_20D_2, true), false);
assertNotNull(resource20D_2);
// Context Object is NOT NULL. But Model Root is NULL;
final EObject modelRoot = componentType20D_2_1.eContainer();
assertNotNull(modelRoot);
Runnable runnable2 = new Runnable() {
@Override
public void run() {
EcoreUtil.delete(componentType20D_2_1);
}
};
WorkspaceTransactionUtil.executeInWriteTransaction(refWks.editingDomain20, runnable2, "remove componentType");
waitForModelLoading();
references = EObjectUtil.getInverseReferences(componentType20D_2_1, true);
assertFalse(references.isEmpty());
List<EObject> objects = getEObjects(references);
assertEquals(2, objects.size());
assertFalse(objects.contains(componentType20D_2_2));
assertFalse(objects.contains(modelRoot));
assertTrue(objects.contains(port20D_2_2));
assertTrue(objects.contains(port20D_2_1));
assertFalse(objects.contains(component21A_4_1));
assertFalse(objects.contains(component20A_3_1));
assertFalse(objects.contains(port20A_2_1));
assertFalse(objects.contains(port20A_2_2));
assertFalse(objects.contains(component20D_3_1));
assertFalse(objects.contains(componentType20D_2_2));
assertFalse(objects.contains(component20E_1_1));
EcoreResourceUtil.unloadResource(resource20D_2);
}
public List<EObject> getEObjects(Collection<EStructuralFeature.Setting> settings) {
List<EObject> objects = new ArrayList<EObject>();
if (settings != null) {
for (Setting setting : settings) {
if (setting.getEObject() != null) {
objects.add(setting.getEObject());
}
}
}
return objects;
}
}