diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryContentInitializer.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryContentInitializer.java index 93e21ac718..eb403d122b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryContentInitializer.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryContentInitializer.java @@ -24,14 +24,11 @@ package sonia.scm.repository; -import com.fasterxml.jackson.databind.JsonNode; import com.google.common.io.ByteSource; import sonia.scm.plugin.ExtensionPoint; import java.io.IOException; import java.io.InputStream; -import java.util.Collections; -import java.util.Map; import java.util.Optional; /** @@ -47,15 +44,6 @@ public interface RepositoryContentInitializer { */ void initialize(InitializerContext context) throws IOException; - /** - * returns the class to which the creation context will be mapped - * - * @return the class of the creation context - */ - default Optional> getType() { - return Optional.empty(); - } - /** * Use this {@link InitializerContext} to create new files on repository initialization * which will be included in the first commit @@ -76,10 +64,15 @@ public interface RepositoryContentInitializer { CreateFile create(String path); /** - * @return creation context of repository which is going to be initialized + * Find the the context object with the given key and unmarshalls it to the given type. + * + * @param key key of the context object + * @param type type of the context object + * @return context object or empty optional + * @since 2.5.0 */ - default Map getCreationContext() { - return Collections.emptyMap(); + default Optional getCreationContext(String key, Class type) { + return Optional.empty(); } } diff --git a/scm-ui/ui-webapp/src/repos/components/form/RepositoryForm.tsx b/scm-ui/ui-webapp/src/repos/components/form/RepositoryForm.tsx index a6d90a0ce3..c036cca608 100644 --- a/scm-ui/ui-webapp/src/repos/components/form/RepositoryForm.tsx +++ b/scm-ui/ui-webapp/src/repos/components/form/RepositoryForm.tsx @@ -258,7 +258,7 @@ class RepositoryForm extends React.Component { helpText={t("help.initializeRepository")} /> {this.state.initRepository && ( - + )} diff --git a/scm-ui/ui-webapp/src/repos/containers/Create.tsx b/scm-ui/ui-webapp/src/repos/containers/Create.tsx index b58791a562..019e130b47 100644 --- a/scm-ui/ui-webapp/src/repos/containers/Create.tsx +++ b/scm-ui/ui-webapp/src/repos/containers/Create.tsx @@ -59,8 +59,7 @@ type Props = WithTranslation & { link: string, repository: RepositoryCreation, initRepository: boolean, - callback: (repo: Repository) => void, - initRepositoryContext?: any + callback: (repo: Repository) => void ) => void; resetForm: () => void; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/RepositoryInitializer.java b/scm-webapp/src/main/java/sonia/scm/repository/RepositoryInitializer.java index c866b8d7d0..32a2253017 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/RepositoryInitializer.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/RepositoryInitializer.java @@ -25,6 +25,7 @@ package sonia.scm.repository; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.io.ByteSource; import com.google.common.io.CharSource; import org.slf4j.Logger; @@ -40,6 +41,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.Optional; import java.util.Set; @Singleton @@ -56,10 +58,6 @@ public class RepositoryInitializer { this.contentInitializers = Priorities.sortInstances(contentInitializerSet); } - public void initialize(Repository repository) { - initialize(repository, null); - } - public void initialize(Repository repository, Map creationContext) { try (RepositoryService service = serviceFactory.create(repository)) { ModifyCommandBuilder modifyCommandBuilder = service.getModifyCommand(); @@ -85,6 +83,8 @@ public class RepositoryInitializer { private final ModifyCommandBuilder builder; private final Map creationContext; + private static final ObjectMapper mapper = new ObjectMapper(); + InitializerContextImpl(Repository repository, ModifyCommandBuilder builder, Map creationContext) { this.repository = repository; this.builder = builder; @@ -97,8 +97,8 @@ public class RepositoryInitializer { } @Override - public Map getCreationContext() { - return creationContext; + public Optional getCreationContext(String key, Class type) { + return Optional.of(mapper.convertValue(creationContext.get(key), type)); } @Override @@ -134,5 +134,4 @@ public class RepositoryInitializer { return initializerContext; } } - } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java index 3c958cae74..d8e22cb33b 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java @@ -74,6 +74,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyMap; import static org.mockito.ArgumentMatchers.anyObject; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; @@ -315,7 +316,7 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { assertEquals(HttpServletResponse.SC_CREATED, response.getStatus()); assertEquals("/v2/repositories/otherspace/repo", response.getOutputHeaders().get("Location").get(0).toString()); verify(repositoryManager).create(any(Repository.class)); - verify(repositoryInitializer, never()).initialize(any(Repository.class)); + verify(repositoryInitializer, never()).initialize(any(Repository.class), anyMap()); } @Test @@ -336,7 +337,7 @@ public class RepositoryRootResourceTest extends RepositoryTestBase { assertEquals(HttpServletResponse.SC_CREATED, response.getStatus()); ArgumentCaptor captor = ArgumentCaptor.forClass(Repository.class); - verify(repositoryInitializer).initialize(captor.capture()); + verify(repositoryInitializer).initialize(captor.capture(), anyMap()); Repository repository = captor.getValue(); assertEquals("space", repository.getNamespace()); diff --git a/scm-webapp/src/test/java/sonia/scm/repository/RepositoryInitializerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/RepositoryInitializerTest.java index efa33feb7f..53a1ea4b02 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/RepositoryInitializerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/RepositoryInitializerTest.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.repository; import com.google.common.collect.ImmutableSet; @@ -29,7 +29,6 @@ import com.google.common.io.ByteSource; import com.google.common.io.ByteStreams; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Answers; import org.mockito.ArgumentCaptor; @@ -44,6 +43,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.Collections; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; @@ -88,7 +88,7 @@ class RepositoryInitializerTest { ); RepositoryInitializer initializer = new RepositoryInitializer(repositoryServiceFactory, repositoryContentInitializers); - initializer.initialize(repository); + initializer.initialize(repository, Collections.emptyMap()); verifyFileCreation(readmeContentLoader, "# HeartOfGold"); verifyFileCreation(licenseContentLoader, "MIT"); @@ -108,7 +108,7 @@ class RepositoryInitializerTest { ); RepositoryInitializer initializer = new RepositoryInitializer(repositoryServiceFactory, repositoryContentInitializers); - initializer.initialize(repository); + initializer.initialize(repository, Collections.emptyMap()); verifyFileCreationWithStream(contentLoader, "awesome"); @@ -138,7 +138,7 @@ class RepositoryInitializerTest { ); RepositoryInitializer initializer = new RepositoryInitializer(repositoryServiceFactory, repositoryContentInitializers); - initializer.initialize(repository); + initializer.initialize(repository, Collections.emptyMap()); assertThat(reference.get()).isEqualTo("MIT"); } @@ -149,7 +149,7 @@ class RepositoryInitializerTest { doThrow(new IOException("epic fail")).when(contentLoader).withData(any(ByteSource.class)); RepositoryInitializer initializer = new RepositoryInitializer(repositoryServiceFactory, ImmutableSet.of(new ReadmeContentInitializer())); - assertThrows(InternalRepositoryException.class, () -> initializer.initialize(repository)); + assertThrows(InternalRepositoryException.class, () -> initializer.initialize(repository, Collections.emptyMap())); verify(repositoryService).close(); }