[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);

 		}