blob: 8220f63cd51100ff97d4d06728df5bb4ae29cf3e [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2008-2014 BMW Car IT, itemis, See4sys and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* Contributors:
* See4sys - Initial API and implementation
* BMW Car IT - [374883] Improve handling of out-of-sync workspace files during descriptor initialization
* itemis - [393021] ClassCastExceptions raised during loading model resources with Sphinx are ignored
* itemis - [409458] Enhance ScopingResourceSetImpl#getEObjectInScope() to enable cross-document references between model files with different metamodels
* itemis - [418005] Add support for model files with multiple root elements
* itemis - [409510] Enable resource scope-sensitive proxy resolutions without forcing metamodel implementations to subclass EObjectImpl
* itemis - [427461] Add progress monitor to resource load options (useful for loading large models)
* itemis - [454092] Loading model resources
* Siemens - [574930] Model load manager extension
*
* </copyright>
*/
package org.eclipse.sphinx.emf.workspace.loading;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.transaction.RunnableWithResult;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.osgi.util.NLS;
import org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor;
import org.eclipse.sphinx.emf.metamodel.MetaModelDescriptorRegistry;
import org.eclipse.sphinx.emf.model.IModelDescriptor;
import org.eclipse.sphinx.emf.scoping.ProjectResourceScope;
import org.eclipse.sphinx.emf.util.EcorePlatformUtil;
import org.eclipse.sphinx.emf.util.WorkspaceEditingDomainUtil;
import org.eclipse.sphinx.emf.workspace.Activator;
import org.eclipse.sphinx.emf.workspace.internal.loading.UnresolveUnreachableCrossProjectReferencesJob;
import org.eclipse.sphinx.emf.workspace.internal.loading.UpdateResourceURIJob;
import org.eclipse.sphinx.emf.workspace.internal.messages.Messages;
import org.eclipse.sphinx.emf.workspace.loading.operations.DefaultFileLoadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.DefaultFileReloadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.DefaultFileUnloadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.DefaultModelLoadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.DefaultModelUnloadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.DefaultProjectLoadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.DefaultProjectReloadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.DefaultUnresolveUnreachableCrossProjectReferencesOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.DefaultUpdateResourceURIOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.IFileLoadCommonOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.IFileLoadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.IFileReloadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.IFileUnloadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.ILoadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.IModelLoadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.IModelUnloadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.IProjectLoadCommonOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.IProjectLoadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.IProjectReloadOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.IUnresolveUnreachableCrossProjectReferencesOperation;
import org.eclipse.sphinx.emf.workspace.loading.operations.IUpdateResourceURIOperation;
import org.eclipse.sphinx.platform.util.ExtendedPlatform;
import org.eclipse.sphinx.platform.util.PlatformLogUtil;
/**
* Default implementation for the {@link IModelLoadManager} interface. It is recommended to use this class as a base
* class for ModelLoadManager extensions. This implementation also provides a possibility to override Default Model Load
* Operations by overriding their create method.
*/
public class DefaultModelLoadManager implements IModelLoadManager {
protected Map<TransactionalEditingDomain, Collection<Resource>> detectResourcesToUnload(final IProject project,
final boolean includeReferencedScopes, final IMetaModelDescriptor mmFilter, IProgressMonitor monitor) throws OperationCanceledException {
Assert.isNotNull(project);
// Investigate all editing domains for loaded resources which belong to given project (or one of its referenced
// projects if required)
/*
* !! Important Note !! For the sake of robustness, it is necessary to consider all editing domains but not only
* the those which would be returned by WorkspaceEditingDomainUtil#getEditingDomains(IContainer). Although not
* really intended by Sphinx workspace management it might anyway happen that wired kind of applications manage
* to populate editing domains with resources which don't belong to any IModelDescriptor. In this case,
* WorkspaceEditingDomainUtil#getEditingDomains(IContainer) is likely to return an incomplete set of editing
* domains for given project and we would have no chance to make sure that actually all resources from given
* project (and its referenced projects if required) get unloaded.
*/
Collection<TransactionalEditingDomain> editingDomains = WorkspaceEditingDomainUtil.getAllEditingDomains();
SubMonitor progress = SubMonitor.convert(monitor, editingDomains.size());
if (progress.isCanceled()) {
throw new OperationCanceledException();
}
Map<TransactionalEditingDomain, Collection<Resource>> resourcesToUnload = new HashMap<TransactionalEditingDomain, Collection<Resource>>();
for (final TransactionalEditingDomain editingDomain : editingDomains) {
try {
List<Resource> resourcesToUnloadInEditingDomain = TransactionUtil.runExclusive(editingDomain,
new RunnableWithResult.Impl<List<Resource>>() {
@Override
public void run() {
List<Resource> resources = new ArrayList<Resource>();
ProjectResourceScope projectResourceScope = new ProjectResourceScope(project);
for (Resource resource : editingDomain.getResourceSet().getResources()) {
if (projectResourceScope.belongsTo(resource, includeReferencedScopes)) {
if (mmFilter != null) {
IMetaModelDescriptor mmDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(resource);
if (mmDescriptor == null) {
mmDescriptor = MetaModelDescriptorRegistry.INSTANCE.getOldDescriptor(resource);
}
if (mmFilter.equals(mmDescriptor)) {
resources.add(resource);
}
} else {
resources.add(resource);
}
}
}
setResult(resources);
}
});
if (resourcesToUnloadInEditingDomain.size() > 0) {
resourcesToUnload.put(editingDomain, resourcesToUnloadInEditingDomain);
}
} catch (Exception ex) {
PlatformLogUtil.logAsError(Activator.getPlugin(), ex);
}
progress.worked(1);
if (progress.isCanceled()) {
throw new OperationCanceledException();
}
}
return resourcesToUnload;
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadWorkspace(boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadWorkspace(boolean async, IProgressMonitor monitor) {
loadAllProjects(null, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadAllProjects(org.eclipse.sphinx.emf.metamodel.
* IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadAllProjects(final IMetaModelDescriptor mmDescriptor, boolean async, IProgressMonitor monitor) {
// Collect root projects in workspace
Collection<IProject> projects = ExtendedPlatform.getRootProjects();
// No projects found?
if (projects.size() == 0) {
return;
}
// Load models from root projects including referenced projects
loadProjects(projects, true, mmDescriptor, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadProject(org.eclipse.core.resources.IProject,
* boolean, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadProject(IProject project, boolean includeReferencedProjects, boolean async, IProgressMonitor monitor) {
loadProjects(Collections.singleton(project), includeReferencedProjects, null, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadProject(org.eclipse.core.resources.IProject,
* boolean, org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadProject(IProject project, boolean includeReferencedProjects, IMetaModelDescriptor mmDescriptor, boolean async,
IProgressMonitor monitor) {
loadProjects(Collections.singleton(project), includeReferencedProjects, mmDescriptor, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadProjects(java.util.Collection, boolean,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadProjects(Collection<IProject> projects, boolean includeReferencedProjects, boolean async, IProgressMonitor monitor) {
loadProjects(projects, includeReferencedProjects, null, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadProjects(java.util.Collection, boolean,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadProjects(final Collection<IProject> projects, final boolean includeReferencedProjects, final IMetaModelDescriptor mmDescriptor,
boolean async, IProgressMonitor monitor) {
Assert.isNotNull(projects);
if (!projects.isEmpty()) {
IProjectLoadCommonOperation projectLoadOperation = createProjectLoadOperation(projects, includeReferencedProjects, mmDescriptor);
LoadOperationRunnerHelper.run(projectLoadOperation, async, monitor);
}
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadFile(org.eclipse.core.resources.IFile,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadFile(IFile file, boolean async, IProgressMonitor monitor) {
loadFiles(Collections.singleton(file), null, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadFile(org.eclipse.core.resources.IFile,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadFile(IFile file, IMetaModelDescriptor mmDescriptor, boolean async, IProgressMonitor monitor) {
loadFiles(Collections.singleton(file), mmDescriptor, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadFiles(java.util.Collection, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadFiles(Collection<IFile> files, boolean async, IProgressMonitor monitor) {
loadFiles(files, null, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadFiles(java.util.Collection,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadFiles(final Collection<IFile> files, final IMetaModelDescriptor mmDescriptor, boolean async, IProgressMonitor monitor) {
Assert.isNotNull(files);
if (!files.isEmpty()) {
IFileLoadCommonOperation fileLoadOperation = createFileLoadOperation(files, mmDescriptor);
LoadOperationRunnerHelper.run(fileLoadOperation, async, monitor);
}
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadURI(org.eclipse.emf.common.util.URI, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadURI(URI uri, boolean async, IProgressMonitor monitor) {
loadURIs(Collections.singleton(uri), null, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadURI(org.eclipse.emf.common.util.URI,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadURI(URI uri, IMetaModelDescriptor mmDescriptor, boolean async, IProgressMonitor monitor) {
loadURIs(Collections.singleton(uri), mmDescriptor, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadURIs(java.util.Collection, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadURIs(Collection<URI> uris, boolean async, IProgressMonitor monitor) {
loadURIs(uris, null, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadURIs(java.util.Collection,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadURIs(final Collection<URI> uris, final IMetaModelDescriptor mmDescriptor, boolean async, IProgressMonitor monitor) {
Assert.isNotNull(uris);
loadFiles(getFiles(uris), mmDescriptor, async, monitor);
}
/*
* @see
* org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadProject(org.eclipse.core.resources.IProject,
* boolean, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadProject(IProject project, boolean includeReferencedProjects, boolean async, IProgressMonitor monitor) {
unloadProjects(Collections.singleton(project), includeReferencedProjects, null, async, monitor);
}
/*
* @see
* org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadProject(org.eclipse.core.resources.IProject,
* boolean, org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadProject(IProject project, boolean includeReferencedProjects, IMetaModelDescriptor mmDescriptor, boolean async,
IProgressMonitor monitor) {
unloadProjects(Collections.singleton(project), includeReferencedProjects, mmDescriptor, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadProjects(java.util.Collection, boolean,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadProjects(Collection<IProject> projects, boolean includeReferencedProjects, boolean async, IProgressMonitor monitor) {
unloadProjects(projects, includeReferencedProjects, null, async, monitor);
}
/*
* @see
* org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadAllProjects(org.eclipse.sphinx.emf.metamodel.
* IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadAllProjects(final IMetaModelDescriptor mmDescriptor, boolean async, IProgressMonitor monitor) {
// Collect root projects in workspace
Collection<IProject> projects = ExtendedPlatform.getRootProjects();
// No projects found?
if (projects.size() == 0) {
return;
}
// Unload models from root projects including referenced projects
unloadProjects(projects, true, mmDescriptor, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadWorkspace(boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadWorkspace(boolean async, IProgressMonitor monitor) {
unloadAllProjects(null, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadProjects(java.util.Collection, boolean,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadProjects(Collection<IProject> projects, boolean includeReferencedProjects, IMetaModelDescriptor mmDescriptor, boolean async,
IProgressMonitor monitor) {
Assert.isNotNull(projects);
try {
for (IProject project : projects) {
String taskName = mmDescriptor != null ? NLS.bind(Messages.task_unloadingModelInProject, mmDescriptor.getName(), project.getName())
: NLS.bind(Messages.task_unloadingModelsInProject, project.getName());
SubMonitor progress = SubMonitor.convert(monitor, taskName, 100);
if (progress.isCanceled()) {
throw new OperationCanceledException();
}
unloadProjectResources(project, includeReferencedProjects, mmDescriptor, async, progress);
}
} catch (OperationCanceledException ex) {
// Ignore exception
}
}
protected void unloadProjectResources(IProject project, boolean includeReferencedProjects, IMetaModelDescriptor mmDescriptor, boolean async,
IProgressMonitor progress) throws OperationCanceledException {
// Detect files to unload in given project and its referenced projects
/*
* !! Important Note !! Perform this part always synchronously. Otherwise - when being called right before the
* project is closed or deleted - the affected files might no longer exist and couldn't be retrieved anymore by
* the time where an asynchronous job would be running.
*/
// FIXME Include referenced projects only if only the given project or its child projects but no other
// root projects reference them; add an appropriate method to ExtendedPlatform for that purpose
Map<TransactionalEditingDomain, Collection<Resource>> resourcesToUnload = detectResourcesToUnload(project, includeReferencedProjects,
mmDescriptor, SubMonitor.convert(progress).newChild(1));
// Unload resources; perform memory-optimized unloading if given project is a root project, i.e. is not
// referenced by any other project
unloadResources(resourcesToUnload, ExtendedPlatform.isRootProject(project), async, progress);
}
protected void unloadResources(final Map<TransactionalEditingDomain, Collection<Resource>> resourcesToUnload, boolean memoryOptimized,
boolean async, IProgressMonitor monitor) throws OperationCanceledException {
Assert.isNotNull(resourcesToUnload);
if (!resourcesToUnload.isEmpty()) {
SubMonitor unloadProgress = SubMonitor.convert(monitor).newChild(99);
ILoadOperation unloadModelResourceOperation = createModelUnloadOperation(resourcesToUnload, memoryOptimized);
LoadOperationRunnerHelper.run(unloadModelResourceOperation, async, unloadProgress);
} else {
monitor.done();
}
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadFile(org.eclipse.core.resources.IFile,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadFile(IFile file, boolean async, IProgressMonitor monitor) {
unloadFiles(Collections.singleton(file), null, false, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadFile(org.eclipse.core.resources.IFile,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadFile(IFile file, IMetaModelDescriptor mmDescriptor, boolean async, IProgressMonitor monitor) {
unloadFiles(Collections.singleton(file), mmDescriptor, false, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadFiles(java.util.Collection, boolean,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadFiles(Collection<IFile> files, boolean memoryOptimized, boolean async, IProgressMonitor monitor) {
unloadFiles(files, null, memoryOptimized, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadFiles(java.util.Collection,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadFiles(final Collection<IFile> files, final IMetaModelDescriptor mmDescriptor, final boolean memoryOptimized, boolean async,
IProgressMonitor monitor) {
Assert.isNotNull(files);
if (!files.isEmpty()) {
IFileLoadCommonOperation fileUnloadOperation = createFileUnloadOperation(files, mmDescriptor, memoryOptimized);
LoadOperationRunnerHelper.run(fileUnloadOperation, async, monitor);
}
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadURI(org.eclipse.emf.common.util.URI,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadURI(URI uri, boolean async, IProgressMonitor monitor) {
unloadURIs(Collections.singleton(uri), null, false, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadURI(org.eclipse.emf.common.util.URI,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadURI(URI uri, IMetaModelDescriptor mmDescriptor, boolean async, IProgressMonitor monitor) {
unloadURIs(Collections.singleton(uri), mmDescriptor, false, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadURIs(java.util.Collection, boolean,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadURIs(Collection<URI> uris, boolean memoryOptimized, boolean async, IProgressMonitor monitor) {
unloadURIs(uris, null, memoryOptimized, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadURIs(java.util.Collection,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadURIs(final Collection<URI> uris, final IMetaModelDescriptor mmDescriptor, final boolean memoryOptimized, boolean async,
IProgressMonitor monitor) {
Assert.isNotNull(uris);
unloadFiles(getFiles(uris), mmDescriptor, memoryOptimized, async, monitor);
}
/*
* @see
* org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadProject(org.eclipse.core.resources.IProject,
* boolean, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadProject(IProject project, boolean includeReferencedProjects, boolean async, IProgressMonitor monitor) {
reloadProjects(Collections.singleton(project), includeReferencedProjects, null, async, monitor);
}
/*
* @see
* org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadProject(org.eclipse.core.resources.IProject,
* boolean, org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadProject(IProject project, boolean includeReferencedProjects, IMetaModelDescriptor mmDescriptor, boolean async,
IProgressMonitor monitor) {
reloadProjects(Collections.singleton(project), includeReferencedProjects, mmDescriptor, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadProjects(java.util.Collection, boolean,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadProjects(Collection<IProject> projects, boolean includeReferencedProjects, boolean async, IProgressMonitor monitor) {
reloadProjects(projects, includeReferencedProjects, null, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadProjects(java.util.Collection, boolean,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadProjects(final Collection<IProject> projects, final boolean includeReferencedProjects, final IMetaModelDescriptor mmDescriptor,
boolean async, IProgressMonitor monitor) {
Assert.isNotNull(projects);
if (!projects.isEmpty()) {
IProjectLoadCommonOperation projectReloadOperation = createProjectReloadOperation(projects, includeReferencedProjects, mmDescriptor);
LoadOperationRunnerHelper.run(projectReloadOperation, async, monitor);
}
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadFile(org.eclipse.core.resources.IFile,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadFile(IFile file, boolean async, IProgressMonitor monitor) {
reloadFiles(Collections.singleton(file), null, false, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadFile(org.eclipse.core.resources.IFile,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadFile(IFile file, IMetaModelDescriptor mmDescriptor, boolean async, IProgressMonitor monitor) {
reloadFiles(Collections.singleton(file), mmDescriptor, false, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadFiles(java.util.Collection, boolean,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadFiles(Collection<IFile> files, boolean memoryOptimized, boolean async, IProgressMonitor monitor) {
reloadFiles(files, null, memoryOptimized, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadFiles(java.util.Collection,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadFiles(final Collection<IFile> files, final IMetaModelDescriptor mmDescriptor, final boolean memoryOptimized, boolean async,
IProgressMonitor monitor) {
Assert.isNotNull(files);
if (!files.isEmpty()) {
IFileLoadCommonOperation fileReloadOperation = createFileReloadOperation(files, mmDescriptor, memoryOptimized);
LoadOperationRunnerHelper.run(fileReloadOperation, async, monitor);
}
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadURI(org.eclipse.emf.common.util.URI,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadURI(URI uri, boolean async, IProgressMonitor monitor) {
reloadURIs(Collections.singleton(uri), null, false, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadURI(org.eclipse.emf.common.util.URI,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadURI(URI uri, IMetaModelDescriptor mmDescriptor, boolean async, IProgressMonitor monitor) {
reloadURIs(Collections.singleton(uri), mmDescriptor, false, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadURIs(java.util.Collection, boolean,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadURIs(Collection<URI> uris, boolean memoryOptimized, boolean async, IProgressMonitor monitor) {
reloadURIs(uris, null, memoryOptimized, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#reloadURIs(java.util.Collection,
* org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor, boolean, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void reloadURIs(final Collection<URI> uris, final IMetaModelDescriptor mmDescriptor, final boolean memoryOptimized, boolean async,
IProgressMonitor monitor) {
Assert.isNotNull(uris);
reloadFiles(getFiles(uris), mmDescriptor, memoryOptimized, async, monitor);
}
/*
* @see
* org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unresolveUnreachableCrossProjectReferences(java.util.
* Collection, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unresolveUnreachableCrossProjectReferences(final Collection<IProject> projects, boolean async, IProgressMonitor monitor) {
Assert.isNotNull(projects);
// Perform unresolving procedure in all given projects as well as in all projects that reference those
final HashSet<IProject> projectsWithUnreachableCrossRefrencesToUnresolve = new HashSet<IProject>(projects);
for (IProject project : projects) {
Collection<IProject> referencingProjects = ExtendedPlatform.getAllReferencingProjects(project);
projectsWithUnreachableCrossRefrencesToUnresolve.addAll(referencingProjects);
}
IUnresolveUnreachableCrossProjectReferencesOperation unresolveUnreachableCrossProjectReferencesOperation = createUnresolveUnreachableCrossProjectReferencesOperation(
projectsWithUnreachableCrossRefrencesToUnresolve);
if (async && projectsWithUnreachableCrossRefrencesToUnresolve.size() > 0) {
Job job = new UnresolveUnreachableCrossProjectReferencesJob(unresolveUnreachableCrossProjectReferencesOperation);
job.setPriority(Job.BUILD);
job.setRule(unresolveUnreachableCrossProjectReferencesOperation.getRule());
job.schedule();
} else {
try {
unresolveUnreachableCrossProjectReferencesOperation.run(monitor);
} catch (OperationCanceledException ex) {
// Ignore exception
} catch (CoreException ex) {
PlatformLogUtil.logAsError(Activator.getPlugin(), ex);
}
}
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadModel(org.eclipse.sphinx.emf.model.
* IModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadModel(IModelDescriptor modelDescriptor, boolean async, IProgressMonitor monitor) {
loadModel(modelDescriptor, true, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadModel(org.eclipse.sphinx.emf.model.
* IModelDescriptor, boolean, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadModel(final IModelDescriptor modelDescriptor, boolean includeReferencedScopes, boolean async, IProgressMonitor monitor) {
Assert.isNotNull(modelDescriptor);
ILoadOperation modelLoadOperation = createModelLoadOperation(modelDescriptor, includeReferencedScopes);
LoadOperationRunnerHelper.run(modelLoadOperation, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadModels(java.util.Collection, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadModels(Collection<IModelDescriptor> modelDescriptors, boolean async, IProgressMonitor monitor) {
loadModels(modelDescriptors, true, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#loadModels(java.util.Collection, boolean,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void loadModels(Collection<IModelDescriptor> modelDescriptors, boolean includeReferencedScopes, boolean async, IProgressMonitor monitor) {
Assert.isNotNull(modelDescriptors);
SubMonitor progress = SubMonitor.convert(monitor, modelDescriptors.size());
for (IModelDescriptor modelDescriptor : modelDescriptors) {
loadModel(modelDescriptor, includeReferencedScopes, async, progress.newChild(1));
if (progress.isCanceled()) {
throw new OperationCanceledException();
}
}
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadModel(org.eclipse.sphinx.emf.model.
* IModelDescriptor, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadModel(IModelDescriptor modelDescriptor, boolean async, IProgressMonitor monitor) {
unloadModel(modelDescriptor, true, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadModel(org.eclipse.sphinx.emf.model.
* IModelDescriptor, boolean, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadModel(final IModelDescriptor modelDescriptor, final boolean includeReferencedScopes, boolean async, IProgressMonitor monitor) {
Assert.isNotNull(modelDescriptor);
// Collect resources to unload in given model
Map<TransactionalEditingDomain, Collection<Resource>> resourcesToUnload = new HashMap<TransactionalEditingDomain, Collection<Resource>>();
resourcesToUnload.put(modelDescriptor.getEditingDomain(), modelDescriptor.getLoadedResources(includeReferencedScopes));
// Unload resources; perform memory-optimized unloading
unloadResources(resourcesToUnload, true, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadModels(java.util.Collection, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadModels(Collection<IModelDescriptor> modelDescriptors, boolean async, IProgressMonitor monitor) {
unloadModels(modelDescriptors, true, async, monitor);
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#unloadModels(java.util.Collection, boolean,
* boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void unloadModels(Collection<IModelDescriptor> modelDescriptors, boolean includeReferencedScopes, boolean async,
IProgressMonitor monitor) {
Assert.isNotNull(modelDescriptors);
SubMonitor progress = SubMonitor.convert(monitor, modelDescriptors.size());
for (IModelDescriptor modelDescriptor : modelDescriptors) {
unloadModel(modelDescriptor, includeReferencedScopes, async, progress.newChild(1));
if (progress.isCanceled()) {
throw new OperationCanceledException();
}
}
}
/*
* @see org.eclipse.sphinx.emf.workspace.loading.IModelLoadManager#updateResourceURIs(java.util.Map, boolean,
* org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void updateResourceURIs(final Map<IFile, IPath> filesToUpdate, boolean async, IProgressMonitor monitor) {
Assert.isNotNull(filesToUpdate);
IUpdateResourceURIOperation updateResourceURIOperation = createUpdateResourceURIOperation(filesToUpdate);
if (async && filesToUpdate.size() > 0) {
Job job = new UpdateResourceURIJob(updateResourceURIOperation);
job.setPriority(Job.BUILD);
job.setRule(updateResourceURIOperation.getRule());
job.schedule();
} else {
try {
updateResourceURIOperation.run(monitor);
} catch (OperationCanceledException ex) {
// Ignore exception
} catch (CoreException ex) {
PlatformLogUtil.logAsError(Activator.getPlugin(), ex);
}
}
}
/**
* Creates an {@link IFileLoadOperation} instance. It is recommended to return a subclass of the
* {@link DefaultFileLoadOperation} class.
*
* @return a new instance.
*/
protected IFileLoadOperation createFileLoadOperation(Collection<IFile> files, IMetaModelDescriptor mmDescriptor) {
return new DefaultFileLoadOperation(files, mmDescriptor);
}
/**
* Creates an {@link IFileReloadOperation} instance. It is recommended to return a subclass of the
* {@link DefaultFileReloadOperation} class.
*
* @return a new instance.
*/
protected IFileReloadOperation createFileReloadOperation(Collection<IFile> files, IMetaModelDescriptor mmDescriptor, boolean memoryOptimized) {
return new DefaultFileReloadOperation(files, mmDescriptor, memoryOptimized);
}
/**
* Creates an {@link IFileUnloadOperation} instance. It is recommended to return a subclass of the
* {@link DefaultFileUnloadOperation} class.
*
* @return a new instance.
*/
protected IFileUnloadOperation createFileUnloadOperation(Collection<IFile> files, IMetaModelDescriptor mmDescriptor, boolean memoryOptimized) {
return new DefaultFileUnloadOperation(files, mmDescriptor, memoryOptimized);
}
/**
* Creates an {@link IModelLoadOperation} instance. It is recommended to return a subclass of the
* {@link DefaultModelLoadOperation} class.
*
* @return a new instance.
*/
protected IModelLoadOperation createModelLoadOperation(IModelDescriptor modelDescriptor, boolean includeReferencedScopes) {
return new DefaultModelLoadOperation(modelDescriptor, includeReferencedScopes);
}
/**
* Creates an {@link IModelUnloadOperation} instance. It is recommended to return a subclass of the
* {@link DefaultModelUnloadOperation} class.
*
* @return a new instance.
*/
protected IModelUnloadOperation createModelUnloadOperation(Map<TransactionalEditingDomain, Collection<Resource>> resourcesToUnload,
boolean memoryOptimized) {
return new DefaultModelUnloadOperation(resourcesToUnload, memoryOptimized);
}
/**
* Creates an {@link IProjectLoadOperation} instance. It is recommended to return a subclass of the
* {@link DefaultProjectLoadOperation} class.
*
* @return a new instance.
*/
protected IProjectLoadOperation createProjectLoadOperation(Collection<IProject> projects, boolean includeReferencedProjects,
IMetaModelDescriptor mmDescriptor) {
return new DefaultProjectLoadOperation(projects, includeReferencedProjects, mmDescriptor);
}
/**
* Creates an {@link IProjectReloadOperation} instance. It is recommended to return a subclass of the
* {@link DefaultProjectReloadOperation} class.
*
* @return a new instance.
*/
protected IProjectReloadOperation createProjectReloadOperation(Collection<IProject> projects, boolean includeReferencedProjects,
IMetaModelDescriptor mmDescriptor) {
return new DefaultProjectReloadOperation(projects, includeReferencedProjects, mmDescriptor);
}
/**
* Creates an {@link IUnresolveUnreachableCrossProjectReferencesOperation} instance. It is recommended to return a
* subclass of the {@link DefaultUnresolveUnreachableCrossProjectReferencesOperation} class.
*
* @return a new instance.
*/
protected IUnresolveUnreachableCrossProjectReferencesOperation createUnresolveUnreachableCrossProjectReferencesOperation(
Collection<IProject> projectsWithUnreachableCrossRefrencesToUnresolve) {
return new DefaultUnresolveUnreachableCrossProjectReferencesOperation(projectsWithUnreachableCrossRefrencesToUnresolve);
}
/**
* Creates an {@link IUpdateResourceURIOperation} instance. It is recommended to return a subclass of the
* {@link DefaultUpdateResourceURIOperation} class.
*
* @return a new instance.
*/
protected IUpdateResourceURIOperation createUpdateResourceURIOperation(Map<IFile, IPath> filesToUpdate) {
return new DefaultUpdateResourceURIOperation(filesToUpdate);
}
protected Collection<IFile> getFiles(Collection<URI> uris) {
Set<IFile> files = new HashSet<IFile>();
if (uris != null) {
Set<URI> modelResourceURIs = new HashSet<URI>();
for (URI uri : uris) {
// Removing URI fragment
modelResourceURIs.add(uri.trimFragment());
}
for (URI modelResourceURI : modelResourceURIs) {
final IFile file = EcorePlatformUtil.getFile(modelResourceURI);
if (file != null) {
files.add(file);
}
}
}
return files;
}
}