blob: ef8c0f3976cd349d22aeacdef577413d31cbb46e [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2008-2010 See4sys 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
*
* </copyright>
*/
package org.eclipse.sphinx.tests.emf.integration;
import java.util.Collection;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.sphinx.emf.internal.metamodel.IFileMetaModelDescriptorCache;
import org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor;
import org.eclipse.sphinx.emf.metamodel.MetaModelDescriptorRegistry;
import org.eclipse.sphinx.emf.model.ModelDescriptorRegistry;
import org.eclipse.sphinx.platform.util.ExtendedPlatform;
import org.eclipse.sphinx.platform.util.ReflectUtil;
import org.eclipse.sphinx.testutils.integration.referenceworkspace.DefaultIntegrationTestCase;
import org.eclipse.sphinx.testutils.integration.referenceworkspace.DefaultTestReferenceWorkspace;
@SuppressWarnings({ "nls", "restriction" })
public class ModelManagementTest extends DefaultIntegrationTestCase {
public void testCreateWorkspaceLoadModelsAndUnloadModelsDeleteResources() throws Exception {
int modelsCount = ModelDescriptorRegistry.INSTANCE.getModels(ResourcesPlugin.getWorkspace().getRoot()).size();
// All non dot files must be present in file meta-model descriptor cache
assertInFileMetaModelDescriptorCache(getAllModelFiles());
assertOldFileMetaModelDescriptorCacheSizeEquals(0);
// Unload all models from one project
synchronizedUnloadProject(refWks.hbProject20_A, false);
// All models of unloaded project must stay in place
assertWorkspaceModelsSizeEquals(modelsCount);
// Underlying files must still be present in file meta-model descriptor cache
assertInFileMetaModelDescriptorCache(getAllModelFiles());
assertOldFileMetaModelDescriptorCacheSizeEquals(0);
// Delete one file from one project
IFile hbProject20_AFile = refWks.hbProject20_A.getFile(DefaultTestReferenceWorkspace.HB_FILE_NAME_20_20A_1);
synchronizedDeleteFile(hbProject20_AFile);
// Deleted file must no longer exist
assertFalse(hbProject20_AFile.exists());
// No more models must have gone yet
assertWorkspaceModelsSizeEquals(modelsCount);
// Deleted file must have been removed from file meta-model descriptor cache
assertNotInFileMetaModelDescriptorCache(hbProject20_AFile);
assertOldFileMetaModelDescriptorCacheSizeEquals(0);
// Delete one project
modelsCount -= ModelDescriptorRegistry.INSTANCE.getModels(refWks.hbProject20_A).size();
synchronizedDeleteProject(refWks.hbProject20_A);
// Deleted project must no longer exist
assertFalse(refWks.hbProject20_A.exists());
// No more models must have gone yet
assertWorkspaceModelsSizeEquals(modelsCount);
// All files of deleted project must have been removed from file meta-model descriptor cache
assertNotInFileMetaModelDescriptorCache(ExtendedPlatform.getAllFiles(refWks.hbProject20_A, false));
assertOldFileMetaModelDescriptorCacheSizeEquals(0);
// Unload all models from all other projects
synchronizedUnloadAllProjects();
// All models should stay in place
assertWorkspaceModelsSizeEquals(modelsCount);
// Underlying files must still be present in file meta-model descriptor cache
assertInFileMetaModelDescriptorCache(getAllModelFiles());
assertOldFileMetaModelDescriptorCacheSizeEquals(0);
// Delete all other projects
synchronizedDeleteWorkspace();
// All models must have gone
assertWorkspaceModelsSizeEquals(0);
// All files must be removed from file meta-model descriptor cache
assertFileMetaModelDescriptorCacheSizeEquals(0);
}
public void testCreateWorkspaceLoadModelsAndDeleteResources() throws Exception {
int modelsCount = ModelDescriptorRegistry.INSTANCE.getModels(ResourcesPlugin.getWorkspace().getRoot()).size();
// All non dot files must be present in file meta-model descriptor cache
assertInFileMetaModelDescriptorCache(getAllModelFiles());
assertOldFileMetaModelDescriptorCacheSizeEquals(0);
// Delete one file from one project
IFile hbProject20_AFile = refWks.hbProject20_A.getFile(DefaultTestReferenceWorkspace.HB_FILE_NAME_20_20A_1);
synchronizedDeleteFile(hbProject20_AFile);
// Deleted file must no longer exist
assertFalse(hbProject20_AFile.exists());
// No models must have gone yet
assertWorkspaceModelsSizeEquals(modelsCount);
// Deleted file must have been removed from file meta-model descriptor cache
assertNotInFileMetaModelDescriptorCache(hbProject20_AFile);
assertOldFileMetaModelDescriptorCacheSizeEquals(0);
// Delete one project
modelsCount -= ModelDescriptorRegistry.INSTANCE.getModels(refWks.hbProject20_A).size();
synchronizedDeleteProject(refWks.hbProject20_A);
waitForModelLoading();
// Deleted project must no longer exist
assertFalse(refWks.hbProject20_A.exists());
// All models of deleted project must have gone
assertWorkspaceModelsSizeEquals(modelsCount);
// All files of deleted project must have been removed from file meta-model descriptor cache
assertNotInFileMetaModelDescriptorCache(ExtendedPlatform.getAllFiles(refWks.hbProject20_A, false));
assertOldFileMetaModelDescriptorCacheSizeEquals(0);
// Delete all other projects
synchronizedDeleteWorkspace();
// All models must have gone
assertWorkspaceModelsSizeEquals(0);
// All files must be removed from file meta-model descriptor cache
assertFileMetaModelDescriptorCacheSizeEquals(0);
}
public void testCreateWorkspaceLoadModelsAndCloseProjects() throws Exception {
int modelsCount = ModelDescriptorRegistry.INSTANCE.getModels(ResourcesPlugin.getWorkspace().getRoot()).size();
// Close projects referencing each other starting with outer most referencing project and going to inner most
// referenced project
modelsCount -= ModelDescriptorRegistry.INSTANCE.getModels(refWks.hbProject20_E).size();
modelsCount -= ModelDescriptorRegistry.INSTANCE.getModels(refWks.hbProject20_D).size();
modelsCount -= ModelDescriptorRegistry.INSTANCE.getModels(refWks.hbProject10_E).size();
modelsCount -= ModelDescriptorRegistry.INSTANCE.getModels(refWks.hbProject10_D).size();
synchronizedCloseProject(refWks.hbProject20_E);
synchronizedCloseProject(refWks.hbProject20_D);
synchronizedCloseProject(refWks.hbProject10_E);
synchronizedCloseProject(refWks.hbProject10_D);
Thread.sleep(1000);
// All models of closed projects must have gone
assertWorkspaceModelsSizeEquals(modelsCount);
}
public void testCreateWorkspaceLoadModelsAndDeleteProjects() throws Exception {
int modelsCount = ModelDescriptorRegistry.INSTANCE.getModels(ResourcesPlugin.getWorkspace().getRoot()).size();
// Close projects referencing each other starting with outer most referencing project and going to inner most
// referenced project
modelsCount -= ModelDescriptorRegistry.INSTANCE.getModels(refWks.hbProject20_E).size();
modelsCount -= ModelDescriptorRegistry.INSTANCE.getModels(refWks.hbProject20_D).size();
modelsCount -= ModelDescriptorRegistry.INSTANCE.getModels(refWks.hbProject10_E).size();
modelsCount -= ModelDescriptorRegistry.INSTANCE.getModels(refWks.hbProject10_D).size();
synchronizedDeleteProject(refWks.hbProject20_E);
synchronizedDeleteProject(refWks.hbProject20_D);
synchronizedDeleteProject(refWks.hbProject10_E);
synchronizedDeleteProject(refWks.hbProject10_D);
Thread.sleep(1000);
// All models of closed projects must have gone
assertWorkspaceModelsSizeEquals(modelsCount);
}
public void testCreateWorkspaceLoadModels() throws Exception {
// All non dot files must be present in file meta-model descriptor cache
assertInFileMetaModelDescriptorCache(getAllModelFiles());
assertOldFileMetaModelDescriptorCacheSizeEquals(0);
}
private static final String FIELD_NAME_META_MODEL_DESCRIPTOR_CACHE = "fFileMetaModelDescriptors";
private static final String FIELD_NAME_OLD_META_MODEL_DESCRIPTOR_CACHE = "fOldFileMetaModelDescriptors";
private void assertInFileMetaModelDescriptorCache(Collection<IFile> files) throws Exception {
for (IFile file : files) {
assertInFileMetaModelDescriptorCache(file);
}
}
private void assertInFileMetaModelDescriptorCache(IFile file) throws Exception {
IFileMetaModelDescriptorCache cache = (IFileMetaModelDescriptorCache) MetaModelDescriptorRegistry.INSTANCE
.getAdapter(IFileMetaModelDescriptorCache.class);
@SuppressWarnings("unchecked")
Map<IFile, IMetaModelDescriptor> fileMetaModelDescriptorCache = (Map<IFile, IMetaModelDescriptor>) ReflectUtil.getInvisibleFieldValue(cache,
FIELD_NAME_META_MODEL_DESCRIPTOR_CACHE);
assertTrue(file.getFullPath() + " not in file meta-model descriptor cache", fileMetaModelDescriptorCache.containsKey(file));
}
private void assertNotInFileMetaModelDescriptorCache(Collection<IFile> files) throws Exception {
for (IFile file : files) {
assertNotInFileMetaModelDescriptorCache(file);
}
}
private void assertNotInFileMetaModelDescriptorCache(IFile file) throws Exception {
IFileMetaModelDescriptorCache cache = (IFileMetaModelDescriptorCache) MetaModelDescriptorRegistry.INSTANCE
.getAdapter(IFileMetaModelDescriptorCache.class);
@SuppressWarnings("unchecked")
Map<IFile, IMetaModelDescriptor> fileMetaModelDescriptorCache = (Map<IFile, IMetaModelDescriptor>) ReflectUtil.getInvisibleFieldValue(cache,
FIELD_NAME_META_MODEL_DESCRIPTOR_CACHE);
assertFalse(file.getFullPath() + " in file meta-model descriptor cache", fileMetaModelDescriptorCache.containsKey(file));
}
private void assertFileMetaModelDescriptorCacheSizeEquals(int expected) throws Exception {
IFileMetaModelDescriptorCache cache = (IFileMetaModelDescriptorCache) MetaModelDescriptorRegistry.INSTANCE
.getAdapter(IFileMetaModelDescriptorCache.class);
@SuppressWarnings("unchecked")
Map<IFile, IMetaModelDescriptor> fileMetaModelDescriptorCache = (Map<IFile, IMetaModelDescriptor>) ReflectUtil.getInvisibleFieldValue(cache,
FIELD_NAME_META_MODEL_DESCRIPTOR_CACHE);
if (expected == 0 && fileMetaModelDescriptorCache.size() > 0) {
System.err.println("Unexpected cached file meta-model descriptors:");
synchronized (fileMetaModelDescriptorCache) {
for (IFile file : fileMetaModelDescriptorCache.keySet()) {
System.err.println(" " + file.getFullPath() + ": " + fileMetaModelDescriptorCache.get(file));
}
}
}
assertEquals(expected, fileMetaModelDescriptorCache.size());
}
private void assertOldFileMetaModelDescriptorCacheSizeEquals(int expected) throws Exception {
IFileMetaModelDescriptorCache cache = (IFileMetaModelDescriptorCache) MetaModelDescriptorRegistry.INSTANCE
.getAdapter(IFileMetaModelDescriptorCache.class);
@SuppressWarnings("unchecked")
Map<IFile, IMetaModelDescriptor> oldFileMetaModelDescriptorCache = (Map<IFile, IMetaModelDescriptor>) ReflectUtil.getInvisibleFieldValue(
cache, FIELD_NAME_OLD_META_MODEL_DESCRIPTOR_CACHE);
if (expected == 0 && oldFileMetaModelDescriptorCache.size() > 0) {
System.err.println("Unexpected cached old file meta-model descriptors:");
synchronized (oldFileMetaModelDescriptorCache) {
for (IFile file : oldFileMetaModelDescriptorCache.keySet()) {
System.err.println(" " + file.getFullPath() + ": " + oldFileMetaModelDescriptorCache.get(file));
}
}
}
assertEquals(expected, oldFileMetaModelDescriptorCache.size());
}
}