/*******************************************************************************
 * Copyright (c) 2017 Obeo.
 * 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:
 *    Obeo - initial API and implementation and/or initial documentation
 *    ...
 *******************************************************************************/
package org.eclipse.intent.mapping.emf.tests.connector;

import anydsl.AnydslPackage;
import anydsl.ProductionCompany;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

import org.eclipse.emf.cdo.common.lob.CDOBlob;
import org.eclipse.emf.cdo.common.lob.CDOClob;
import org.eclipse.emf.cdo.common.util.CDOException;
import org.eclipse.emf.cdo.eresource.CDOBinaryResource;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.eresource.CDOResourceFolder;
import org.eclipse.emf.cdo.eresource.CDOTextResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.intent.mapping.MappingUtils;
import org.eclipse.intent.mapping.base.BaseElementFactory;
import org.eclipse.intent.mapping.base.IBase;
import org.eclipse.intent.mapping.base.ILocation;
import org.eclipse.intent.mapping.emf.ICDOBinaryResourceLocation;
import org.eclipse.intent.mapping.emf.ICDOFolderLocation;
import org.eclipse.intent.mapping.emf.ICDORepositoryLocation;
import org.eclipse.intent.mapping.emf.ICDOResourceLocation;
import org.eclipse.intent.mapping.emf.ICDOResourceNodeLocation;
import org.eclipse.intent.mapping.emf.ICDOTextResourceLocation;
import org.eclipse.intent.mapping.emf.ICouple;
import org.eclipse.intent.mapping.emf.IEObjectLocation;
import org.eclipse.intent.mapping.emf.connector.CDOResourceNodeConnector;
import org.eclipse.intent.mapping.emf.connector.CDOViewConnector;
import org.eclipse.intent.mapping.emf.connector.EObjectConnector;
import org.eclipse.intent.mapping.emf.connector.MappingCDOListener;
import org.eclipse.intent.mapping.emf.tests.AllTests;
import org.eclipse.intent.mapping.emf.tests.CDOServer;
import org.eclipse.intent.mapping.emf.tests.CDOUtils;
import org.eclipse.intent.mapping.emf.tests.connector.CDOResourceNodeConnectorTests.TestCDOBinaryResourceLocation;
import org.eclipse.intent.mapping.emf.tests.connector.CDOResourceNodeConnectorTests.TestCDOFolderLocation;
import org.eclipse.intent.mapping.emf.tests.connector.CDOResourceNodeConnectorTests.TestCDOResourceLocation;
import org.eclipse.intent.mapping.emf.tests.connector.CDOResourceNodeConnectorTests.TestCDOTextResourceLocation;
import org.eclipse.intent.mapping.emf.tests.connector.CDOViewConnectorTests.TestCDORepositoryLocation;
import org.eclipse.intent.mapping.emf.tests.connector.EObjectConnectorParametrizedTests.TestEObjectLocation;
import org.eclipse.intent.mapping.tests.base.BaseElementFactoryTests.TestCouple;
import org.eclipse.intent.mapping.tests.base.BaseRegistryTests;
import org.eclipse.net4j.connector.IConnector;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

/**
 * Test {@link MappingCDOListener}.
 *
 * @author <a href="mailto:yvan.lussaud@obeo.fr">Yvan Lussaud</a>
 */
public class MappingCDOListenerTest {

	/**
	 * The buffer size.
	 */
	private static final int BUFFZE_SIZE = 8192;

	/**
	 * The {@link CDOTransaction}.
	 */
	private static CDOTransaction transaction;

	/**
	 * The {@link CDOTransaction}.
	 */
	private static CDOTransaction otherTransaction;

	/**
	 * The {@link CDOViewConnector}.
	 */
	private static CDOViewConnector viewConnector = new CDOViewConnector();

	/**
	 * The {@link CDOResourceNodeConnector}.
	 */
	private static CDOResourceNodeConnector resourceConnector = new CDOResourceNodeConnector();

	/**
	 * The {@link EObjectConnector}.
	 */
	private static EObjectConnector eObjectConnector = new EObjectConnector();

	@BeforeClass
	public static void beforeClass() {
		AllTests.startCDOServer();
		IConnector connector = CDOUtils.getConnector(CDOServer.PROTOCOL + "://" + CDOServer.IP + ":"
				+ CDOServer.PORT);
		CDOSession session = CDOUtils.openSession(connector, CDOServer.REPOSITORY_NAME);
		transaction = CDOUtils.openTransaction(session);
		otherTransaction = CDOUtils.openTransaction(session);

		viewConnector.addSessionToCache(transaction);

		MappingUtils.getConnectorRegistry().register(viewConnector);
		MappingUtils.getConnectorRegistry().register(resourceConnector);
		MappingUtils.getConnectorRegistry().register(eObjectConnector);
	}

	@AfterClass
	public static void afterClass() {
		viewConnector.removeSessionFromCache(transaction);

		MappingUtils.getConnectorRegistry().unregister(viewConnector);
		MappingUtils.getConnectorRegistry().unregister(resourceConnector);
		MappingUtils.getConnectorRegistry().unregister(eObjectConnector);

		transaction.close();
		otherTransaction.close();
		AllTests.stopCDOServer();
	}

