/*
 * Copyright (c) 2004-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.common.branch.CDOBranch;
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.spi.common.revision.InternalCDORevision;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.config.IRepositoryConfig;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires;
import org.eclipse.emf.cdo.tests.model1.Category;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.view.CDOView;

/**
 * See bug 439173.
 *
 * @author Leonid Ripeynih
 */
@Requires(IRepositoryConfig.CAPABILITY_BRANCHING)
public class Bugzilla_439173_Test extends AbstractCDOTest
{
  public void testSwitchTargetVersion() throws Exception
  {
    CDOSession session = openSession();

    // Create an object in main branch
    //
    CDOTransaction mainTx = session.openTransaction();
    String path = getResourcePath("test");
    CDOResource resource = mainTx.createResource(path);
    resource.getContents().add(createCategory("cat1"));
    mainTx.commit();
    mainTx.close();

    // Create a branch and change object
    //
    CDOBranch branch = session.getBranchManager().getMainBranch().createBranch("branch");
    CDOTransaction branchTx = session.openTransaction(branch);
    resource = branchTx.getResource(path);

    // Change resource in branch twice (so it's version becomes 2)
    //
    resource.getContents().add(createCategory("cat2"));
    branchTx.commit();
    resource.getContents().add(createCategory("cat3"));
    branchTx.commit();
    branchTx.close();

    // Open another session to invalidate cache
    //
    session.close();
    CDOSession cleanSession = openSession();

    // Open view on new session and switch target
    //
    CDOView view = cleanSession.openView();
    resource = view.getResource(path);
    resource.getContents().size();

    assertEquals(1, resource.cdoRevision().getVersion());
    view.setBranch(branch);
    assertEquals(2, resource.cdoRevision().getVersion());
  }

  public void testSwitchTargetVersionResourceID() throws Exception
  {
    CDOSession session = openSession();

    // Create an object in main branch
    //
    CDOTransaction mainTx = session.openTransaction();
    String sourcePath = getResourcePath("source");
    String targetPath = getResourcePath("target");
    CDOResource resource = mainTx.createResource(sourcePath);
    Category category = createCategory("cat1");
    resource.getContents().add(category);

    mainTx.commit();
    CDOID sourceResourceID = resource.cdoID();
    mainTx.close();

    // Create a branch and change object
    //
    CDOBranch branch = session.getBranchManager().getMainBranch().createBranch("branch");
    CDOTransaction branchTx = session.openTransaction(branch);
    resource = branchTx.getResource(sourcePath);

    // Change category resource
    //
    CDOResource targetResource = branchTx.createResource(targetPath);
    targetResource.getContents().addAll(resource.getContents());

    branchTx.commit();
    CDOID targetResourceID = targetResource.cdoID();
    branchTx.close();

    // Open another session to invalidate cache
    //
    session.close();
    CDOSession cleanSession = openSession();

    // Open view on new session and switch target
    //
    CDOView view = cleanSession.openView();
    resource = view.getResource(sourcePath);
    category = (Category)resource.getContents().get(0);
    category.getName();

    assertEquals(sourceResourceID, ((InternalCDORevision)CDOUtil.getCDOObject(category).cdoRevision()).getResourceID());
    view.setBranch(branch);
    assertEquals(targetResourceID, ((InternalCDORevision)CDOUtil.getCDOObject(category).cdoRevision()).getResourceID());
  }

  private Category createCategory(String name)
  {
    Category category = getModel1Factory().createCategory();
    category.setName(name);
    return category;
  }
}
