Skip to content

Commit

Permalink
Update DatastreamService to replace createDatastreamNode with createD…
Browse files Browse the repository at this point in the history
…atastream that returns a Datastream instead of the JCR node
  • Loading branch information
cbeer authored and Andrew Woods committed Apr 19, 2014
1 parent ca5ddbf commit 1025757
Show file tree
Hide file tree
Showing 18 changed files with 148 additions and 113 deletions.
Expand Up @@ -157,7 +157,7 @@ public Response batchModify(@PathParam("path") final List<PathSegment> pathList,

try {

final Set<Node> nodesChanged = new HashSet<>();
final Set<FedoraResource> resourcesChanged = new HashSet<>();

// iterate through the multipart entities
for (final BodyPart part : multipart.getBodyParts()) {
Expand Down Expand Up @@ -254,7 +254,7 @@ public Response batchModify(@PathParam("path") final List<PathSegment> pathList,
.entity("Invalid Content Type " + contentTypeString).build());
}

nodesChanged.add(resource.getNode());
resourcesChanged.add(resource);

break;

Expand All @@ -270,7 +270,7 @@ public Response batchModify(@PathParam("path") final List<PathSegment> pathList,
checksumURI = null;
}

nodesChanged.add(datastreamService.createDatastreamNode(session, objPath,
resourcesChanged.add(datastreamService.createDatastream(session, objPath,
part.getMediaType().toString(),
contentDisposition.getFileName(),
src, checksumURI));
Expand All @@ -288,8 +288,8 @@ public Response batchModify(@PathParam("path") final List<PathSegment> pathList,

session.save();
versionService.nodeUpdated(session, path);
for (final Node n : nodesChanged) {
versionService.nodeUpdated(n);
for (final FedoraResource resource : resourcesChanged) {
versionService.nodeUpdated(resource.getNode());
}

final HttpIdentifierTranslator subjects =
Expand Down
Expand Up @@ -26,7 +26,6 @@
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.servlet.http.HttpServletResponse;
Expand Down Expand Up @@ -55,7 +54,6 @@
import static javax.ws.rs.core.Response.noContent;
import static javax.ws.rs.core.Response.status;
import static org.apache.http.HttpStatus.SC_CONFLICT;
import static org.modeshape.jcr.api.JcrConstants.JCR_CONTENT;
import static org.slf4j.LoggerFactory.getLogger;

/**
Expand Down Expand Up @@ -144,8 +142,8 @@ public Response create(@PathParam("path")
}


final Node datastreamNode =
datastreamService.createDatastreamNode(session, newDatastreamPath,
final Datastream datastream =
datastreamService.createDatastream(session, newDatastreamPath,
contentType.toString(), originalFileName, requestBodyStream,
checksumURI);

Expand All @@ -154,11 +152,10 @@ public Response create(@PathParam("path")
uriInfo);

session.save();
versionService.nodeUpdated(datastreamNode);
versionService.nodeUpdated(datastream.getNode());

final ResponseBuilder builder = created(new URI(subjects.getSubject(
datastreamNode.getNode(JCR_CONTENT).getPath()).getURI()));
final Datastream datastream = datastreamService.asDatastream(datastreamNode);
datastream.getContentNode().getPath()).getURI()));

addCacheControlHeaders(servletResponse, datastream);

Expand Down Expand Up @@ -222,13 +219,13 @@ public Response modifyContent(@PathParam("path") final List<PathSegment> pathLis
originalFileName = null;
}

final Node datastreamNode =
datastreamService.createDatastreamNode(session, path,
final Datastream datastream =
datastreamService.createDatastream(session, path,
contentType.toString(), originalFileName, requestBodyStream, checksumURI);

final boolean isNew = datastreamNode.isNew();
final boolean isNew = datastream.isNew();
session.save();
versionService.nodeUpdated(datastreamNode);
versionService.nodeUpdated(datastream.getNode());

ResponseBuilder builder;
if (isNew) {
Expand All @@ -237,13 +234,11 @@ public Response modifyContent(@PathParam("path") final List<PathSegment> pathLis
uriInfo);

builder = created(new URI(subjects.getSubject(
datastreamNode.getNode(JCR_CONTENT).getPath()).getURI()));
datastream.getContentNode().getPath()).getURI()));
} else {
builder = noContent();
}

final Datastream datastream = datastreamService.asDatastream(datastreamNode);

addCacheControlHeaders(servletResponse, datastream);

return builder.build();
Expand Down
Expand Up @@ -573,7 +573,7 @@ public Response createObject(@PathParam("path")
originalFileName = null;
}

datastreamService.createDatastreamNode(session,
datastreamService.createDatastream(session,
newObjectPath, contentTypeString, originalFileName, requestBodyStream, checksumURI);

}
Expand Down
Expand Up @@ -112,6 +112,9 @@ public class FedoraBatchTest {
@Mock
private Node mockNode;

@Mock
private Datastream mockDatastream;

@Before
public void setUp() throws Exception {
initMocks(this);
Expand All @@ -129,6 +132,7 @@ public void setUp() throws Exception {
when(mockWorkspace.getVersionManager()).thenReturn(mockVM);
when(mockDsNodeType.getName()).thenReturn("nt:file");
when(mockNode.getPrimaryNodeType()).thenReturn(mockDsNodeType);
when(mockDatastream.getNode()).thenReturn(mockNode);
}

@Test
Expand Down Expand Up @@ -206,15 +210,23 @@ public void testModifyBinaryContent() throws Exception {
when(mockNode.getPath()).thenReturn("/FedoraDatastreamsTest1");
when(mockSession.getNode("/FedoraDatastreamsTest1")).thenReturn(
mockNode);

when(mockDatastreams.createDatastream(any(Session.class),
eq("/{}" + pid + "/{}" + dsId1), anyString(), eq("testDs1.txt"),
any(InputStream.class), eq((URI)null))).thenReturn(mockDatastream);

when(mockDatastreams.createDatastream(any(Session.class),
eq("/{}" + pid + "/{}" + dsId2), anyString(), eq("testDs2.txt"),
any(InputStream.class), eq((URI) null))).thenReturn(mockDatastream);
final Response actual =
testObj.batchModify(createPathList(pid), multipart);
assertEquals(CREATED.getStatusCode(), actual.getStatus());
verify(mockDatastreams).createDatastreamNode(any(Session.class),
eq("/{}" + pid + "/{}" + dsId1), anyString(), eq("testDs1.txt"),
any(InputStream.class), eq((URI)null));
verify(mockDatastreams).createDatastreamNode(any(Session.class),
eq("/{}" + pid + "/{}" + dsId2), anyString(), eq("testDs2.txt"),
any(InputStream.class), eq((URI)null));
verify(mockDatastreams).createDatastream(any(Session.class),
eq("/{}" + pid + "/{}" + dsId1), anyString(), eq("testDs1.txt"),
any(InputStream.class), eq((URI) null));
verify(mockDatastreams).createDatastream(any(Session.class),
eq("/{}" + pid + "/{}" + dsId2), anyString(), eq("testDs2.txt"),
any(InputStream.class), eq((URI) null));
verify(mockSession).save();
}

Expand All @@ -236,16 +248,18 @@ public void testModifyBinaryRdfContent() throws Exception {

multipart.bodyPart(part);

when(mockDatastreams.createDatastream(any(Session.class),
eq("/{}" + pid + "/{}xyz"), anyString(), eq("filename.txt"),
any(InputStream.class), eq((URI) null))).thenReturn(mockDatastream);

when(mockNode.getPath()).thenReturn("/FedoraDatastreamsTest1");
when(mockSession.getNode("/FedoraDatastreamsTest1")).thenReturn(
mockNode);
when(mockSession.getNode("/FedoraDatastreamsTest1")).thenReturn(mockNode);
final Response actual =
testObj.batchModify(createPathList(pid), multipart);
assertEquals(CREATED.getStatusCode(), actual.getStatus());
verify(mockDatastreams).createDatastreamNode(any(Session.class),
eq("/{}" + pid + "/{}xyz"), anyString(), eq("filename.txt"),
any(InputStream.class), eq((URI)null));
verify(mockDatastreams).createDatastream(any(Session.class),
eq("/{}" + pid + "/{}xyz"), anyString(), eq("filename.txt"),
any(InputStream.class), eq((URI) null));
verify(mockSession).save();
}

Expand Down
Expand Up @@ -99,6 +99,9 @@ public class FedoraContentTest {
@Mock
private HttpServletResponse mockResponse;

@Mock
private Datastream mockDatastream;

@Before
public void setUp() throws Exception {
initMocks(this);
Expand All @@ -118,6 +121,8 @@ public void setUp() throws Exception {
when(mockNode.getPrimaryNodeType()).thenReturn(mockNodeType);
when(mockContentNodeType.getName()).thenReturn("nt:content");
when(mockContentNode.getPrimaryNodeType()).thenReturn(mockContentNodeType);
when(mockDatastream.getContentDigest()).thenReturn(URI.create("some:uri"));
when(mockDatastream.getContentNode()).thenReturn(mockContentNode);
}

@Test
Expand All @@ -127,22 +132,19 @@ public void testPutContent() throws RepositoryException, InvalidChecksumExceptio
final String dsContent = "asdf";
final String dsPath = "/" + pid + "/" + dsId;
final InputStream dsContentStream = IOUtils.toInputStream(dsContent);
when(mockNode.isNew()).thenReturn(true);
when(mockNode.getNode(JCR_CONTENT)).thenReturn(mockContentNode);
when(mockDatastream.isNew()).thenReturn(true);
when(mockContentNode.getPath()).thenReturn(dsPath + "/jcr:content");
when(mockNodeService.exists(mockSession, dsPath)).thenReturn(false);
when(
mockDatastreams.createDatastreamNode(any(Session.class),
mockDatastreams.createDatastream(any(Session.class),
eq(dsPath), anyString(), eq("xyz"), any(InputStream.class), eq((URI)null)))
.thenReturn(mockNode);
.thenReturn(mockDatastream);
when(mockDatastreams.exists(mockSession, dsPath)).thenReturn(true);
final Datastream ds = mockDatastream(pid, dsId, dsContent);
when(mockDatastreams.asDatastream(mockNode)).thenReturn(ds);
final Response actual =
testObj.modifyContent(createPathList(pid, dsId), null, "inline; filename=\"xyz\"", null,
dsContentStream, null, mockResponse);
assertEquals(CREATED.getStatusCode(), actual.getStatus());
verify(mockDatastreams).createDatastreamNode(any(Session.class),
verify(mockDatastreams).createDatastream(any(Session.class),
eq(dsPath), anyString(), eq("xyz"), any(InputStream.class), eq((URI)null));
verify(mockSession).save();
}
Expand All @@ -161,18 +163,16 @@ public void testCreateContent() throws RepositoryException, IOException,
when(mockContentNode.getPath()).thenReturn(dsPath + "/jcr:content");
when(mockNodeService.exists(mockSession, dsPath)).thenReturn(false);
when(
mockDatastreams.createDatastreamNode(any(Session.class),
eq(dsPath), anyString(), eq((String)null), any(InputStream.class),
eq((URI) null))).thenReturn(mockNode);
mockDatastreams.createDatastream(any(Session.class),
eq(dsPath), anyString(), eq((String) null), any(InputStream.class),
eq((URI) null))).thenReturn(mockDatastream);
when(mockDatastreams.exists(mockSession, dsPath)).thenReturn(true);
final Datastream ds = mockDatastream(pid, dsId, dsContent);
when(mockDatastreams.asDatastream(mockNode)).thenReturn(ds);
final Response actual =
testObj.create(createPathList(pid, dsId), null, null, null, TEXT_PLAIN_TYPE,
dsContentStream, mockResponse);
assertEquals(CREATED.getStatusCode(), actual.getStatus());
verify(mockDatastreams).createDatastreamNode(mockSession, dsPath,
"text/plain", null, dsContentStream, null);
verify(mockDatastreams).createDatastream(mockSession, dsPath,
"text/plain", null, dsContentStream, null);
verify(mockSession).save();
}

Expand All @@ -190,22 +190,20 @@ public void testCreateContentAtMintedPath() throws RepositoryException, InvalidC
when(mockNode.getNode(JCR_CONTENT)).thenReturn(mockContentNode);
when(mockContentNode.getPath()).thenReturn(dsPath + "xyz/jcr:content");
when(
mockDatastreams.createDatastreamNode(any(Session.class), eq("/"
+ pid + "/xyz"), anyString(), eq((String)null), any(InputStream.class),
eq((URI) null))).thenReturn(mockNode);
mockDatastreams.createDatastream(any(Session.class), eq("/"
+ pid + "/xyz"), anyString(), eq((String) null), any(InputStream.class),
eq((URI) null))).thenReturn(mockDatastream);
when(mockDatastreams.exists(mockSession, dsPath)).thenReturn(true);
final FedoraResource mockResource = mock(FedoraResource.class);
when(mockNodeService.getObject(mockSession,dsPath)).thenReturn(mockResource);
when(mockResource.hasContent()).thenReturn(false);

final Datastream ds = mockDatastream(pid, "xyz", dsContent);
when(mockDatastreams.asDatastream(mockNode)).thenReturn(ds);
final Response actual =
testObj.create(createPathList(pid), null, null, null, TEXT_PLAIN_TYPE,
dsContentStream, mockResponse);
assertEquals(CREATED.getStatusCode(), actual.getStatus());
verify(mockDatastreams).createDatastreamNode(mockSession,
"/" + pid + "/xyz", "text/plain", null, dsContentStream, null);
verify(mockDatastreams).createDatastream(mockSession,
"/" + pid + "/xyz", "text/plain", null, dsContentStream, null);
verify(mockSession).save();
}

Expand All @@ -224,22 +222,19 @@ public void testCreateContentWithSlug() throws RepositoryException, InvalidCheck
when(mockNode.getNode(JCR_CONTENT)).thenReturn(mockContentNode);
when(mockContentNode.getPath()).thenReturn(dsPath + "slug/jcr:content");
when(
mockDatastreams.createDatastreamNode(any(Session.class), eq("/"
+ pid + "/slug"), anyString(), eq((String) null), any(InputStream.class),
eq((URI) null))).thenReturn(mockNode);
mockDatastreams.createDatastream(any(Session.class), eq("/"
+ pid + "/slug"), anyString(), eq((String) null), any(InputStream.class),
eq((URI) null))).thenReturn(mockDatastream);
when(mockDatastreams.exists(mockSession, dsPath)).thenReturn(true);
final FedoraResource mockResource = mock(FedoraResource.class);
when(mockNodeService.getObject(mockSession,dsPath)).thenReturn(mockResource);
when(mockResource.hasContent()).thenReturn(false);

final Datastream ds = mockDatastream(pid, dsid, dsContent);
when(mockDatastreams.asDatastream(mockNode)).thenReturn(ds);
final Response actual =
testObj.create(createPathList(pid), dsid, null, null, TEXT_PLAIN_TYPE,
dsContentStream, mockResponse);
assertEquals(CREATED.getStatusCode(), actual.getStatus());
verify(mockDatastreams).createDatastreamNode(mockSession,
"/" + pid + "/slug", "text/plain", null, dsContentStream, null);
verify(mockDatastreams).createDatastream(mockSession,
"/" + pid + "/slug", "text/plain", null, dsContentStream, null);
verify(mockSession).save();
}

Expand All @@ -261,16 +256,16 @@ public void testModifyContent() throws RepositoryException, InvalidChecksumExcep
mockRequest.evaluatePreconditions(any(Date.class),
any(EntityTag.class))).thenReturn(null);
when(
mockDatastreams.createDatastreamNode(any(Session.class),
eq(dsPath), anyString(), eq((String)null), any(InputStream.class), eq(checksum)))
.thenReturn(mockNode);
mockDatastreams.createDatastream(any(Session.class),
eq(dsPath), anyString(), eq((String) null), any(InputStream.class), eq(checksum)))
.thenReturn(mockDatastream);
when(mockDatastreams.exists(mockSession, dsPath)).thenReturn(true);
final Response actual =
testObj.modifyContent(createPathList(pid, dsId), "urn:sha1:some-checksum", null, null,
dsContentStream, mockRequest, mockResponse);
assertEquals(NO_CONTENT.getStatusCode(), actual.getStatus());
verify(mockDatastreams).createDatastreamNode(any(Session.class),
eq(dsPath), anyString(), eq((String)null), any(InputStream.class), eq(checksum));
verify(mockDatastreams).createDatastream(any(Session.class),
eq(dsPath), anyString(), eq((String) null), any(InputStream.class), eq(checksum));
verify(mockSession).save();
}

Expand Down

0 comments on commit 1025757

Please sign in to comment.