From a22bb631b2c30638a64ebdbaf67990ca043abfc5 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 9 Oct 2018 11:09:43 +0200 Subject: [PATCH] start refactoring of dto mapping of BrowserResult and FileObject --- .../api/v2/resources/BrowserResultDto.java | 26 ---------- ...BrowserResultToBrowserResultDtoMapper.java | 49 ------------------- .../BrowserResultToFileObjectDtoMapper.java | 18 +++++++ .../scm/api/v2/resources/FileObjectDto.java | 8 +++ .../FileObjectToFileObjectDtoMapper.java | 10 ++++ .../api/v2/resources/SourceRootResource.java | 8 +-- ...owserResultToFileObjectDtoMapperTest.java} | 31 ++++++------ .../v2/resources/SourceRootResourceTest.java | 22 +++++---- 8 files changed, 68 insertions(+), 104 deletions(-) delete mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultDto.java delete mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java create mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToFileObjectDtoMapper.java rename scm-webapp/src/test/java/sonia/scm/api/v2/resources/{BrowserResultToBrowserResultDtoMapperTest.java => BrowserResultToFileObjectDtoMapperTest.java} (81%) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultDto.java deleted file mode 100644 index 2b49f18fa1..0000000000 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package sonia.scm.api.v2.resources; - -import de.otto.edison.hal.HalRepresentation; -import de.otto.edison.hal.Links; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -@NoArgsConstructor -public class BrowserResultDto extends HalRepresentation { - private String revision; - - @Override - @SuppressWarnings("squid:S1185") // We want to have this method available in this package - protected HalRepresentation add(Links links) { - return super.add(links); - } - - public void setFiles(List files) { - this.withEmbedded("files", files); - } -} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java deleted file mode 100644 index c877cb0647..0000000000 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java +++ /dev/null @@ -1,49 +0,0 @@ -package sonia.scm.api.v2.resources; - -import de.otto.edison.hal.Links; -import sonia.scm.repository.BrowserResult; -import sonia.scm.repository.FileObject; -import sonia.scm.repository.NamespaceAndName; - -import javax.inject.Inject; -import java.util.ArrayList; -import java.util.List; - -public class BrowserResultToBrowserResultDtoMapper { - - @Inject - private FileObjectToFileObjectDtoMapper fileObjectToFileObjectDtoMapper; - - @Inject - private ResourceLinks resourceLinks; - - public BrowserResultDto map(BrowserResult browserResult, NamespaceAndName namespaceAndName, String path) { - BrowserResultDto browserResultDto = new BrowserResultDto(); - - browserResultDto.setRevision(browserResult.getRevision()); - - List fileObjectDtoList = new ArrayList<>(); - for (FileObject fileObject : browserResult.getFiles()) { - fileObjectDtoList.add(mapFileObject(fileObject, namespaceAndName, browserResult.getRevision())); - } - - browserResultDto.setFiles(fileObjectDtoList); - this.addLinks(browserResult, browserResultDto, namespaceAndName, path); - return browserResultDto; - } - - private FileObjectDto mapFileObject(FileObject fileObject, NamespaceAndName namespaceAndName, String revision) { - return fileObjectToFileObjectDtoMapper.map(fileObject, namespaceAndName, revision); - } - - private void addLinks(BrowserResult browserResult, BrowserResultDto dto, NamespaceAndName namespaceAndName, String path) { - if (path.equals("/")) { - path = ""; - } - if (browserResult.getRevision() == null) { - throw new IllegalStateException("missing revision in browser result for repository " + namespaceAndName + " and path " + path); - } else { - dto.add(Links.linkingTo().self(resourceLinks.source().sourceWithPath(namespaceAndName.getNamespace(), namespaceAndName.getName(), browserResult.getRevision(), path)).build()); - } - } -} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToFileObjectDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToFileObjectDtoMapper.java new file mode 100644 index 0000000000..027f07473a --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToFileObjectDtoMapper.java @@ -0,0 +1,18 @@ +package sonia.scm.api.v2.resources; + +import sonia.scm.repository.BrowserResult; +import sonia.scm.repository.NamespaceAndName; + +import javax.inject.Inject; + +public class BrowserResultToFileObjectDtoMapper { + + @Inject + private FileObjectToFileObjectDtoMapper fileObjectToFileObjectDtoMapper; + + public FileObjectDto map(BrowserResult browserResult, NamespaceAndName namespaceAndName, String path) { + FileObjectDto fileObjectDto = fileObjectToFileObjectDtoMapper.map(browserResult.getFile(), namespaceAndName, path); + fileObjectDto.setRevision( browserResult.getRevision() ); + return fileObjectDto; + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectDto.java index ab4986554a..470199066d 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectDto.java @@ -1,5 +1,6 @@ package sonia.scm.api.v2.resources; +import com.fasterxml.jackson.annotation.JsonInclude; import de.otto.edison.hal.HalRepresentation; import de.otto.edison.hal.Links; import lombok.Getter; @@ -7,6 +8,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; import java.time.Instant; +import java.util.List; @Getter @Setter @@ -19,10 +21,16 @@ public class FileObjectDto extends HalRepresentation { private int length; private Instant lastModified; private SubRepositoryDto subRepository; + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private String revision; @Override @SuppressWarnings("squid:S1185") // We want to have this method available in this package protected HalRepresentation add(Links links) { return super.add(links); } + + public void setChildren(List children) { + this.withEmbedded("children", children); + } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectToFileObjectDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectToFileObjectDtoMapper.java index 365c0ad4cb..441e111311 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectToFileObjectDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectToFileObjectDtoMapper.java @@ -12,6 +12,9 @@ import sonia.scm.repository.SubRepository; import javax.inject.Inject; +import java.util.List; +import java.util.stream.Collectors; + import static de.otto.edison.hal.Link.link; @Mapper @@ -37,6 +40,13 @@ public abstract class FileObjectToFileObjectDtoMapper implements InstantAttribut } dto.add(links.build()); + if (fileObject.isDirectory() && fileObject.hasChildren()) { + List children = fileObject.getChildren() + .stream() + .map(fo -> map(fo, namespaceAndName, revision)) + .collect(Collectors.toList()); + dto.setChildren(children); + } } private String removeFirstSlash(String source) { diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java index 874ce4f568..d2b9b382d2 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java @@ -21,13 +21,13 @@ import java.io.IOException; public class SourceRootResource { private final RepositoryServiceFactory serviceFactory; - private final BrowserResultToBrowserResultDtoMapper browserResultToBrowserResultDtoMapper; + private final BrowserResultToFileObjectDtoMapper browserResultToFileObjectDtoMapper; @Inject - public SourceRootResource(RepositoryServiceFactory serviceFactory, BrowserResultToBrowserResultDtoMapper browserResultToBrowserResultDtoMapper) { + public SourceRootResource(RepositoryServiceFactory serviceFactory, BrowserResultToFileObjectDtoMapper browserResultToFileObjectDtoMapper) { this.serviceFactory = serviceFactory; - this.browserResultToBrowserResultDtoMapper = browserResultToBrowserResultDtoMapper; + this.browserResultToFileObjectDtoMapper = browserResultToFileObjectDtoMapper; } @GET @@ -62,7 +62,7 @@ public class SourceRootResource { BrowserResult browserResult = browseCommand.getBrowserResult(); if (browserResult != null) { - return Response.ok(browserResultToBrowserResultDtoMapper.map(browserResult, namespaceAndName, path)).build(); + return Response.ok(browserResultToFileObjectDtoMapper.map(browserResult, namespaceAndName, path)).build(); } else { return Response.status(Response.Status.NOT_FOUND).build(); } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToFileObjectDtoMapperTest.java similarity index 81% rename from scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapperTest.java rename to scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToFileObjectDtoMapperTest.java index 528418a187..2d19928549 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToFileObjectDtoMapperTest.java @@ -25,7 +25,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; -public class BrowserResultToBrowserResultDtoMapperTest { +public class BrowserResultToFileObjectDtoMapperTest { private final URI baseUri = URI.create("http://example.com/base/"); @SuppressWarnings("unused") // Is injected @@ -35,7 +35,7 @@ public class BrowserResultToBrowserResultDtoMapperTest { private FileObjectToFileObjectDtoMapper fileObjectToFileObjectDtoMapper; @InjectMocks - private BrowserResultToBrowserResultDtoMapper mapper; + private BrowserResultToFileObjectDtoMapper mapper; private final Subject subject = mock(Subject.class); private final ThreadState subjectThreadState = new SubjectThreadState(subject); @@ -77,7 +77,7 @@ public class BrowserResultToBrowserResultDtoMapperTest { public void shouldMapAttributesCorrectly() { BrowserResult browserResult = createBrowserResult(); - BrowserResultDto dto = mapper.map(browserResult, new NamespaceAndName("foo", "bar"), "path"); + FileObjectDto dto = mapper.map(browserResult, new NamespaceAndName("foo", "bar"), "path"); assertEqualAttributes(browserResult, dto); } @@ -87,7 +87,7 @@ public class BrowserResultToBrowserResultDtoMapperTest { BrowserResult browserResult = createBrowserResult(); NamespaceAndName namespaceAndName = new NamespaceAndName("foo", "bar"); - BrowserResultDto dto = mapper.map(browserResult, namespaceAndName, "path"); + FileObjectDto dto = mapper.map(browserResult, namespaceAndName, "path"); verify(fileObjectToFileObjectDtoMapper).map(fileObject1, namespaceAndName, "Revision"); verify(fileObjectToFileObjectDtoMapper).map(fileObject2, namespaceAndName, "Revision"); @@ -98,28 +98,27 @@ public class BrowserResultToBrowserResultDtoMapperTest { BrowserResult browserResult = createBrowserResult(); NamespaceAndName namespaceAndName = new NamespaceAndName("foo", "bar"); - BrowserResultDto dto = mapper.map(browserResult, namespaceAndName, "path"); + FileObjectDto dto = mapper.map(browserResult, namespaceAndName, "path"); assertThat(dto.getLinks().getLinkBy("self").get().getHref()).contains("path"); } private BrowserResult createBrowserResult() { - BrowserResult browserResult = new BrowserResult(); - browserResult.setRevision("Revision"); - browserResult.setFiles(createFileObjects()); - - return browserResult; + return new BrowserResult("Revision", createFileObject()); } - private List createFileObjects() { - List fileObjects = new ArrayList<>(); + private FileObject createFileObject() { + FileObject file = new FileObject(); + file.setName(""); + file.setPath(""); + file.setDirectory(true); - fileObjects.add(fileObject1); - fileObjects.add(fileObject2); - return fileObjects; + file.addChild(fileObject1); + file.addChild(fileObject2); + return file; } - private void assertEqualAttributes(BrowserResult browserResult, BrowserResultDto dto) { + private void assertEqualAttributes(BrowserResult browserResult, FileObjectDto dto) { assertThat(dto.getRevision()).isEqualTo(browserResult.getRevision()); } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java index c84a74bc92..66c7c487c1 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java @@ -50,7 +50,7 @@ public class SourceRootResourceTest extends RepositoryTestBase { private FileObjectToFileObjectDtoMapper fileObjectToFileObjectDtoMapper; @InjectMocks - private BrowserResultToBrowserResultDtoMapper browserResultToBrowserResultDtoMapper; + private BrowserResultToFileObjectDtoMapper browserResultToFileObjectDtoMapper; @Before @@ -63,7 +63,7 @@ public class SourceRootResourceTest extends RepositoryTestBase { dto.setLength(1024); when(fileObjectToFileObjectDtoMapper.map(any(FileObject.class), any(NamespaceAndName.class), anyString())).thenReturn(dto); - SourceRootResource sourceRootResource = new SourceRootResource(serviceFactory, browserResultToBrowserResultDtoMapper); + SourceRootResource sourceRootResource = new SourceRootResource(serviceFactory, browserResultToFileObjectDtoMapper); super.sourceRootResource = Providers.of(sourceRootResource); dispatcher = createDispatcher(getRepositoryRootResource()); } @@ -93,12 +93,9 @@ public class SourceRootResourceTest extends RepositoryTestBase { @Test public void shouldGetResultForSingleFile() throws URISyntaxException, IOException, RevisionNotFoundException { - BrowserResult browserResult = new BrowserResult(); - browserResult.setRevision("revision"); FileObject fileObject = new FileObject(); fileObject.setName("File Object!"); - - browserResult.setFiles(Arrays.asList(fileObject)); + BrowserResult browserResult = new BrowserResult("revision", fileObject); when(browseCommandBuilder.getBrowserResult()).thenReturn(browserResult); MockHttpRequest request = MockHttpRequest.get("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/repo/sources/revision/fileabc"); @@ -121,10 +118,15 @@ public class SourceRootResourceTest extends RepositoryTestBase { } private BrowserResult createBrowserResult() { - return new BrowserResult("revision", "tag", "branch", createFileObjects()); + return new BrowserResult("revision", createFileObject()); } - private List createFileObjects() { + private FileObject createFileObject() { + FileObject parent = new FileObject(); + parent.setName("bar"); + parent.setPath("/foo/bar"); + parent.setDirectory(true); + FileObject fileObject1 = new FileObject(); fileObject1.setName("FO 1"); fileObject1.setDirectory(false); @@ -132,6 +134,7 @@ public class SourceRootResourceTest extends RepositoryTestBase { fileObject1.setPath("/foo/bar/fo1"); fileObject1.setLength(1024L); fileObject1.setLastModified(0L); + parent.addChild(fileObject1); FileObject fileObject2 = new FileObject(); fileObject2.setName("FO 2"); @@ -140,7 +143,8 @@ public class SourceRootResourceTest extends RepositoryTestBase { fileObject2.setPath("/foo/bar/fo2"); fileObject2.setLength(4096L); fileObject2.setLastModified(1234L); + parent.addChild(fileObject2); - return Arrays.asList(fileObject1, fileObject2); + return parent; } }