Skip to content

Commit

Permalink
Added caching back in
Browse files Browse the repository at this point in the history
  • Loading branch information
ajs6f committed May 19, 2013
1 parent c71c6ba commit 00fafbd
Show file tree
Hide file tree
Showing 8 changed files with 251 additions and 141 deletions.
12 changes: 12 additions & 0 deletions fcrepo-http-api/pom.xml
Expand Up @@ -155,6 +155,18 @@
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient-cache</artifactId>
<version>4.2.3</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

<build>
Expand Down
21 changes: 21 additions & 0 deletions fcrepo-http-api/src/main/java/org/fcrepo/api/FedoraNodes.java
Expand Up @@ -5,6 +5,7 @@
import static javax.ws.rs.core.MediaType.TEXT_HTML;
import static javax.ws.rs.core.Response.created;
import static javax.ws.rs.core.Response.noContent;
import static javax.ws.rs.core.Response.ResponseBuilder;
import static javax.ws.rs.core.Response.status;
import static org.apache.jena.riot.WebContent.contentTypeSPARQLUpdate;
import static org.fcrepo.http.RDFMediaType.N3;
Expand All @@ -18,6 +19,7 @@

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import javax.jcr.RepositoryException;
Expand All @@ -33,6 +35,8 @@
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.PathSegment;
Expand Down Expand Up @@ -82,6 +86,23 @@ public Dataset describe(@PathParam("path")
try {
final FedoraResource resource =
nodeService.getObject(session, path);
final Date date = resource.getLastModifiedDate();
final Date roundedDate = new Date();
if (date != null) {
roundedDate.setTime(date.getTime() - date.getTime() % 1000);
}
final ResponseBuilder builder =
request.evaluatePreconditions(roundedDate);
if (builder != null) {
final CacheControl cc = new CacheControl();
cc.setMaxAge(0);
cc.setMustRevalidate(true);
// here we are implicitly emitting a 304
// the exception is not an error, it's genuinely
// an exceptional condition
throw new WebApplicationException(builder.cacheControl(cc)
.lastModified(date).build());
}
return resource.getGraphStore().toDataset();

} finally {
Expand Down
42 changes: 0 additions & 42 deletions fcrepo-http-api/src/test/java/org/fcrepo/api/FedoraNodesTest.java
Expand Up @@ -16,18 +16,13 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

import javax.jcr.LoginException;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.Variant;

import org.apache.commons.io.IOUtils;
import org.fcrepo.FedoraObject;
import org.fcrepo.exception.InvalidChecksumException;
Expand Down Expand Up @@ -159,7 +154,6 @@ public void testDeleteObject() throws RepositoryException {
verify(mockSession).save();
}

@SuppressWarnings("unchecked")
@Test
public void testDescribeObject() throws RepositoryException, IOException {
final String pid = "FedoraObjectsRdfTest1";
Expand All @@ -177,48 +171,12 @@ public void testDescribeObject() throws RepositoryException, IOException {
when(mockObject.getGraphStore()).thenReturn(mockStore);
when(mockNodes.getObject(mockSession, path)).thenReturn(mockObject);
final Request mockRequest = mock(Request.class);

when(mockRequest.selectVariant(any(List.class))).thenReturn(
new Variant(MediaType.valueOf("application/n-triples"), null,
null));

final Dataset dataset =
testObj.describe(createPathList(pid), mockRequest);
assertNotNull(dataset.getDefaultModel());

}

// ignore this test until caching is re-enabled
/*
* @SuppressWarnings("unchecked")
* @Test
* public void testDescribeRdfCached() throws RepositoryException,
* IOException {
* final String pid = "FedoraObjectsRdfTest2";
* final String path = "/" + pid;
* final FedoraObject mockObject = mock(FedoraObject.class);
* final GraphStore mockStore = mock(GraphStore.class);
* final Dataset mockDataset = mock(Dataset.class);
* final Model mockModel = mock(Model.class);
* when(mockStore.toDataset()).thenReturn(mockDataset);
* when(mockDataset.getDefaultModel()).thenReturn(mockModel);
* when(mockObject.getLastModifiedDate()).thenReturn(new Date());
* when(mockObject.getGraphStore()).thenReturn(mockStore);
* when(mockNodes.getObject(mockSession, path)).thenReturn(mockObject);
* final Request mockRequest = mock(Request.class);
* when(mockRequest.selectVariant(any(List.class))).thenReturn(
* new Variant(MediaType.valueOf("application/n-triples"), null,
* null));
* when(mockRequest.evaluatePreconditions(any(Date.class))).thenReturn(
* Response.notModified());
* final Response actual =
* testObj.describeRdf(createPathList(pid), mockRequest);
* assertNotNull(actual);
* assertEquals(Status.NOT_MODIFIED.getStatusCode(), actual.getStatus());
* verify(mockSession, never()).save();
* }
*/

@Test
public void testSparqlUpdate() throws RepositoryException, IOException {
final String pid = "FedoraObjectsRdfTest1";
Expand Down

0 comments on commit 00fafbd

Please sign in to comment.