/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.api.git; import com.google.inject.Inject; import org.eclipse.che.api.core.ApiException; import org.eclipse.che.api.git.shared.Remote; import org.eclipse.che.api.project.server.FolderEntry; import org.eclipse.che.api.project.server.type.ReadonlyValueProvider; import org.eclipse.che.api.project.server.type.ValueProvider; import org.eclipse.che.api.project.server.type.ValueProviderFactory; import org.eclipse.che.api.project.server.type.ValueStorageException; import javax.inject.Singleton; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import static org.eclipse.che.api.git.GitProjectType.GIT_CURRENT_BRANCH_NAME; import static org.eclipse.che.api.git.GitProjectType.GIT_REPOSITORY_REMOTES; import static org.eclipse.che.api.git.GitProjectType.VCS_PROVIDER_NAME; /** * @author Roman Nikitenko */ @Singleton public class GitValueProviderFactory implements ValueProviderFactory { @Inject private GitConnectionFactory gitConnectionFactory; @Override public ValueProvider newInstance(final FolderEntry folder) { return new ReadonlyValueProvider() { @Override public List<String> getValues(String attributeName) throws ValueStorageException { if (folder == null) { return Collections.emptyList(); } try (GitConnection gitConnection = gitConnectionFactory.getConnection(resolveLocalPath(folder))) { //check whether the folder belongs to git repository if (!gitConnection.isInsideWorkTree()) { return Collections.emptyList(); } switch (attributeName) { case VCS_PROVIDER_NAME: return Collections.singletonList("git"); case GIT_CURRENT_BRANCH_NAME: return Collections.singletonList(gitConnection.getCurrentBranch()); case GIT_REPOSITORY_REMOTES: return gitConnection.remoteList(null, false) .stream() .map(Remote::getUrl) .collect(Collectors.toList()); default: return Collections.emptyList(); } } catch (ApiException e) { throw new ValueStorageException(e.getMessage()); } } }; } private String resolveLocalPath(FolderEntry folder) throws ApiException { return folder.getVirtualFile().toIoFile().getAbsolutePath(); } }