[ASSIGNED] Bug 449909 - Integration of EMF-Incquery in Sphinx
https://bugs.eclipse.org/bugs/show_bug.cgi?id=449909
Added support for EMF-IncQuery based proxy resolution.
diff --git a/plugins/org.eclipse.sphinx.emf.incquery/src/org/eclipse/sphinx/emf/incquery/proxymanagment/AbstractProxyResolver.java b/plugins/org.eclipse.sphinx.emf.incquery/src/org/eclipse/sphinx/emf/incquery/proxymanagment/AbstractProxyResolver.java
index 3722475..82d8a9f 100644
--- a/plugins/org.eclipse.sphinx.emf.incquery/src/org/eclipse/sphinx/emf/incquery/proxymanagment/AbstractProxyResolver.java
+++ b/plugins/org.eclipse.sphinx.emf.incquery/src/org/eclipse/sphinx/emf/incquery/proxymanagment/AbstractProxyResolver.java
@@ -14,20 +14,22 @@
*/
package org.eclipse.sphinx.emf.incquery.proxymanagment;
+import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.incquery.runtime.api.IncQueryEngine;
import org.eclipse.incquery.runtime.exception.IncQueryException;
import org.eclipse.sphinx.emf.ecore.proxymanagement.IProxyResolver;
import org.eclipse.sphinx.emf.incquery.AbstractIncQueryProvider;
import org.eclipse.sphinx.emf.incquery.internal.Activator;
+import org.eclipse.sphinx.emf.resource.ExtendedResource;
+import org.eclipse.sphinx.emf.resource.ExtendedResourceAdapterFactory;
import org.eclipse.sphinx.platform.util.PlatformLogUtil;
public abstract class AbstractProxyResolver extends AbstractIncQueryProvider implements IProxyResolver {
- public final String SEGMENT_SEPARATOR = "/"; //$NON-NLS-1$
-
public AbstractProxyResolver() {
super();
}
@@ -38,36 +40,7 @@
* @param engine
* @return
*/
- protected EObject[] getEObjectCandidates(EObject proxy, EObject contextObject, IncQueryEngine engine) {
- Class<?> type = getInstanceClass(proxy);
- String name = getName(proxy);
- if (type != null && !isBlank(name)) {
- try {
- return doGetEObjectCandidates(type, name, engine);
- } catch (IncQueryException ex) {
- PlatformLogUtil.logAsError(Activator.getPlugin(), ex);
- }
- }
- return new EObject[] {};
- }
-
- protected abstract EObject[] doGetEObjectCandidates(Class<?> type, String shortName, IncQueryEngine engine) throws IncQueryException;
-
- public String getName(EObject eObject) {
- // ((InternalEObject)eObject).eProxyURI().lastSegment()
- return getName(((InternalEObject) eObject).eProxyURI().fragment());
- }
-
- public String getName(String absoluteQualifiedName) {
- if (!isBlank(absoluteQualifiedName)) {
- int lastIndexOfSegSeparator = absoluteQualifiedName.lastIndexOf(SEGMENT_SEPARATOR);
- if (lastIndexOfSegSeparator != -1) {
- return absoluteQualifiedName.substring(lastIndexOfSegSeparator + 1);
- }
- return absoluteQualifiedName;
- }
- return null;
- }
+ protected abstract EObject[] getEObjectCandidates(EObject proxy, EObject contextObject, IncQueryEngine engine);
protected Class<?> getInstanceClass(EObject proxy) {
if (proxy != null && proxy.eClass() != null) {
@@ -79,15 +52,24 @@
protected EObject getMatchingEObject(EObject proxy, EObject[] eObjectCandidates) {
if (proxy != null && eObjectCandidates != null) {
for (EObject eObj : eObjectCandidates) {
- ((InternalEObject) eObj).eProxyURI().equals(((InternalEObject) proxy).eProxyURI());
- return eObj;
+ if (matches(proxy, eObj)) {
+ return eObj;
+ }
}
}
return null;
}
- protected boolean isBlank(String text) {
- return text == null || text.length() == 0;
+ protected boolean matches(EObject proxy, EObject candidate) {
+ URI proxyURI = ((InternalEObject) proxy).eProxyURI();
+ URI candidateURI;
+ ExtendedResource extendedTargetResource = ExtendedResourceAdapterFactory.INSTANCE.adapt(candidate.eResource());
+ if (extendedTargetResource != null) {
+ candidateURI = extendedTargetResource.getURI(candidate);
+ } else {
+ candidateURI = EcoreUtil.getURI(candidate);
+ }
+ return proxyURI.equals(candidateURI);
}
@Override
diff --git a/plugins/org.eclipse.sphinx.emf.incquery/src/org/eclipse/sphinx/emf/incquery/proxymanagment/AbstractProxyResolutionService.java b/plugins/org.eclipse.sphinx.emf.incquery/src/org/eclipse/sphinx/emf/incquery/proxymanagment/AbstractProxyResolverService.java
similarity index 93%
rename from plugins/org.eclipse.sphinx.emf.incquery/src/org/eclipse/sphinx/emf/incquery/proxymanagment/AbstractProxyResolutionService.java
rename to plugins/org.eclipse.sphinx.emf.incquery/src/org/eclipse/sphinx/emf/incquery/proxymanagment/AbstractProxyResolverService.java
index 8ca180b..b453b48 100644
--- a/plugins/org.eclipse.sphinx.emf.incquery/src/org/eclipse/sphinx/emf/incquery/proxymanagment/AbstractProxyResolutionService.java
+++ b/plugins/org.eclipse.sphinx.emf.incquery/src/org/eclipse/sphinx/emf/incquery/proxymanagment/AbstractProxyResolverService.java
@@ -23,12 +23,12 @@
import org.eclipse.sphinx.emf.ecore.proxymanagement.IProxyResolver;
import org.eclipse.sphinx.emf.incquery.IncQueryEngineHelper;
-public abstract class AbstractProxyResolutionService implements IProxyResolverService {
+public abstract class AbstractProxyResolverService implements IProxyResolverService {
private List<IProxyResolver> proxyResolvers = new ArrayList<IProxyResolver>();
private IncQueryEngineHelper incQueryEngineHelper;
- public AbstractProxyResolutionService() {
+ public AbstractProxyResolverService() {
initProxyResolvers();
}
diff --git a/plugins/org.eclipse.sphinx.emf/src/org/eclipse/sphinx/emf/resource/ContextAwareProxyURIHelper.java b/plugins/org.eclipse.sphinx.emf/src/org/eclipse/sphinx/emf/resource/ContextAwareProxyURIHelper.java
index c82eec2..46c3314 100644
--- a/plugins/org.eclipse.sphinx.emf/src/org/eclipse/sphinx/emf/resource/ContextAwareProxyURIHelper.java
+++ b/plugins/org.eclipse.sphinx.emf/src/org/eclipse/sphinx/emf/resource/ContextAwareProxyURIHelper.java
@@ -75,20 +75,11 @@
// Build target metamodel descriptor query field
StringBuilder targetMMDescriptorQueryField = null;
IMetaModelDescriptor proxyMMDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(proxy);
- IMetaModelDescriptor contextMMDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(contextResource);
if (proxyMMDescriptor != null) {
- /*
- * Performance optimization: Add target metamodel descriptor field to context-aware URI only when metamodel
- * behind proxy is different from that of the context model, i.e. the model that references it. The presence
- * of the target metamodel descriptor is only required for resolving proxies across different metamodels and
- * would needlessly blow up the proxy URI size otherwise.
- */
- if (!proxyMMDescriptor.equals(contextMMDescriptor)) {
- targetMMDescriptorQueryField = new StringBuilder();
- targetMMDescriptorQueryField.append(CONTEXT_AWARE_PROXY_URI_QUERY_KEY_TARGET_METAMODEL_DESCRIPTOR);
- targetMMDescriptorQueryField.append(ExtendedResource.URI_QUERY_KEY_VALUE_SEPARATOR);
- targetMMDescriptorQueryField.append(proxyMMDescriptor.getIdentifier());
- }
+ targetMMDescriptorQueryField = new StringBuilder();
+ targetMMDescriptorQueryField.append(CONTEXT_AWARE_PROXY_URI_QUERY_KEY_TARGET_METAMODEL_DESCRIPTOR);
+ targetMMDescriptorQueryField.append(ExtendedResource.URI_QUERY_KEY_VALUE_SEPARATOR);
+ targetMMDescriptorQueryField.append(proxyMMDescriptor.getIdentifier());
}
// Build context URI query field
diff --git a/plugins/org.eclipse.sphinx.emf/src/org/eclipse/sphinx/emf/resource/ExtendedResourceSetImpl.java b/plugins/org.eclipse.sphinx.emf/src/org/eclipse/sphinx/emf/resource/ExtendedResourceSetImpl.java
index e79a517..b01c329 100644
--- a/plugins/org.eclipse.sphinx.emf/src/org/eclipse/sphinx/emf/resource/ExtendedResourceSetImpl.java
+++ b/plugins/org.eclipse.sphinx.emf/src/org/eclipse/sphinx/emf/resource/ExtendedResourceSetImpl.java
@@ -371,6 +371,15 @@
return null;
}
+ // Retrieve context information from given URI
+ String targetMMDescriptorId = contextAwareProxyURIHelper.getTargetMetaModelDescriptorId(uri);
+ IMetaModelDescriptor targetMMDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(targetMMDescriptorId);
+
+ IProxyResolverService proxyResolverService = getProxyResolverService(targetMMDescriptor);
+ if (proxyResolverService != null) {
+ return proxyResolverService.getEObject(uri, loadOnDemand);
+ }
+
if (proxyHelper != null) {
// If proxy URI references a known unresolved proxy then don't try to resolve it again
if (proxyHelper.getBlackList().existsProxyURI(uri)) {
@@ -395,8 +404,6 @@
}
// Retrieve context information from given URI
- String targetMMDescriptorId = contextAwareProxyURIHelper.getTargetMetaModelDescriptorId(uri);
- IMetaModelDescriptor targetMMDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(targetMMDescriptorId);
URI contextURI = contextAwareProxyURIHelper.getContextURI(uri);
// Try to resolve proxy URI in this resource set
@@ -435,9 +442,13 @@
return null;
}
- IProxyResolverService indexService = getIndexService(contextObject);
- if (indexService != null) {
- return indexService.getEObject(proxy, contextObject, loadOnDemand);
+ // Retrieve context information from provided arguments
+ IMetaModelDescriptor targetMMDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(proxy);
+
+ // Try to retrieve an IProxyResolverService for the given meta-model descriptor
+ IProxyResolverService proxyResolverService = getProxyResolverService(targetMMDescriptor);
+ if (proxyResolverService != null) {
+ return proxyResolverService.getEObject(proxy, contextObject, loadOnDemand);
}
URI uri = ((InternalEObject) proxy).eProxyURI();
@@ -464,9 +475,6 @@
}
}
- // Retrieve context information from provided arguments
- IMetaModelDescriptor targetMMDescriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(proxy);
-
// Try to resolve proxy URI in this resource set
EObject resolvedEObject = getEObject(uri, targetMMDescriptor, contextObject, loadOnDemand);
if (resolvedEObject != null) {
@@ -797,8 +805,7 @@
return null;
}
- protected IProxyResolverService getIndexService(EObject contextObject) {
- IMetaModelDescriptor descriptor = MetaModelDescriptorRegistry.INSTANCE.getDescriptor(contextObject);
+ protected IProxyResolverService getProxyResolverService(IMetaModelDescriptor descriptor) {
if (descriptor != null) {
return new DefaultMetaModelServiceProvider().getService(descriptor, IProxyResolverService.class);
}