/*******************************************************************************
 * 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.storage;

import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.team.core.variants.IResourceVariant;

// CHECKSTYLE:OFF
/**
 * Base class of the git-related resource variants.
 * 
 * @author <a href="mailto:laurent.goubet@obeo.fr">Laurent Goubet</a>
 */
public abstract class AbstractGitResourceVariant implements IResourceVariant {
	/** Repository in which this variant's content will be accessed. */
	protected final Repository repository;

	/** Repository-relative path of this resource. */
	protected final String path;

	/**
	 * Whether this resource is a container or not in this particular variant. This may be different than the
	 * local resource's state (if there is a file/folder conflict for example).
	 */
	protected final boolean isContainer;

	/** Object id of this variant in its repository. */
	protected final ObjectId objectId;

	/** Raw mode bits of this variant. */
	protected final int rawMode;

	/**
	 * @param repository
	 *            Repository in which this variant's content will be accessed.
	 * @param path
	 *            Repository-relative path of this resource.
	 * @param isContainer
	 *            Whether this resource is a container or not in this particular variant.
	 * @param objectId
	 *            Object id of this variant in its repository.
	 * @param rawMode
	 *            Raw mode bits of this variant.
	 */
	protected AbstractGitResourceVariant(Repository repository, String path, boolean isContainer,
			ObjectId objectId, int rawMode) {
		this.repository = repository;
		this.path = path;
		this.isContainer = isContainer;
		this.objectId = objectId;
		this.rawMode = rawMode;
	}

	public String getName() {
		int lastSeparator = path.lastIndexOf('/');
		return path.substring(lastSeparator + 1);
	}

	public String getPath() {
		return path;
	}

	public boolean isContainer() {
		return isContainer;
	}

	public String getContentIdentifier() {
		return objectId.name();
	}

	public byte[] asBytes() {
		return objectId.name().getBytes();
	}

	/**
	 * @return the object id of this variant in its backing repository.
	 */
	public ObjectId getObjectId() {
		return objectId;
	}

	/**
	 * @return the raw mode of this variant.
	 */
	public int getRawMode() {
		return rawMode;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == this) {
			return true;
		}
		if (obj instanceof AbstractGitResourceVariant) {
			AbstractGitResourceVariant other = (AbstractGitResourceVariant)obj;
			return this.path.equals(other.path) && this.repository.equals(other.repository)
					&& this.objectId.equals(other.objectId);
		}
		return false;
	}

	@Override
	public int hashCode() {
		int hash = 37;
		hash = 37 * hash + (path != null ? path.hashCode() : 0);
		hash = 37 * hash + (repository != null ? repository.hashCode() : 0);
		hash = 37 * hash + (objectId != null ? objectId.hashCode() : 0);
		return hash;
	}
}
// CHECKSTYLE:ON