	@Test
	public void deleteResourceNode() throws Exception {
		final IBase base = new BaseRegistryTests.TestBase();
		base.getFactory().addDescriptor(ICDORepositoryLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDORepositoryLocation>(
						TestCDORepositoryLocation.class));
		base.getFactory().addDescriptor(ICDOFolderLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDOFolderLocation>(TestCDOFolderLocation.class));

		final String path = this.getClass().getCanonicalName() + "/test1/";
		final CDOResourceFolder folder = otherTransaction.createResourceFolder(path);
		otherTransaction.commit();

		final ILocation container = MappingUtils.getConnectorRegistry().createLocation(base, transaction);
		final ILocation location = MappingUtils.getConnectorRegistry().createLocation(container, folder);

		assertNotNull(otherTransaction.getResourceNode(path));
		assertFalse(container.getContents().isEmpty());

		viewConnector.addBaseToUpdate(base);
		folder.delete(null);
		otherTransaction.commit();
		viewConnector.removeBaseToUpdate(base);

		try {
			transaction.getResourceNode(path);
			fail("the resource should be deleted by now.");
		} catch (CDOException e) {
			// nothing to do here
		}
		assertNull(location.getContainer());
	}

	@Test
	public void renameResourceNode() throws Exception {
		final IBase base = new BaseRegistryTests.TestBase();
		base.getFactory().addDescriptor(ICDORepositoryLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDORepositoryLocation>(
						TestCDORepositoryLocation.class));
		base.getFactory().addDescriptor(ICDOFolderLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDOFolderLocation>(TestCDOFolderLocation.class));

		final String path = this.getClass().getCanonicalName() + "/test2/";
		final CDOResourceFolder folder = otherTransaction.createResourceFolder(path);
		otherTransaction.commit();

		final ILocation container = MappingUtils.getConnectorRegistry().createLocation(base, transaction);
		final ICDOResourceNodeLocation location = (ICDOResourceNodeLocation)MappingUtils
				.getConnectorRegistry().createLocation(container, folder);

		assertNotNull(otherTransaction.getResourceNode(path));
		assertFalse(container.getContents().isEmpty());

		viewConnector.addBaseToUpdate(base);
		folder.setName("someNewName");
		otherTransaction.commit();
		viewConnector.removeBaseToUpdate(base);

		try {
			transaction.getResourceNode(path);
			fail("the resource should be deleted by now.");
		} catch (CDOException e) {
			// nothing to do here
		}
		assertEquals("/org.eclipse.intent.mapping.emf.tests.connector.MappingCDOListenerTest/someNewName",
				location.getPath());
	}

	@Test
	public void renameParentResourceNode() throws Exception {
		final IBase base = new BaseRegistryTests.TestBase();
		base.getFactory().addDescriptor(ICDORepositoryLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDORepositoryLocation>(
						TestCDORepositoryLocation.class));
		base.getFactory().addDescriptor(ICDOFolderLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDOFolderLocation>(TestCDOFolderLocation.class));

		final String path = this.getClass().getCanonicalName() + "/test3/";
		final CDOResourceFolder folder = otherTransaction.createResourceFolder(path);
		otherTransaction.commit();

		final ILocation container = MappingUtils.getConnectorRegistry().createLocation(base, transaction);
		final ICDOResourceNodeLocation location = (ICDOResourceNodeLocation)MappingUtils
				.getConnectorRegistry().createLocation(container, folder);

		assertNotNull(otherTransaction.getResourceNode(path));
		assertFalse(container.getContents().isEmpty());

		viewConnector.addBaseToUpdate(base);
		folder.getFolder().setName("someNewName");
		otherTransaction.commit();
		viewConnector.removeBaseToUpdate(base);

		try {
			transaction.getResourceNode(path);
			fail("the resource should be deleted by now.");
		} catch (CDOException e) {
			// nothing to do here
		}
		assertEquals("/someNewName/test3", location.getPath());
	}

	@Test
	public void resourceContentChanged() throws Exception {
		final IBase base = new BaseRegistryTests.TestBase();
		base.getFactory().addDescriptor(ICDORepositoryLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDORepositoryLocation>(
						TestCDORepositoryLocation.class));
		base.getFactory().addDescriptor(ICDOResourceLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDOResourceLocation>(
						TestCDOResourceLocation.class));
		base.getFactory().addDescriptor(IEObjectLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestEObjectLocation>(TestEObjectLocation.class));
		base.getFactory().addDescriptor(ICouple.class, new BaseElementFactory.FactoryDescriptor<TestCouple>(
				TestCouple.class));

		final String path = this.getClass().getCanonicalName() + "/test.resource";
		final CDOResource resource = otherTransaction.createResource(path);
		final ProductionCompany eObject = AnydslPackage.eINSTANCE.getAnydslFactory()
				.createProductionCompany();
		resource.getContents().add(eObject);
		eObject.setName("MyCompany");
		resource.save(null);
		otherTransaction.commit();

		final ILocation container = MappingUtils.getConnectorRegistry().createLocation(base, transaction);
		final ICDOResourceLocation resourceLocation = (ICDOResourceLocation)MappingUtils
				.getConnectorRegistry().createLocation(container, resource);
		final IEObjectLocation eObjectLocation = (IEObjectLocation)MappingUtils.getConnectorRegistry()
				.createLocation(resourceLocation, eObject);

		final String initialXMIContent = resourceLocation.getXMIContent();
		final String initialURIFragment = eObjectLocation.getURIFragment();

		assertNotNull(otherTransaction.getResourceNode(path));
		assertFalse(container.getContents().isEmpty());
		assertFalse(initialXMIContent == null || initialXMIContent.isEmpty());
		assertFalse(initialURIFragment == null || initialURIFragment.isEmpty());

		viewConnector.addBaseToUpdate(base);
		eObject.setName("someNewName");
		otherTransaction.commit();
		viewConnector.removeBaseToUpdate(base);

		assertFalse(resourceLocation.getXMIContent().isEmpty());
		assertFalse(initialXMIContent.equals(resourceLocation.getXMIContent()));
		assertTrue(initialURIFragment.equals(eObjectLocation.getURIFragment()));
	}

