blob: 2708495fad1dacf0b044b25d2a8373580a6f53d5 [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 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
* itemis - [423676] AbstractIntegrationTestCase unable to remove project references that are no longer needed
*
* </copyright>
*/
package org.eclipse.sphinx.testutils.integration;
import java.util.ArrayList;
import java.util.Arrays;
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.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
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.ServiceCaller;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor;
import org.eclipse.sphinx.emf.util.WorkspaceEditingDomainUtil;
import org.eclipse.sphinx.emf.workspace.domain.mapping.AbstractWorkspaceEditingDomainMapping;
import org.eclipse.sphinx.platform.util.ExtendedPlatform;
import org.eclipse.sphinx.testutils.integration.internal.IInternalReferenceWorkspace;
import org.eclipse.sphinx.testutils.integration.internal.ReferenceEditingDomainDescriptor;
import org.eclipse.sphinx.testutils.integration.internal.ReferenceModelDescriptor;
import org.eclipse.sphinx.testutils.integration.internal.ReferenceProjectDescriptor;
/**
*
*/
public abstract class AbstractReferenceWorkspace implements IInternalReferenceWorkspace {
private Map<IMetaModelDescriptor, ReferenceEditingDomainDescriptor> referenceEditingDomainsDescriptors = new HashMap<IMetaModelDescriptor, ReferenceEditingDomainDescriptor>();
private Set<ReferenceProjectDescriptor> referenceProjectDescriptors = new HashSet<ReferenceProjectDescriptor>();
public AbstractReferenceWorkspace(Set<String> referenceProjectSubset) {
initContentDescriptors(referenceProjectSubset);
initContentAccessors();
}
protected final void initContentDescriptors(Set<String> referenceProjectSubset) {
initReferenceProjectDescriptors(referenceProjectSubset);
initReferenceFileDescriptors();
}
protected void initContentAccessors() {
// Do nothing by default
}
private void initReferenceProjectDescriptors(Set<String> referenceProjectSubset) {
Assert.isNotNull(referenceProjectSubset);
if (referenceProjectSubset.isEmpty()) {
referenceProjectSubset.addAll(Arrays.asList(getReferenceProjectsNames()));
}
for (String referenceProjectName : referenceProjectSubset) {
addReferenceProjectDescriptor(referenceProjectName);
}
}
private void addReferenceProjectDescriptor(String projectName) {
if (referenceProjectDescriptors == null) {
referenceProjectDescriptors = new HashSet<ReferenceProjectDescriptor>();
}
for (ReferenceProjectDescriptor projectDescriptor : referenceProjectDescriptors) {
if (projectDescriptor.getProjectName().equals(projectName)) {
return;
}
}
referenceProjectDescriptors.add(new ReferenceProjectDescriptor(projectName));
}
protected abstract void initReferenceFileDescriptors();
protected void addFileDescriptors(String projectName, String[] filesPath) {
if (projectName != null && filesPath != null) {
for (String relativeFilePath : filesPath) {
addFileDescriptor(projectName, relativeFilePath);
}
}
}
protected void addFileDescriptor(String projectName, String relativeFilePath) {
if (projectName != null && relativeFilePath != null) {
ReferenceProjectDescriptor projectDescriptor = getReferenceProjectDescriptor(projectName);
if (projectDescriptor != null) {
projectDescriptor.addFile(relativeFilePath, null);
}
}
}
protected void addFileDescriptors(String projectName, String[] filesPath, IMetaModelDescriptor metaModeldescriptor) {
if (projectName != null && filesPath != null) {
for (String relativeFilePath : filesPath) {
addFileDescriptor(projectName, relativeFilePath, metaModeldescriptor);
}
}
}
protected void addFileDescriptor(String projectName, String relativeFilePath, IMetaModelDescriptor metaModelDescriptor) {
ReferenceEditingDomainDescriptor referenceEditingDomainDescriptor = getReferenceEditingDomainDescriptor(metaModelDescriptor);
if (referenceEditingDomainDescriptor == null) {
String editingDomainId = AbstractWorkspaceEditingDomainMapping.getDefaultEditingDomainId(Collections.singleton(metaModelDescriptor));
addEditingDomainDescriptor(metaModelDescriptor, editingDomainId);
referenceEditingDomainDescriptor = getReferenceEditingDomainDescriptor(metaModelDescriptor);
}
ReferenceProjectDescriptor referenceProjectDescriptor = getReferenceProjectDescriptor(projectName);
if (referenceProjectDescriptor != null) {
referenceProjectDescriptor.addFile(relativeFilePath, metaModelDescriptor);
IPath referenceProjectPath = referenceProjectDescriptor.getProject().getFullPath();
referenceEditingDomainDescriptor
.addResourceURI(URI.createPlatformResourceURI(referenceProjectPath.append(relativeFilePath).toString(), true));
addReferenceModelDescriptor(metaModelDescriptor, referenceEditingDomainDescriptor, referenceProjectDescriptor);
}
}
private void addEditingDomainDescriptor(IMetaModelDescriptor metaModelDescriptor, String editingDomainName) {
if (referenceEditingDomainsDescriptors != null) {
if (getReferenceEditingDomainDescriptor(metaModelDescriptor) == null) {
ReferenceEditingDomainDescriptor referenceEditingDomainsDescriptor = referenceEditingDomainsDescriptors.get(metaModelDescriptor);
if (referenceEditingDomainsDescriptor == null) {
referenceEditingDomainsDescriptors.put(metaModelDescriptor, new ReferenceEditingDomainDescriptor(editingDomainName));
}
}
}
}
private void addReferenceModelDescriptor(IMetaModelDescriptor metaModelDescriptor,
ReferenceEditingDomainDescriptor referenceEditingDomainDescriptor, ReferenceProjectDescriptor referenceProjectDescriptor) {
Assert.isNotNull(metaModelDescriptor);
Assert.isNotNull(referenceEditingDomainDescriptor);
Assert.isNotNull(referenceProjectDescriptor);
ReferenceModelDescriptor referenceModelDescriptor = new ReferenceModelDescriptor(metaModelDescriptor, referenceEditingDomainDescriptor.name,
referenceProjectDescriptor.getProject());
referenceProjectDescriptor.addReferenceModelDescriptor(referenceModelDescriptor);
for (IProject referencingProject : ExtendedPlatform.getAllReferencingProjects(referenceProjectDescriptor.getProject())) {
ReferenceProjectDescriptor referencingReferenceProjectDescriptor = getReferenceProjectDescriptor(referencingProject.getName());
if (referencingReferenceProjectDescriptor != null) {
ReferenceModelDescriptor forwardedReferenceModelDescriptor = new ReferenceModelDescriptor(metaModelDescriptor,
referenceEditingDomainDescriptor.name, referencingProject);
referencingReferenceProjectDescriptor.addReferenceModelDescriptor(forwardedReferenceModelDescriptor);
}
}
}
@Override
public void addResourceSetProblemListener(ResourceProblemListener resourceProblemListener) {
for (IMetaModelDescriptor metaModelDescriptor : referenceEditingDomainsDescriptors.keySet()) {
TransactionalEditingDomain editingDomain = WorkspaceEditingDomainUtil.getEditingDomain(ResourcesPlugin.getWorkspace().getRoot(),
metaModelDescriptor);
if (editingDomain != null) {
editingDomain.addResourceSetListener(resourceProblemListener);
}
}
}
@Override
public void removeResourceSetProblemListener(ResourceProblemListener resourceProblemListener) {
for (IMetaModelDescriptor metaModelDescriptor : referenceEditingDomainsDescriptors.keySet()) {
TransactionalEditingDomain editingDomain = WorkspaceEditingDomainUtil.getEditingDomain(ResourcesPlugin.getWorkspace().getRoot(),
metaModelDescriptor);
if (editingDomain != null) {
editingDomain.removeResourceSetListener(resourceProblemListener);
}
}
}
@Override
public void addReferenceWorkspaceChangeListener(ReferenceWorkspaceChangeListener referenceWorkspaceChangeListener) {
ServiceCaller.callOnce(getClass(), IWorkspace.class, ws -> {
ws.addResourceChangeListener(referenceWorkspaceChangeListener);
});
}
@Override
public void removeReferenceWorkspaceChangeListener(ReferenceWorkspaceChangeListener referenceWorkspaceChangeListener) {
ServiceCaller.callOnce(getClass(), IWorkspace.class, ws -> {
ws.removeResourceChangeListener(referenceWorkspaceChangeListener);
});
}
@Override
public ReferenceEditingDomainDescriptor getReferenceEditingDomainDescriptor(IMetaModelDescriptor metaModeldescriptor) {
if (referenceEditingDomainsDescriptors != null && metaModeldescriptor != null) {
return referenceEditingDomainsDescriptors.get(metaModeldescriptor);
}
return null;
}
@Override
public Map<IMetaModelDescriptor, ReferenceEditingDomainDescriptor> getReferenceEditingDomainDescritpors() {
return referenceEditingDomainsDescriptors;
}
/**
* return the first editing domain descriptor of the list corresponding to the given MetaModelDescriptor
*/
@Override
public int getInitialReferenceEditingDomainCount() {
if (referenceEditingDomainsDescriptors != null) {
return referenceEditingDomainsDescriptors.size();
}
return 0;
}
@Override
public int getInitialResourcesInReferenceEditingDomainCount(IMetaModelDescriptor metaModeldescriptor) {
ReferenceEditingDomainDescriptor referenceEditingDomainDescriptor = getReferenceEditingDomainDescriptor(metaModeldescriptor);
if (referenceEditingDomainDescriptor != null) {
return referenceEditingDomainDescriptor.getResourceURIs().size();
}
return 0;
}
@Override
public int getInitialResourcesInAllReferenceEditingDomainCount() {
int count = 0;
if (referenceEditingDomainsDescriptors != null) {
for (IMetaModelDescriptor metaModelDescriptor : referenceEditingDomainsDescriptors.keySet()) {
count += getInitialResourcesInReferenceEditingDomainCount(metaModelDescriptor);
}
}
return count;
}
@Override
public Set<IFile> getAllReferenceFiles() {
Assert.isNotNull(referenceProjectDescriptors);
Set<IFile> results = new HashSet<IFile>();
for (ReferenceProjectDescriptor referenceProjectDescriptor : referenceProjectDescriptors) {
if (referenceProjectDescriptor != null) {
results.addAll(referenceProjectDescriptor.getAllFiles());
}
}
return results;
}
@Override
public Set<IFile> getReferenceFiles(IMetaModelDescriptor metaModelDescriptor) {
Assert.isNotNull(referenceProjectDescriptors);
Set<IFile> results = new HashSet<IFile>();
for (ReferenceProjectDescriptor referenceProjectDescriptor : referenceProjectDescriptors) {
if (referenceProjectDescriptor != null) {
results.addAll(referenceProjectDescriptor.getFiles(metaModelDescriptor));
}
}
return results;
}
@Override
public Set<String> getReferenceFileNames(IMetaModelDescriptor metaModelDescriptor) {
Assert.isNotNull(referenceProjectDescriptors);
Set<String> results = new HashSet<String>();
for (ReferenceProjectDescriptor referenceProjectDescriptor : referenceProjectDescriptors) {
if (referenceProjectDescriptor != null) {
for (IFile file : referenceProjectDescriptor.getFiles(metaModelDescriptor)) {
results.add(file.getName());
}
}
}
return results;
}
@Override
public Set<IFile> getReferenceFiles(String projectName) {
ReferenceProjectDescriptor referenceProjectdescriptor = getReferenceProjectDescriptor(projectName);
if (referenceProjectdescriptor != null) {
return referenceProjectdescriptor.getAllFiles();
}
return new HashSet<IFile>();
}
@Override
public Set<IFile> getReferenceFiles(String projectName, IMetaModelDescriptor metaModelDescriptor) {
ReferenceProjectDescriptor referenceProjectdescriptor = getReferenceProjectDescriptor(projectName);
if (referenceProjectdescriptor != null) {
return referenceProjectdescriptor.getFiles(metaModelDescriptor);
}
return new HashSet<IFile>();
}
// TODO reduce API to only use IPath
@Override
public IFile getReferenceFile(String projectName, String fileName) {
ReferenceProjectDescriptor referenceProjectDescriptor = getReferenceProjectDescriptor(projectName);
if (referenceProjectDescriptor != null) {
return referenceProjectDescriptor.getFile(fileName);
}
return null;
}
public IFile getReferenceFile(IPath filePath) {
return ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
}
protected abstract String[] getReferenceProjectsNames();
@Override
public IProject getReferenceProject(String projectName) {
ReferenceProjectDescriptor referenceProjectdescriptor = getReferenceProjectDescriptor(projectName);
if (referenceProjectdescriptor != null) {
return referenceProjectdescriptor.getProject();
}
return null;
}
@Override
public List<String> getReferenceFileNames(String projectName, IMetaModelDescriptor metaModelDescriptor) {
ReferenceProjectDescriptor referenceProjectDescriptor = getReferenceProjectDescriptor(projectName);
if (referenceProjectDescriptor != null) {
return referenceProjectDescriptor.getFileNames(metaModelDescriptor);
}
return new ArrayList<String>();
}
@Override
public List<String> getReferenceFileNames(String projectName) {
ReferenceProjectDescriptor referenceProjectDescriptor = getReferenceProjectDescriptor(projectName);
if (referenceProjectDescriptor != null) {
return referenceProjectDescriptor.getAllFileNames();
}
return new ArrayList<String>();
}
@Override
public ReferenceProjectDescriptor getReferenceProjectDescriptor(String projectName) {
Assert.isNotNull(referenceProjectDescriptors);
for (ReferenceProjectDescriptor projectDescriptor : referenceProjectDescriptors) {
if (projectDescriptor.getProjectName().equals(projectName)) {
return projectDescriptor;
}
}
return null;
}
public Map<String, IProject> getReferenceProjectAccessors() {
Assert.isNotNull(referenceProjectDescriptors);
Map<String, IProject> projects = new HashMap<String, IProject>();
for (ReferenceProjectDescriptor projcetDescriptor : referenceProjectDescriptors) {
projects.put(projcetDescriptor.getProjectName(), projcetDescriptor.getProject());
}
return projects;
}
@Override
public Set<ReferenceProjectDescriptor> getReferenceProjectDescriptors() {
return referenceProjectDescriptors;
}
/**
* Create an empty eclipse project.
*
* @param project
* @throws CoreException
*/
protected final IProject createSimpleProject(final String projectName) throws CoreException {
final IProject[] project = new IProject[1];
IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
@Override
public void run(IProgressMonitor monitor) throws CoreException {
project[0] = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
if (!project[0].exists()) {
project[0].create(null);
project[0].open(null);
}
}
};
ResourcesPlugin.getWorkspace().run(runnable, ResourcesPlugin.getWorkspace().getRoot(), IWorkspace.AVOID_UPDATE, null);
return project[0];
}
}