Use URI for alternative resolution, support CDO view
diff --git a/org.eclipse.opencert.elastic.cdo/src/org/eclipse/opencert/elastic/cdo/CDOObjectResolver.java b/org.eclipse.opencert.elastic.cdo/src/org/eclipse/opencert/elastic/cdo/CDOObjectResolver.java
index b6610b5..5524dff 100644
--- a/org.eclipse.opencert.elastic.cdo/src/org/eclipse/opencert/elastic/cdo/CDOObjectResolver.java
+++ b/org.eclipse.opencert.elastic.cdo/src/org/eclipse/opencert/elastic/cdo/CDOObjectResolver.java
@@ -12,41 +12,27 @@
  ******************************************************************************/

 package org.eclipse.opencert.elastic.cdo;

 

-import java.util.Iterator;

-

 import org.eclipse.emf.cdo.CDOObject;

-import org.eclipse.emf.cdo.eresource.CDOResource;

+import org.eclipse.emf.cdo.common.id.CDOID;

+import org.eclipse.emf.cdo.common.id.CDOIDUtil;

+import org.eclipse.emf.cdo.view.CDOView;

+import org.eclipse.emf.common.util.URI;

 import org.eclipse.opencert.elastic.search.ObjectResolver;

 

 public class CDOObjectResolver implements ObjectResolver<CDOObject> {

 

 	@Override

 	public CDOObject resolve(String objectId, Object context) {

-

-		if (context instanceof CDOResource) {

-			context = ((CDOResource) context).eAllContents();

-		}

-

-		if (context instanceof Iterator) {

-			@SuppressWarnings("unchecked")

-			Iterator<Object> it = (Iterator<Object>) context;

-			while (it.hasNext()) {

-				Object next = (Object) it.next();

-				if (next instanceof CDOObject) {

-					CDOObject object = (CDOObject) next;

-					if (objectId.equals(object.cdoID().toString())) {

-						return object;

-					}

-				}

-			}

-		} else if (context instanceof Iterable) {

-			for (Object next : (Iterable<?>) context) {

-				if (next instanceof CDOObject) {

-					CDOObject object = (CDOObject) next;

-					if (objectId.equals(object.cdoID().toString())) {

-						return object;

-					}

-				}

+		// the only context we can handle at the moment is a CDOView

+		if (context instanceof CDOView) {

+			try {

+				URI uri = URI.createURI(objectId);

+				CDOID id = CDOIDUtil.read(uri.fragment());

+				CDOView view = (CDOView) context;

+				CDOObject object = view.getObject(id, true);

+				return object;

+			} catch (Exception e) {

+				// ignore

 			}

 		}

 

diff --git a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinderImpl.java b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinderImpl.java
index 2d27223..d160b7a 100644
--- a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinderImpl.java
+++ b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/ElasticFinderImpl.java
@@ -110,6 +110,10 @@
 				// we count 1 for string match + number of filters

 				hit.score = 1 + (filters != null ? filters.size() : 0);

 				hit.objectId = document.id;

+				// HACK Extract the URI from the document

+				if (document.source != null && document.source.has("uri")) {

+					hit.uri = document.source.get("uri").getAsString();

+				}

 				hits.add(hit);

 			}

 			return hits;

diff --git a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/Hit.java b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/Hit.java
index d891434..21eb2e1 100644
--- a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/Hit.java
+++ b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/Hit.java
@@ -32,12 +32,17 @@
 	public int score;

 

 	/**

-	 * The object identifier e.g. a EMF URI or a CDO object ID

+	 * The object identifier i.e. a unique elastic search ID

 	 */

 	public String objectId;

 

+	/**

+	 * The object URI e.g. a EMF URI or a CDO URI

+	 */

+	public String uri;

+

 	@Override

 	public String toString() {

-		return "Hit (score=" + score + ", objectId=" + objectId + ", document=" + document + ")";

+		return "Hit (score=" + score + ", objectId=" + objectId + ", uri=" + uri + ", document=" + document + ")";

 	}

 }

diff --git a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/HitResolution.java b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/HitResolution.java
index 2003cc0..8d408e1 100644
--- a/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/HitResolution.java
+++ b/org.eclipse.opencert.elastic/src/org/eclipse/opencert/elastic/search/HitResolution.java
@@ -39,9 +39,23 @@
 	 * @return the new {@link HitResolution}

 	 */

 	public static <T> HitResolution<T> on(Object context) {

+		return on(context, true);

+	}

+

+	/**

+	 * Factory to create a new {@link HitResolution} object working on the given

+	 * context

+	 *

+	 * @param context

+	 *            an arbitrary context that can be interpreted by the

+	 *            {@link ObjectResolver}

+	 * @param resolve

+	 * @return the new {@link HitResolution}

+	 */

+	public static <T> HitResolution<T> on(Object context, boolean resolve) {

 		HitResolution<T> resolution = new HitResolution<>();

 		// XXX hack

-		resolution.context = DummyData.INSTANCE.convert(context);

+		resolution.context = (resolve ? DummyData.INSTANCE.convert(context) : context);

 		return resolution;

 	}

 

@@ -61,7 +75,12 @@
 		if (objectResolver == null) {

 			throw new IllegalStateException("an object resolver is missing - use with(...) before"); //$NON-NLS-1$

 		}

-		return objectResolver.resolve(hit.objectId, context);

+		T resolved = objectResolver.resolve(hit.objectId, context);

+		if (resolved == null) {

+			// try URI

+			resolved = objectResolver.resolve(hit.uri, context);

+		}

+		return resolved;

 	}

 

 	public Set<T> resolve(Set<Hit> hits, int minScore) {