diff --git a/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStep.java index 8c93b21822..9f79287a19 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStep.java @@ -9,6 +9,8 @@ import sonia.scm.plugin.Extension; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryPermission; import sonia.scm.repository.xml.XmlRepositoryDAO; +import sonia.scm.store.ConfigurationEntryStore; +import sonia.scm.store.ConfigurationEntryStoreFactory; import sonia.scm.store.StoreConstants; import sonia.scm.version.Version; @@ -57,13 +59,24 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep { private final XmlRepositoryDAO repositoryDao; private final MigrationStrategyDao migrationStrategyDao; private final Injector injector; + private final ConfigurationEntryStore propertyStore; @Inject - public XmlRepositoryV1UpdateStep(SCMContextProvider contextProvider, XmlRepositoryDAO repositoryDao, MigrationStrategyDao migrationStrategyDao, Injector injector) { + public XmlRepositoryV1UpdateStep( + SCMContextProvider contextProvider, + XmlRepositoryDAO repositoryDao, + MigrationStrategyDao migrationStrategyDao, + Injector injector, + ConfigurationEntryStoreFactory configurationEntryStoreFactory + ) { this.contextProvider = contextProvider; this.repositoryDao = repositoryDao; this.migrationStrategyDao = migrationStrategyDao; this.injector = injector; + this.propertyStore = configurationEntryStoreFactory + .withType(V1Properties.class) + .withName("repository-properties-v1") + .build(); } @Override @@ -103,6 +116,7 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep { createPermissions(v1Repository)); LOG.info("creating new repository {} with id {} from old repository {} in directory {}", repository.getNamespaceAndName(), repository.getId(), v1Repository.name, destination); repositoryDao.add(repository, destination); + propertyStore.put(v1Repository.id, v1Repository.properties); } private Path handleDataDirectory(V1Repository v1Repository) { @@ -170,10 +184,22 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep { private String type; } + @XmlAccessorType(XmlAccessType.FIELD) + private static class V1Property { + private String key; + private String value; + } + + @XmlAccessorType(XmlAccessType.FIELD) + @XmlRootElement(name = "properties") + private static class V1Properties { + @XmlElement(name = "item") + private List properties; + } + @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "repositories") private static class V1Repository { - private Map properties; private String contact; private long creationDate; private Long lastModified; @@ -184,11 +210,11 @@ public class XmlRepositoryV1UpdateStep implements UpdateStep { private boolean archived; private String type; private List permissions; + private V1Properties properties; @Override public String toString() { return "V1Repository{" + - "properties=" + properties + ", contact='" + contact + '\'' + ", creationDate=" + creationDate + ", lastModified=" + lastModified + diff --git a/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStepTest.java index b7ad55a889..8c0f4bb103 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/update/XmlRepositoryV1UpdateStepTest.java @@ -16,6 +16,10 @@ import sonia.scm.SCMContextProvider; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryPermission; import sonia.scm.repository.xml.XmlRepositoryDAO; +import sonia.scm.store.ConfigurationEntryStore; +import sonia.scm.store.ConfigurationEntryStoreFactory; +import sonia.scm.store.InMemoryConfigurationEntryStore; +import sonia.scm.store.InMemoryConfigurationEntryStoreFactory; import javax.xml.bind.JAXBException; import java.io.IOException; @@ -29,7 +33,6 @@ import static java.util.Optional.of; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -48,15 +51,16 @@ class XmlRepositoryV1UpdateStepTest { SCMContextProvider contextProvider; @Mock XmlRepositoryDAO repositoryDAO; - @Mock() + @Mock MigrationStrategyDao migrationStrategyDao; + ConfigurationEntryStoreFactory configurationEntryStoreFactory = new InMemoryConfigurationEntryStoreFactory(new InMemoryConfigurationEntryStore()); + @Captor ArgumentCaptor storeCaptor; @Captor ArgumentCaptor locationCaptor; - @InjectMocks XmlRepositoryV1UpdateStep updateStep; @BeforeEach @@ -64,6 +68,17 @@ class XmlRepositoryV1UpdateStepTest { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); } + @BeforeEach + void createUpdateStepFromMocks() { + updateStep = new XmlRepositoryV1UpdateStep( + contextProvider, + repositoryDAO, + migrationStrategyDao, + injectorMock, + configurationEntryStoreFactory + ); + } + @Nested class WithExistingDatabase { @@ -154,6 +169,15 @@ class XmlRepositoryV1UpdateStepTest { ); } + @Test + void shouldExtractPropertiesFromRepositories() throws JAXBException { + updateStep.doUpdate(); + + ConfigurationEntryStore store = configurationEntryStoreFactory.withType(null).withName("").build(); + assertThat(store.getAll()) + .hasSize(3); + } + @Test void shouldUseDirectoryFromStrategy(@TempDirectory.TempDir Path tempDir) throws JAXBException { Path targetDir = tempDir.resolve("someDir"); diff --git a/scm-webapp/src/test/resources/sonia/scm/repository/update/scm-home.v1.zip b/scm-webapp/src/test/resources/sonia/scm/repository/update/scm-home.v1.zip index 5d936db5e2..0d43f2f4d6 100644 Binary files a/scm-webapp/src/test/resources/sonia/scm/repository/update/scm-home.v1.zip and b/scm-webapp/src/test/resources/sonia/scm/repository/update/scm-home.v1.zip differ