Inject uri info for http protocol url computation

This commit is contained in:
René Pfeuffer
2018-09-10 14:48:22 +02:00
parent ce518ad784
commit a490a20ac9
9 changed files with 25 additions and 19 deletions

View File

@@ -1,7 +1,5 @@
package sonia.scm.repository.api;
import java.net.URI;
/**
* An ScmProtocol represents a concrete protocol provided by the SCM-Manager instance
* to interact with a repository depending on its type. There may be multiple protocols
@@ -17,5 +15,5 @@ public interface ScmProtocol {
/**
* The URL to access the repository providing this protocol.
*/
String getUrl(URI baseUri);
String getUrl();
}

View File

@@ -7,15 +7,18 @@ import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.net.URI;
public abstract class HttpScmProtocol implements ScmProtocol {
private final Repository repository;
private final UriInfo uriInfo;
public HttpScmProtocol(Repository repository) {
public HttpScmProtocol(Repository repository, UriInfo uriInfo) {
this.repository = repository;
this.uriInfo = uriInfo;
}
@Override
@@ -24,8 +27,8 @@ public abstract class HttpScmProtocol implements ScmProtocol {
}
@Override
public String getUrl(URI baseUri) {
return baseUri.resolve(URI.create("repo" + "/" + repository.getNamespace() + "/" + repository.getName())).toASCIIString();
public String getUrl() {
return uriInfo.getBaseUri().resolve(URI.create("../../repo/" + repository.getNamespace() + "/" + repository.getName())).toASCIIString();
}
public abstract void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException;

View File

@@ -1,5 +1,6 @@
package sonia.scm.repository.spi;
import sonia.scm.api.v2.resources.UriInfoStore;
import sonia.scm.repository.Repository;
import javax.inject.Provider;
@@ -13,12 +14,14 @@ import java.io.IOException;
public abstract class InitializingHttpScmProtocolWrapper {
private final Provider<? extends HttpServlet> delegateProvider;
private final Provider<UriInfoStore> uriInfoStore;
private volatile boolean isInitialized = false;
protected InitializingHttpScmProtocolWrapper(Provider<? extends HttpServlet> delegateProvider) {
protected InitializingHttpScmProtocolWrapper(Provider<? extends HttpServlet> delegateProvider, Provider<UriInfoStore> uriInfoStore) {
this.delegateProvider = delegateProvider;
this.uriInfoStore = uriInfoStore;
}
protected void initializeServlet(ServletConfig config, HttpServlet httpServlet) throws ServletException {
@@ -32,7 +35,7 @@ public abstract class InitializingHttpScmProtocolWrapper {
private class ProtocolWrapper extends HttpScmProtocol {
public ProtocolWrapper(Repository repository) {
super(repository);
super(repository, uriInfoStore.get().get());
}
@Override

View File

@@ -8,6 +8,7 @@ import sonia.scm.repository.spi.RepositoryServiceProvider;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.UriInfo;
import java.util.Collection;
import java.util.Collections;
@@ -45,7 +46,7 @@ public class RepositoryServiceTest {
private static class DummyHttpProtocol extends HttpScmProtocol {
public DummyHttpProtocol(Repository repository) {
super(repository);
super(repository, mock(UriInfo.class));
}
@Override

View File

@@ -1,5 +1,6 @@
package sonia.scm.web;
import sonia.scm.api.v2.resources.UriInfoStore;
import sonia.scm.repository.spi.InitializingHttpScmProtocolWrapper;
import javax.inject.Inject;
@@ -9,7 +10,7 @@ import javax.inject.Singleton;
@Singleton
public class GitScmProtocolProviderWrapper extends InitializingHttpScmProtocolWrapper {
@Inject
public GitScmProtocolProviderWrapper(Provider<ScmGitServlet> servletProvider) {
super(servletProvider);
public GitScmProtocolProviderWrapper(Provider<ScmGitServlet> servletProvider, Provider<UriInfoStore> uriInfoStore) {
super(servletProvider, uriInfoStore);
}
}

View File

@@ -1,5 +1,6 @@
package sonia.scm.web;
import sonia.scm.api.v2.resources.UriInfoStore;
import sonia.scm.repository.spi.InitializingHttpScmProtocolWrapper;
import javax.inject.Inject;
@@ -9,7 +10,7 @@ import javax.inject.Singleton;
@Singleton
public class HgScmProtocolProviderWrapper extends InitializingHttpScmProtocolWrapper {
@Inject
public HgScmProtocolProviderWrapper(Provider<HgCGIServlet> servletProvider) {
super(servletProvider);
public HgScmProtocolProviderWrapper(Provider<HgCGIServlet> servletProvider, Provider<UriInfoStore> uriInfoStore) {
super(servletProvider, uriInfoStore);
}
}

View File

@@ -1,5 +1,6 @@
package sonia.scm.web;
import sonia.scm.api.v2.resources.UriInfoStore;
import sonia.scm.repository.spi.InitializingHttpScmProtocolWrapper;
import javax.inject.Inject;
@@ -16,8 +17,8 @@ import static sonia.scm.web.SvnServletModule.PARAMETER_SVN_PARENTPATH;
@Singleton
public class SvnScmProtocolProviderWrapper extends InitializingHttpScmProtocolWrapper {
@Inject
public SvnScmProtocolProviderWrapper(Provider<SvnDAVServlet> servletProvider) {
super(servletProvider);
public SvnScmProtocolProviderWrapper(Provider<SvnDAVServlet> servletProvider, Provider<UriInfoStore> uriInfoStore) {
super(servletProvider, uriInfoStore);
}
@Override

View File

@@ -67,6 +67,6 @@ public abstract class RepositoryToRepositoryDtoMapper extends BaseMapper<Reposit
}
private Link createProtocolLink(ScmProtocol protocol, Repository repository) {
return Link.linkBuilder("protocol", protocol.getUrl(uriInfoStore.get().getBaseUri().resolve("../.."))).withName(protocol.getType()).build();
return Link.linkBuilder("protocol", protocol.getUrl()).withName(protocol.getType()).build();
}
}

View File

@@ -2,8 +2,6 @@ package sonia.scm.api.v2.resources;
import sonia.scm.repository.api.ScmProtocol;
import java.net.URI;
class MockScmProtocol implements ScmProtocol {
private final String type;
private final String protocol;
@@ -19,7 +17,7 @@ class MockScmProtocol implements ScmProtocol {
}
@Override
public String getUrl(URI baseUri) {
public String getUrl() {
return protocol;
}
}