/*******************************************************************************
* Copyright (C) 2010, 2012 Dariusz Luksza <dariusz@luksza.org> and others.
*
* 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.egit.ui.internal.synchronize.mapping;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.mapping.ResourceMapping;
import org.eclipse.egit.ui.internal.synchronize.GitChangeSetModelProvider;
import org.eclipse.egit.ui.internal.synchronize.model.GitModelBlob;
import org.eclipse.egit.ui.internal.synchronize.model.GitModelObject;
import org.eclipse.egit.ui.internal.synchronize.model.GitModelObjectContainer;
import org.eclipse.egit.ui.internal.synchronize.model.GitModelTree;
import org.eclipse.egit.ui.internal.synchronize.model.HasProjects;
/**
* Maps Git's objects onto proper {@link ResourceMapping} instants. It allows
* traverse over repository content provides resources for Git ChangeSet.
*/
public abstract class GitObjectMapping extends ResourceMapping {
private final GitModelObject object;
/**
* @param object
* @return resource mapping
*/
public static ResourceMapping create(GitModelObject object) {
if (object instanceof GitModelBlob)
return new GitBlobMapping((GitModelBlob) object);
if (object instanceof GitModelTree)
return new GitTreeMapping((GitModelTree) object);
if (object instanceof GitModelObjectContainer)
return new GitContainerMapping((GitModelObjectContainer) object);
return null;
}
/**
* @param parent instance of parent object
*/
protected GitObjectMapping(GitModelObject parent) {
this.object = parent;
}
@Override
public boolean contains(ResourceMapping mapping) {
if (mapping.getModelProviderId().equals(getModelProviderId())) {
GitModelObject obj = (GitModelObject) mapping.getModelObject();
return obj.repositoryHashCode() == object.repositoryHashCode();
}
return false;
}
@Override
public Object getModelObject() {
return object;
}
@Override
public String getModelProviderId() {
return GitChangeSetModelProvider.ID;
}
private IProject getProject(final IResource resource) {
return resource != null ? resource.getProject() : null;
}
@Override
public IProject[] getProjects() {
IProject[] projects = null;
if (!object.isContainer()) {
IProject project = getProject(ResourcesPlugin.getWorkspace()
.getRoot().getFileForLocation(object.getLocation()));
if (project != null)
projects = new IProject[] { project };
} else if (object instanceof GitModelTree) {
IProject project = getProject(ResourcesPlugin.getWorkspace()
.getRoot().getContainerForLocation(object.getLocation()));
if (project != null)
projects = new IProject[] { project };
} else if (object instanceof HasProjects)
projects = ((HasProjects) object).getProjects();
return projects != null ? projects : new IProject[0];
}
}