| /* |
| * Copyright (c) 2010-2013 Eike Stepper (Berlin, Germany) and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Stefan Winkler - initial API and implementation |
| */ |
| package org.eclipse.emf.cdo.tests.bugzilla; |
| |
| import org.eclipse.emf.cdo.CDOObjectReference; |
| import org.eclipse.emf.cdo.common.model.EMFUtil; |
| import org.eclipse.emf.cdo.eresource.CDOResource; |
| import org.eclipse.emf.cdo.session.CDOSession; |
| import org.eclipse.emf.cdo.tests.AbstractCDOTest; |
| import org.eclipse.emf.cdo.transaction.CDOTransaction; |
| import org.eclipse.emf.cdo.util.CDOUtil; |
| import org.eclipse.emf.cdo.util.CommitException; |
| import org.eclipse.emf.cdo.view.CDOView; |
| |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.ecore.EAttribute; |
| 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.EcorePackage; |
| import org.eclipse.emf.ecore.util.EcoreUtil; |
| |
| import java.util.Collections; |
| import java.util.List; |
| |
| /** |
| * @author Stefan Winkler |
| */ |
| public class Bugzilla_331619_Test extends AbstractCDOTest |
| { |
| @SuppressWarnings("unchecked") |
| public void testAbstractXRef() throws CommitException |
| { |
| skipStoreWithoutQueryXRefs(); |
| |
| // set up model |
| EPackage pkg = createUniquePackage(); |
| EClass ref = EMFUtil.createEClass(pkg, "referencee", false, false); |
| EAttribute refName = EMFUtil.createEAttribute(ref, "refname", EcorePackage.eINSTANCE.getEString()); |
| |
| EClass abs = EMFUtil.createEClass(pkg, "abstractClass", true, false); |
| EReference reference = EMFUtil.createEReference(abs, "reference", ref, false, true); |
| reference.setContainment(false); |
| |
| EClass con = EMFUtil.createEClass(pkg, "concreteClass", false, false); |
| con.getESuperTypes().add(abs); |
| EAttribute conName = EMFUtil.createEAttribute(con, "conname", EcorePackage.eINSTANCE.getEString()); |
| |
| CDOUtil.prepareDynamicEPackage(pkg); |
| |
| // write model |
| { |
| CDOSession session = openSession(); |
| CDOTransaction tx = session.openTransaction(); |
| CDOResource refres = tx.createResource(getResourcePath("/test/referenced")); |
| CDOResource conres = tx.createResource(getResourcePath("/test/concrete")); |
| |
| EObject[] oRef = new EObject[6]; |
| for (int i = 0; i < 6; i++) |
| { |
| oRef[i] = EcoreUtil.create(ref); |
| oRef[i].eSet(refName, "ref" + i); |
| refres.getContents().add(oRef[i]); |
| } |
| |
| EObject con1 = EcoreUtil.create(con); |
| con1.eSet(conName, "con1"); |
| ((EList<EObject>)con1.eGet(reference)).add(oRef[1]); |
| ((EList<EObject>)con1.eGet(reference)).add(oRef[5]); |
| conres.getContents().add(con1); |
| |
| EObject con2 = EcoreUtil.create(con); |
| con2.eSet(conName, "con2"); |
| ((EList<EObject>)con2.eGet(reference)).add(oRef[4]); |
| ((EList<EObject>)con2.eGet(reference)).add(oRef[1]); |
| conres.getContents().add(con2); |
| |
| tx.commit(); |
| tx.close(); |
| session.close(); |
| } |
| |
| // read model |
| { |
| CDOSession session = openSession(); |
| CDOView view = session.openView(); |
| CDOResource res = view.getResource(getResourcePath("/test/referenced")); |
| |
| EObject oRef = res.getContents().get(0); |
| refName = (EAttribute)oRef.eClass().getEStructuralFeature("refname"); |
| assertEquals("ref0", oRef.eGet(refName)); |
| List<CDOObjectReference> results = view.queryXRefs(Collections.singleton(CDOUtil.getCDOObject(oRef))); |
| assertEquals(0, results.size()); |
| |
| oRef = res.getContents().get(1); |
| assertEquals("ref1", oRef.eGet(refName)); |
| results = view.queryXRefs(Collections.singleton(CDOUtil.getCDOObject(oRef))); |
| assertEquals(2, results.size()); |
| |
| conName = (EAttribute)((EObject)results.get(0).getSourceObject()).eClass().getEStructuralFeature("conname"); |
| String conName1 = (String)results.get(0).getSourceObject().eGet(conName); |
| String conName2 = (String)results.get(1).getSourceObject().eGet(conName); |
| |
| assertEquals(true, conName1.equals("con1") || conName1.equals("con2")); |
| assertEquals(true, conName2.equals("con1") || conName2.equals("con2")); |
| assertEquals(true, !conName1.equals(conName2)); |
| |
| oRef = res.getContents().get(2); |
| assertEquals("ref2", oRef.eGet(refName)); |
| results = view.queryXRefs(Collections.singleton(CDOUtil.getCDOObject(oRef))); |
| assertEquals(0, results.size()); |
| |
| oRef = res.getContents().get(3); |
| assertEquals("ref3", oRef.eGet(refName)); |
| results = view.queryXRefs(Collections.singleton(CDOUtil.getCDOObject(oRef))); |
| assertEquals(0, results.size()); |
| |
| oRef = res.getContents().get(4); |
| assertEquals("ref4", oRef.eGet(refName)); |
| results = view.queryXRefs(Collections.singleton(CDOUtil.getCDOObject(oRef))); |
| assertEquals(1, results.size()); |
| assertEquals("con2", (String)results.get(0).getSourceObject().eGet(conName)); |
| |
| oRef = res.getContents().get(5); |
| assertEquals("ref5", oRef.eGet(refName)); |
| results = view.queryXRefs(Collections.singleton(CDOUtil.getCDOObject(oRef))); |
| assertEquals(1, results.size()); |
| assertEquals("con1", (String)results.get(0).getSourceObject().eGet(conName)); |
| } |
| } |
| } |