package com.atlassian.labs.speakeasy.git;
import com.atlassian.plugin.Plugin;
import com.atlassian.plugin.PluginAccessor;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.resolver.FileResolver;
import org.eclipse.jgit.transport.resolver.RepositoryResolver;
import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
import org.osgi.framework.BundleContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import static com.atlassian.labs.speakeasy.util.ExtensionValidate.isPureSpeakeasyExtension;
/**
*
*/
@Component
public class SpeakeasyRepositoryResolver implements RepositoryResolver<HttpServletRequest>
{
private final GitRepositoryManager gitRepositoryManager;
private final FileResolver<HttpServletRequest> resolver;
private final BundleContext bundleContext;
private final PluginAccessor pluginAccessor;
@Autowired
public SpeakeasyRepositoryResolver(GitRepositoryManager gitRepositoryManager, BundleContext bundleContext, PluginAccessor pluginAccessor)
{
this.gitRepositoryManager = gitRepositoryManager;
this.bundleContext = bundleContext;
this.pluginAccessor = pluginAccessor;
this.resolver = new FileResolver<HttpServletRequest>(this.gitRepositoryManager.getRepositoriesDir(), true);
}
public Repository open(HttpServletRequest req, String name) throws RepositoryNotFoundException, ServiceNotAuthorizedException, ServiceNotEnabledException
{
String pluginKey = extractKeyFromUrl(name);
Plugin plugin = pluginAccessor.getPlugin(pluginKey);
if ((plugin != null && isPureSpeakeasyExtension(bundleContext, plugin)) || new File(gitRepositoryManager.getRepositoriesDir(), pluginKey).exists())
{
gitRepositoryManager.ensureRepository(pluginKey);
return resolver.open(req, pluginKey);
}
else
{
throw new RepositoryNotFoundException(name);
}
}
public String extractKeyFromUrl(String name)
{
return name.endsWith(".git") ? name.substring(0, name.length() - 4) : name;
}
}