blob: f9eb379ddb46cee6537f43cddfea1de512b2cba3 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2014-2017 itemis, IncQuery Labs 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:
* itemis - Initial API and implementation
* IncQuery Labs, itemis - [501899] Use base index instead of IncQuery patterns
*
* </copyright>
*/
package org.eclipse.sphinx.emf.viatra.query;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
import org.eclipse.core.runtime.Assert;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.sphinx.emf.metamodel.IMetaModelDescriptor;
import org.eclipse.sphinx.emf.metamodel.services.AbstractMetaModelService;
import org.eclipse.sphinx.emf.query.IModelQueryService;
import org.eclipse.sphinx.emf.util.EObjectUtil;
import org.eclipse.sphinx.emf.viatra.query.internal.Activator;
import org.eclipse.sphinx.platform.util.PlatformLogUtil;
import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
import org.eclipse.viatra.query.runtime.base.api.IndexingLevel;
import org.eclipse.viatra.query.runtime.base.api.NavigationHelper;
import org.eclipse.viatra.query.runtime.emf.EMFScope;
import org.eclipse.viatra.query.runtime.exception.ViatraQueryException;
public class BasicViatraModelQueryService extends AbstractMetaModelService implements IModelQueryService {
private IViatraQueryEngineHelper viatraQueryEngineHelper;
public BasicViatraModelQueryService(Collection<IMetaModelDescriptor> mmDescriptors) {
super(mmDescriptors);
}
protected IViatraQueryEngineHelper getViatraQueryEngineHelper() {
if (viatraQueryEngineHelper == null) {
viatraQueryEngineHelper = createViatraQueryEngineHelper();
}
return viatraQueryEngineHelper;
}
protected IViatraQueryEngineHelper createViatraQueryEngineHelper() {
return new ViatraQueryEngineHelper();
}
protected EClass getEClassForType(Class<?> type) {
for (IMetaModelDescriptor mmDescriptor : getMetaModelDescriptors()) {
for (EPackage ePackage : mmDescriptor.getEPackages()) {
EClassifier eClassifier = EObjectUtil.findEClassifier(ePackage, type);
if (eClassifier instanceof EClass) {
return (EClass) eClassifier;
}
}
}
return null;
}
@Override
public <T> List<T> getAllInstancesOf(EObject contextObject, Class<T> type) {
return getAllInstancesOf(contextObject.eResource(), type);
}
@Override
public <T> List<T> getAllInstancesOf(Resource contextResource, Class<T> type) {
try {
ViatraQueryEngine engine = getViatraQueryEngineHelper().getEngine(contextResource);
return doGetAllInstancesOf(type, engine);
} catch (Exception ex) {
PlatformLogUtil.logAsError(Activator.getPlugin(), ex);
return Collections.emptyList();
}
}
protected <T> List<T> doGetAllInstancesOf(Class<T> type, ViatraQueryEngine engine) throws ViatraQueryException, InvocationTargetException {
Assert.isNotNull(type);
final NavigationHelper baseIndex = EMFScope.extractUnderlyingEMFIndex(engine);
final EClass eClass = getEClassForType(type);
baseIndex.coalesceTraversals(new Callable<Void>() {
@Override
public Void call() throws Exception {
baseIndex.registerEClasses(Collections.singleton(eClass), IndexingLevel.FULL);
return null;
}
});
List<T> instances = new ArrayList<T>();
for (EObject instance : baseIndex.getAllInstances(eClass)) {
instances.add(type.cast(instance));
}
return instances;
}
}