/*
 * Copyright (c) 2012, 2015 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.eresource.CDOResourceFactory;
import org.eclipse.emf.cdo.net4j.CDONet4jUtil;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.config.ISessionConfig;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires;
import org.eclipse.emf.cdo.tests.config.impl.RepositoryConfig;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.model1.Customer;
import org.eclipse.emf.cdo.tests.model1.PurchaseOrder;
import org.eclipse.emf.cdo.tests.model1.SalesOrder;
import org.eclipse.emf.cdo.tests.model1.Supplier;
import org.eclipse.emf.cdo.util.CDOURIData;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.Resource.Factory.Registry;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;

import java.util.Collections;

/**
 * @author Eike Stepper
 */
@Requires(ISessionConfig.CAPABILITY_NET4J_TCP)
public class Bugzilla_329786_Test extends AbstractCDOTest
{
  public void testConnectionAwareURI() throws Exception
  {
    getRepository();

    Registry registry = Resource.Factory.Registry.INSTANCE;
    registry.getProtocolToFactoryMap().put(CDONet4jUtil.PROTOCOL_TCP, CDOResourceFactory.INSTANCE);
    registry.getExtensionToFactoryMap().put("model1", new XMIResourceFactoryImpl());

    try
    {
      URI localURI = createLocalAndRemoteResource();
      accessRemoteObjectByLocalReferences(localURI);
    }
    finally
    {
      registry.getProtocolToFactoryMap().remove(CDONet4jUtil.PROTOCOL_TCP);
      registry.getExtensionToFactoryMap().remove("model1");
    }
  }

  private URI createLocalAndRemoteResource() throws Exception
  {
    ResourceSet resourceSet = new ResourceSetImpl();

    URI sharedURI = URI.createURI(CDONet4jUtil.PROTOCOL_TCP + "://localhost:2036/" + RepositoryConfig.REPOSITORY_NAME
        + getResourcePath("/sharedResource")).appendQuery(CDOURIData.TRANSACTIONAL_PARAMETER + "=true");
    Resource sharedResource = resourceSet.createResource(sharedURI);

    URI localURI = URI.createFileURI(createTempFile("resource", ".model1").getCanonicalPath());
    Resource localResource = resourceSet.createResource(localURI);

    Company localCompany = getModel1Factory().createCompany();
    localCompany.setName("localCompany");

    Company sharedCompany = getModel1Factory().createCompany();
    sharedCompany.setName("sharedCompany");

    Customer localCustomer = getModel1Factory().createCustomer();
    localCustomer.setName("localCustomer");

    Customer sharedCustomer = getModel1Factory().createCustomer();
    sharedCustomer.setName("sharedCustomer");

    Supplier localSupplier = getModel1Factory().createSupplier();
    localSupplier.setName("localSupplier");

    Supplier sharedSupplier = getModel1Factory().createSupplier();
    sharedSupplier.setName("sharedSupplier");

    SalesOrder sharedSalesOrder = getModel1Factory().createSalesOrder();
    SalesOrder localSalesOrder = getModel1Factory().createSalesOrder();
    PurchaseOrder sharedPurchaseOrder = getModel1Factory().createPurchaseOrder();
    PurchaseOrder localPurchaseOrder = getModel1Factory().createPurchaseOrder();

    sharedResource.getContents().add(sharedCompany);
    sharedCompany.getCustomers().add(sharedCustomer);
    sharedCompany.getSuppliers().add(sharedSupplier);
    sharedCompany.getSalesOrders().add(sharedSalesOrder);
    sharedCompany.getPurchaseOrders().add(sharedPurchaseOrder);

    localResource.getContents().add(localCompany);
    localCompany.getCustomers().add(localCustomer);
    localCompany.getSuppliers().add(localSupplier);
    localCompany.getSalesOrders().add(localSalesOrder);
    localCompany.getPurchaseOrders().add(localPurchaseOrder);

    localCustomer.getSalesOrders().add(sharedSalesOrder);
    localSupplier.getPurchaseOrders().add(sharedPurchaseOrder);

    sharedCustomer.getSalesOrders().add(localSalesOrder);
    sharedSupplier.getPurchaseOrders().add(localPurchaseOrder);

    sharedResource.save(Collections.emptyMap());
    localResource.save(Collections.emptyMap());
    return localURI;
  }

  private void accessRemoteObjectByLocalReferences(URI localURI)
  {
    ResourceSet resourceSet = new ResourceSetImpl();
    Resource localResource = resourceSet.getResource(localURI, true);
    assertEquals(true, localResource.getContents().get(0) instanceof Company);

    Company localCompany = (Company)localResource.getContents().get(0);
    assertEquals("localCompany", localCompany.getName());

    Customer localCustomer = localCompany.getCustomers().get(0);
    assertEquals(1, localCustomer.getSalesOrders().size());

    Supplier localSupplier = localCompany.getSuppliers().get(0);
    assertEquals(1, localSupplier.getPurchaseOrders().size());

    SalesOrder sharedSalesOrder = localCustomer.getSalesOrders().get(0);
    assertEquals(true, sharedSalesOrder.eResource() instanceof CDOResource);

    PurchaseOrder sharedPurchaseOrder = localSupplier.getPurchaseOrders().get(0);
    assertEquals(true, sharedPurchaseOrder.eResource() instanceof CDOResource);
  }
}
