/*******************************************************************************
 * 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.ide.navigator;

import java.util.LinkedHashSet;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger.LogType;
import org.eclipse.mylyn.docs.intent.collab.common.logger.IntentLogger;
import org.eclipse.mylyn.docs.intent.collab.common.query.CompilationStatusQuery;
import org.eclipse.mylyn.docs.intent.collab.common.query.IndexQuery;
import org.eclipse.mylyn.docs.intent.collab.common.repository.IntentRepositoryManager;
import org.eclipse.mylyn.docs.intent.collab.handlers.RepositoryObjectHandler;
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.collab.handlers.impl.AbstractRepositoryClient;
import org.eclipse.mylyn.docs.intent.collab.handlers.impl.ReadWriteRepositoryObjectHandlerImpl;
import org.eclipse.mylyn.docs.intent.collab.handlers.impl.notification.elementList.ElementListNotificator;
import org.eclipse.mylyn.docs.intent.collab.handlers.notification.Notificator;
import org.eclipse.mylyn.docs.intent.collab.handlers.notification.RepositoryChangeNotification;
import org.eclipse.mylyn.docs.intent.collab.repository.Repository;
import org.eclipse.mylyn.docs.intent.collab.repository.RepositoryConnectionException;

/**
 * A Repository Client used by the IDE bridge to refresh the project explorer when the Indexer computes a new
 * Table of Contents.
 * 
 * @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
 */
public class ProjectExplorerRefresher extends AbstractRepositoryClient {

	private static final long UPDATE_PROBLEM_VIEW_JOB_DELAY = 200;

	/**
	 * The project to refresh.
	 */
	private IProject project;

	private Job updateProblemViewJob;

	/**
	 * Creates a new {@link ProjectExplorerRefresher}.
	 * 
	 * @param project
	 *            the project to refresh
	 * @param repository
	 *            the repository to listen
	 */
	public ProjectExplorerRefresher(IProject project, Repository repository) {
		super(repository);
		this.project = project;
		updateProblemView();
	}

	/**
	 * Creates a new {@link ProjectExplorerRefresher}, that will refresh the project explorer when the Indexer
	 * computes a new Index for the given repository.
	 * 
	 * @param project
	 *            the project that will be refreshed by this {@link ProjectExplorerRefresher} (must match a
	 *            Repository)
	 * @return a new {@link ProjectExplorerRefresher}
	 * @throws RepositoryConnectionException
	 *             if cannot correctly connect to the given repository
	 * @throws CoreException
	 *             if needed the repository type cannot be found
	 * @throws ReadOnlyException
	 *             if no sufficient rights to write on the repository
	 */
	public static ProjectExplorerRefresher createProjectExplorerRefresher(IProject project)
			throws RepositoryConnectionException, CoreException, ReadOnlyException {
		// Step 1 : Create a Repository Adapter
		Repository repository = IntentRepositoryManager.INSTANCE.getRepository(project.getName());
		final RepositoryAdapter repositoryAdapter = repository.createRepositoryAdapter();

		repositoryAdapter.openSaveContext();
		// Step 2 : Creating the RepositoryObjectHandler for this client
		RepositoryObjectHandler handler = new ReadWriteRepositoryObjectHandlerImpl(repositoryAdapter);
		// listening to the Intent Index
		Set<EObject> listenedElements = new LinkedHashSet<EObject>();

		listenedElements.add(new IndexQuery(repositoryAdapter).getOrCreateIntentIndex());
		listenedElements.add(new CompilationStatusQuery(repositoryAdapter)
				.getOrCreateCompilationStatusManager());

		Notificator listenedElementsNotificator = new ElementListNotificator(listenedElements,
				repositoryAdapter);
		handler.addNotificator(listenedElementsNotificator);

		// Step 4 : create the ProjectExplorer refresher
		ProjectExplorerRefresher refresher = new ProjectExplorerRefresher(project, repository);
		refresher.addRepositoryObjectHandler(handler);
		return refresher;
	}

	/**
	 * {@inheritDoc}
	 * 
	 * @see org.eclipse.mylyn.docs.intent.collab.handlers.impl.AbstractRepositoryClient#createNotificationJob(org.eclipse.mylyn.docs.intent.collab.handlers.notification.RepositoryChangeNotification)
	 */
	@Override
	protected Job createNotificationJob(RepositoryChangeNotification notification) {
		Job res = null;
		if (notification != null && notification.getImpactedElements().isEmpty()) {
			res = new ProjectExplorerRefreshJob(project, notification.getImpactedElements().iterator().next());
		} else {
			res = new ProjectExplorerRefreshJob(project, null);
		}
		updateProblemView();
		IntentLogger.getInstance().log(LogType.LIFECYCLE,
				"[ProjectExplorer Refresher] Project explorer and Problem view refreshed");
		return res;
	}

	/**
	 * Updates the problem view (my creating markers for each compilation or synchronization status associated
	 * to the current document.
	 */
	private void updateProblemView() {
		if (updateProblemViewJob != null) {
			updateProblemViewJob.cancel();
		}
		if (this.getRepositoryObjectHandler() != null
				&& this.getRepositoryObjectHandler().getRepositoryAdapter() != null) {
			updateProblemViewJob = new UpdateProblemsViewJob(project, this.getRepositoryObjectHandler()
					.getRepositoryAdapter());
			updateProblemViewJob.schedule(UPDATE_PROBLEM_VIEW_JOB_DELAY);
		}
	}
}
