/*******************************************************************************
 * Copyright (C) 2015, 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
 *******************************************************************************/
package org.eclipse.emf.compare.egit.internal.merge;

//CHECKSTYLE:OFF
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.team.core.variants.IResourceVariant;

/**
 * Caches the resource variants corresponding to local IResources.
 * 
 * @author <a href="mailto:laurent.goubet@obeo.fr">Laurent Goubet</a>
 */
class GitResourceVariantCache {
	private final Map<IResource, IResourceVariant> cache = new LinkedHashMap<IResource, IResourceVariant>();

	private final Map<IResource, Set<IResource>> members = new LinkedHashMap<IResource, Set<IResource>>();

	private final Set<IResource> roots = new LinkedHashSet<IResource>();

	/**
	 * Sets the variant associated with the given resource in this cache.
	 *
	 * @param resource
	 *            The resource for which we need to cache a variant.
	 * @param variant
	 *            Variant for the resource.
	 */
	public void setVariant(IResource resource, IResourceVariant variant) {
		cache.put(resource, variant);

		IProject project = resource.getProject();
		roots.add(project);

		members.put(resource, new LinkedHashSet<IResource>());

		final IResource parent = resource.getParent();
		Set<IResource> parentMembers = members.get(parent);
		if (parentMembers == null) {
			parentMembers = new LinkedHashSet<IResource>();
			members.put(parent, parentMembers);
		}
		parentMembers.add(resource);
	}

	/**
	 * @param resource
	 *            The resource which variant we need.
	 * @return The variant associated with this resource in this cache.
	 */
	public IResourceVariant getVariant(IResource resource) {
		return cache.get(resource);
	}

	/**
	 * @return The known roots of the tree we were populated from.
	 */
	public Set<IResource> getRoots() {
		return Collections.unmodifiableSet(roots);
	}

	/**
	 * @return All resources for which this cache holds variants.
	 */
	public Set<IResource> getKnownResources() {
		return Collections.unmodifiableSet(cache.keySet());
	}

	/**
	 * Returns all members of the given resource for which we hold variants.
	 *
	 * @param resource
	 *            The resource which members we need.
	 * @return All members of the given resource for which we hold variants; an empty array if none.
	 */
	public IResource[] members(IResource resource) {
		final Set<IResource> children = members.get(resource);
		return children.toArray(new IResource[children.size()]);
	}
}
// CHECKSTYLE:ON
