From 76c59a6dee383369d3f4166a0c82683f4e1c00f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 24 May 2019 13:55:37 +0200 Subject: [PATCH] Extract properties from v1 repositories --- .../update/XmlRepositoryV1UpdateStep.java | 32 ++++++++++++++++-- .../update/XmlRepositoryV1UpdateStepTest.java | 30 ++++++++++++++-- .../scm/repository/update/scm-home.v1.zip | Bin 13593 -> 13412 bytes 3 files changed, 56 insertions(+), 6 deletions(-) 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 5d936db5e264ac6182855e34a5aae82871c2c3fd..0d43f2f4d6a0b5f595e58cda18933e1565bbc083 100644 GIT binary patch delta 2435 zcmZ8h3s@6Z7M|P?5=fW?0to~X5&{9jD`0q8(HP|+5F!tu7F@7J5eq1a3c{9Jw_87@ zUEp*}YiSJy*P`G9Dk80qszqJ863aud6uPYyq>ADy_EV9a2}y(|-^~2~fBtjsx%1sK zpKQFf!D3|`)dB*9j#Uj#)beYiRp)!j2h>o0#re7I3ESREU)GK=>^>9rAh+_f`q7Mj z;@Vcs#3&YHR17oR`cgHU>J^+bPttU?HI9q}4hPd4*W|LF)g3+}N-b4Pt!xrhv@tJ<;~V>Hb=x;cZ;Xa4EjFgcE?@E()Hn~ zPhqezOI5n_8Y)*m%wvpe7O$bG!1;Z6y4P}t)=KGQ5zzrmZ9j+9+y{vs_) zZrT`@_oL@)`4Ru@8ygzcmAn42;#OiFzdfd6ck7jF7YACsCr_~P&cItze4>^;!n6y; zzbL+2#(F<FE4X^l;u;B zy78x4w@b8dzp;-!(3x=8EmEG{qECLd{rfaWcWLnJ0{Nr(ve2PrPZZsPrmoBDI}$J0 zZ=0N~pnso!<*ZL4WjtskV)YYgBr`7!6Qpg{DZVVcwrhfaGVDh59>w&7_=wE4{`B>- zj{n~O=}=Rfm+InZs!c34;?Z9`QVJ@UpUxZz^LF`ByZ1_GuixF(%X1ue$GxKq%a)(} zqpu}4J^r_&wsOghnk_rJ?%3V9GSpjM`Wo0-Kkn>2>D?!~x~X*HUT$T?|29j1IPile zYUYy{Ot7Q{8_xV<+FkP5>Sy^nh04rrhibZ)t5U2mYUQC{Gf2^3uyG***6_KNmBC1Ay;i|SECRW8gAu2h?Nhh_cKzo>GP8!0KtQ50ti;cpJyKMptn1aVs^+cZ(Tn;;NUo-B(1C4Px^l_z- z!seR!hwMd0EP^|pILxqT+aqh}IZCr{v4aD=?Sn&(H`|)n@g?JqNt-FuVap@!WXGen zGv-V#_vPw^+)%UL#|<&yrF;?SommiOFP+Et*n7?6dJfS6pEvu)pBUFSB`fL8U(pI01Ax!!x{PFx8plX^g&ybNnpGa*UkES2!&K+zJ1a7E5ws|E-6e zB$RnEoTmhii}ASpx%nLDm^tR;*&=dS$Pk*~N|#q4%ZdR-41a^OP$Y(Mp@4!xiZB@s zV9+RBAfErp#xOqSh><@EaW(83qrh{ah)R6Kp-|)k;UW>5w1Cy3B+4)}i9#0=-w=ClgA;gogw1x6OEc@;Rik% zWXmjJ3*1>3Y zC8jDGot{g{A&W+Syg3dUR0e3!A(P|*e1!`6^39HYiWpS;lK$0+0qj6E!X3>HQo^0+ z@L`||y*pQC13yTGp1+j#1;wCmoy>`+1x!%-1wn#8j+6qkOw1+hTcAeu^Cg`#v5ZoM z9G&MlS@3}}h{G|?28MC4drK>vp~W=>jw?l|-x>7E;A*)A=p~jg<|;zoF2E4`+0!hE Qk;1}>|4lxI6}gb?|49vj^Z)<= delta 2169 zcmY+EeN+=y8pe~0A(MoJ2_YmILikKf2qZvKC~7IjN>WrLNCn%1vXn~D0!ohvEFf-S zYqwb8^<#_eB1oz0fr_xuqNqhF?QWHirCV()7Nynd8kOp)daSxLlQ4V8Klk@M?{n|W z+`RYxl>dGK;5Gwo&bkz_SY22n3PA}+p~hQU?OdHz zv_HzX^7fI$vQp)CUaI|Ava{{En@jBN32Qe(rb+%?d)AZ3%6*!ekFrdT?^VN+lh-cX zfAF^rOR659*gNQPKIzca0-u!iuq`e?6ChNc2 z8FM=P#L|uk1G@iHdP!H|hkFi{iHA2;CttPi-nB7dbcR*Yx-9CqgI}lfM#{@SsC9hM z7Oz^j@?K@q;JH=#@=L1is{G!9{=S{{R_vvEPJv)-%f$84cjLBvUs*ytdhqt7{uJl< zk9&TYh~Rl2|MfyKF@vw7TfgQHvK<(yi6_elX)XY->X0T&7QQeR^-^a^U?S& z)Kob1r@JllonJ0#n(Q0M6ztD^x}_Lv?*8TW13%F6WT&p}&qu>$`cD_1ssH(A=accM zk;cY!th=Djwpxv4X0~W^#4K-zGQ;?AeR}n|O`Z1!zsOp1)04Q_@wh1eg|9ZMK3*>` zcwsU*A>qBlJ%jez>O9?!7x$i39N-^58}Lu<;-5o43{B$U2_CkxveW;*YZ$Q4-#Ynm zz_nw3ub0;B556+qyE^Mp-b!7^t&1_!zl`4fW9!Rf5dYkn(k~wWdgeyq#bDL2@y3Ex zn|}PLX!nZ)8(Pn+t4}_C^V8q=g}oBl<~ufEs3I)mUg;i1u#MNo z)b0F8n(y!vV3aR%^Ky5cIvcP?@LwigiYcMq%N3&@^_5o?QyU>`i-i(ekBJDV5r#mm zSOOG}2_qQRiJ}?SOG05v?FCh0G9y~;_C;Xz?q)I?+{~~O*Mm^Yb>|6i;_-CNb&O$& z_#qQ@_(a3eFe!9-Veq*ShcA8N=4ibnme#mj4m-)$pmur6mw-zWEyEgI3U?HKknPK3 zJSXk>L#jea<}(;Sg)oC5k_*jJF5^u|tqfcJR=AnmKEH1mzfZQ5;b!?FPH|4|2BUj* z0-EK?bd~(TZbdMgNv04MhEEVSh9{(E2r_v=nu2im%rb}yCgfa}oaOrAEazg1TsI|L z4pc*m2@e#`2~deSS0;2RweXgbV80E`%2j9`8}2DhL31xj7E9({giTIwt0_ic4Ny_{ zrdTC|;t)@Gi`EZ4l$7W?3Qu68G zCqYSQhYRsw8@lYmH~4(03Qj}|1$5{QK1Lo4E?g(ArvF<80TM zsB%_%L!CAeO}pfEt&P184(LK4+(!Uwb&2eUq;jAP2{~Bq4E;#!iAe#)Z&nw6H%TX*)71$kYP(B+81~DU1PK zw2i$1W};2tO$eYXI+1;eROM)eKV1$okqsGRL#JnD0