From a30721876ebd767416a81d969f1a17d880fb9794 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Wed, 2 Sep 2020 11:06:29 +0200 Subject: [PATCH] enhance repository initializer api with creation context --- .../RepositoryContentInitializer.java | 27 ++++++++++++- .../RepositoryCollectionResource.java | 4 +- .../v2/resources/RepositoryCreationDto.java | 39 +++++++++++++++++++ .../scm/repository/RepositoryInitializer.java | 17 +++++++- ...eadmeRepositoryContentInitializerTest.java | 2 +- 5 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCreationDto.java 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 c58ffa2402..93e21ac718 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryContentInitializer.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryContentInitializer.java @@ -21,14 +21,18 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + 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; /** * Use this {@link RepositoryContentInitializer} to create new files with custom content @@ -38,12 +42,20 @@ import java.io.InputStream; public interface RepositoryContentInitializer { /** - * * @param context add content to this context in order to commit files in the initial repository commit * @throws IOException */ 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 @@ -57,10 +69,18 @@ public interface RepositoryContentInitializer { /** * create new file which will be included in initial repository commit + * * @param path path of new file * @return */ CreateFile create(String path); + + /** + * @return creation context of repository which is going to be initialized + */ + default Map getCreationContext() { + return Collections.emptyMap(); + } } /** @@ -70,6 +90,7 @@ public interface RepositoryContentInitializer { /** * Applies content to new file + * * @param content content of file as string * @return {@link InitializerContext} * @throws IOException @@ -78,6 +99,7 @@ public interface RepositoryContentInitializer { /** * Applies content to new file + * * @param input content of file as input stream * @return {@link InitializerContext} * @throws IOException @@ -86,6 +108,7 @@ public interface RepositoryContentInitializer { /** * Applies content to new file + * * @param byteSource content of file as byte source * @return {@link InitializerContext} * @throws IOException diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCollectionResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCollectionResource.java index 51f632fa8c..274999d401 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCollectionResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCollectionResource.java @@ -147,7 +147,7 @@ public class RepositoryCollectionResource { mediaType = VndMediaType.ERROR_TYPE, schema = @Schema(implementation = ErrorDto.class) )) - public Response create(@Valid RepositoryDto repository, @QueryParam("initialize") boolean initialize) { + public Response create(@Valid RepositoryCreationDto repository, @QueryParam("initialize") boolean initialize) { AtomicReference reference = new AtomicReference<>(); Response response = adapter.create(repository, () -> createModelObjectFromDto(repository), @@ -156,7 +156,7 @@ public class RepositoryCollectionResource { return resourceLinks.repository().self(r.getNamespace(), r.getName()); }); if (initialize) { - repositoryInitializer.initialize(reference.get()); + repositoryInitializer.initialize(reference.get(), repository.getCreationContext()); } return response; } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCreationDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCreationDto.java new file mode 100644 index 0000000000..4606ce3060 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCreationDto.java @@ -0,0 +1,39 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.api.v2.resources; + +import com.fasterxml.jackson.databind.JsonNode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Map; + +@NoArgsConstructor +@Getter +@Setter +public class RepositoryCreationDto extends RepositoryDto { + private Map creationContext; +} 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 c8ca705a9a..c866b8d7d0 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/RepositoryInitializer.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/RepositoryInitializer.java @@ -24,6 +24,7 @@ package sonia.scm.repository; +import com.fasterxml.jackson.databind.JsonNode; import com.google.common.io.ByteSource; import com.google.common.io.CharSource; import org.slf4j.Logger; @@ -38,6 +39,7 @@ import javax.inject.Singleton; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.Map; import java.util.Set; @Singleton @@ -55,10 +57,14 @@ public class RepositoryInitializer { } 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(); - InitializerContextImpl initializerContext = new InitializerContextImpl(repository, modifyCommandBuilder); + InitializerContextImpl initializerContext = new InitializerContextImpl(repository, modifyCommandBuilder, creationContext); for (RepositoryContentInitializer initializer : contentInitializers) { initializer.initialize(initializerContext); @@ -77,10 +83,12 @@ public class RepositoryInitializer { private final Repository repository; private final ModifyCommandBuilder builder; + private final Map creationContext; - InitializerContextImpl(Repository repository, ModifyCommandBuilder builder) { + InitializerContextImpl(Repository repository, ModifyCommandBuilder builder, Map creationContext) { this.repository = repository; this.builder = builder; + this.creationContext = creationContext; } @Override @@ -88,6 +96,11 @@ public class RepositoryInitializer { return repository; } + @Override + public Map getCreationContext() { + return creationContext; + } + @Override public RepositoryContentInitializer.CreateFile create(String path) { return new CreateFileImpl(this, builder.useDefaultPath(true).createFile(path).setOverwrite(true)); diff --git a/scm-webapp/src/test/java/sonia/scm/repository/ReadmeRepositoryContentInitializerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/ReadmeRepositoryContentInitializerTest.java index d7e704e76c..d1cbdf7e37 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/ReadmeRepositoryContentInitializerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/ReadmeRepositoryContentInitializerTest.java @@ -48,7 +48,7 @@ class ReadmeRepositoryContentInitializerTest { private Repository repository; - private ReadmeRepositoryContentInitializer initializer = new ReadmeRepositoryContentInitializer(); + private final ReadmeRepositoryContentInitializer initializer = new ReadmeRepositoryContentInitializer(); @BeforeEach void setUpContext() {