Reduce dependency to RepositoryProvider in provider servlets

This commit is contained in:
René Pfeuffer
2018-09-11 07:40:24 +02:00
parent 1b200ae69d
commit bf9de8ea8e
8 changed files with 52 additions and 135 deletions

View File

@@ -31,9 +31,9 @@ public abstract class HttpScmProtocol implements ScmProtocol {
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;
Repository getRepository() {
return repository;
public final void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException {
serve(request, response, repository, config);
}
protected abstract void serve(HttpServletRequest request, HttpServletResponse response, Repository repository, ServletConfig config) throws ServletException, IOException;
}

View File

@@ -9,7 +9,6 @@ import sonia.scm.web.filter.ProviderPermissionFilter;
import javax.inject.Provider;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@@ -19,20 +18,20 @@ public abstract class InitializingHttpScmProtocolWrapper {
private static final Logger logger =
LoggerFactory.getLogger(InitializingHttpScmProtocolWrapper.class);
private final Provider<? extends HttpServlet> delegateProvider;
private final Provider<? extends ScmProviderHttpServlet> delegateProvider;
private final Provider<? extends ProviderPermissionFilter> permissionFilterProvider;
private final Provider<UriInfoStore> uriInfoStore;
private volatile boolean isInitialized = false;
protected InitializingHttpScmProtocolWrapper(Provider<? extends HttpServlet> delegateProvider, Provider<? extends ProviderPermissionFilter> permissionFilterProvider, Provider<UriInfoStore> uriInfoStore) {
protected InitializingHttpScmProtocolWrapper(Provider<? extends ScmProviderHttpServlet> delegateProvider, Provider<? extends ProviderPermissionFilter> permissionFilterProvider, Provider<UriInfoStore> uriInfoStore) {
this.delegateProvider = delegateProvider;
this.permissionFilterProvider = permissionFilterProvider;
this.uriInfoStore = uriInfoStore;
}
protected void initializeServlet(ServletConfig config, HttpServlet httpServlet) throws ServletException {
protected void initializeServlet(ServletConfig config, ScmProviderHttpServlet httpServlet) throws ServletException {
httpServlet.init(config);
}
@@ -47,11 +46,11 @@ public abstract class InitializingHttpScmProtocolWrapper {
}
@Override
public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException {
protected void serve(HttpServletRequest request, HttpServletResponse response, Repository repository, ServletConfig config) throws ServletException, IOException {
if (!isInitialized) {
synchronized (InitializingHttpScmProtocolWrapper.this) {
if (!isInitialized) {
HttpServlet httpServlet = delegateProvider.get();
ScmProviderHttpServlet httpServlet = delegateProvider.get();
initializeServlet(config, httpServlet);
isInitialized = true;
}
@@ -61,8 +60,8 @@ public abstract class InitializingHttpScmProtocolWrapper {
permissionFilterProvider.get().executeIfPermitted(
request,
response,
getRepository(),
() -> delegateProvider.get().service(request, response));
repository,
() -> delegateProvider.get().service(request, response, repository));
}
}
}

View File

@@ -0,0 +1,16 @@
package sonia.scm.repository.spi;
import sonia.scm.repository.Repository;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public interface ScmProviderHttpServlet {
void service(HttpServletRequest request, HttpServletResponse response, Repository repository) throws ServletException, IOException;
void init(ServletConfig config) throws ServletException;
}

View File

@@ -50,7 +50,7 @@ public class RepositoryServiceTest {
}
@Override
public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) {
public void serve(HttpServletRequest request, HttpServletResponse response, Repository repository, ServletConfig config) {
}
}
}

View File

@@ -42,8 +42,8 @@ import org.eclipse.jgit.http.server.GitServlet;
import org.eclipse.jgit.lfs.lib.Constants;
import org.slf4j.Logger;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryProvider;
import sonia.scm.repository.RepositoryRequestListenerUtil;
import sonia.scm.repository.spi.ScmProviderHttpServlet;
import sonia.scm.util.HttpUtil;
import sonia.scm.web.lfs.servlet.LfsServletFactory;
@@ -64,7 +64,7 @@ import static org.slf4j.LoggerFactory.getLogger;
* @author Sebastian Sdorra
*/
@Singleton
public class ScmGitServlet extends GitServlet
public class ScmGitServlet extends GitServlet implements ScmProviderHttpServlet
{
/** Field description */
@@ -88,7 +88,6 @@ public class ScmGitServlet extends GitServlet
* @param repositoryResolver
* @param receivePackFactory
* @param repositoryViewer
* @param repositoryProvider
* @param repositoryRequestListenerUtil
* @param lfsServletFactory
*/
@@ -96,11 +95,9 @@ public class ScmGitServlet extends GitServlet
public ScmGitServlet(GitRepositoryResolver repositoryResolver,
GitReceivePackFactory receivePackFactory,
GitRepositoryViewer repositoryViewer,
RepositoryProvider repositoryProvider,
RepositoryRequestListenerUtil repositoryRequestListenerUtil,
LfsServletFactory lfsServletFactory)
{
this.repositoryProvider = repositoryProvider;
this.repositoryViewer = repositoryViewer;
this.repositoryRequestListenerUtil = repositoryRequestListenerUtil;
this.lfsServletFactory = lfsServletFactory;
@@ -122,44 +119,9 @@ public class ScmGitServlet extends GitServlet
* @throws ServletException
*/
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response)
public void service(HttpServletRequest request, HttpServletResponse response, Repository repository)
throws ServletException, IOException
{
Repository repository = repositoryProvider.get();
if (repository != null) {
handleRequest(request, response, repository);
} else {
// logger
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
/**
* Decides the type request being currently made and delegates it accordingly.
* <ul>
* <li>Batch API:</li>
* <ul>
* <li>used to provide the client with information on how handle the large files of a repository.</li>
* <li>response contains the information where to perform the actual upload and download of the large objects.</li>
* </ul>
* <li>Transfer API:</li>
* <ul>
* <li>receives and provides the actual large objects (resolves the pointer placed in the file of the working copy).</li>
* <li>invoked only after the Batch API has been questioned about what to do with the large files</li>
* </ul>
* <li>Regular Git Http API:</li>
* <ul>
* <li>regular git http wire protocol, use by normal git clients.</li>
* </ul>
* <li>Browser Overview:<li>
* <ul>
* <li>short repository overview for browser clients.</li>
* </ul>
* </li>
* </ul>
*/
private void handleRequest(HttpServletRequest request, HttpServletResponse response, Repository repository) throws ServletException, IOException {
String repoPath = repository.getNamespace() + "/" + repository.getName();
logger.trace("handle git repository at {}", repoPath);
if (isLfsBatchApiRequest(request, repoPath)) {
@@ -286,9 +248,6 @@ public class ScmGitServlet extends GitServlet
//~--- fields ---------------------------------------------------------------
/** Field description */
private final RepositoryProvider repositoryProvider;
/** Field description */
private final RepositoryRequestListenerUtil repositoryRequestListenerUtil;

View File

@@ -49,8 +49,8 @@ import sonia.scm.repository.HgHookManager;
import sonia.scm.repository.HgPythonScript;
import sonia.scm.repository.HgRepositoryHandler;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryProvider;
import sonia.scm.repository.RepositoryRequestListenerUtil;
import sonia.scm.repository.spi.ScmProviderHttpServlet;
import sonia.scm.security.CipherUtil;
import sonia.scm.util.AssertUtil;
import sonia.scm.util.HttpUtil;
@@ -58,7 +58,6 @@ import sonia.scm.web.cgi.CGIExecutor;
import sonia.scm.web.cgi.CGIExecutorFactory;
import sonia.scm.web.cgi.EnvList;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@@ -76,7 +75,7 @@ import java.util.Enumeration;
* @author Sebastian Sdorra
*/
@Singleton
public class HgCGIServlet extends HttpServlet
public class HgCGIServlet extends HttpServlet implements ScmProviderHttpServlet
{
/** Field description */
@@ -109,20 +108,18 @@ public class HgCGIServlet extends HttpServlet
*
* @param cgiExecutorFactory
* @param configuration
* @param repositoryProvider
* @param handler
* @param hookManager
* @param requestListenerUtil
*/
@Inject
public HgCGIServlet(CGIExecutorFactory cgiExecutorFactory,
ScmConfiguration configuration, RepositoryProvider repositoryProvider,
ScmConfiguration configuration,
HgRepositoryHandler handler, HgHookManager hookManager,
RepositoryRequestListenerUtil requestListenerUtil)
{
this.cgiExecutorFactory = cgiExecutorFactory;
this.configuration = configuration;
this.repositoryProvider = repositoryProvider;
this.handler = handler;
this.hookManager = hookManager;
this.requestListenerUtil = requestListenerUtil;
@@ -132,32 +129,11 @@ public class HgCGIServlet extends HttpServlet
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param request
* @param response
*
* @throws IOException
* @throws ServletException
*/
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response)
public void service(HttpServletRequest request,
HttpServletResponse response, Repository repository)
{
Repository repository = repositoryProvider.get();
if (repository == null)
{
if (logger.isDebugEnabled())
{
logger.debug("no hg repository found at {}", request.getRequestURI());
}
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
}
else if (!handler.isConfigured())
if (!handler.isConfigured())
{
exceptionHandler.sendFormattedError(request, response,
HgCGIExceptionHandler.ERROR_NOT_CONFIGURED);
@@ -346,11 +322,6 @@ public class HgCGIServlet extends HttpServlet
return python;
}
// @Override
public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) {
service(request, response);
}
//~--- fields ---------------------------------------------------------------
/** Field description */
@@ -371,9 +342,6 @@ public class HgCGIServlet extends HttpServlet
/** Field description */
private final HgHookManager hookManager;
/** Field description */
private final RepositoryProvider repositoryProvider;
/** Field description */
private final RepositoryRequestListenerUtil requestListenerUtil;
}

View File

@@ -45,10 +45,10 @@ import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryProvider;
import sonia.scm.repository.RepositoryRequestListenerUtil;
import sonia.scm.repository.SvnRepositoryHandler;
import sonia.scm.repository.spi.ScmProviderHttpServlet;
import sonia.scm.util.AssertUtil;
import sonia.scm.util.HttpUtil;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
@@ -62,7 +62,7 @@ import java.io.IOException;
* @author Sebastian Sdorra
*/
@Singleton
public class SvnDAVServlet extends DAVServlet
public class SvnDAVServlet extends DAVServlet implements ScmProviderHttpServlet
{
/** Field description */
@@ -111,28 +111,18 @@ public class SvnDAVServlet extends DAVServlet
* @throws ServletException
*/
@Override
public void service(HttpServletRequest request, HttpServletResponse response)
public void service(HttpServletRequest request, HttpServletResponse response, Repository repository)
throws ServletException, IOException
{
Repository repository = repositoryProvider.get();
if (repository != null)
{
if (repositoryRequestListenerUtil.callListeners(request, response,
repository))
{
super.service(new SvnHttpServletRequestWrapper(request,
repositoryProvider), response);
}
else if (logger.isDebugEnabled())
{
logger.debug("request aborted by repository request listener");
}
}
else
if (repositoryRequestListenerUtil.callListeners(request, response,
repository))
{
super.service(new SvnHttpServletRequestWrapper(request,
repositoryProvider), response);
repository), response);
}
else if (logger.isDebugEnabled())
{
logger.debug("request aborted by repository request listener");
}
}
@@ -164,18 +154,11 @@ public class SvnDAVServlet extends DAVServlet
extends HttpServletRequestWrapper
{
/**
* Constructs ...
*
*
* @param request
* @param repositoryProvider
*/
public SvnHttpServletRequestWrapper(HttpServletRequest request,
RepositoryProvider repositoryProvider)
Repository repository)
{
super(request);
this.repositoryProvider = repositoryProvider;
this.repository = repository;
}
//~--- get methods --------------------------------------------------------
@@ -212,8 +195,6 @@ public class SvnDAVServlet extends DAVServlet
AssertUtil.assertIsNotEmpty(pathInfo);
Repository repository = repositoryProvider.get();
if (repository != null)
{
if (pathInfo.startsWith(HttpUtil.SEPARATOR_PATH))
@@ -237,7 +218,6 @@ public class SvnDAVServlet extends DAVServlet
public String getServletPath()
{
String servletPath = super.getServletPath();
Repository repository = repositoryProvider.get();
if (repository != null)
{
@@ -281,12 +261,7 @@ public class SvnDAVServlet extends DAVServlet
//~--- fields -------------------------------------------------------------
/** Field description */
private final RepositoryProvider repositoryProvider;
}
// @Override
public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException {
service(request, response);
private final Repository repository;
}
//~--- fields ---------------------------------------------------------------

View File

@@ -2,6 +2,7 @@ package sonia.scm.web;
import sonia.scm.api.v2.resources.UriInfoStore;
import sonia.scm.repository.spi.InitializingHttpScmProtocolWrapper;
import sonia.scm.repository.spi.ScmProviderHttpServlet;
import javax.inject.Inject;
import javax.inject.Provider;
@@ -9,7 +10,6 @@ import javax.inject.Singleton;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import java.util.Enumeration;
import static sonia.scm.web.SvnServletModule.PARAMETER_SVN_PARENTPATH;
@@ -22,7 +22,7 @@ public class SvnScmProtocolProviderWrapper extends InitializingHttpScmProtocolWr
}
@Override
protected void initializeServlet(ServletConfig config, HttpServlet httpServlet) throws ServletException {
protected void initializeServlet(ServletConfig config, ScmProviderHttpServlet httpServlet) throws ServletException {
super.initializeServlet(new X(config), httpServlet);
}