mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-12 00:15:44 +01:00
Started implementing the sources feature
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
package sonia.scm.api.v2.resources;
|
||||||
|
|
||||||
|
import de.otto.edison.hal.HalRepresentation;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class BrowserResultDto extends HalRepresentation {
|
||||||
|
private String revision;
|
||||||
|
private String tag;
|
||||||
|
private String branch;
|
||||||
|
private Collection<FileObjectDto> files;
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package sonia.scm.api.v2.resources;
|
||||||
|
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import sonia.scm.repository.BrowserResult;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public abstract class BrowserResultToBrowserResultDtoMapper extends BaseMapper<BrowserResult, BrowserResultDto> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
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.time.Instant;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class FileObjectDto extends HalRepresentation {
|
||||||
|
private String name;
|
||||||
|
private String path;
|
||||||
|
private boolean directory;
|
||||||
|
private String description;
|
||||||
|
private int length;
|
||||||
|
// TODO: What about subrepos?
|
||||||
|
private Instant lastModified;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("squid:S1185") // We want to have this method available in this package
|
||||||
|
protected HalRepresentation add(Links links) {
|
||||||
|
return super.add(links);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package sonia.scm.api.v2.resources;
|
||||||
|
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import sonia.scm.repository.FileObject;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public abstract class FileObjectToFileObjectDtoMapper extends BaseMapper<FileObject, FileObjectDto> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,20 +1,45 @@
|
|||||||
package sonia.scm.api.v2.resources;
|
package sonia.scm.api.v2.resources;
|
||||||
|
|
||||||
import javax.ws.rs.DefaultValue;
|
import sonia.scm.repository.BrowserResult;
|
||||||
import javax.ws.rs.GET;
|
import sonia.scm.repository.NamespaceAndName;
|
||||||
import javax.ws.rs.Path;
|
import sonia.scm.repository.RepositoryException;
|
||||||
import javax.ws.rs.QueryParam;
|
import sonia.scm.repository.RepositoryNotFoundException;
|
||||||
|
import sonia.scm.repository.api.BrowseCommandBuilder;
|
||||||
|
import sonia.scm.repository.api.RepositoryService;
|
||||||
|
import sonia.scm.repository.api.RepositoryServiceFactory;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.ws.rs.*;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
public class SourceRootResource {
|
public class SourceRootResource {
|
||||||
|
|
||||||
|
private final RepositoryServiceFactory serviceFactory;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public SourceRootResource(RepositoryServiceFactory serviceFactory) {
|
||||||
|
this.serviceFactory = serviceFactory;
|
||||||
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("")
|
@Path("")
|
||||||
public Response getAll(@DefaultValue("0") @QueryParam("page") int page,
|
public Response getAll(@PathParam("namespace") String namespace, @PathParam("name") String name) {
|
||||||
@DefaultValue("10") @QueryParam("pageSize") int pageSize,
|
|
||||||
@QueryParam("sortBy") String sortBy,
|
BrowserResult browserResult = null;
|
||||||
@DefaultValue("false") @QueryParam("desc") boolean desc) {
|
try (RepositoryService repositoryService = serviceFactory.create(new NamespaceAndName(namespace, name))) {
|
||||||
throw new UnsupportedOperationException();
|
BrowseCommandBuilder browseCommand = repositoryService.getBrowseCommand();
|
||||||
|
browseCommand.setPath("/");
|
||||||
|
browserResult = browseCommand.getBrowserResult();
|
||||||
|
} catch (RepositoryNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (RepositoryException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response.ok(browserResult.toString()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
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.FileObject;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.MockitoAnnotations.initMocks;
|
||||||
|
|
||||||
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
|
public class FileObjectToFileObjectDtoMapperTest {
|
||||||
|
private final URI baseUri = URI.create("http://example.com/base/");
|
||||||
|
|
||||||
|
@InjectMocks
|
||||||
|
private FileObjectToFileObjectDtoMapperImpl mapper;
|
||||||
|
|
||||||
|
private final Subject subject = mock(Subject.class);
|
||||||
|
private final ThreadState subjectThreadState = new SubjectThreadState(subject);
|
||||||
|
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void init() throws URISyntaxException {
|
||||||
|
initMocks(this);
|
||||||
|
subjectThreadState.bind();
|
||||||
|
ThreadContext.bind(subject);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldMapAttributesCorrectly() {
|
||||||
|
FileObject fileObject = createFileObject();
|
||||||
|
FileObjectDto dto = mapper.map(fileObject);
|
||||||
|
|
||||||
|
assertEqualAttributes(fileObject, dto);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private FileObject createFileObject() {
|
||||||
|
FileObject fileObject = new FileObject();
|
||||||
|
fileObject.setName("foo");
|
||||||
|
fileObject.setDescription("bar");
|
||||||
|
fileObject.setPath("/foo/bar");
|
||||||
|
fileObject.setDirectory(false);
|
||||||
|
fileObject.setLength(100);
|
||||||
|
fileObject.setLastModified(123L);
|
||||||
|
return fileObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: subrepo
|
||||||
|
private void assertEqualAttributes(FileObject fileObject, FileObjectDto dto) {
|
||||||
|
assertEquals(fileObject.getName(), dto.getName());
|
||||||
|
assertEquals(fileObject.getDescription(), dto.getDescription());
|
||||||
|
assertEquals(fileObject.getPath(), dto.getPath());
|
||||||
|
assertEquals(fileObject.isDirectory(), dto.isDirectory());
|
||||||
|
assertEquals(fileObject.getLength(), dto.getLength());
|
||||||
|
assertEquals((long)fileObject.getLastModified(), dto.getLastModified().toEpochMilli());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user