Skip to content

Commit

Permalink
Done through FedoraFixity
Browse files Browse the repository at this point in the history
  • Loading branch information
ajs6f committed Jun 12, 2013
1 parent 0f56e1f commit e602ba7
Show file tree
Hide file tree
Showing 9 changed files with 158 additions and 100 deletions.
67 changes: 44 additions & 23 deletions fcrepo-http-api/src/main/java/org/fcrepo/api/FedoraFieldSearch.java
@@ -1,7 +1,13 @@

package org.fcrepo.api;

import static com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createResource;
import static javax.ws.rs.core.MediaType.TEXT_HTML;
import static javax.ws.rs.core.Response.status;
import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
import static org.fcrepo.RdfLexicon.SEARCH_HAS_MORE;
import static org.fcrepo.RdfLexicon.SEARCH_NEXT_PAGE;
import static org.fcrepo.http.RDFMediaType.N3;
import static org.fcrepo.http.RDFMediaType.N3_ALT1;
import static org.fcrepo.http.RDFMediaType.N3_ALT2;
Expand All @@ -23,48 +29,51 @@
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import org.fcrepo.AbstractResource;
import org.fcrepo.RdfLexicon;
import org.fcrepo.api.rdf.HttpGraphSubjects;
import org.fcrepo.responses.HtmlTemplate;
import org.fcrepo.session.InjectedSession;
import org.fcrepo.utils.FedoraJcrTypes;
import org.slf4j.Logger;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.codahale.metrics.annotation.Timed;
import com.google.common.collect.ImmutableBiMap;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;

/**
* @author Frank Asseg
* @author ajs6f
*/

