blob: 0303719435af4942ec49dbff928330dffec1ef32 [file] [log] [blame]
/*
* 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));
}
}
}