/*******************************************************************************
 * Copyright (c) 2010, 2012 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
 *******************************************************************************/
package org.eclipse.mylyn.docs.intent.client.ui.test.unit.cdo;

import org.eclipse.mylyn.docs.intent.client.ui.editor.IntentEditor;
import org.eclipse.mylyn.docs.intent.client.ui.editor.IntentEditorDocument;
import org.eclipse.mylyn.docs.intent.client.ui.test.unit.cdo.util.AbstractIntentCDOTest;
import org.eclipse.mylyn.docs.intent.client.ui.utils.IntentEditorOpener;
import org.eclipse.mylyn.docs.intent.collab.common.location.IntentLocations;
import org.eclipse.mylyn.docs.intent.collab.common.repository.IntentRepositoryManager;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.IntentCommand;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.ReadOnlyException;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.RepositoryAdapter;
import org.eclipse.mylyn.docs.intent.core.document.IntentDocument;
import org.eclipse.mylyn.docs.intent.core.document.IntentDocumentFactory;

/**
 * Basic tests ensuring that Intent works correctly when the document is stored on a CDO Repository.
 * 
 * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
 */
public class CDOIntegrationTest extends AbstractIntentCDOTest {

	private static final String INTENT_ABSTRACT_RESOURCE_DOCUMENT_PATH = "data/unit/documents/scenario/abstract_resources.intent";

	/**
	 * A test that ensure that a local user can :
	 * <ul>
	 * <li>Create/get an intent document located on a cdo repository</li>
	 * <li>Receive changes made by remote users.</li>
	 * </ul>
	 * 
	 * @throws Exception
	 */
	public void testBasicRelationshipBetweenLocalAndRemoteUser() throws Exception {
		// Local user creates and get the intent project
		setUpIntentProject("myIntentProject", INTENT_ABSTRACT_RESOURCE_DOCUMENT_PATH, false);
		final IntentDocument cdoIntentDocument = getIntentDocument();
		repositoryAdapter.save();
		final int initialChapterNumber = cdoIntentDocument.getChapters().size();
		assertNotNull("Intent document has not been correctly created on the repository", cdoIntentDocument);

		// Some remote user modifies the intent document by adding a chapter
		final RepositoryAdapter remoteUser = IntentRepositoryManager.INSTANCE.getRepository(
				getIntentRepositoryIdentifier()).createRepositoryAdapter();
		remoteUser.openSaveContext();
		remoteUser.execute(new IntentCommand() {

			public void execute() {
				IntentDocument remoteIntentDocument;
				try {
					remoteIntentDocument = (IntentDocument)remoteUser
							.getOrCreateResource(IntentLocations.INTENT_INDEX).getContents().iterator()
							.next();
					assertFalse("Remote and Local user should not share the same instance",
							remoteIntentDocument == cdoIntentDocument);
					remoteIntentDocument.getChapters().add(
							IntentDocumentFactory.eINSTANCE.createIntentChapter());
				} catch (ReadOnlyException e) {
					fail(e.getMessage());
				}
			}
		});
		assertEquals("Remote modification should not have been received by the local user",
				initialChapterNumber, cdoIntentDocument.getChapters().size());
		remoteUser.save();
		remoteUser.closeContext();

		assertEquals("Remote modification should have been received by the local user",
				initialChapterNumber + 1, cdoIntentDocument.getChapters().size());
	}

	/**
	 * Ensures that when remote users make modifications and commit.
	 * 
	 * @throws Exception
	 */
	public void testRemoteChangesIntegrationInsideEditor() throws Exception {
		// Local user opens an editor on an Intent document
		setUpIntentProject("myIntentProject", INTENT_ABSTRACT_RESOURCE_DOCUMENT_PATH, false);
		IntentEditor editor = IntentEditorOpener.openIntentEditor(
				IntentRepositoryManager.INSTANCE.getRepository(getIntentRepositoryIdentifier()), false);
		waitForAllOperationsInUIThread();
		String initialContent = ((IntentEditorDocument)editor.getDocumentProvider().getDocument(
				editor.getEditorInput())).get();

		// Remote user adds an untitled chapter
		final RepositoryAdapter remoteUser = IntentRepositoryManager.INSTANCE.getRepository(
				getIntentRepositoryIdentifier()).createRepositoryAdapter();
		remoteUser.openSaveContext();
		remoteUser.execute(new IntentCommand() {

			public void execute() {
				IntentDocument remoteIntentDocument;
				try {
					remoteIntentDocument = (IntentDocument)remoteUser
							.getOrCreateResource(IntentLocations.INTENT_INDEX).getContents().iterator()
							.next();
					remoteIntentDocument.getChapters().add(
							IntentDocumentFactory.eINSTANCE.createIntentChapter());
				} catch (ReadOnlyException e) {
					fail(e.getMessage());
				}
			}
		});
		remoteUser.save();
		remoteUser.closeContext();
		waitForAllOperationsInUIThread();

		// Local user should see the new chapter
		assertNotSame(initialContent,
				((IntentEditorDocument)editor.getDocumentProvider().getDocument(editor.getEditorInput()))
						.get());
		// Local user's editor should not be dirty
		assertFalse("Editor should not be dirty after remote changes integration", editor.isDirty());
		editor.close(false);
	}
}
