diff --git a/scm-webapp/src/main/java/sonia/scm/update/group/XmlGroupV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/group/XmlGroupV1UpdateStep.java index 3f3b25352d..9622af0f34 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/group/XmlGroupV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/group/XmlGroupV1UpdateStep.java @@ -21,10 +21,10 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; import java.util.Optional; @@ -96,9 +96,8 @@ public class XmlGroupV1UpdateStep implements UpdateStep { } private Optional determineV1File() { - Path configDirectory = determineConfigDirectory(); - Path existingGroupsFile = configDirectory.resolve("groups" + StoreConstants.FILE_EXTENSION); - Path groupsV1File = configDirectory.resolve("groupsV1" + StoreConstants.FILE_EXTENSION); + Path existingGroupsFile = resolveConfigFile("groups"); + Path groupsV1File = resolveConfigFile("groupsV1"); if (existingGroupsFile.toFile().exists()) { try { Files.move(existingGroupsFile, groupsV1File); @@ -111,8 +110,11 @@ public class XmlGroupV1UpdateStep implements UpdateStep { return empty(); } - private Path determineConfigDirectory() { - return new File(contextProvider.getBaseDirectory(), StoreConstants.CONFIG_DIRECTORY_NAME).toPath(); + private Path resolveConfigFile(String name) { + return contextProvider + .resolve( + Paths.get(StoreConstants.CONFIG_DIRECTORY_NAME).resolve(name + StoreConstants.FILE_EXTENSION) + ); } @XmlAccessorType(XmlAccessType.FIELD) diff --git a/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java index a3b511a06b..34c08fb16b 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStep.java @@ -27,6 +27,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -94,7 +95,7 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep { @Override public void doUpdate() throws JAXBException { - if (!determineV1File().exists()) { + if (!resolveV1File().exists()) { LOG.info("no v1 repositories database file found"); return; } @@ -179,7 +180,7 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep { } private Optional readV1Database(JAXBContext jaxbContext) throws JAXBException { - Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(determineV1File()); + Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(resolveV1File()); if (unmarshal instanceof V1RepositoryDatabase) { return of((V1RepositoryDatabase) unmarshal); } else { @@ -187,9 +188,11 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep { } } - private File determineV1File() { - File configDirectory = new File(contextProvider.getBaseDirectory(), StoreConstants.CONFIG_DIRECTORY_NAME); - return new File(configDirectory, "repositories" + StoreConstants.FILE_EXTENSION); + private File resolveV1File() { + return contextProvider + .resolve( + Paths.get(StoreConstants.CONFIG_DIRECTORY_NAME).resolve("repositories" + StoreConstants.FILE_EXTENSION) + ).toFile(); } @XmlAccessorType(XmlAccessType.FIELD) diff --git a/scm-webapp/src/main/java/sonia/scm/update/user/XmlUserV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/user/XmlUserV1UpdateStep.java index 9878304585..24d96d3654 100644 --- a/scm-webapp/src/main/java/sonia/scm/update/user/XmlUserV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/update/user/XmlUserV1UpdateStep.java @@ -22,10 +22,10 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; import java.util.Optional; @@ -107,9 +107,8 @@ public class XmlUserV1UpdateStep implements UpdateStep { } private Optional determineV1File() { - Path configDirectory = determineConfigDirectory(); - Path existingUsersFile = configDirectory.resolve("users" + StoreConstants.FILE_EXTENSION); - Path usersV1File = configDirectory.resolve("usersV1" + StoreConstants.FILE_EXTENSION); + Path existingUsersFile = resolveConfigFile("users"); + Path usersV1File = resolveConfigFile("usersV1"); if (existingUsersFile.toFile().exists()) { try { Files.move(existingUsersFile, usersV1File); @@ -122,8 +121,11 @@ public class XmlUserV1UpdateStep implements UpdateStep { return empty(); } - private Path determineConfigDirectory() { - return new File(contextProvider.getBaseDirectory(), StoreConstants.CONFIG_DIRECTORY_NAME).toPath(); + private Path resolveConfigFile(String name) { + return contextProvider + .resolve( + Paths.get(StoreConstants.CONFIG_DIRECTORY_NAME).resolve(name + StoreConstants.FILE_EXTENSION) + ); } @XmlAccessorType(XmlAccessType.FIELD) diff --git a/scm-webapp/src/test/java/sonia/scm/update/UpdateStepTestUtil.java b/scm-webapp/src/test/java/sonia/scm/update/UpdateStepTestUtil.java index f077d783b3..88b09fc086 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/UpdateStepTestUtil.java +++ b/scm-webapp/src/test/java/sonia/scm/update/UpdateStepTestUtil.java @@ -15,7 +15,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import static org.mockito.Mockito.when; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.lenient; public class UpdateStepTestUtil { @@ -28,7 +29,8 @@ private final SCMContextProvider contextProvider; this.tempDir = tempDir; contextProvider = Mockito.mock(SCMContextProvider.class); storeFactory = new JAXBConfigurationEntryStoreFactory(contextProvider, null, new DefaultKeyGenerator()); - when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); + lenient().when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); + lenient().when(contextProvider.resolve(any())).thenAnswer(invocation -> tempDir.resolve(invocation.getArgument(0).toString())); } public SCMContextProvider getContextProvider() { diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java index 438a54b70d..2102d296ea 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java @@ -11,7 +11,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import sonia.scm.SCMContextProvider; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryPermission; import sonia.scm.repository.xml.XmlRepositoryDAO; @@ -19,6 +18,7 @@ import sonia.scm.store.ConfigurationEntryStore; import sonia.scm.store.ConfigurationEntryStoreFactory; import sonia.scm.store.InMemoryConfigurationEntryStore; import sonia.scm.store.InMemoryConfigurationEntryStoreFactory; +import sonia.scm.update.UpdateStepTestUtil; import javax.xml.bind.JAXBException; import java.io.IOException; @@ -46,8 +46,6 @@ class XmlRepositoryV1UpdateStepTest { Injector injectorMock = MigrationStrategyMock.init(); - @Mock - SCMContextProvider contextProvider; @Mock XmlRepositoryDAO repositoryDAO; @Mock @@ -60,17 +58,15 @@ class XmlRepositoryV1UpdateStepTest { @Captor ArgumentCaptor locationCaptor; + UpdateStepTestUtil testUtil; + XmlRepositoryV1UpdateStep updateStep; @BeforeEach - void mockScmHome(@TempDirectory.TempDir Path tempDir) { - when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); - } - - @BeforeEach - void createUpdateStepFromMocks() { + void createUpdateStepFromMocks(@TempDirectory.TempDir Path tempDir) { + testUtil = new UpdateStepTestUtil(tempDir); updateStep = new XmlRepositoryV1UpdateStep( - contextProvider, + testUtil.getContextProvider(), repositoryDAO, migrationStrategyDao, injectorMock,