/*
 * 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:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.emf.cdo.tests.bugzilla;

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.Category;
import org.eclipse.emf.cdo.tests.model1.Product1;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CommitException;

import org.eclipse.emf.common.notify.impl.AdapterImpl;

/**
 * @author Eike Stepper
 */
public class Bugzilla_324544_Test extends AbstractCDOTest
{
  public void testCommitRefresh() throws CommitException
  {
    // user 1
    CDOSession s1 = openSession();
    CDOTransaction t1 = s1.openTransaction();
    CDOResource r1 = t1.createResource(getResourcePath("test"));
    Category c1 = getModel1Factory().createCategory();
    r1.getContents().add(c1);
    t1.commit();
    Product1 p1 = getModel1Factory().createProduct1();
    p1.setName("p1");
    c1.getProducts().add(p1);

    // user 2
    CDOSession s2 = openSession();
    s2.options().setPassiveUpdateEnabled(false);

    CDOTransaction t2 = s2.openTransaction();
    CDOResource r2 = t2.getResource(getResourcePath("test"));

    Category c2 = (Category)r2.getContents().get(0);
    Product1 p2 = getModel1Factory().createProduct1();
    p2.setName("p2");
    c2.getProducts().add(p2);
    c2.eAdapters().add(new AdapterImpl());

    // user 1
    t1.commit();

    // user2
    s2.refresh();
  }
}
