start refactoring of dto mapping of BrowserResult and FileObject

This commit is contained in:
Sebastian Sdorra
2018-10-09 11:09:43 +02:00
parent bc240577f8
commit a22bb631b2
8 changed files with 68 additions and 104 deletions

View File

@@ -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<FileObjectDto> files) {
this.withEmbedded("files", files);
}
}

View File

@@ -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<FileObjectDto> 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());
}
}
}

View File

@@ -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;
}
}

View File

@@ -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<FileObjectDto> children) {
this.withEmbedded("children", children);
}
}

View File

@@ -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<FileObjectDto> children = fileObject.getChildren()
.stream()
.map(fo -> map(fo, namespaceAndName, revision))
.collect(Collectors.toList());
dto.setChildren(children);
}
}
private String removeFirstSlash(String source) {

View File

@@ -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();
}

View File

@@ -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<FileObject> createFileObjects() {
List<FileObject> 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());
}

View File

@@ -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<FileObject> 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;
}
}