From dd3b616ba4f3fa8626892dd06a1fafc4f9884c85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 6 Apr 2022 09:16:03 +0200 Subject: [PATCH] Limit scopes and rename bean (#1991) This limits the scope of all cli related classes, so that they cannot be used outside of cli context and therefore cannot confuse other developers. Secondly, we rename RepositoryCommandDto to RepositoryCommandBean, because we have no data transfers here and the name might be confusing otherwise. --- ...andDto.java => RepositoryCommandBean.java} | 2 +- .../cli/RepositoryCreateCommand.java | 2 +- .../cli/RepositoryDeleteCommand.java | 2 +- .../repository/cli/RepositoryGetCommand.java | 2 +- .../repository/cli/RepositoryListCommand.java | 12 +++++----- .../cli/RepositoryModifyCommand.java | 2 +- .../cli/RepositoryTemplateRenderer.java | 22 +++++++++---------- ...epositoryToRepositoryCommandDtoMapper.java | 12 +++++----- ...oryToRepositoryCommandBeanMapperTest.java} | 7 +++--- 9 files changed, 32 insertions(+), 31 deletions(-) rename scm-webapp/src/main/java/sonia/scm/repository/cli/{RepositoryCommandDto.java => RepositoryCommandBean.java} (97%) rename scm-webapp/src/test/java/sonia/scm/repository/cli/{RepositoryToRepositoryCommandDtoMapperTest.java => RepositoryToRepositoryCommandBeanMapperTest.java} (94%) diff --git a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryCommandDto.java b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryCommandBean.java similarity index 97% rename from scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryCommandDto.java rename to scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryCommandBean.java index e934fd6393..e61509d766 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryCommandDto.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryCommandBean.java @@ -31,7 +31,7 @@ import lombok.Setter; @Getter @Setter @NoArgsConstructor -public class RepositoryCommandDto { +class RepositoryCommandBean { private String name; private String namespace; private String type; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryCreateCommand.java b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryCreateCommand.java index 6dc8054fd7..a115075c29 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryCreateCommand.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryCreateCommand.java @@ -40,7 +40,7 @@ import javax.validation.constraints.Email; @CommandLine.Command(name = "create") @ParentCommand(value = RepositoryCommand.class) -public class RepositoryCreateCommand implements Runnable { +class RepositoryCreateCommand implements Runnable { @CommandLine.Mixin private final RepositoryTemplateRenderer templateRenderer; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryDeleteCommand.java b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryDeleteCommand.java index 80130f46e5..173397a8c4 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryDeleteCommand.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryDeleteCommand.java @@ -36,7 +36,7 @@ import java.util.Collections; @CommandLine.Command(name = "delete", aliases = "rm") @ParentCommand(RepositoryCommand.class) -public class RepositoryDeleteCommand implements Runnable { +class RepositoryDeleteCommand implements Runnable { private static final String PROMPT_TEMPLATE = "{{i18n.repoDeletePrompt}}"; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryGetCommand.java b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryGetCommand.java index e0057dbac9..c07e0ff793 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryGetCommand.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryGetCommand.java @@ -35,7 +35,7 @@ import javax.inject.Inject; @ParentCommand(value = RepositoryCommand.class) @CommandLine.Command(name = "get") -public class RepositoryGetCommand implements Runnable { +class RepositoryGetCommand implements Runnable { @CommandLine.Parameters(paramLabel = "namespace/name", index = "0") private String repository; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryListCommand.java b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryListCommand.java index ae61c25a72..6b697e52ed 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryListCommand.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryListCommand.java @@ -38,7 +38,7 @@ import java.util.stream.Collectors; @ParentCommand(value = RepositoryCommand.class) @CommandLine.Command(name = "list", aliases = "ls") -public class RepositoryListCommand implements Runnable { +class RepositoryListCommand implements Runnable { @CommandLine.Mixin private final TemplateRenderer templateRenderer; @@ -69,16 +69,16 @@ public class RepositoryListCommand implements Runnable { @Override public void run() { - Collection dtos = manager.getAll().stream().map(mapper::map).collect(Collectors.toList()); + Collection beans = manager.getAll().stream().map(mapper::map).collect(Collectors.toList()); if (useShortTemplate) { - templateRenderer.renderToStdout(SHORT_TEMPLATE, ImmutableMap.of("repos", dtos)); + templateRenderer.renderToStdout(SHORT_TEMPLATE, ImmutableMap.of("repos", beans)); } else { Table table = templateRenderer.createTable(); table.addHeader("repoName", "repoType", "repoUrl"); - for (RepositoryCommandDto dto : dtos) { - table.addRow(dto.getNamespace() + "/" + dto.getName(), dto.getType(), dto.getUrl()); + for (RepositoryCommandBean bean : beans) { + table.addRow(bean.getNamespace() + "/" + bean.getName(), bean.getType(), bean.getUrl()); } - templateRenderer.renderToStdout(TABLE_TEMPLATE, ImmutableMap.of("rows", table, "repos", dtos)); + templateRenderer.renderToStdout(TABLE_TEMPLATE, ImmutableMap.of("rows", table, "repos", beans)); } } diff --git a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryModifyCommand.java b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryModifyCommand.java index 6aba9c70e0..3f438c03b1 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryModifyCommand.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryModifyCommand.java @@ -37,7 +37,7 @@ import javax.validation.constraints.Email; @ParentCommand(value = RepositoryCommand.class) @CommandLine.Command(name = "modify") -public class RepositoryModifyCommand implements Runnable { +class RepositoryModifyCommand implements Runnable { @CommandLine.Mixin private final RepositoryTemplateRenderer templateRenderer; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryTemplateRenderer.java b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryTemplateRenderer.java index cc5676434f..78f6123552 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryTemplateRenderer.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryTemplateRenderer.java @@ -35,7 +35,7 @@ import sonia.scm.template.TemplateEngineFactory; import javax.inject.Inject; import java.util.Collections; -public class RepositoryTemplateRenderer extends TemplateRenderer { +class RepositoryTemplateRenderer extends TemplateRenderer { private static final String DETAILS_TABLE_TEMPLATE = String.join("\n", "{{#rows}}", @@ -57,16 +57,16 @@ public class RepositoryTemplateRenderer extends TemplateRenderer { public void render(Repository repository) { Table table = createTable(); - RepositoryCommandDto dto = mapper.map(repository); - table.addLabelValueRow("repoNamespace", dto.getNamespace()); - table.addLabelValueRow("repoName", dto.getName()); - table.addLabelValueRow("repoType", dto.getType()); - table.addLabelValueRow("repoContact", dto.getContact()); - table.addLabelValueRow("repoCreationDate", dto.getCreationDate()); - table.addLabelValueRow("repoLastModified", dto.getLastModified()); - table.addLabelValueRow("repoUrl", dto.getUrl()); - table.addLabelValueRow("repoDescription", dto.getDescription()); - renderToStdout(DETAILS_TABLE_TEMPLATE, ImmutableMap.of("rows", table, "repo", dto)); + RepositoryCommandBean bean = mapper.map(repository); + table.addLabelValueRow("repoNamespace", bean.getNamespace()); + table.addLabelValueRow("repoName", bean.getName()); + table.addLabelValueRow("repoType", bean.getType()); + table.addLabelValueRow("repoContact", bean.getContact()); + table.addLabelValueRow("repoCreationDate", bean.getCreationDate()); + table.addLabelValueRow("repoLastModified", bean.getLastModified()); + table.addLabelValueRow("repoUrl", bean.getUrl()); + table.addLabelValueRow("repoDescription", bean.getDescription()); + renderToStdout(DETAILS_TABLE_TEMPLATE, ImmutableMap.of("rows", table, "repo", bean)); } public void renderInvalidInputError() { diff --git a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryToRepositoryCommandDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryToRepositoryCommandDtoMapper.java index 67230e5814..927d967169 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryToRepositoryCommandDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/cli/RepositoryToRepositoryCommandDtoMapper.java @@ -26,6 +26,7 @@ package sonia.scm.repository.cli; import com.google.common.annotations.VisibleForTesting; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; import org.mapstruct.ObjectFactory; import sonia.scm.repository.Repository; import sonia.scm.repository.api.RepositoryService; @@ -43,16 +44,17 @@ public abstract class RepositoryToRepositoryCommandDtoMapper { @Inject private RepositoryServiceFactory serviceFactory; - public abstract RepositoryCommandDto map(Repository modelObject); + @Mapping(target = "url", ignore = true) + abstract RepositoryCommandBean map(Repository modelObject); @ObjectFactory - RepositoryCommandDto createDto(Repository repository) { - RepositoryCommandDto dto = new RepositoryCommandDto(); + RepositoryCommandBean createBean(Repository repository) { + RepositoryCommandBean bean = new RepositoryCommandBean(); try (RepositoryService service = serviceFactory.create(repository)) { Optional protocolUrl = service.getSupportedProtocols().filter(p -> p.getType().equals("http")).findFirst(); - protocolUrl.ifPresent(scmProtocol -> dto.setUrl(scmProtocol.getUrl())); + protocolUrl.ifPresent(scmProtocol -> bean.setUrl(scmProtocol.getUrl())); } - return dto; + return bean; } String mapTimestampToISODate(Long timestamp) { diff --git a/scm-webapp/src/test/java/sonia/scm/repository/cli/RepositoryToRepositoryCommandDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/repository/cli/RepositoryToRepositoryCommandBeanMapperTest.java similarity index 94% rename from scm-webapp/src/test/java/sonia/scm/repository/cli/RepositoryToRepositoryCommandDtoMapperTest.java rename to scm-webapp/src/test/java/sonia/scm/repository/cli/RepositoryToRepositoryCommandBeanMapperTest.java index 2d784769e3..bc1fdbffff 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/cli/RepositoryToRepositoryCommandDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/cli/RepositoryToRepositoryCommandBeanMapperTest.java @@ -28,7 +28,6 @@ import com.google.common.collect.ImmutableList; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Answers; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.repository.Repository; @@ -42,7 +41,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -class RepositoryToRepositoryCommandDtoMapperTest { +class RepositoryToRepositoryCommandBeanMapperTest { @Mock private RepositoryServiceFactory serviceFactory; @@ -61,7 +60,7 @@ class RepositoryToRepositoryCommandDtoMapperTest { void shouldMapAttributes() { Repository testRepo = RepositoryTestData.create42Puzzle(); when(serviceFactory.create(testRepo)).thenReturn(service); - RepositoryCommandDto dto = mapper.map(testRepo); + RepositoryCommandBean dto = mapper.map(testRepo); assertThat(dto.getNamespace()).isEqualTo(testRepo.getNamespace()); assertThat(dto.getName()).isEqualTo(testRepo.getName()); @@ -88,7 +87,7 @@ class RepositoryToRepositoryCommandDtoMapperTest { when(serviceFactory.create(testRepo)).thenReturn(service); when(service.getSupportedProtocols()).thenReturn(ImmutableList.of(scmProtocol).stream()); - RepositoryCommandDto dto = mapper.map(testRepo); + RepositoryCommandBean dto = mapper.map(testRepo); assertThat(dto.getUrl()).isEqualTo("http://localhost:8081/scm"); }