/*
 * Copyright (c) 2012 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:
 *    Torsten Scholz - initial API and implementation
 */
package org.eclipse.emf.cdo.tests.bugzilla;

import org.eclipse.emf.cdo.CDOObject;
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.Model1Factory;
import org.eclipse.emf.cdo.tests.model1.Order;
import org.eclipse.emf.cdo.tests.model1.OrderDetail;
import org.eclipse.emf.cdo.transaction.CDOTransaction;

/**
 * @author Torsten Scholz <scholz@kdo.de>
 */
public class Bugzilla_396181_Test extends AbstractCDOTest
{
  public void testCreatePersist() throws Exception
  {
    // Create an OrderDetail and add it to the resource
    final CDOSession session1 = openSession();
    final CDOTransaction transaction1 = session1.openTransaction();
    CDOResource resource1 = transaction1.getOrCreateResource(getResourcePath("/res1"));

    OrderDetail orderDetail = Model1Factory.eINSTANCE.createOrderDetail();
    resource1.getContents().add(orderDetail);
    transaction1.commit();

    // Create a SalesOrder an add it the resource in another transaction, commit the transaction
    final CDOSession session2 = openSession();
    final CDOTransaction transaction2 = session2.openTransaction();
    CDOResource resource2 = transaction2.getOrCreateResource(getResourcePath("/res1"));

    Order order = Model1Factory.eINSTANCE.createSalesOrder();
    resource2.getContents().add(order);
    commitAndSync(transaction2, transaction1);

    // Query the SalesOrder in the first opened transaction, add it to the OrderDetail, commit the first transaction
    Order queriedOrder = (Order)transaction1.getObject(((CDOObject)order).cdoID());
    orderDetail.setOrder(queriedOrder);
    transaction1.commit();
  }
}
