mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-12 00:15:44 +01:00
Implemented BrowserResultMapper
This commit is contained in:
@@ -25,6 +25,7 @@ public class VndMediaType {
|
|||||||
public static final String REPOSITORY_TYPE_COLLECTION = PREFIX + "repositoryTypeCollection" + SUFFIX;
|
public static final String REPOSITORY_TYPE_COLLECTION = PREFIX + "repositoryTypeCollection" + SUFFIX;
|
||||||
public static final String REPOSITORY_TYPE = PREFIX + "repositoryType" + SUFFIX;
|
public static final String REPOSITORY_TYPE = PREFIX + "repositoryType" + SUFFIX;
|
||||||
public static final String ME = PREFIX + "me" + SUFFIX;
|
public static final String ME = PREFIX + "me" + SUFFIX;
|
||||||
|
public static final String SOURCE = PREFIX + "source" + SUFFIX;
|
||||||
|
|
||||||
private VndMediaType() {
|
private VndMediaType() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,14 +5,27 @@ import lombok.Getter;
|
|||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class BrowserResultDto extends HalRepresentation {
|
public class BrowserResultDto extends HalRepresentation implements Iterable<FileObjectDto> {
|
||||||
private String revision;
|
private String revision;
|
||||||
private String tag;
|
private String tag;
|
||||||
private String branch;
|
private String branch;
|
||||||
private Collection<FileObjectDto> files;
|
private List<FileObjectDto> files;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<FileObjectDto> iterator() {
|
||||||
|
Iterator<FileObjectDto> it = null;
|
||||||
|
|
||||||
|
if (files != null)
|
||||||
|
{
|
||||||
|
it = files.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
return it;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package sonia.scm.api.v2.resources;
|
||||||
|
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import sonia.scm.repository.BrowserResult;
|
||||||
|
import sonia.scm.repository.FileObject;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public abstract class BrowserResultMapper extends BaseMapper<BrowserResult, BrowserResultDto> {
|
||||||
|
|
||||||
|
abstract FileObjectDto mapFileObject(FileObject fileObject);
|
||||||
|
|
||||||
|
public BrowserResultDto map(BrowserResult browserResult) {
|
||||||
|
BrowserResultDto browserResultDto = new BrowserResultDto();
|
||||||
|
|
||||||
|
browserResultDto.setTag(browserResult.getTag());
|
||||||
|
browserResultDto.setBranch(browserResult.getBranch());
|
||||||
|
browserResultDto.setRevision(browserResult.getRevision());
|
||||||
|
|
||||||
|
List<FileObjectDto> fileObjectDtoList = new ArrayList<>();
|
||||||
|
for (FileObject fileObject : browserResult.getFiles()) {
|
||||||
|
fileObjectDtoList.add(mapFileObject(fileObject));
|
||||||
|
}
|
||||||
|
|
||||||
|
browserResultDto.setFiles(fileObjectDtoList);
|
||||||
|
|
||||||
|
return browserResultDto;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
package sonia.scm.api.v2.resources;
|
|
||||||
|
|
||||||
import org.mapstruct.Mapper;
|
|
||||||
import sonia.scm.repository.BrowserResult;
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
public abstract class BrowserResultToBrowserResultDtoMapper extends BaseMapper<BrowserResult, BrowserResultDto> {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -4,6 +4,5 @@ import org.mapstruct.Mapper;
|
|||||||
import sonia.scm.repository.FileObject;
|
import sonia.scm.repository.FileObject;
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public abstract class FileObjectToFileObjectDtoMapper extends BaseMapper<FileObject, FileObjectDto> {
|
public abstract class FileObjectMapper extends BaseMapper<FileObject, FileObjectDto> {
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -26,6 +26,8 @@ public class MapperModule extends AbstractModule {
|
|||||||
|
|
||||||
bind(BranchToBranchDtoMapper.class).to(Mappers.getMapper(BranchToBranchDtoMapper.class).getClass());
|
bind(BranchToBranchDtoMapper.class).to(Mappers.getMapper(BranchToBranchDtoMapper.class).getClass());
|
||||||
|
|
||||||
|
bind(BrowserResultMapper.class).to(Mappers.getMapper(BrowserResultMapper.class).getClass());
|
||||||
|
|
||||||
bind(UriInfoStore.class).in(ServletScopes.REQUEST);
|
bind(UriInfoStore.class).in(ServletScopes.REQUEST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,22 +7,31 @@ import sonia.scm.repository.RepositoryNotFoundException;
|
|||||||
import sonia.scm.repository.api.BrowseCommandBuilder;
|
import sonia.scm.repository.api.BrowseCommandBuilder;
|
||||||
import sonia.scm.repository.api.RepositoryService;
|
import sonia.scm.repository.api.RepositoryService;
|
||||||
import sonia.scm.repository.api.RepositoryServiceFactory;
|
import sonia.scm.repository.api.RepositoryServiceFactory;
|
||||||
|
import sonia.scm.web.VndMediaType;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.ws.rs.*;
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class SourceRootResource {
|
public class SourceRootResource {
|
||||||
|
|
||||||
private final RepositoryServiceFactory serviceFactory;
|
private final RepositoryServiceFactory serviceFactory;
|
||||||
|
private final BrowserResultMapper browserResultMapper;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public SourceRootResource(RepositoryServiceFactory serviceFactory) {
|
public SourceRootResource(RepositoryServiceFactory serviceFactory, BrowserResultMapper browserResultMapper) {
|
||||||
this.serviceFactory = serviceFactory;
|
this.serviceFactory = serviceFactory;
|
||||||
|
this.browserResultMapper = browserResultMapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
@Produces(VndMediaType.SOURCE)
|
||||||
@Path("")
|
@Path("")
|
||||||
public Response getAll(@PathParam("namespace") String namespace, @PathParam("name") String name) {
|
public Response getAll(@PathParam("namespace") String namespace, @PathParam("name") String name) {
|
||||||
|
|
||||||
@@ -38,8 +47,7 @@ public class SourceRootResource {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
return Response.ok(browserResultMapper.map(browserResult)).build();
|
||||||
return Response.ok(browserResult.toString()).build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
|||||||
@@ -0,0 +1,100 @@
|
|||||||
|
package sonia.scm.api.v2.resources;
|
||||||
|
|
||||||
|
import org.apache.shiro.subject.Subject;
|
||||||
|
import org.apache.shiro.subject.support.SubjectThreadState;
|
||||||
|
import org.apache.shiro.util.ThreadContext;
|
||||||
|
import org.apache.shiro.util.ThreadState;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.InjectMocks;
|
||||||
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
|
import sonia.scm.repository.BrowserResult;
|
||||||
|
import sonia.scm.repository.FileObject;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.MockitoAnnotations.initMocks;
|
||||||
|
|
||||||
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
|
public class BrowserResultMapperTest {
|
||||||
|
|
||||||
|
@InjectMocks
|
||||||
|
private BrowserResultMapperImpl mapper;
|
||||||
|
|
||||||
|
private final Subject subject = mock(Subject.class);
|
||||||
|
private final ThreadState subjectThreadState = new SubjectThreadState(subject);
|
||||||
|
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void init() {
|
||||||
|
initMocks(this);
|
||||||
|
subjectThreadState.bind();
|
||||||
|
ThreadContext.bind(subject);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldMapAttributesCorrectly() {
|
||||||
|
BrowserResult browserResult = createBrowserResult();
|
||||||
|
|
||||||
|
BrowserResultDto dto = mapper.map(browserResult);
|
||||||
|
|
||||||
|
assertEqualAttributes(browserResult, dto);
|
||||||
|
|
||||||
|
assertEqualFileObjectAttributes(browserResult.getFiles().get(0), dto.getFiles().get(0));
|
||||||
|
assertEqualFileObjectAttributes(browserResult.getFiles().get(1), dto.getFiles().get(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
private BrowserResult createBrowserResult() {
|
||||||
|
BrowserResult browserResult = new BrowserResult();
|
||||||
|
browserResult.setTag("Tag");
|
||||||
|
browserResult.setRevision("Revision");
|
||||||
|
browserResult.setBranch("Branch");
|
||||||
|
browserResult.setFiles(createFileObjects());
|
||||||
|
|
||||||
|
return browserResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<FileObject> createFileObjects() {
|
||||||
|
List<FileObject> fileObjects = new ArrayList<>();
|
||||||
|
|
||||||
|
FileObject fileObject1 = new FileObject();
|
||||||
|
fileObject1.setName("FO 1");
|
||||||
|
fileObject1.setLength(100);
|
||||||
|
fileObject1.setLastModified(0L);
|
||||||
|
fileObject1.setPath("/path/object/1");
|
||||||
|
fileObject1.setDescription("description of file object 1");
|
||||||
|
fileObject1.setDirectory(false);
|
||||||
|
|
||||||
|
FileObject fileObject2 = new FileObject();
|
||||||
|
fileObject2.setName("FO 2");
|
||||||
|
fileObject2.setLength(100);
|
||||||
|
fileObject2.setLastModified(101L);
|
||||||
|
fileObject2.setPath("/path/object/2");
|
||||||
|
fileObject2.setDescription("description of file object 2");
|
||||||
|
fileObject2.setDirectory(true);
|
||||||
|
|
||||||
|
fileObjects.add(fileObject1);
|
||||||
|
fileObjects.add(fileObject2);
|
||||||
|
return fileObjects;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertEqualAttributes(BrowserResult browserResult, BrowserResultDto dto) {
|
||||||
|
assertThat(dto.getTag()).isEqualTo(browserResult.getTag());
|
||||||
|
assertThat(dto.getBranch()).isEqualTo(browserResult.getBranch());
|
||||||
|
assertThat(dto.getRevision()).isEqualTo(browserResult.getRevision());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertEqualFileObjectAttributes(FileObject fileObject, FileObjectDto dto) {
|
||||||
|
assertThat(dto.getName()).isEqualTo(fileObject.getName());
|
||||||
|
assertThat(dto.getLength()).isEqualTo(fileObject.getLength());
|
||||||
|
assertThat(dto.getLastModified()).isEqualTo(Instant.ofEpochMilli(fileObject.getLastModified()));
|
||||||
|
assertThat(dto.isDirectory()).isEqualTo(fileObject.isDirectory());
|
||||||
|
assertThat(dto.getDescription()).isEqualTo(fileObject.getDescription());
|
||||||
|
assertThat(dto.getPath()).isEqualTo(fileObject.getPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,26 +11,22 @@ import org.mockito.InjectMocks;
|
|||||||
import org.mockito.junit.MockitoJUnitRunner;
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
import sonia.scm.repository.FileObject;
|
import sonia.scm.repository.FileObject;
|
||||||
|
|
||||||
import java.net.URI;
|
import static org.junit.Assert.assertEquals;
|
||||||
import java.net.URISyntaxException;
|
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.MockitoAnnotations.initMocks;
|
import static org.mockito.MockitoAnnotations.initMocks;
|
||||||
|
|
||||||
@RunWith(MockitoJUnitRunner.class)
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
public class FileObjectToFileObjectDtoMapperTest {
|
public class FileObjectMapperTest {
|
||||||
private final URI baseUri = URI.create("http://example.com/base/");
|
|
||||||
|
|
||||||
@InjectMocks
|
@InjectMocks
|
||||||
private FileObjectToFileObjectDtoMapperImpl mapper;
|
private FileObjectMapperImpl 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);
|
||||||
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void init() throws URISyntaxException {
|
public void init() {
|
||||||
initMocks(this);
|
initMocks(this);
|
||||||
subjectThreadState.bind();
|
subjectThreadState.bind();
|
||||||
ThreadContext.bind(subject);
|
ThreadContext.bind(subject);
|
||||||
Reference in New Issue
Block a user