Skip to main content

This CGIT instance is deprecated, and repositories have been moved to Gitlab or Github. See the repository descriptions for specific locations.

summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2010-12-27 09:50:08 +0000
committerEike Stepper2010-12-27 09:50:08 +0000
commit0465fdd3e6f686aab65cc60d7d7fc71c8eff7213 (patch)
tree8a811b0695b3716f38dc40253557a79746e8a3c3
parente4b40d895ed76808ace9509ec9e3dfa9552d48db (diff)
downloadcdo-0465fdd3e6f686aab65cc60d7d7fc71c8eff7213.tar.gz
cdo-0465fdd3e6f686aab65cc60d7d7fc71c8eff7213.tar.xz
cdo-0465fdd3e6f686aab65cc60d7d7fc71c8eff7213.zip
[333230] queryXRefs does not work with specific source references
https://bugs.eclipse.org/bugs/show_bug.cgi?id=333230
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/XRefsQueryHandler.java10
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XRefTest.java250
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java8
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java27
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java8
5 files changed, 293 insertions, 10 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/XRefsQueryHandler.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/XRefsQueryHandler.java
index 2f42b16ce5..dfc4a3ec7b 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/XRefsQueryHandler.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/XRefsQueryHandler.java
@@ -135,11 +135,15 @@ public class XRefsQueryHandler implements IQueryHandler
Map<EClass, List<EReference>> sourceCandidates, CDOPackageRegistry packageRegistry)
{
EClass rootClass = eReference.getEContainingClass();
- Collection<EClass> descendentClasses = packageRegistry.getSubTypes().get(rootClass);
+ collectSourceCandidates(rootClass, eReference, concreteTypes, sourceCandidates);
- for (EClass candidateClass : descendentClasses)
+ Collection<EClass> descendentClasses = packageRegistry.getSubTypes().get(rootClass);
+ if (descendentClasses != null)
{
- collectSourceCandidates(candidateClass, eReference, concreteTypes, sourceCandidates);
+ for (EClass candidateClass : descendentClasses)
+ {
+ collectSourceCandidates(candidateClass, eReference, concreteTypes, sourceCandidates);
+ }
}
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XRefTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XRefTest.java
index 240ac65cdd..1a878b8e23 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XRefTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/XRefTest.java
@@ -28,6 +28,8 @@ import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.util.EcoreUtil;
@@ -198,6 +200,7 @@ public class XRefTest extends AbstractCDOTest
assertTrue(false);
}
}
+
assertTrue(found1 && found2 && found3);
view.close();
@@ -293,15 +296,258 @@ public class XRefTest extends AbstractCDOTest
{
found1 = true;
}
- if (id == 2)
+ else if (id == 2)
{
found2 = true;
}
-
}
+
assertTrue(found1 && found2);
view.close();
session2.close();
}
+
+ @SuppressWarnings({ "unchecked", "unused" })
+ public void testSpecificReferences0() throws Exception
+ {
+ EClass a = EcoreFactory.eINSTANCE.createEClass();
+ a.setName("A");
+
+ EClass b = EcoreFactory.eINSTANCE.createEClass();
+ b.setName("B");
+
+ EReference aa1 = addReference(a, a, true);
+ EReference aa2 = addReference(a, a, true);
+ EReference aa3 = addReference(a, a, false);
+ EReference aa4 = addReference(a, a, false);
+ EReference ab5 = addReference(a, b, true);
+ EReference ab6 = addReference(a, b, true);
+ EReference ab7 = addReference(a, b, false);
+ EReference ab8 = addReference(a, b, false);
+
+ EReference ba1 = addReference(b, a, true);
+ EReference ba2 = addReference(b, a, true);
+ EReference ba3 = addReference(b, a, false);
+ EReference ba4 = addReference(b, a, false);
+ EReference bb5 = addReference(b, b, true);
+ EReference bb6 = addReference(b, b, true);
+ EReference bb7 = addReference(b, b, false);
+ EReference bb8 = addReference(b, b, false);
+
+ EPackage xref = EcoreFactory.eINSTANCE.createEPackage();
+ xref.setName("xref");
+ xref.setNsPrefix("xref");
+ xref.setNsURI("http://xref");
+ xref.getEClassifiers().add(a);
+ xref.getEClassifiers().add(b);
+
+ CDOSession session = openSession();
+ session.getPackageRegistry().putEPackage(xref);
+
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource("/test1");
+
+ EObject a1 = addObject(resource, a);
+ EObject a2 = addObject(resource, a);
+ EObject a3 = addObject(resource, a);
+ EObject a4 = addObject(resource, a);
+
+ EObject b1 = addObject(resource, b);
+ EObject b2 = addObject(resource, b);
+ EObject b3 = addObject(resource, b);
+ EObject b4 = addObject(resource, b);
+
+ ((EList<EObject>)a1.eGet(ab5)).add(b1);
+ ((EList<EObject>)a1.eGet(ab5)).add(b2);
+ ((EList<EObject>)a1.eGet(ab5)).add(b3);
+ ((EList<EObject>)a1.eGet(ab5)).add(b4);
+
+ ((EList<EObject>)a1.eGet(ab6)).add(b1);
+ ((EList<EObject>)a1.eGet(ab6)).add(b2);
+ ((EList<EObject>)a1.eGet(ab6)).add(b3);
+ ((EList<EObject>)a1.eGet(ab6)).add(b4);
+
+ transaction.commit();
+
+ /******************/
+
+ List<CDOObjectReference> results = transaction.queryXRefs(CDOUtil.getCDOObject(b1));
+ assertEquals(2, results.size());
+
+ assertEquals(0, results.get(0).getSourceIndex());
+ assertEquals(ab5, results.get(0).getSourceReference());
+ assertEquals(a1, results.get(0).getSourceObject());
+ assertEquals(b1, results.get(0).getTargetObject());
+
+ assertEquals(0, results.get(1).getSourceIndex());
+ assertEquals(ab6, results.get(1).getSourceReference());
+ assertEquals(a1, results.get(1).getSourceObject());
+ assertEquals(b1, results.get(1).getTargetObject());
+ }
+
+ @SuppressWarnings({ "unchecked", "unused" })
+ public void testSpecificReferences1() throws Exception
+ {
+ EClass a = EcoreFactory.eINSTANCE.createEClass();
+ a.setName("A");
+
+ EClass b = EcoreFactory.eINSTANCE.createEClass();
+ b.setName("B");
+
+ EReference aa1 = addReference(a, a, true);
+ EReference aa2 = addReference(a, a, true);
+ EReference aa3 = addReference(a, a, false);
+ EReference aa4 = addReference(a, a, false);
+ EReference ab5 = addReference(a, b, true);
+ EReference ab6 = addReference(a, b, true);
+ EReference ab7 = addReference(a, b, false);
+ EReference ab8 = addReference(a, b, false);
+
+ EReference ba1 = addReference(b, a, true);
+ EReference ba2 = addReference(b, a, true);
+ EReference ba3 = addReference(b, a, false);
+ EReference ba4 = addReference(b, a, false);
+ EReference bb5 = addReference(b, b, true);
+ EReference bb6 = addReference(b, b, true);
+ EReference bb7 = addReference(b, b, false);
+ EReference bb8 = addReference(b, b, false);
+
+ EPackage xref = EcoreFactory.eINSTANCE.createEPackage();
+ xref.setName("xref");
+ xref.setNsPrefix("xref");
+ xref.setNsURI("http://xref");
+ xref.getEClassifiers().add(a);
+ xref.getEClassifiers().add(b);
+
+ CDOSession session = openSession();
+ session.getPackageRegistry().putEPackage(xref);
+
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource("/test1");
+
+ EObject a1 = addObject(resource, a);
+ EObject a2 = addObject(resource, a);
+ EObject a3 = addObject(resource, a);
+ EObject a4 = addObject(resource, a);
+
+ EObject b1 = addObject(resource, b);
+ EObject b2 = addObject(resource, b);
+ EObject b3 = addObject(resource, b);
+ EObject b4 = addObject(resource, b);
+
+ ((EList<EObject>)a1.eGet(ab5)).add(b1);
+ ((EList<EObject>)a1.eGet(ab5)).add(b2);
+ ((EList<EObject>)a1.eGet(ab5)).add(b3);
+ ((EList<EObject>)a1.eGet(ab5)).add(b4);
+
+ ((EList<EObject>)a1.eGet(ab6)).add(b1);
+ ((EList<EObject>)a1.eGet(ab6)).add(b2);
+ ((EList<EObject>)a1.eGet(ab6)).add(b3);
+ ((EList<EObject>)a1.eGet(ab6)).add(b4);
+
+ transaction.commit();
+
+ /******************/
+
+ List<CDOObjectReference> results = transaction.queryXRefs(CDOUtil.getCDOObject(b1), ab5);
+ assertEquals(1, results.size());
+
+ assertEquals(0, results.get(0).getSourceIndex());
+ assertEquals(ab5, results.get(0).getSourceReference());
+ assertEquals(a1, results.get(0).getSourceObject());
+ assertEquals(b1, results.get(0).getTargetObject());
+ }
+
+ @SuppressWarnings({ "unchecked", "unused" })
+ public void testSpecificReferences2() throws Exception
+ {
+ EClass a = EcoreFactory.eINSTANCE.createEClass();
+ a.setName("A");
+
+ EClass b = EcoreFactory.eINSTANCE.createEClass();
+ b.setName("B");
+
+ EReference aa1 = addReference(a, a, true);
+ EReference aa2 = addReference(a, a, true);
+ EReference aa3 = addReference(a, a, false);
+ EReference aa4 = addReference(a, a, false);
+ EReference ab5 = addReference(a, b, true);
+ EReference ab6 = addReference(a, b, true);
+ EReference ab7 = addReference(a, b, false);
+ EReference ab8 = addReference(a, b, false);
+
+ EReference ba1 = addReference(b, a, true);
+ EReference ba2 = addReference(b, a, true);
+ EReference ba3 = addReference(b, a, false);
+ EReference ba4 = addReference(b, a, false);
+ EReference bb5 = addReference(b, b, true);
+ EReference bb6 = addReference(b, b, true);
+ EReference bb7 = addReference(b, b, false);
+ EReference bb8 = addReference(b, b, false);
+
+ EPackage xref = EcoreFactory.eINSTANCE.createEPackage();
+ xref.setName("xref");
+ xref.setNsPrefix("xref");
+ xref.setNsURI("http://xref");
+ xref.getEClassifiers().add(a);
+ xref.getEClassifiers().add(b);
+
+ CDOSession session = openSession();
+ session.getPackageRegistry().putEPackage(xref);
+
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource("/test1");
+
+ EObject a1 = addObject(resource, a);
+ EObject a2 = addObject(resource, a);
+ EObject a3 = addObject(resource, a);
+ EObject a4 = addObject(resource, a);
+
+ EObject b1 = addObject(resource, b);
+ EObject b2 = addObject(resource, b);
+ EObject b3 = addObject(resource, b);
+ EObject b4 = addObject(resource, b);
+
+ ((EList<EObject>)a1.eGet(ab5)).add(b1);
+ ((EList<EObject>)a1.eGet(ab5)).add(b2);
+ ((EList<EObject>)a1.eGet(ab5)).add(b3);
+ ((EList<EObject>)a1.eGet(ab5)).add(b4);
+
+ ((EList<EObject>)a1.eGet(ab6)).add(b1);
+ ((EList<EObject>)a1.eGet(ab6)).add(b2);
+ ((EList<EObject>)a1.eGet(ab6)).add(b3);
+ ((EList<EObject>)a1.eGet(ab6)).add(b4);
+
+ transaction.commit();
+
+ /******************/
+
+ List<CDOObjectReference> results = transaction.queryXRefs(CDOUtil.getCDOObject(b1), ab6);
+ assertEquals(1, results.size());
+
+ assertEquals(0, results.get(0).getSourceIndex());
+ assertEquals(ab6, results.get(0).getSourceReference());
+ assertEquals(a1, results.get(0).getSourceObject());
+ assertEquals(b1, results.get(0).getTargetObject());
+ }
+
+ private EObject addObject(CDOResource resource, EClass eClass)
+ {
+ EObject b8 = EcoreUtil.create(eClass);
+ resource.getContents().add(b8);
+ return b8;
+ }
+
+ private EReference addReference(EClass source, EClass target, boolean many)
+ {
+ EReference reference = EcoreFactory.eINSTANCE.createEReference();
+ EList<EStructuralFeature> features = source.getEStructuralFeatures();
+ features.add(reference);
+
+ reference.setName(target.getName().toLowerCase() + features.size());
+ reference.setEType(target);
+ reference.setUpperBound(many ? -1 : 1);
+ return reference;
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java
index 8880814c4d..59f98d19e7 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/transaction/CDOPushTransaction.java
@@ -561,6 +561,14 @@ public class CDOPushTransaction extends Notifier implements CDOTransaction
return delegate.queryResourcesAsync(folder, name, exactMatch);
}
+ /**
+ * @since 4.0
+ */
+ public List<CDOObjectReference> queryXRefs(CDOObject targetObject, EReference... sourceReferences)
+ {
+ return delegate.queryXRefs(targetObject, sourceReferences);
+ }
+
public List<CDOObjectReference> queryXRefs(Set<CDOObject> targetObjects, EReference... sourceReferences)
{
return delegate.queryXRefs(targetObjects, sourceReferences);
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java
index 09042278bb..0c5c5357f9 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOView.java
@@ -265,8 +265,23 @@ public interface CDOView extends CDOCommonView, CDOUpdatable, INotifier, IOption
boolean exactMatch);
/**
- * Returns a list of the resources in the given folder with a name equal to or starting with the value of the name
- * parameter.
+ * Returns a list of {@link CDOObjectReference object references} that represent the cross references to the specified
+ * target object.
+ *
+ * @param targetObject
+ * The target object that referencing objects are requested for.
+ * @param sourceReferences
+ * The reference features that referencing objects are requested for, or an empty array if all reference
+ * features are to be used in the request.
+ * @since 4.0
+ * @see CDOView#queryXRefs(Set, EReference...)
+ * @see CDOView#queryXRefsAsync(Set, EReference...)
+ */
+ public List<CDOObjectReference> queryXRefs(CDOObject targetObject, EReference... sourceReferences);
+
+ /**
+ * Returns a list of {@link CDOObjectReference object references} that represent the cross references to the specified
+ * target objects.
*
* @param targetObjects
* The set of target objects that referencing objects are requested for.
@@ -274,12 +289,14 @@ public interface CDOView extends CDOCommonView, CDOUpdatable, INotifier, IOption
* The reference features that referencing objects are requested for, or an empty array if all reference
* features are to be used in the request.
* @since 3.0
+ * @see CDOView#queryXRefs(CDOObject, EReference...)
+ * @see CDOView#queryXRefsAsync(Set, EReference...)
*/
public List<CDOObjectReference> queryXRefs(Set<CDOObject> targetObjects, EReference... sourceReferences);
/**
- * Returns an iterator over the resources in the given folder with a name equal to or starting with the value of the
- * name parameter. The underlying query will be executed asynchronously.
+ * Returns an iterator over the {@link CDOObjectReference object references} that represent the cross references to
+ * the specified target objects. The underlying query will be executed asynchronously.
*
* @param targetObjects
* The set of target objects that referencing objects are requested for.
@@ -287,6 +304,8 @@ public interface CDOView extends CDOCommonView, CDOUpdatable, INotifier, IOption
* The reference features that referencing objects are requested for, or an empty array if all reference
* features are to be used in the request.
* @since 3.0
+ * @see CDOView#queryXRefs(CDOObject, EReference...)
+ * @see CDOView#queryXRefs(Set, EReference...)
*/
public CloseableIterator<CDOObjectReference> queryXRefsAsync(Set<CDOObject> targetObjects,
EReference... sourceReferences);
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java
index 391232ec59..43cf8016b0 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java
@@ -88,6 +88,7 @@ import org.eclipse.emf.spi.cdo.InternalCDOViewSet;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -541,6 +542,11 @@ public abstract class AbstractCDOView extends Lifecycle implements InternalCDOVi
return query;
}
+ public List<CDOObjectReference> queryXRefs(CDOObject targetObject, EReference... sourceReferences)
+ {
+ return queryXRefs(Collections.singleton(targetObject), sourceReferences);
+ }
+
public List<CDOObjectReference> queryXRefs(Set<CDOObject> targetObjects, EReference... sourceReferences)
{
CDOQuery xrefsQuery = createXRefsQuery(targetObjects, sourceReferences);
@@ -614,7 +620,7 @@ public abstract class AbstractCDOView extends Lifecycle implements InternalCDOVi
builder.append("|");
}
- CDOClassifierRef classifierRef = new CDOClassifierRef(sourceReference.eClass());
+ CDOClassifierRef classifierRef = new CDOClassifierRef(sourceReference.getEContainingClass());
builder.append(classifierRef.getURI());
builder.append("|");
builder.append(sourceReference.getName());

Back to the top