Clean up generics

This commit is contained in:
René Pfeuffer
2019-03-28 14:10:43 +01:00
parent 79be188777
commit df9e16c485
5 changed files with 25 additions and 21 deletions

View File

@@ -2,7 +2,7 @@ package sonia.scm.repository.util;
import java.util.function.Consumer;
public class CloseableWrapper<T> implements AutoCloseable {
public class CloseableWrapper<T extends AutoCloseable> implements AutoCloseable {
private final T wrapped;
private final Consumer<T> cleanup;

View File

@@ -9,28 +9,31 @@ import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
public abstract class SimpleWorkdirFactory<T extends AutoCloseable, C> {
public abstract class SimpleWorkdirFactory<R extends AutoCloseable, C> implements WorkdirFactory<R, C> {
private static final Logger logger = LoggerFactory.getLogger(SimpleWorkdirFactory.class);
private final File poolDirectory;
private final CloneProvider<T, C> cloneProvider;
private final CloneProvider<R, C> cloneProvider;
public SimpleWorkdirFactory(CloneProvider<T, C> cloneProvider) {
public SimpleWorkdirFactory(CloneProvider<R, C> cloneProvider) {
this(new File(System.getProperty("java.io.tmpdir"), "scmm-work-pool"), cloneProvider);
}
public SimpleWorkdirFactory(File poolDirectory, CloneProvider<T, C> cloneProvider) {
public SimpleWorkdirFactory(File poolDirectory, CloneProvider<R, C> cloneProvider) {
this.poolDirectory = poolDirectory;
this.cloneProvider = cloneProvider;
poolDirectory.mkdirs();
if (!poolDirectory.exists() && !poolDirectory.mkdirs()) {
throw new IllegalStateException("could not create pool directory " + poolDirectory);
}
}
public WorkingCopy<T> createWorkingCopy(C context) {
@Override
public WorkingCopy<R> createWorkingCopy(C context) {
try {
File directory = createNewWorkdir();
T clone = cloneProvider.cloneRepository(context, directory);
R clone = cloneProvider.cloneRepository(context, directory);
return new WorkingCopy<>(clone, this::close, directory);
} catch (IOException e) {
throw new InternalRepositoryException(getRepository(context), "could not create temporary directory for clone of repository", e);
@@ -43,7 +46,7 @@ public abstract class SimpleWorkdirFactory<T extends AutoCloseable, C> {
return Files.createTempDirectory(poolDirectory.toPath(),"workdir").toFile();
}
private void close(T repository) {
private void close(R repository) {
try {
repository.close();
} catch (Exception e) {
@@ -51,7 +54,7 @@ public abstract class SimpleWorkdirFactory<T extends AutoCloseable, C> {
}
}
public interface CloneProvider<T, C> {
T cloneRepository(C context, File target) throws IOException;
public interface CloneProvider<R, C> {
R cloneRepository(C context, File target) throws IOException;
}
}

View File

@@ -1,5 +1,5 @@
package sonia.scm.repository.util;
public interface WorkdirFactory<T, C> {
WorkingCopy<T> createWorkingCopy(C gitContext);
public interface WorkdirFactory<R extends AutoCloseable, C> {
WorkingCopy<R> createWorkingCopy(C context);
}

View File

@@ -8,14 +8,14 @@ import java.io.File;
import java.io.IOException;
import java.util.function.Consumer;
public class WorkingCopy<T> extends CloseableWrapper<T> {
public class WorkingCopy<R extends AutoCloseable> extends CloseableWrapper<R> {
private static final Logger LOG = LoggerFactory.getLogger(WorkingCopy.class);
private final File directory;
public WorkingCopy(T wrapped, Consumer<T> cleanup, File directory) {
super(wrapped, cleanup);
public WorkingCopy(R wrappedRepository, Consumer<R> cleanup, File directory) {
super(wrappedRepository, cleanup);
this.directory = directory;
}

View File

@@ -12,19 +12,20 @@ public class CloseableWrapperTest {
@Test
public void shouldExecuteGivenMethodAtClose() {
Consumer<String> wrapped = new Consumer<String>() {
Consumer<AutoCloseable> wrapped = new Consumer<AutoCloseable>() {
// no this cannot be replaced with a lambda because otherwise we could not use Mockito#spy
@Override
public void accept(String s) {
public void accept(AutoCloseable s) {
}
};
Consumer<String> closer = spy(wrapped);
Consumer<AutoCloseable> closer = spy(wrapped);
try (CloseableWrapper<String> wrapper = new CloseableWrapper<>("test", closer)) {
AutoCloseable autoCloseable = () -> {};
try (CloseableWrapper<AutoCloseable> wrapper = new CloseableWrapper<>(autoCloseable, closer)) {
// nothing to do here
}
verify(closer).accept("test");
verify(closer).accept(autoCloseable);
}
}