Expose ScmCommandProtocol as extension point

This is necessary so that multiple providers (git, hg, ...) can
implement this. The using class has to find the matching implementation.
This commit is contained in:
René Pfeuffer
2019-03-05 14:20:31 +01:00
parent ebb21ee308
commit dd71fb4c3b
3 changed files with 18 additions and 7 deletions

View File

@@ -1,8 +1,13 @@
package sonia.scm.protocolcommand; package sonia.scm.protocolcommand;
import sonia.scm.plugin.ExtensionPoint;
import java.io.IOException; import java.io.IOException;
public interface ScmSshProtocol { @ExtensionPoint
public interface ScmCommandProtocol {
boolean canHandle(RepositoryContext repositoryContext);
void handle(CommandContext context, RepositoryContext repositoryContext) throws IOException; void handle(CommandContext context, RepositoryContext repositoryContext) throws IOException;

View File

@@ -10,27 +10,35 @@ import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.FS;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.plugin.Extension;
import sonia.scm.protocolcommand.CommandContext; import sonia.scm.protocolcommand.CommandContext;
import sonia.scm.protocolcommand.RepositoryContext; import sonia.scm.protocolcommand.RepositoryContext;
import sonia.scm.protocolcommand.ScmSshProtocol; import sonia.scm.protocolcommand.ScmCommandProtocol;
import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.RepositoryPermissions; import sonia.scm.repository.RepositoryPermissions;
import javax.inject.Inject; import javax.inject.Inject;
import java.io.IOException; import java.io.IOException;
public class GitSshProtocol implements ScmSshProtocol { @Extension
public class GitCommandProtocol implements ScmCommandProtocol {
private static final Logger LOG = LoggerFactory.getLogger(GitSshProtocol.class); private static final Logger LOG = LoggerFactory.getLogger(GitCommandProtocol.class);
private SshUploadPackFactory uploadPackFactory; private SshUploadPackFactory uploadPackFactory;
private SshReceivePackFactory receivePackFactory; private SshReceivePackFactory receivePackFactory;
@Inject @Inject
public GitSshProtocol(SshUploadPackFactory uploadPackFactory, SshReceivePackFactory receivePackFactory) { public GitCommandProtocol(SshUploadPackFactory uploadPackFactory, SshReceivePackFactory receivePackFactory) {
this.uploadPackFactory = uploadPackFactory; this.uploadPackFactory = uploadPackFactory;
this.receivePackFactory = receivePackFactory; this.receivePackFactory = receivePackFactory;
} }
@Override
public boolean canHandle(RepositoryContext repositoryContext) {
return GitRepositoryHandler.TYPE_NAME.equals(repositoryContext.getRepository().getType());
}
@Override @Override
public void handle(CommandContext commandContext, RepositoryContext repositoryContext) throws IOException { public void handle(CommandContext commandContext, RepositoryContext repositoryContext) throws IOException {
String subCommand = commandContext.getArgs()[0]; String subCommand = commandContext.getArgs()[0];

View File

@@ -3,13 +3,11 @@ package sonia.scm.protocolcommand.git;
import com.google.inject.servlet.ServletModule; import com.google.inject.servlet.ServletModule;
import sonia.scm.plugin.Extension; import sonia.scm.plugin.Extension;
import sonia.scm.protocolcommand.RepositoryContextResolver; import sonia.scm.protocolcommand.RepositoryContextResolver;
import sonia.scm.protocolcommand.ScmSshProtocol;
@Extension @Extension
public class GitProtocolModule extends ServletModule { public class GitProtocolModule extends ServletModule {
@Override @Override
protected void configureServlets() { protected void configureServlets() {
bind(RepositoryContextResolver.class).to(GitRepositoryContextResolver.class); bind(RepositoryContextResolver.class).to(GitRepositoryContextResolver.class);
bind(ScmSshProtocol.class).to(GitSshProtocol.class);
} }
} }