/*
 * Copyright (c) 2012, 2014 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.CDOObject;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.model1.Category;
import org.eclipse.emf.cdo.tests.model1.OrderDetail;
import org.eclipse.emf.cdo.tests.model1.Product1;
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.spi.cdo.InternalCDOObject;
import org.eclipse.emf.spi.cdo.InternalCDOTransaction;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Bug 350987: Revision compare does not consider EObject values in references
 *
 * @author Egidijus Vaisnora
 */
public class Bugzilla_350987_Test extends AbstractCDOTest
{
  public void testRestoringReferences() throws CommitException
  {
    {
      CDOSession session = openSession();
      CDOTransaction transaction = session.openTransaction();
      CDOResource resource = transaction.createResource(getResourcePath("test"));

      Category category = getModel1Factory().createCategory();
      resource.getContents().add(category);

      Product1 product = getModel1Factory().createProduct1();
      product.setName("test1");
      category.getProducts().add(product);

      OrderDetail orderDetail = getModel1Factory().createOrderDetail();
      orderDetail.setProduct(product);
      resource.getContents().add(orderDetail);

      transaction.commit();
      session.close();
    }

    CDOSession session = openSession();
    CDOTransaction transaction = session.openTransaction();
    CDOResource resource = transaction.getResource(getResourcePath("test"));

    Category category = (Category)resource.getContents().get(0);
    OrderDetail orderDetail = (OrderDetail)resource.getContents().get(1);

    EList<Product1> products = category.getProducts();
    List<Product1> productList = new ArrayList<Product1>(products);
    products.clear(); // Detach
    products.addAll(productList); // Reattach

    CDOObject cdoOrderDetail = CDOUtil.getCDOObject(orderDetail);
    CDORevision revision = cdoOrderDetail.cdoRevision();

    Map<InternalCDOObject, InternalCDORevision> cleanRevisions = ((InternalCDOTransaction)transaction)
        .getCleanRevisions();
    InternalCDORevision originRevision = cleanRevisions.get(cdoOrderDetail);

    if (originRevision != null)
    {
      CDORevisionDelta delta = revision.compare(originRevision);

      // Comparing with clean revision should not give changes
      assertEquals(0, delta.size());
      assertEquals(true, delta.isEmpty());
    }

    Product1 product = products.get(0);
    resource.getContents().remove(1);
    resource.getContents().add(orderDetail);

    CDOObject cdoProduct = CDOUtil.getCDOObject(product);
    revision = cdoProduct.cdoRevision();
    int previousSize = product.getOrderDetails().size();
    product.getOrderDetails().add(orderDetail);

    // Element shouldn't be added
    assertEquals(previousSize, product.getOrderDetails().size());
    originRevision = cleanRevisions.get(cdoProduct);
    CDORevisionDelta delta2 = revision.compare(originRevision);

    // Comparing with clean revision should not give changes
    assertEquals(true, delta2.isEmpty());
  }
}
