/*******************************************************************************
 * Copyright (c) 2010, 2011 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.util;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.mylyn.docs.intent.client.ui.test.util.AbstractIntentUITest;
import org.eclipse.mylyn.docs.intent.collab.common.repository.IntentRepositoryInitializer;
import org.eclipse.mylyn.docs.intent.collab.common.repository.IntentRepositoryManager;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.ReadOnlyException;
import org.eclipse.mylyn.docs.intent.collab.repository.RepositoryConnectionException;
import org.eclipse.mylyn.docs.intent.test.server.IntentCDORepository;

/**
 * An abstract test class providing API for managing an Intent document stored in a CDO Repository.
 * 
 * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
 */
public class AbstractIntentCDOTest extends AbstractIntentUITest {

	private static final String INTENT_REPOSITORY_NAME = "intent-server";

	/**
	 * {@inheritDoc}
	 * 
	 * @see org.eclipse.mylyn.docs.intent.client.ui.test.util.AbstractIntentUITest#setUp()
	 */
	@Override
	protected void setUp() throws Exception {
		// First step is to launch a CDOServer
		IntentCDORepository.start(true, INTENT_REPOSITORY_NAME);

		// Otherwise, everything is the same as local
		super.setUp();
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @see org.eclipse.mylyn.docs.intent.client.ui.test.util.AbstractIntentUITest#tearDown()
	 */
	@Override
	protected void tearDown() throws Exception {
		super.tearDown();

		// Delete intent repository
		IntentRepositoryManager.INSTANCE.getRepository(getIntentRepositoryIdentifier()).closeSession();
		IntentRepositoryManager.INSTANCE.deleteRepository(getIntentRepositoryIdentifier());
		waitForAllOperationsInUIThread();

		// Stopping the CDOServer
		IntentCDORepository.stop();
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @see org.eclipse.mylyn.docs.intent.client.ui.test.util.AbstractIntentUITest#setUpIntentProject(java.lang.String,
	 *      java.lang.String, boolean)
	 */
	@Override
	protected void setUpIntentProject(String projectName, String intentDocumentPath,
			boolean listenForRepository) {
		super.setUpIntentProject(getIntentRepositoryIdentifier(), intentDocumentPath, listenForRepository);
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @see org.eclipse.mylyn.docs.intent.client.ui.test.util.AbstractIntentUITest#doCreateIntentProject(java.lang.String,
	 *      java.lang.String)
	 */
	@Override
	protected void doCreateIntentProject(String projectName, String intentDocumentContent)
			throws CoreException {
		// Step 1: create the repository
		try {
			repository = IntentRepositoryManager.INSTANCE.getRepository(projectName);

			repositoryAdapter = repository.createRepositoryAdapter();
			repositoryAdapter.openSaveContext();
			assertNotNull(repository);
			assertNotNull(repositoryAdapter);

			// Step 2: initialise content
			IntentRepositoryInitializer.initializeContent(projectName, intentDocumentContent);
		} catch (RepositoryConnectionException e) {
			fail("Failed to create CDO Repository '" + projectName + "': " + e.getMessage());
		} catch (ReadOnlyException e) {
			fail("Failed to open a Transaction on the CDO Repository '" + projectName + "': "
					+ e.getMessage());
		}
	}

	/**
	 * Returns the repository identifier associated to the current test.
	 * 
	 * @return the repository identifier associated to the current test
	 */
	protected final String getIntentRepositoryIdentifier() {
		return "cdo://" + IntentCDORepository.getServerLocation() + "/" + INTENT_REPOSITORY_NAME;
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @see org.eclipse.mylyn.docs.intent.client.ui.test.util.AbstractIntentUITest#additionalSetUpOperations()
	 */
	@Override
	protected void additionalSetUpOperations() {

	}

}
