Implemented BrowserResultMapper

This commit is contained in:
Philipp Czora
2018-08-13 17:31:45 +02:00
parent 60526ba38e
commit f375e076e4
9 changed files with 167 additions and 26 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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