From 0be816dd28ccf63b86c6d45b56fd188abb9743d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Mon, 3 Jun 2019 14:22:57 +0200 Subject: [PATCH] Extract properties from users and groups in v1 into own file --- .../group/update/XmlGroupV1UpdateStep.java | 32 +++++++++++-- .../scm/user/update/XmlUserV1UpdateStep.java | 23 ++++++++- .../update/XmlGroupV1UpdateStepTest.java | 32 ++++++++++--- .../user/update/XmlUserV1UpdateStepTest.java | 47 +++++++++++++++---- .../sonia/scm/group/update/groups.xml | 7 ++- .../resources/sonia/scm/user/update/users.xml | 11 ++++- 6 files changed, 131 insertions(+), 21 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/group/update/XmlGroupV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/group/update/XmlGroupV1UpdateStep.java index 146a709e7f..7589fe5db7 100644 --- a/scm-webapp/src/main/java/sonia/scm/group/update/XmlGroupV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/group/update/XmlGroupV1UpdateStep.java @@ -8,6 +8,8 @@ import sonia.scm.group.xml.XmlGroupDAO; import sonia.scm.migration.UpdateException; import sonia.scm.migration.UpdateStep; import sonia.scm.plugin.Extension; +import sonia.scm.store.ConfigurationEntryStore; +import sonia.scm.store.ConfigurationEntryStoreFactory; import sonia.scm.store.StoreConstants; import sonia.scm.version.Version; @@ -37,11 +39,20 @@ public class XmlGroupV1UpdateStep implements UpdateStep { private final SCMContextProvider contextProvider; private final XmlGroupDAO groupDAO; + private final ConfigurationEntryStore propertyStore; @Inject - public XmlGroupV1UpdateStep(SCMContextProvider contextProvider, XmlGroupDAO groupDAO) { + public XmlGroupV1UpdateStep( + SCMContextProvider contextProvider, + XmlGroupDAO groupDAO, + ConfigurationEntryStoreFactory configurationEntryStoreFactory + ) { this.contextProvider = contextProvider; this.groupDAO = groupDAO; + this.propertyStore = configurationEntryStoreFactory + .withType(V1Properties.class) + .withName("group-properties-v1") + .build(); } @Override @@ -52,7 +63,7 @@ public class XmlGroupV1UpdateStep implements UpdateStep { return; } XmlGroupV1UpdateStep.V1GroupDatabase v1Database = readV1Database(v1GroupsFile.get()); - v1Database.groupList.groups.forEach(group -> update(group)); + v1Database.groupList.groups.forEach(this::update); } @Override @@ -75,6 +86,8 @@ public class XmlGroupV1UpdateStep implements UpdateStep { group.setCreationDate(v1Group.creationDate); group.setLastModified(v1Group.lastModified); groupDAO.add(group); + + propertyStore.put(v1Group.name, v1Group.properties); } private XmlGroupV1UpdateStep.V1GroupDatabase readV1Database(Path v1GroupsFile) throws JAXBException { @@ -105,7 +118,7 @@ public class XmlGroupV1UpdateStep implements UpdateStep { @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "group") private static class V1Group { - private Map properties; + private V1Properties properties; private long creationDate; private String description; private Long lastModified; @@ -127,6 +140,19 @@ public class XmlGroupV1UpdateStep implements UpdateStep { } } + @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; + } + private static class GroupList { @XmlElement(name = "group") private List groups; diff --git a/scm-webapp/src/main/java/sonia/scm/user/update/XmlUserV1UpdateStep.java b/scm-webapp/src/main/java/sonia/scm/user/update/XmlUserV1UpdateStep.java index 8c5e760710..d02de8067d 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/update/XmlUserV1UpdateStep.java +++ b/scm-webapp/src/main/java/sonia/scm/user/update/XmlUserV1UpdateStep.java @@ -26,7 +26,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; -import java.util.Map; import java.util.Optional; import static java.util.Optional.empty; @@ -41,12 +40,17 @@ public class XmlUserV1UpdateStep implements UpdateStep { private final SCMContextProvider contextProvider; private final XmlUserDAO userDAO; private final ConfigurationEntryStoreFactory configurationEntryStoreFactory; + private final ConfigurationEntryStore propertyStore; @Inject public XmlUserV1UpdateStep(SCMContextProvider contextProvider, XmlUserDAO userDAO, ConfigurationEntryStoreFactory configurationEntryStoreFactory) { this.contextProvider = contextProvider; this.userDAO = userDAO; this.configurationEntryStoreFactory = configurationEntryStoreFactory; + this.propertyStore = configurationEntryStoreFactory + .withType(V1Properties.class) + .withName("user-properties-v1") + .build(); } @Override @@ -88,6 +92,8 @@ public class XmlUserV1UpdateStep implements UpdateStep { LOG.debug("setting admin permissions for user {}", v1User.name); securityStore.put(new AssignedPermission(v1User.name, "*")); } + + propertyStore.put(v1User.name, v1User.properties); } private XmlUserV1UpdateStep.V1UserDatabase readV1Database(Path v1UsersFile) throws JAXBException { @@ -119,10 +125,23 @@ public class XmlUserV1UpdateStep implements UpdateStep { return new File(contextProvider.getBaseDirectory(), StoreConstants.CONFIG_DIRECTORY_NAME).toPath(); } + @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 = "user") private static class V1User { - private Map properties; + private V1Properties properties; private boolean admin; private long creationDate; private String displayName; diff --git a/scm-webapp/src/test/java/sonia/scm/group/update/XmlGroupV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/group/update/XmlGroupV1UpdateStepTest.java index 552298ed77..ab82771304 100644 --- a/scm-webapp/src/test/java/sonia/scm/group/update/XmlGroupV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/group/update/XmlGroupV1UpdateStepTest.java @@ -13,9 +13,9 @@ import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.SCMContextProvider; import sonia.scm.group.Group; import sonia.scm.group.xml.XmlGroupDAO; -import sonia.scm.security.AssignedPermission; -import sonia.scm.store.ConfigurationEntryStore; -import sonia.scm.store.InMemoryConfigurationEntryStore; +import sonia.scm.security.DefaultKeyGenerator; +import sonia.scm.store.ConfigurationEntryStoreFactory; +import sonia.scm.store.JAXBConfigurationEntryStoreFactory; import javax.xml.bind.JAXBException; import java.io.IOException; @@ -26,6 +26,7 @@ import java.util.Optional; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.linesOf; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.times; @@ -45,13 +46,14 @@ class XmlGroupV1UpdateStepTest { ArgumentCaptor groupCaptor; XmlGroupV1UpdateStep updateStep; - ConfigurationEntryStore assignedPermissionStore; + + ConfigurationEntryStoreFactory storeFactory; @BeforeEach void mockScmHome(@TempDirectory.TempDir Path tempDir) { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); - assignedPermissionStore = new InMemoryConfigurationEntryStore<>(); - updateStep = new XmlGroupV1UpdateStep(contextProvider, groupDAO); + storeFactory = new JAXBConfigurationEntryStoreFactory(contextProvider, null, new DefaultKeyGenerator()); + updateStep = new XmlGroupV1UpdateStep(contextProvider, groupDAO, storeFactory); } @Nested @@ -88,6 +90,24 @@ class XmlGroupV1UpdateStepTest { .hasFieldOrPropertyWithValue("lastModified", 1559550955883L) .hasFieldOrPropertyWithValue("creationDate", 1559548942457L); } + + @Test + void shouldExtractProperties(@TempDirectory.TempDir Path tempDir) throws JAXBException { + updateStep.doUpdate(); + Path propertiesFile = tempDir.resolve("config").resolve("group-properties-v1.xml"); + assertThat(propertiesFile) + .exists(); + assertThat(linesOf(propertiesFile.toFile())) + .extracting(String::trim) + .containsSequence( + "normals", + "", + "", + "mostly", + "humans", + "", + ""); + } } private void copyTestDatabaseFile(Path configDir, String groupsFileName) throws IOException { diff --git a/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java index 764fda2c5d..0d0920620c 100644 --- a/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/user/update/XmlUserV1UpdateStepTest.java @@ -12,10 +12,9 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.SCMContextProvider; import sonia.scm.security.AssignedPermission; -import sonia.scm.store.ConfigurationEntryStore; +import sonia.scm.security.DefaultKeyGenerator; import sonia.scm.store.ConfigurationEntryStoreFactory; -import sonia.scm.store.InMemoryConfigurationEntryStore; -import sonia.scm.store.InMemoryConfigurationEntryStoreFactory; +import sonia.scm.store.JAXBConfigurationEntryStoreFactory; import sonia.scm.user.User; import sonia.scm.user.xml.XmlUserDAO; @@ -27,6 +26,7 @@ import java.nio.file.Path; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.linesOf; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.times; @@ -46,14 +46,14 @@ class XmlUserV1UpdateStepTest { ArgumentCaptor userCaptor; XmlUserV1UpdateStep updateStep; - ConfigurationEntryStore assignedPermissionStore; + + ConfigurationEntryStoreFactory storeFactory; @BeforeEach void mockScmHome(@TempDirectory.TempDir Path tempDir) { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); - assignedPermissionStore = new InMemoryConfigurationEntryStore<>(); - ConfigurationEntryStoreFactory inMemoryConfigurationEntryStoreFactory = new InMemoryConfigurationEntryStoreFactory(assignedPermissionStore); - updateStep = new XmlUserV1UpdateStep(contextProvider, userDAO, inMemoryConfigurationEntryStoreFactory); + storeFactory = new JAXBConfigurationEntryStoreFactory(contextProvider, null, new DefaultKeyGenerator()); + updateStep = new XmlUserV1UpdateStep(contextProvider, userDAO, storeFactory); } @Nested @@ -74,7 +74,16 @@ class XmlUserV1UpdateStepTest { @Test void shouldCreateNewPermissionsForV1AdminUser() throws JAXBException { updateStep.doUpdate(); - Optional assignedPermission = assignedPermissionStore.getAll().values().stream().filter(a -> a.getName().equals("scmadmin")).findFirst(); + Optional assignedPermission = + storeFactory + .withType(AssignedPermission.class) + .withName("security") + .build() + .getAll() + .values() + .stream() + .filter(a -> a.getName().equals("scmadmin")) + .findFirst(); assertThat(assignedPermission.get().getPermission().getValue()).contains("*"); assertThat(assignedPermission.get().isGroupPermission()).isFalse(); } @@ -100,6 +109,28 @@ class XmlUserV1UpdateStepTest { .hasFieldOrPropertyWithValue("lastModified", 1558597367492L) .hasFieldOrPropertyWithValue("creationDate", 1558597074732L); } + + @Test + void shouldExtractProperties(@TempDirectory.TempDir Path tempDir) throws JAXBException { + updateStep.doUpdate(); + Path propertiesFile = tempDir.resolve("config").resolve("user-properties-v1.xml"); + assertThat(propertiesFile) + .exists(); + assertThat(linesOf(propertiesFile.toFile())) + .extracting(String::trim) + .containsSequence( + "dent", + "", + "", + "born.on", + "earth", + "", + "", + "last.seen", + "end of the universe", + "", + ""); + } } private void copyTestDatabaseFile(Path configDir, String usersFileName) throws IOException { diff --git a/scm-webapp/src/test/resources/sonia/scm/group/update/groups.xml b/scm-webapp/src/test/resources/sonia/scm/group/update/groups.xml index f058a01e7a..97cd98c17c 100644 --- a/scm-webapp/src/test/resources/sonia/scm/group/update/groups.xml +++ b/scm-webapp/src/test/resources/sonia/scm/group/update/groups.xml @@ -11,7 +11,12 @@ xml - + + + mostly + humans + + 1559548942457 Normal people normals diff --git a/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml b/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml index f586996384..d82b2fcb1d 100644 --- a/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml +++ b/scm-webapp/src/test/resources/sonia/scm/user/update/users.xml @@ -24,7 +24,16 @@ xml - + + + born.on + earth + + + last.seen + end of the universe + + false 1558597107621 Arthur Dent