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) {