@Component
@Scope("prototype")
@Path("/fcr:search")
public class FedoraFieldSearch extends AbstractResource implements
FedoraJcrTypes {

@InjectedSession
protected Session session;

private static final Logger LOGGER = getLogger(FedoraFieldSearch.class);

@GET
@Timed
@HtmlTemplate("search:results")
@Produces({TEXT_HTML})
public Dataset searchSubmitHtml(@QueryParam("q")
final String terms, @QueryParam("offset")
@DefaultValue("0")
final long offset, @QueryParam("limit")
@DefaultValue("25")
final int limit, @Context
final Request request, @Context
final UriInfo uriInfo) throws RepositoryException {
final String terms, @QueryParam("offset")
@DefaultValue("0")
final long offset, @QueryParam("limit")
@DefaultValue("25")
final int limit, @Context
final Request request, @Context
final UriInfo uriInfo) throws RepositoryException {

return getSearchDataset(terms, offset, limit, uriInfo);
}
Expand All @@ -81,35 +90,43 @@ public Dataset searchSubmitRdf(@QueryParam("q")
final Request request, @Context
final UriInfo uriInfo) throws RepositoryException {


if (terms == null) {
LOGGER.trace("Received search request, but terms was empty. Aborting.");
throw new WebApplicationException(Response.status(
Response.Status.BAD_REQUEST).entity(
throw new WebApplicationException(status(BAD_REQUEST).entity(
"q parameter is mandatory").build());
}

return getSearchDataset(terms, offset, limit, uriInfo);
}

private Dataset getSearchDataset(final String terms, final long offset, final int limit, final UriInfo uriInfo) throws RepositoryException {
final Session session = getAuthenticatedSession();
private Dataset getSearchDataset(final String terms, final long offset,
final int limit, final UriInfo uriInfo) throws RepositoryException {

try {
LOGGER.debug("Received search request with search terms {}, offset {}, and limit {}", terms, offset, limit);
LOGGER.debug(
"Received search request with search terms {}, offset {}, and limit {}",
terms, offset, limit);

final Resource searchResult =
ResourceFactory.createResource(uriInfo.getRequestUri()
.toASCIIString());
createResource(uriInfo.getRequestUri().toASCIIString());

final Dataset dataset =
nodeService.searchRepository(new HttpGraphSubjects(
FedoraNodes.class, uriInfo), searchResult, session,
terms, limit, offset);

final Model searchModel = ModelFactory.createDefaultModel();
if (terms != null && dataset.getDefaultModel().contains(searchResult, RdfLexicon.SEARCH_HAS_MORE, searchModel.createTypedLiteral(true))) {
Map<String, ?> pathMap = ImmutableBiMap.of("q", terms, "offset", offset + limit, "limit", limit);
searchModel.add(searchResult, RdfLexicon.SEARCH_NEXT_PAGE, searchModel.createResource(uriInfo.getBaseUriBuilder().path(FedoraFieldSearch.class).buildFromMap(pathMap).toString()));
final Model searchModel = createDefaultModel();
if (terms != null &&
dataset.getDefaultModel().contains(searchResult,
SEARCH_HAS_MORE,
searchModel.createTypedLiteral(true))) {
final Map<String, ?> pathMap =
ImmutableBiMap.of("q", terms, "offset", offset + limit,
"limit", limit);
searchModel.add(searchResult, SEARCH_NEXT_PAGE, searchModel
.createResource(uriInfo.getBaseUriBuilder().path(
FedoraFieldSearch.class).buildFromMap(pathMap)
.toString()));
dataset.addNamedModel("search-pagination", searchModel);
}

Expand All @@ -120,4 +137,8 @@ private Dataset getSearchDataset(final String terms, final long offset, final in
}
}

public void setSession(final Session session) {
this.session = session;
}

}
47 changes: 32 additions & 15 deletions fcrepo-http-api/src/main/java/org/fcrepo/api/FedoraFixity.java
@@ -1,3 +1,4 @@

package org.fcrepo.api;

import static javax.ws.rs.core.MediaType.TEXT_HTML;
Expand Down Expand Up @@ -25,33 +26,49 @@
import org.fcrepo.AbstractResource;
import org.fcrepo.Datastream;
import org.fcrepo.api.rdf.HttpGraphSubjects;
import org.fcrepo.session.InjectedSession;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.codahale.metrics.annotation.Timed;
import com.hp.hpl.jena.query.Dataset;

/**
* @author ajs6f
* @date Jun 12, 2013
*/
@Component
@Scope("prototype")
@Path("/{path: .*}/fcr:fixity")
public class FedoraFixity extends AbstractResource {

@GET
@Timed
@Produces({N3, N3_ALT1, N3_ALT2, TURTLE, RDF_XML, RDF_JSON, NTRIPLES, TEXT_HTML})
public Dataset getDatastreamFixity(@PathParam("path") List<PathSegment> pathList,
@Context final Request request,
@Context final UriInfo uriInfo) throws RepositoryException {
@InjectedSession
protected Session session;

@GET
@Timed
@Produces({N3, N3_ALT1, N3_ALT2, TURTLE, RDF_XML, RDF_JSON, NTRIPLES,
TEXT_HTML})
public Dataset getDatastreamFixity(@PathParam("path")
final List<PathSegment> pathList, @Context
final Request request, @Context
final UriInfo uriInfo) throws RepositoryException {

final Session session = getAuthenticatedSession();
try {
final String path = toPath(pathList);

try {
final String path = toPath(pathList);
final Datastream ds =
datastreamService.getDatastream(session, path);

final Datastream ds = datastreamService.getDatastream(session, path);
return datastreamService.getFixityResultsModel(
new HttpGraphSubjects(FedoraNodes.class, uriInfo), ds);
} finally {
session.logout();
}
}

return datastreamService.getFixityResultsModel(new HttpGraphSubjects(FedoraNodes.class, uriInfo), ds);
} finally {
session.logout();
}
}
public void setSession(final Session session) {
this.session = session;
}

}
2 changes: 2 additions & 0 deletions fcrepo-http-api/src/main/java/org/fcrepo/api/FedoraNodes.java
Expand Up @@ -18,6 +18,7 @@
import static org.fcrepo.http.RDFMediaType.RDF_XML;
import static org.fcrepo.http.RDFMediaType.TURTLE;
import static org.slf4j.LoggerFactory.getLogger;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
Expand Down Expand Up @@ -57,6 +58,7 @@
import org.slf4j.Logger;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.codahale.metrics.annotation.Timed;
import com.hp.hpl.jena.query.Dataset;

Expand Down
Expand Up @@ -36,7 +36,9 @@ public class FedoraFieldSearchTest {
FedoraFieldSearch testObj;

Session mockSession;

private NodeService mockNodeService;

private UriInfo uriInfo;

@Before
Expand All @@ -47,6 +49,7 @@ public void setUp() throws LoginException, RepositoryException {
testObj.setUriInfo(uriInfo);
mockNodeService = mock(NodeService.class);
testObj.setNodeService(mockNodeService);
testObj.setSession(mockSession);
}

@After
Expand All @@ -55,26 +58,42 @@ public void tearDown() {
}

@Test
public void testFieldSearch() throws RepositoryException, URISyntaxException {
public void testFieldSearch() throws RepositoryException,
URISyntaxException {

final Request mockRequest = mock(Request.class);

when(uriInfo.getRequestUri()).thenReturn(new URI("http://localhost/fcrepo/path/to/query/endpoint"));
when(uriInfo.getRequestUri()).thenReturn(
new URI("http://localhost/fcrepo/path/to/query/endpoint"));
when(mockRequest.selectVariant(any(List.class))).thenReturn(
new Variant(MediaType.valueOf("application/n-triples"), null,
null));

when(mockNodeService.searchRepository(any(GraphSubjects.class), eq(ResourceFactory.createResource("http://localhost/fcrepo/path/to/query/endpoint")), eq(mockSession), eq("ZZZ"), eq(0), eq(0L))).thenReturn(DatasetFactory.create());
new Variant(MediaType.valueOf("application/n-triples"), null,
null));

when(
mockNodeService
.searchRepository(
any(GraphSubjects.class),
eq(ResourceFactory
.createResource("http://localhost/fcrepo/path/to/query/endpoint")),
eq(mockSession), eq("ZZZ"), eq(0), eq(0L)))
.thenReturn(DatasetFactory.create());
final UriBuilder mockUriBuilder = mock(UriBuilder.class);

when(mockUriBuilder.path(FedoraFieldSearch.class)).thenReturn(mockUriBuilder);
when(mockUriBuilder.buildFromMap(any(Map.class))).thenReturn(new URI("path/to/object"));
when(mockUriBuilder.path(FedoraFieldSearch.class)).thenReturn(
mockUriBuilder);
when(mockUriBuilder.buildFromMap(any(Map.class))).thenReturn(
new URI("path/to/object"));

when(uriInfo.getRequestUriBuilder()).thenReturn(mockUriBuilder);
when(uriInfo.getRequestUriBuilder()).thenReturn(mockUriBuilder);

testObj.searchSubmitRdf("ZZZ", 0, 0, mockRequest, uriInfo);

verify(mockNodeService).searchRepository(any(GraphSubjects.class), eq(ResourceFactory.createResource("http://localhost/fcrepo/path/to/query/endpoint")), eq(mockSession), eq("ZZZ"), eq(0), eq(0L));
verify(mockNodeService)
.searchRepository(
any(GraphSubjects.class),
eq(ResourceFactory
.createResource("http://localhost/fcrepo/path/to/query/endpoint")),
eq(mockSession), eq("ZZZ"), eq(0), eq(0L));
}

}
65 changes: 36 additions & 29 deletions fcrepo-http-api/src/test/java/org/fcrepo/api/FedoraFixityTest.java
@@ -1,3 +1,4 @@

package org.fcrepo.api;

import static org.fcrepo.test.util.PathSegmentImpl.createPathList;
Expand Down Expand Up @@ -25,47 +26,53 @@
import org.junit.Test;

public class FedoraFixityTest {
FedoraFixity testObj;

DatastreamService mockDatastreams;
FedoraFixity testObj;

DatastreamService mockDatastreams;

Session mockSession;
Session mockSession;

private UriInfo uriInfo;

private Request mockRequest;

@Before
public void setUp() throws LoginException, RepositoryException {
public void setUp() throws LoginException, RepositoryException {

mockRequest = mock(Request.class);
mockDatastreams = mock(DatastreamService.class);
mockDatastreams = mock(DatastreamService.class);

testObj = new FedoraFixity();
testObj.setDatastreamService(mockDatastreams);
testObj = new FedoraFixity();
testObj.setDatastreamService(mockDatastreams);

uriInfo = TestHelpers.getUriInfoImpl();
testObj.setUriInfo(uriInfo);


mockSession = TestHelpers.mockSession(testObj);
}

@After
public void tearDown() {

}
@Test
public void testGetDatastreamFixity() throws RepositoryException,
IOException {
final String pid = "FedoraDatastreamsTest1";
final String path = "/objects/" + pid + "/testDS";
final String dsId = "testDS";
final Datastream mockDs = TestHelpers.mockDatastream(pid, dsId, null);
Node mockNode = mock(Node.class);
when(mockNode.getSession()).thenReturn(mockSession);
when(mockDs.getNode()).thenReturn(mockNode);
when(mockDatastreams.getDatastream(mockSession, path)).thenReturn(mockDs);
testObj.getDatastreamFixity(createPathList("objects", pid, "testDS"), mockRequest, uriInfo);
verify(mockDatastreams).getFixityResultsModel(any(GraphSubjects.class), eq(mockDs));
}
mockSession = TestHelpers.mockSession(testObj);
testObj.setSession(mockSession);
}

@After
public void tearDown() {

}

@Test
public void testGetDatastreamFixity() throws RepositoryException,
IOException {
final String pid = "FedoraDatastreamsTest1";
final String path = "/objects/" + pid + "/testDS";
final String dsId = "testDS";
final Datastream mockDs = TestHelpers.mockDatastream(pid, dsId, null);
final Node mockNode = mock(Node.class);
when(mockNode.getSession()).thenReturn(mockSession);
when(mockDs.getNode()).thenReturn(mockNode);
when(mockDatastreams.getDatastream(mockSession, path)).thenReturn(
mockDs);
testObj.getDatastreamFixity(createPathList("objects", pid, "testDS"),
mockRequest, uriInfo);
verify(mockDatastreams).getFixityResultsModel(any(GraphSubjects.class),
eq(mockDs));
}
}

0 comments on commit e602ba7

Please sign in to comment.