	@Test
	public void textResourceContentChanged() throws Exception {
		final IBase base = new BaseRegistryTests.TestBase();
		base.getFactory().addDescriptor(ICDORepositoryLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDORepositoryLocation>(
						TestCDORepositoryLocation.class));
		base.getFactory().addDescriptor(ICDOTextResourceLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDOTextResourceLocation>(
						TestCDOTextResourceLocation.class));
		base.getFactory().addDescriptor(IEObjectLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestEObjectLocation>(TestEObjectLocation.class));
		base.getFactory().addDescriptor(ICouple.class, new BaseElementFactory.FactoryDescriptor<TestCouple>(
				TestCouple.class));

		final String path = this.getClass().getCanonicalName() + "/test.txt";
		final CDOTextResource resource = otherTransaction.createTextResource(path);
		resource.setContents(new CDOClob(new StringReader("some text")));
		otherTransaction.commit();

		final ILocation container = MappingUtils.getConnectorRegistry().createLocation(base, transaction);
		final ICDOTextResourceLocation resourceLocation = (ICDOTextResourceLocation)MappingUtils
				.getConnectorRegistry().createLocation(container, resource);

		assertNotNull(otherTransaction.getResourceNode(path));
		assertFalse(container.getContents().isEmpty());
		final String initialContent = getContent(resource.getContents().getContents());
		assertEquals(initialContent, resourceLocation.getText());

		viewConnector.addBaseToUpdate(base);
		resource.setContents(new CDOClob(new StringReader("some other text blah !")));
		otherTransaction.commit();
		viewConnector.removeBaseToUpdate(base);

		final String newContent = getContent(resource.getContents().getContents());
		assertFalse(initialContent.equals(newContent));
		assertEquals(newContent, resourceLocation.getText());
	}

	@Test
	@Ignore
	public void binaryResourceContentChanged() throws Exception {
		final IBase base = new BaseRegistryTests.TestBase();
		base.getFactory().addDescriptor(ICDORepositoryLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDORepositoryLocation>(
						TestCDORepositoryLocation.class));
		base.getFactory().addDescriptor(ICDOBinaryResourceLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestCDOBinaryResourceLocation>(
						TestCDOBinaryResourceLocation.class));
		base.getFactory().addDescriptor(IEObjectLocation.class,
				new BaseElementFactory.FactoryDescriptor<TestEObjectLocation>(TestEObjectLocation.class));
		base.getFactory().addDescriptor(ICouple.class, new BaseElementFactory.FactoryDescriptor<TestCouple>(
				TestCouple.class));

		final String path = this.getClass().getCanonicalName() + "/test.bin";
		final CDOBinaryResource resource = otherTransaction.createBinaryResource(path);
		resource.setContents(new CDOBlob(new ByteArrayInputStream("some binary data".getBytes())));
		otherTransaction.commit();

		final ILocation container = MappingUtils.getConnectorRegistry().createLocation(base, transaction);
		final ICDOBinaryResourceLocation resourceLocation = (ICDOBinaryResourceLocation)MappingUtils
				.getConnectorRegistry().createLocation(container, resource);

		assertNotNull(otherTransaction.getResourceNode(path));
		assertFalse(container.getContents().isEmpty());

		viewConnector.addBaseToUpdate(base);
		resource.setContents(new CDOBlob(new ByteArrayInputStream("some other binary data blah !"
				.getBytes())));
		otherTransaction.commit();
		viewConnector.removeBaseToUpdate(base);

		// TODO assert resourceLocation
	}

	/**
	 * Gets the content of the given {@link Reader}.
	 * 
	 * @param reader
	 *            the {@link Reader}
	 * @return the content of the given {@link Reader}
	 * @throws IOException
	 *             if the {@link Reader} can't be read
	 */
	private String getContent(Reader reader) throws IOException {
		final StringBuilder builder = new StringBuilder();

		char[] buffer = new char[BUFFZE_SIZE];
		while (reader.read(buffer) != -1) {
			builder.append(buffer);
		}

		return builder.toString();
	}

}
