blob: e72ce6195faf404d5644e6c78e3128f233b7c338 [file] [log] [blame]
/*
* Copyright (c) 2011-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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.tests.bugzilla;
import org.eclipse.emf.cdo.common.id.CDOID;
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.tests.model1.Customer;
import org.eclipse.emf.cdo.tests.model1.Model1Factory;
import org.eclipse.emf.cdo.tests.model1.Product1;
import org.eclipse.emf.cdo.tests.model1.SalesOrder;
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.common.util.EList;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.ecore.EObject;
import java.util.HashMap;
import java.util.Map;
/**
* @author Eike Stepper
*/
public class Bugzilla_335772_Test extends AbstractCDOTest
{
private Model1Factory factory;
private Customer customer;
private Product1 product1;
private Product1 product2;
private SalesOrder order1;
private SalesOrder order2;
private HashMap<Product1, SalesOrder> map;
@Override
protected void doSetUp() throws Exception
{
super.doSetUp();
factory = getModel1Factory();
customer = factory.createCustomer();
product1 = factory.createProduct1();
product1.setName("product1");
product2 = factory.createProduct1();
product2.setName("product2");
order1 = factory.createSalesOrder();
order1.setId(1);
order2 = factory.createSalesOrder();
order2.setId(2);
map = new HashMap<Product1, SalesOrder>();
map.put(product1, order1);
customer.eSet(getModel1Package().getCustomer_OrderByProduct(), map);
// delegateEList is not empty at this point
customer.getOrderByProduct().get(0);
}
@Override
protected void doTearDown() throws Exception
{
factory = null;
customer = null;
product1 = null;
product2 = null;
order1 = null;
order2 = null;
map = null;
super.doTearDown();
}
public void testMapEntryReplacement() throws Exception
{
replaceMapEntry();
// if delegateEList is empty at this point following line will throw IndexOutOfBoundsException
customer.getOrderByProduct().get(0);
}
public void testMapEntryAddition() throws Exception
{
addMapEntry();
// if delegateEList has only one element at this point following line will throw IndexOutOfBoundsException
customer.getOrderByProduct().get(1);
}
public void testMapEntryReplacementPersistence() throws Exception
{
replaceMapEntry();
assertEquals((Integer)2, persistAndRetrieveOrderIdForProduct1());
}
public void testMapEntryAdditionPersistence() throws Exception
{
addMapEntry();
assertEquals((Integer)1, persistAndRetrieveOrderIdForProduct1());
}
private void replaceMapEntry()
{
map.put(product1, order2);
assertEquals(1, map.size());
customer.eSet(getModel1Package().getCustomer_OrderByProduct(), map);
}
private void addMapEntry()
{
map.put(product2, order2);
assertEquals(2, map.size());
customer.eSet(getModel1Package().getCustomer_OrderByProduct(), map);
}
private Integer persistAndRetrieveOrderIdForProduct1() throws CommitException
{
CDOSession session = openSession();
try
{
CDOTransaction transaction = session.openTransaction();
CDOResource customerResource;
try
{
customerResource = transaction.getOrCreateResource(getResourcePath("/customer")); //$NON-NLS-1$
EList<EObject> customerResourceContents = customerResource.getContents();
customerResourceContents.clear();
customerResourceContents.add(customer);
customerResourceContents.add(product1);
customerResourceContents.add(product2);
customerResourceContents.add(order1);
customerResourceContents.add(order2);
transaction.commit();
}
finally
{
transaction.close();
}
transaction = session.openTransaction();
try
{
customerResource = transaction.getResource(getResourcePath("/customer")); //$NON-NLS-1$
Customer customer = (Customer)customerResource.getContents().get(0);
EMap<Product1, SalesOrder> orderByProduct = customer.getOrderByProduct();
orderByProduct.get(product1);
CDOID product1CDOID = CDOUtil.getCDOObject(product1).cdoID();
for (Map.Entry<Product1, SalesOrder> entry : orderByProduct.entrySet())
{
if (CDOUtil.getCDOObject(entry.getKey()).cdoID() == product1CDOID)
{
return entry.getValue().getId();
}
}
return null;
}
finally
{
transaction.close();
}
}
finally
{
session.close();
}
}
}