mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-12 16:35:45 +01:00
start refactoring of dto mapping of BrowserResult and FileObject
This commit is contained in:
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package sonia.scm.api.v2.resources;
|
package sonia.scm.api.v2.resources;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
import de.otto.edison.hal.HalRepresentation;
|
import de.otto.edison.hal.HalRepresentation;
|
||||||
import de.otto.edison.hal.Links;
|
import de.otto.edison.hal.Links;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -7,6 +8,7 @@ import lombok.NoArgsConstructor;
|
|||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@@ -19,10 +21,16 @@ public class FileObjectDto extends HalRepresentation {
|
|||||||
private int length;
|
private int length;
|
||||||
private Instant lastModified;
|
private Instant lastModified;
|
||||||
private SubRepositoryDto subRepository;
|
private SubRepositoryDto subRepository;
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_EMPTY)
|
||||||
|
private String revision;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("squid:S1185") // We want to have this method available in this package
|
@SuppressWarnings("squid:S1185") // We want to have this method available in this package
|
||||||
protected HalRepresentation add(Links links) {
|
protected HalRepresentation add(Links links) {
|
||||||
return super.add(links);
|
return super.add(links);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setChildren(List<FileObjectDto> children) {
|
||||||
|
this.withEmbedded("children", children);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ import sonia.scm.repository.SubRepository;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static de.otto.edison.hal.Link.link;
|
import static de.otto.edison.hal.Link.link;
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
@@ -37,6 +40,13 @@ public abstract class FileObjectToFileObjectDtoMapper implements InstantAttribut
|
|||||||
}
|
}
|
||||||
|
|
||||||
dto.add(links.build());
|
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) {
|
private String removeFirstSlash(String source) {
|
||||||
|
|||||||
@@ -21,13 +21,13 @@ import java.io.IOException;
|
|||||||
public class SourceRootResource {
|
public class SourceRootResource {
|
||||||
|
|
||||||
private final RepositoryServiceFactory serviceFactory;
|
private final RepositoryServiceFactory serviceFactory;
|
||||||
private final BrowserResultToBrowserResultDtoMapper browserResultToBrowserResultDtoMapper;
|
private final BrowserResultToFileObjectDtoMapper browserResultToFileObjectDtoMapper;
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public SourceRootResource(RepositoryServiceFactory serviceFactory, BrowserResultToBrowserResultDtoMapper browserResultToBrowserResultDtoMapper) {
|
public SourceRootResource(RepositoryServiceFactory serviceFactory, BrowserResultToFileObjectDtoMapper browserResultToFileObjectDtoMapper) {
|
||||||
this.serviceFactory = serviceFactory;
|
this.serviceFactory = serviceFactory;
|
||||||
this.browserResultToBrowserResultDtoMapper = browserResultToBrowserResultDtoMapper;
|
this.browserResultToFileObjectDtoMapper = browserResultToFileObjectDtoMapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@@ -62,7 +62,7 @@ public class SourceRootResource {
|
|||||||
BrowserResult browserResult = browseCommand.getBrowserResult();
|
BrowserResult browserResult = browseCommand.getBrowserResult();
|
||||||
|
|
||||||
if (browserResult != null) {
|
if (browserResult != null) {
|
||||||
return Response.ok(browserResultToBrowserResultDtoMapper.map(browserResult, namespaceAndName, path)).build();
|
return Response.ok(browserResultToFileObjectDtoMapper.map(browserResult, namespaceAndName, path)).build();
|
||||||
} else {
|
} else {
|
||||||
return Response.status(Response.Status.NOT_FOUND).build();
|
return Response.status(Response.Status.NOT_FOUND).build();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import static org.mockito.Mockito.verify;
|
|||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
import static org.mockito.MockitoAnnotations.initMocks;
|
import static org.mockito.MockitoAnnotations.initMocks;
|
||||||
|
|
||||||
public class BrowserResultToBrowserResultDtoMapperTest {
|
public class BrowserResultToFileObjectDtoMapperTest {
|
||||||
|
|
||||||
private final URI baseUri = URI.create("http://example.com/base/");
|
private final URI baseUri = URI.create("http://example.com/base/");
|
||||||
@SuppressWarnings("unused") // Is injected
|
@SuppressWarnings("unused") // Is injected
|
||||||
@@ -35,7 +35,7 @@ public class BrowserResultToBrowserResultDtoMapperTest {
|
|||||||
private FileObjectToFileObjectDtoMapper fileObjectToFileObjectDtoMapper;
|
private FileObjectToFileObjectDtoMapper fileObjectToFileObjectDtoMapper;
|
||||||
|
|
||||||
@InjectMocks
|
@InjectMocks
|
||||||
private BrowserResultToBrowserResultDtoMapper mapper;
|
private BrowserResultToFileObjectDtoMapper mapper;
|
||||||
|
|
||||||
private final Subject subject = mock(Subject.class);
|
private final Subject subject = mock(Subject.class);
|
||||||
private final ThreadState subjectThreadState = new SubjectThreadState(subject);
|
private final ThreadState subjectThreadState = new SubjectThreadState(subject);
|
||||||
@@ -77,7 +77,7 @@ public class BrowserResultToBrowserResultDtoMapperTest {
|
|||||||
public void shouldMapAttributesCorrectly() {
|
public void shouldMapAttributesCorrectly() {
|
||||||
BrowserResult browserResult = createBrowserResult();
|
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);
|
assertEqualAttributes(browserResult, dto);
|
||||||
}
|
}
|
||||||
@@ -87,7 +87,7 @@ public class BrowserResultToBrowserResultDtoMapperTest {
|
|||||||
BrowserResult browserResult = createBrowserResult();
|
BrowserResult browserResult = createBrowserResult();
|
||||||
NamespaceAndName namespaceAndName = new NamespaceAndName("foo", "bar");
|
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(fileObject1, namespaceAndName, "Revision");
|
||||||
verify(fileObjectToFileObjectDtoMapper).map(fileObject2, namespaceAndName, "Revision");
|
verify(fileObjectToFileObjectDtoMapper).map(fileObject2, namespaceAndName, "Revision");
|
||||||
@@ -98,28 +98,27 @@ public class BrowserResultToBrowserResultDtoMapperTest {
|
|||||||
BrowserResult browserResult = createBrowserResult();
|
BrowserResult browserResult = createBrowserResult();
|
||||||
NamespaceAndName namespaceAndName = new NamespaceAndName("foo", "bar");
|
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");
|
assertThat(dto.getLinks().getLinkBy("self").get().getHref()).contains("path");
|
||||||
}
|
}
|
||||||
|
|
||||||
private BrowserResult createBrowserResult() {
|
private BrowserResult createBrowserResult() {
|
||||||
BrowserResult browserResult = new BrowserResult();
|
return new BrowserResult("Revision", createFileObject());
|
||||||
browserResult.setRevision("Revision");
|
|
||||||
browserResult.setFiles(createFileObjects());
|
|
||||||
|
|
||||||
return browserResult;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<FileObject> createFileObjects() {
|
private FileObject createFileObject() {
|
||||||
List<FileObject> fileObjects = new ArrayList<>();
|
FileObject file = new FileObject();
|
||||||
|
file.setName("");
|
||||||
|
file.setPath("");
|
||||||
|
file.setDirectory(true);
|
||||||
|
|
||||||
fileObjects.add(fileObject1);
|
file.addChild(fileObject1);
|
||||||
fileObjects.add(fileObject2);
|
file.addChild(fileObject2);
|
||||||
return fileObjects;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertEqualAttributes(BrowserResult browserResult, BrowserResultDto dto) {
|
private void assertEqualAttributes(BrowserResult browserResult, FileObjectDto dto) {
|
||||||
assertThat(dto.getRevision()).isEqualTo(browserResult.getRevision());
|
assertThat(dto.getRevision()).isEqualTo(browserResult.getRevision());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ public class SourceRootResourceTest extends RepositoryTestBase {
|
|||||||
private FileObjectToFileObjectDtoMapper fileObjectToFileObjectDtoMapper;
|
private FileObjectToFileObjectDtoMapper fileObjectToFileObjectDtoMapper;
|
||||||
|
|
||||||
@InjectMocks
|
@InjectMocks
|
||||||
private BrowserResultToBrowserResultDtoMapper browserResultToBrowserResultDtoMapper;
|
private BrowserResultToFileObjectDtoMapper browserResultToFileObjectDtoMapper;
|
||||||
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -63,7 +63,7 @@ public class SourceRootResourceTest extends RepositoryTestBase {
|
|||||||
dto.setLength(1024);
|
dto.setLength(1024);
|
||||||
|
|
||||||
when(fileObjectToFileObjectDtoMapper.map(any(FileObject.class), any(NamespaceAndName.class), anyString())).thenReturn(dto);
|
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);
|
super.sourceRootResource = Providers.of(sourceRootResource);
|
||||||
dispatcher = createDispatcher(getRepositoryRootResource());
|
dispatcher = createDispatcher(getRepositoryRootResource());
|
||||||
}
|
}
|
||||||
@@ -93,12 +93,9 @@ public class SourceRootResourceTest extends RepositoryTestBase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldGetResultForSingleFile() throws URISyntaxException, IOException, RevisionNotFoundException {
|
public void shouldGetResultForSingleFile() throws URISyntaxException, IOException, RevisionNotFoundException {
|
||||||
BrowserResult browserResult = new BrowserResult();
|
|
||||||
browserResult.setRevision("revision");
|
|
||||||
FileObject fileObject = new FileObject();
|
FileObject fileObject = new FileObject();
|
||||||
fileObject.setName("File Object!");
|
fileObject.setName("File Object!");
|
||||||
|
BrowserResult browserResult = new BrowserResult("revision", fileObject);
|
||||||
browserResult.setFiles(Arrays.asList(fileObject));
|
|
||||||
|
|
||||||
when(browseCommandBuilder.getBrowserResult()).thenReturn(browserResult);
|
when(browseCommandBuilder.getBrowserResult()).thenReturn(browserResult);
|
||||||
MockHttpRequest request = MockHttpRequest.get("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/repo/sources/revision/fileabc");
|
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() {
|
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();
|
FileObject fileObject1 = new FileObject();
|
||||||
fileObject1.setName("FO 1");
|
fileObject1.setName("FO 1");
|
||||||
fileObject1.setDirectory(false);
|
fileObject1.setDirectory(false);
|
||||||
@@ -132,6 +134,7 @@ public class SourceRootResourceTest extends RepositoryTestBase {
|
|||||||
fileObject1.setPath("/foo/bar/fo1");
|
fileObject1.setPath("/foo/bar/fo1");
|
||||||
fileObject1.setLength(1024L);
|
fileObject1.setLength(1024L);
|
||||||
fileObject1.setLastModified(0L);
|
fileObject1.setLastModified(0L);
|
||||||
|
parent.addChild(fileObject1);
|
||||||
|
|
||||||
FileObject fileObject2 = new FileObject();
|
FileObject fileObject2 = new FileObject();
|
||||||
fileObject2.setName("FO 2");
|
fileObject2.setName("FO 2");
|
||||||
@@ -140,7 +143,8 @@ public class SourceRootResourceTest extends RepositoryTestBase {
|
|||||||
fileObject2.setPath("/foo/bar/fo2");
|
fileObject2.setPath("/foo/bar/fo2");
|
||||||
fileObject2.setLength(4096L);
|
fileObject2.setLength(4096L);
|
||||||
fileObject2.setLastModified(1234L);
|
fileObject2.setLastModified(1234L);
|
||||||
|
parent.addChild(fileObject2);
|
||||||
|
|
||||||
return Arrays.asList(fileObject1, fileObject2);
|
return parent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user