Use existing RepositoryProvider

This commit is contained in:
René Pfeuffer
2020-05-14 21:27:35 +02:00
parent 28824c37d3
commit 3c808bf171
11 changed files with 29 additions and 49 deletions

View File

@@ -28,14 +28,13 @@ import com.google.common.base.Stopwatch;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider;
import sonia.scm.util.IOUtil; import sonia.scm.util.IOUtil;
import javax.inject.Inject; import javax.inject.Inject;
import java.io.File; import java.io.File;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
public class CachingAllWorkingCopyPool implements WorkingCopyPool { public class CachingAllWorkingCopyPool implements WorkingCopyPool {
@@ -51,7 +50,7 @@ public class CachingAllWorkingCopyPool implements WorkingCopyPool {
} }
@Override @Override
public <R, W, C extends Supplier<Repository>> ParentAndClone<R, W> getWorkingCopy(WorkingCopyContext<R, W, C> workingCopyContext) { public <R, W, C extends RepositoryProvider> ParentAndClone<R, W> getWorkingCopy(WorkingCopyContext<R, W, C> workingCopyContext) {
String id = workingCopyContext.getScmRepository().getId(); String id = workingCopyContext.getScmRepository().getId();
File existingWorkdir = workdirs.remove(id); File existingWorkdir = workdirs.remove(id);
if (existingWorkdir != null) { if (existingWorkdir != null) {
@@ -66,13 +65,13 @@ public class CachingAllWorkingCopyPool implements WorkingCopyPool {
} }
} }
try { try {
return createNewWorkdir(workingCopyContext); return createNewWorkingCopy(workingCopyContext);
} catch (WorkingCopyFailedException e) { } catch (WorkingCopyFailedException e) {
throw new InternalRepositoryException(workingCopyContext.getScmRepository(), "failed to create working copy", e); throw new InternalRepositoryException(workingCopyContext.getScmRepository(), "failed to create working copy", e);
} }
} }
private <R, W> ParentAndClone<R, W> createNewWorkdir(WorkingCopyContext<R, W, ?> workingCopyContext) throws WorkingCopyFailedException { private <R, W> ParentAndClone<R, W> createNewWorkingCopy(WorkingCopyContext<R, W, ?> workingCopyContext) throws WorkingCopyFailedException {
Stopwatch stopwatch = Stopwatch.createStarted(); Stopwatch stopwatch = Stopwatch.createStarted();
File newWorkdir = workdirProvider.createNewWorkdir(); File newWorkdir = workdirProvider.createNewWorkdir();
SimpleWorkingCopyFactory.WorkingCopyInitializer<R, W> initializer = workingCopyContext.getInitializer(); SimpleWorkingCopyFactory.WorkingCopyInitializer<R, W> initializer = workingCopyContext.getInitializer();
@@ -96,9 +95,9 @@ public class CachingAllWorkingCopyPool implements WorkingCopyPool {
workdirs.clear(); workdirs.clear();
} }
private void deleteWorkdir(File existingWorkdir) { private void deleteWorkdir(File workdir) {
if (existingWorkdir.exists()) { if (workdir.exists()) {
IOUtil.deleteSilently(existingWorkdir); IOUtil.deleteSilently(workdir);
} }
} }
} }

View File

