/******************************************************************************* * Copyright (c) 2015-2016 Intel Corporation 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 * * Contributors: * Stephane Bouchet (Intel Corporation) - initial API and implementation * Olivier Constant (Thales Global Services) - tight integration *******************************************************************************/ package org.eclipse.emf.diffmerge.connector.svn.ext; import org.eclipse.compare.ITypedElement; import org.eclipse.core.resources.IStorage; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.diffmerge.connector.core.ext.AbstractRevisionScopeDefinitionFactory; import org.eclipse.emf.diffmerge.connector.svn.Messages; import org.eclipse.emf.ecore.resource.URIConverter; import org.eclipse.emf.ecore.resource.impl.ExtensibleURIConverterImpl; import org.eclipse.team.core.history.IFileRevision; import org.eclipse.team.core.variants.IResourceVariant; import org.eclipse.team.svn.core.connector.SVNRevision; import org.eclipse.team.svn.core.resource.ILocalResource; import org.eclipse.team.svn.core.resource.IRepositoryLocation; import org.eclipse.team.svn.core.svnstorage.SVNRemoteStorage; import org.eclipse.team.svn.core.synchronize.variant.BaseFileVariant; import org.eclipse.team.svn.core.synchronize.variant.RemoteFileVariant; /** * A scope definition factory for file revisions in SVN history. * It is used in the Team Synchronizing perspective for the ancestor and remote scopes. */ public class SVNRevisionScopeDefinitionFactory extends AbstractRevisionScopeDefinitionFactory { /** * @see org.eclipse.emf.diffmerge.connector.core.ext.AbstractRevisionScopeDefinitionFactory#getLabelForRevision(org.eclipse.team.core.history.IFileRevision, org.eclipse.compare.ITypedElement) */ @Override protected String getLabelForRevision(IFileRevision revision_p, ITypedElement entrypoint_p) { String result = null; IResourceVariant variant = getVariant(revision_p); if (variant != null) { // Ancestor or remote result = String.format( Messages.SVNRevisionScopeDefinitionFactory_LabelRevision, variant.getContentIdentifier()); } return result; } /** * @see org.eclipse.emf.diffmerge.connector.core.ext.AbstractRevisionScopeDefinitionFactory#getURIConverterForRevision(org.eclipse.team.core.history.IFileRevision) */ @Override protected URIConverter getURIConverterForRevision(IFileRevision revision_p) throws CoreException { URIConverter result = null; IResourceVariant variant = getVariant(revision_p); if (variant instanceof BaseFileVariant) { // Ancestor ILocalResource res =((BaseFileVariant)variant).getResource(); IRepositoryLocation location = SVNRemoteStorage.instance().getRepositoryLocation(res.getResource()); result = new SVNHistoryURIConverter(location, SVNRevision.fromString(variant.getContentIdentifier())); } else { // Remote result = new ExtensibleURIConverterImpl(); } return result; } /** * @see org.eclipse.emf.diffmerge.connector.core.ext.AbstractRevisionScopeDefinitionFactory#getURIForRevision(org.eclipse.team.core.history.IFileRevision) */ @Override protected URI getURIForRevision(IFileRevision revision_p) throws CoreException { URI result = null; IResourceVariant variant = getVariant(revision_p); if (variant instanceof BaseFileVariant) { // Ancestor ILocalResource res = ((BaseFileVariant)variant).getResource(); IRepositoryLocation location = SVNRemoteStorage.instance().getRepositoryLocation(res.getResource()); result = URI.createURI(location.getRepositoryRootUrl() + ((BaseFileVariant)variant).getResource().getResource().getFullPath(), true); } else { // Remote IStorage storage = getStorage(revision_p); if (storage != null) result = toFileURI(storage.getFullPath().toString()); } return result; } /** * @see org.eclipse.emf.diffmerge.connector.core.ext.AbstractRevisionScopeDefinitionFactory#isApplicableToRevision(org.eclipse.team.core.history.IFileRevision, org.eclipse.compare.ITypedElement) */ @Override protected boolean isApplicableToRevision(IFileRevision revision_p, ITypedElement entrypoint_p) { IResourceVariant variant = getVariant(revision_p); // Ancestor and remote return variant instanceof BaseFileVariant || variant instanceof RemoteFileVariant; } }