diff options
author | Eike Stepper | 2010-12-27 09:50:08 +0000 |
---|---|---|
committer | Eike Stepper | 2010-12-27 09:50:08 +0000 |
commit | 0465fdd3e6f686aab65cc60d7d7fc71c8eff7213 (patch) | |
tree | 8a811b0695b3716f38dc40253557a79746e8a3c3 | |
parent | e4b40d895ed76808ace9509ec9e3dfa9552d48db (diff) | |
download | cdo-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
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()); |