@@ -24,12 +24,11 @@
package sonia.scm.repository.work; package sonia.scm.repository.work;
import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider;
import sonia.scm.util.IOUtil; import sonia.scm.util.IOUtil;
import javax.inject.Inject; import javax.inject.Inject;
import java.io.File; import java.io.File;
import java.util.function.Supplier;
public class NoneCachingWorkingCopyPool implements WorkingCopyPool { public class NoneCachingWorkingCopyPool implements WorkingCopyPool {
@@ -41,7 +40,7 @@ public class NoneCachingWorkingCopyPool implements WorkingCopyPool {
} }
@Override @Override
public <R, W, C extends Supplier<Repository>> ParentAndClone<R, W> getWorkingCopy(WorkingCopyContext<R, W, C> context) throws WorkingCopyFailedException { public <R, W, C extends RepositoryProvider> ParentAndClone<R, W> getWorkingCopy(WorkingCopyContext<R, W, C> context) throws WorkingCopyFailedException {
return context.getInitializer().initialize(workdirProvider.createNewWorkdir(), context.getRequestedBranch()); return context.getInitializer().initialize(workdirProvider.createNewWorkdir(), context.getRequestedBranch());
} }

View File

@@ -27,12 +27,11 @@ package sonia.scm.repository.work;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider;
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; import javax.servlet.ServletContextListener;
import java.io.File; import java.io.File;
import java.util.function.Supplier;
/** /**
* This class is responsible to govern the creation, the reuse and the destruction * This class is responsible to govern the creation, the reuse and the destruction
@@ -180,7 +179,7 @@ SimpleGitWorkingCopyFactory->SimpleGitWorkingCopyFactory:closeRepository
SimpleGitWorkingCopyFactory->WorkingCopyPool:contextClosed SimpleGitWorkingCopyFactory->WorkingCopyPool:contextClosed
@enduml @enduml
*/ */
public abstract class SimpleWorkingCopyFactory<R, W, C extends Supplier<Repository>> implements WorkingCopyFactory<R, W, C>, ServletContextListener { public abstract class SimpleWorkingCopyFactory<R, W, C extends RepositoryProvider> implements WorkingCopyFactory<R, W, C>, ServletContextListener {
private static final Logger LOG = LoggerFactory.getLogger(SimpleWorkingCopyFactory.class); private static final Logger LOG = LoggerFactory.getLogger(SimpleWorkingCopyFactory.class);

View File

@@ -25,10 +25,9 @@
package sonia.scm.repository.work; package sonia.scm.repository.work;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryProvider;
import java.util.function.Supplier; public class WorkingCopyContext<R, W, C extends RepositoryProvider> {
public class WorkingCopyContext<R, W, C extends Supplier<Repository>> {
private final String requestedBranch; private final String requestedBranch;
private final C context; private final C context;
private final SimpleWorkingCopyFactory.WorkingCopyInitializer<R, W> initializer; private final SimpleWorkingCopyFactory.WorkingCopyInitializer<R, W> initializer;

View File

@@ -24,13 +24,12 @@
package sonia.scm.repository.work; package sonia.scm.repository.work;
import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider;
import java.io.File; import java.io.File;
import java.util.function.Supplier;
public interface WorkingCopyPool { public interface WorkingCopyPool {
<R, W, C extends Supplier<Repository>> ParentAndClone<R, W> getWorkingCopy(WorkingCopyContext<R, W, C> context) throws WorkingCopyFailedException; <R, W, C extends RepositoryProvider> ParentAndClone<R, W> getWorkingCopy(WorkingCopyContext<R, W, C> context) throws WorkingCopyFailedException;
void contextClosed(WorkingCopyContext<?, ?, ?> workingCopyContext, File workdir); void contextClosed(WorkingCopyContext<?, ?, ?> workingCopyContext, File workdir);

View File

@@ -32,14 +32,13 @@ import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryProvider;
import java.io.File; import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.function.Supplier;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
@@ -56,7 +55,7 @@ class CachingAllWorkingCopyPoolTest {
CachingAllWorkingCopyPool cachingAllWorkingCopyPool; CachingAllWorkingCopyPool cachingAllWorkingCopyPool;
@Mock @Mock
WorkingCopyContext<Object, Path, Supplier<Repository>> workingCopyContext; WorkingCopyContext<Object, Path, RepositoryProvider> workingCopyContext;
@Mock @Mock
SimpleWorkingCopyFactory.WorkingCopyInitializer<Object, Path> initializer; SimpleWorkingCopyFactory.WorkingCopyInitializer<Object, Path> initializer;
@Mock @Mock

View File

@@ -29,12 +29,12 @@ import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.TemporaryFolder; import org.junit.rules.TemporaryFolder;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryProvider;
import sonia.scm.util.IOUtil; import sonia.scm.util.IOUtil;
import java.io.Closeable; import java.io.Closeable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.function.Supplier;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@@ -61,7 +61,7 @@ public class SimpleWorkingCopyFactoryTest {
WorkdirProvider workdirProvider = new WorkdirProvider(temporaryFolder.newFolder()); WorkdirProvider workdirProvider = new WorkdirProvider(temporaryFolder.newFolder());
WorkingCopyPool configurableTestWorkingCopyPool = new WorkingCopyPool() { WorkingCopyPool configurableTestWorkingCopyPool = new WorkingCopyPool() {
@Override @Override
public <R, W, C extends Supplier<Repository>> ParentAndClone<R, W> getWorkingCopy(WorkingCopyContext<R, W, C> context) throws WorkingCopyFailedException { public <R, W, C extends RepositoryProvider> ParentAndClone<R, W> getWorkingCopy(WorkingCopyContext<R, W, C> context) throws WorkingCopyFailedException {
workdir = workdirProvider.createNewWorkdir(); workdir = workdirProvider.createNewWorkdir();
return context.getInitializer().initialize(workdir, context.getRequestedBranch()); return context.getInitializer().initialize(workdir, context.getRequestedBranch());
} }
@@ -154,7 +154,7 @@ public class SimpleWorkingCopyFactoryTest {
} }
} }
private static class Context implements Supplier<Repository> { private static class Context implements RepositoryProvider {
@Override @Override
public Repository get() { public Repository get() {
return REPOSITORY; return REPOSITORY;

View File

@@ -24,28 +24,23 @@
package sonia.scm.repository.spi; package sonia.scm.repository.spi;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.api.v2.resources.GitRepositoryConfigStoreProvider; import sonia.scm.api.v2.resources.GitRepositoryConfigStoreProvider;
import sonia.scm.repository.GitRepositoryConfig; import sonia.scm.repository.GitRepositoryConfig;
import sonia.scm.repository.GitUtil; import sonia.scm.repository.GitUtil;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryProvider;
//~--- JDK imports ------------------------------------------------------------
import java.io.Closeable; import java.io.Closeable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.function.Supplier;
/** /**
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
*/ */
public class GitContext implements Closeable, Supplier<Repository> public class GitContext implements Closeable, RepositoryProvider
{ {
/** /**

View File

@@ -27,28 +27,26 @@ package sonia.scm.repository.spi;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import com.aragost.javahg.Repository; import com.aragost.javahg.Repository;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import sonia.scm.repository.HgConfig; import sonia.scm.repository.HgConfig;
import sonia.scm.repository.HgHookManager; import sonia.scm.repository.HgHookManager;
import sonia.scm.repository.HgRepositoryHandler; import sonia.scm.repository.HgRepositoryHandler;
import sonia.scm.repository.RepositoryProvider;
import sonia.scm.web.HgUtil; import sonia.scm.web.HgUtil;
//~--- JDK imports ------------------------------------------------------------
import java.io.Closeable; import java.io.Closeable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Supplier;
//~--- JDK imports ------------------------------------------------------------
/** /**
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
*/ */
public class HgCommandContext implements Closeable, Supplier<sonia.scm.repository.Repository> public class HgCommandContext implements Closeable, RepositoryProvider
{ {
/** Field description */ /** Field description */

View File

@@ -32,16 +32,15 @@ import com.aragost.javahg.commands.PullCommand;
import com.aragost.javahg.commands.StatusCommand; import com.aragost.javahg.commands.StatusCommand;
import com.aragost.javahg.commands.UpdateCommand; import com.aragost.javahg.commands.UpdateCommand;
import com.aragost.javahg.commands.flags.CloneCommandFlags; import com.aragost.javahg.commands.flags.CloneCommandFlags;
import sonia.scm.repository.work.SimpleWorkingCopyFactory;
import sonia.scm.repository.work.WorkingCopyFailedException; import sonia.scm.repository.work.WorkingCopyFailedException;
import sonia.scm.repository.work.WorkingCopyPool; import sonia.scm.repository.work.WorkingCopyPool;
import sonia.scm.repository.work.SimpleWorkingCopyFactory;
import sonia.scm.repository.work.WorkingCopyPool.ParentAndClone; import sonia.scm.repository.work.WorkingCopyPool.ParentAndClone;
import sonia.scm.util.IOUtil; import sonia.scm.util.IOUtil;
import sonia.scm.web.HgRepositoryEnvironmentBuilder; import sonia.scm.web.HgRepositoryEnvironmentBuilder;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Provider; import javax.inject.Provider;
import javax.xml.stream.events.StartDocument;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;

View File

@@ -24,30 +24,24 @@
package sonia.scm.repository.spi; package sonia.scm.repository.spi;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory; import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryProvider;
import sonia.scm.repository.SvnUtil; import sonia.scm.repository.SvnUtil;
//~--- JDK imports ------------------------------------------------------------
import java.io.Closeable; import java.io.Closeable;
import java.io.File; import java.io.File;
import java.util.function.Supplier;
/** /**
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
*/ */
public class SvnContext implements Closeable, Supplier<Repository> { public class SvnContext implements Closeable, RepositoryProvider {
private static final Logger LOG = LoggerFactory.getLogger(SvnContext.class); private static final Logger LOG = LoggerFactory.getLogger(SvnContext.class);