Skip to content

Commit

Permalink
Merge pull request #533 from fcrepo4/remove-datasets
Browse files Browse the repository at this point in the history
Use RdfStream instead of Dataset at all API boundaries
  • Loading branch information
Andrew Woods committed Oct 15, 2014
2 parents e085c4a + 52232f6 commit ba3dcf9
Show file tree
Hide file tree
Showing 40 changed files with 422 additions and 1,054 deletions.
Expand Up @@ -17,6 +17,8 @@

import org.fcrepo.kernel.FedoraResource;
import org.fcrepo.kernel.impl.rdf.impl.DefaultIdentifierTranslator;
import org.fcrepo.kernel.impl.rdf.impl.PropertiesRdfContext;
import org.fcrepo.kernel.utils.iterators.RdfStream;
import org.junit.Test;

import javax.jcr.PathNotFoundException;
Expand Down Expand Up @@ -68,7 +70,7 @@ public void testWriteProperty() throws RepositoryException {


// Write the properties
object.updatePropertiesDataset(new DefaultIdentifierTranslator(session), sparql);
object.updateProperties(new DefaultIdentifierTranslator(session), sparql, new RdfStream());

// Verify
final Property property = object.getNode().getProperty("fedora:name");
Expand All @@ -94,7 +96,7 @@ public void testRemoveProperty() throws RepositoryException {

// Write the properties
final DefaultIdentifierTranslator graphSubjects = new DefaultIdentifierTranslator(session);
object.updatePropertiesDataset(graphSubjects, sparql);
object.updateProperties(graphSubjects, sparql, new RdfStream());

// Verify property exists
final Property property = object.getNode().getProperty("fedora:remove");
Expand All @@ -109,7 +111,9 @@ public void testRemoveProperty() throws RepositoryException {
"}";

// Remove the properties
object.updatePropertiesDataset(graphSubjects, sparqlRemove);
object.updateProperties(graphSubjects,
sparqlRemove,
object.getTriples(graphSubjects, PropertiesRdfContext.class));

// Persist the object (although the propery will be removed from memory without this.)
session.save();
Expand Down
Expand Up @@ -98,7 +98,6 @@ public abstract class ContentExposingResource extends FedoraBaseResource {

@Context protected Request request;
@Context protected HttpServletResponse servletResponse;
@Context protected UriInfo uriInfo;

@Inject
@Optional
Expand All @@ -112,9 +111,9 @@ public abstract class ContentExposingResource extends FedoraBaseResource {

private static long MAX_BUFFER_SIZE = 10240000;

abstract String externalPath();
protected abstract String externalPath();

abstract void addResourceHttpHeaders(FedoraResource resource);
protected abstract void addResourceHttpHeaders(FedoraResource resource);

protected Response getContent(final Prefer prefer,
final String rangeValue,
Expand Down Expand Up @@ -147,30 +146,32 @@ public Triple apply(final Statement input) {
}

} else {
rdfStream.concat(getResourceTriples(prefer));

final PreferTag returnPreference;

if (prefer != null && prefer.hasReturn()) {
returnPreference = prefer.getReturn();
} else {
returnPreference = new PreferTag("");
if (prefer != null) {
prefer.getReturn().addResponseHeaders(servletResponse);
}

rdfStream.concat(getResourceTriples(returnPreference));

returnPreference.addResponseHeaders(servletResponse);

}
servletResponse.addHeader("Vary", "Accept, Range, Accept-Encoding, Accept-Language");

return Response.ok(rdfStream).build();
}

protected RdfStream getResourceTriples() {
return getResourceTriples(new PreferTag(""));
return getResourceTriples(null);
}

protected RdfStream getResourceTriples(final PreferTag returnPreference) {
protected RdfStream getResourceTriples(final Prefer prefer) {

final PreferTag returnPreference;

if (prefer != null && prefer.hasReturn()) {
returnPreference = prefer.getReturn();
} else {
returnPreference = new PreferTag("");
}

final RdfStream rdfStream = new RdfStream();

rdfStream.concat(getTriples(PropertiesRdfContext.class));
Expand Down Expand Up @@ -498,7 +499,15 @@ protected void replaceResourceWithStream(final FedoraResource resource,
}

protected void patchResourcewithSparql(final FedoraResource resource, final String requestBody) {
resource.updatePropertiesDataset(translator(), requestBody);
final RdfStream resourceTriples;

if (resource.isNew()) {
resourceTriples = new RdfStream();
} else {
resourceTriples = getResourceTriples();
}

resource.updateProperties(translator(), requestBody, resourceTriples);
}

/**
Expand Down
Expand Up @@ -438,7 +438,7 @@ protected void addResourceHttpHeaders(final FedoraResource resource) {
}

@Override
String externalPath() {
protected String externalPath() {
return externalPath;
}

Expand Down
Expand Up @@ -201,12 +201,12 @@ protected Session session() {
}

@Override
void addResourceHttpHeaders(final FedoraResource resource) {
protected void addResourceHttpHeaders(final FedoraResource resource) {

}

@Override
String externalPath() {
protected String externalPath() {
return externalPath;
}

Expand Down
Expand Up @@ -191,12 +191,12 @@ protected FedoraResource resource() {
}

@Override
void addResourceHttpHeaders(final FedoraResource resource) {
protected void addResourceHttpHeaders(final FedoraResource resource) {
// no-op
}

@Override
String externalPath() {
protected String externalPath() {
return externalPath;
}

Expand Down
Expand Up @@ -15,7 +15,6 @@
*/
package org.fcrepo.http.api.responses;

import static com.google.common.collect.ImmutableList.of;
import static com.google.common.collect.ImmutableMap.builder;
import static com.hp.hpl.jena.graph.Node.ANY;
import static javax.ws.rs.core.MediaType.APPLICATION_XHTML_XML;
Expand All @@ -24,10 +23,6 @@
import static javax.ws.rs.core.MediaType.TEXT_HTML_TYPE;
import static org.fcrepo.http.commons.responses.RdfSerializationUtils.getFirstValueForPredicate;
import static org.fcrepo.http.commons.responses.RdfSerializationUtils.primaryTypePredicate;
import static org.fcrepo.http.commons.responses.RdfSerializationUtils.setCachingHeaders;
import static org.fcrepo.kernel.impl.rdf.SerializationUtils.getDatasetSubject;
import static org.fcrepo.kernel.impl.rdf.SerializationUtils.subjectKey;
import static org.fcrepo.kernel.impl.rdf.SerializationUtils.unifyDatasetModel;
import static org.slf4j.LoggerFactory.getLogger;

import java.io.IOException;
Expand Down Expand Up @@ -74,9 +69,6 @@
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.DatasetFactory;

/**
* Simple HTML provider for RdfStreams
*
Expand Down Expand Up @@ -189,45 +181,38 @@ public void writeTo(final RdfStream rdfStream, final Class<?> type,
final OutputStream entityStream) throws IOException {

try {
final RdfStream nsRdfStream = new NamespaceRdfContext(rdfStream.session());
final Dataset rdf = DatasetFactory.create(rdfStream.namespaces(nsRdfStream.namespaces()).asModel());
rdf.getContext().set(subjectKey, rdfStream.topic());
final RdfStream nsRdfStream = new NamespaceRdfContext(rdfStream.session());

rdfStream.namespaces(nsRdfStream.namespaces());

LOGGER.debug("Writing an HTML response for: {}", rdf);
LOGGER.trace("Attempting to discover our subject");
final Node subject = getDatasetSubject(rdf);
final Node subject = rdfStream.topic();

// add standard headers
httpHeaders.put("Content-type", of((Object) TEXT_HTML));
setCachingHeaders(httpHeaders, rdf, uriInfo);
final Model model = rdfStream.asModel();

final Template nodeTypeTemplate =
getTemplate(rdf, subject, annotations);
final Template nodeTypeTemplate = getTemplate(model, subject, annotations);

final Context context = getContext(rdf, subject);
final Context context = getContext(model, subject);

// the contract of MessageBodyWriter<T> is _not_ to close the stream
// after writing to it
final Writer outWriter = new OutputStreamWriter(entityStream);
nodeTypeTemplate.merge(context, outWriter);
outWriter.flush();
// the contract of MessageBodyWriter<T> is _not_ to close the stream
// after writing to it
final Writer outWriter = new OutputStreamWriter(entityStream);
nodeTypeTemplate.merge(context, outWriter);
outWriter.flush();

} catch (final RepositoryException e) {
throw new WebApplicationException(e);
}

}

protected Context getContext(final Dataset rdf, final Node subject) {
protected Context getContext(final Model model, final Node subject) {
final FieldTool fieldTool = new FieldTool();

final Context context = new VelocityContext();
context.put("rdfLexicon", fieldTool.in(RdfLexicon.class));
context.put("helpers", ViewHelpers.getInstance());
context.put("esc", escapeTool);
context.put("rdf", rdf.asDatasetGraph());

final Model model = unifyDatasetModel(rdf);
context.put("rdf", model.getGraph());

context.put("model", model);
context.put("subjects", model.listSubjects());
Expand All @@ -237,7 +222,7 @@ protected Context getContext(final Dataset rdf, final Node subject) {
return context;
}

private Template getTemplate(final Dataset rdf, final Node subject,
private Template getTemplate(final Model rdf, final Node subject,
final Annotation[] annotations) {
Template template = null;

Expand All @@ -253,8 +238,7 @@ private Template getTemplate(final Dataset rdf, final Node subject,
if (template == null) {
LOGGER.trace("Attempting to discover the primary type of the node for the resource in question...");
final String nodeType =
getFirstValueForPredicate(rdf, subject,
primaryTypePredicate);
getFirstValueForPredicate(rdf, subject, primaryTypePredicate);

LOGGER.debug("Found primary node type: {}", nodeType);
template = templatesMap.get(nodeType);
Expand Down
Expand Up @@ -87,7 +87,7 @@ WHERE { }
</form>
#end

#set ($serializations = $rdf.find($nodeany, $topic, $helpers.asNode($rdfLexicon.HAS_SERIALIZATION), $nodeany))
#set ($serializations = $rdf.find($topic, $helpers.asNode($rdfLexicon.HAS_SERIALIZATION), $nodeany))

#if($serializations.hasNext())
<div class="btn-group">
Expand All @@ -109,7 +109,7 @@ WHERE { }


#if ($writable == true)
#set ($serializations = $rdf.find($nodeany, $topic, $helpers.asNode($rdfLexicon.HAS_SERIALIZATION), $nodeany))
#set ($serializations = $rdf.find($topic, $helpers.asNode($rdfLexicon.HAS_SERIALIZATION), $nodeany))
#set ($isLockable = $helpers.isRdfResource($rdf, $topic, $rdfLexicon.MIX_NAMESPACE, "lockable"))

#if($serializations.hasNext())
Expand Down Expand Up @@ -181,7 +181,7 @@ WHERE { }
#end

#if ($writable == true)
#set ($fedoraresc = $rdf.find($nodeany, $topic, $helpers.asNode($rdfLexicon.HAS_MIXIN_TYPE), $helpers.asLiteralStringNode("fedora:resource")))
#set ($fedoraresc = $rdf.find($topic, $helpers.asNode($rdfLexicon.HAS_MIXIN_TYPE), $helpers.asLiteralStringNode("fedora:resource")))
#if($fedoraresc.hasNext())
<h3>Access Roles</h3>
<form id="update_rbacl" type="application/json" action="javascript:updateAccessRoles()" method="POST">
Expand Down
32 changes: 16 additions & 16 deletions fcrepo-http-api/src/main/resources/views/common.vsl
@@ -1,40 +1,40 @@
#* @vtlvariable name="quad" type="com.hp.hpl.jena.sparql.core.Quad" *#
#* @vtlvariable name="rdf" type="com.hp.hpl.jena.sparql.core.DatasetGraph" *#
#* @vtlvariable name="rdf" type="com.hp.hpl.jena.graph.Graph" *#
#* @vtlvariable name="model" type="com.hp.hpl.jena.rdf.model.Model" *#
#macro( triples $sub )
<dl>

#set ($last_quad = false)
#foreach($quad in $helpers.getSortedTriples($model, $rdf.find($nodeany, $sub, $nodeany, $nodeany)))
#if( $rdfLexicon.isManagedPredicateURI.apply($quad.getPredicate().toString()) )
#foreach($triple in $helpers.getSortedTriples($model, $rdf.find($sub, $nodeany, $nodeany)))
#if( $rdfLexicon.isManagedPredicateURI.apply($triple.getPredicate().toString()) )
#set ($prop_status = ' class="text-info" title="managed predicate"')
#else
#set ($prop_status = "")
#end

#if($last_quad == false || !$last_quad.getPredicate().equals($quad.getPredicate()))
#if($last_quad == false || !$last_quad.getPredicate().equals($triple.getPredicate()))
<dt$prop_status>
#if($last_quad == false || !$last_quad.getPredicate().getNameSpace().equals($quad.getPredicate().getNameSpace()))
<span class="namespace text-muted" title="$quad.getPredicate().getNameSpace()">$helpers.getNamespacePrefix($model, $quad.getPredicate().getNameSpace(), false)</span>
#if($last_quad == false || !$last_quad.getPredicate().getNameSpace().equals($triple.getPredicate().getNameSpace()))
<span class="namespace text-muted" title="$triple.getPredicate().getNameSpace()">$helpers.getNamespacePrefix($model, $triple.getPredicate().getNameSpace(), false)</span>
#else
<span class="namespace text-muted" title="$quad.getPredicate().getNameSpace()">$helpers.getNamespacePrefix($model, $quad.getPredicate().getNameSpace(), true)</span>
<span class="namespace text-muted" title="$triple.getPredicate().getNameSpace()">$helpers.getNamespacePrefix($model, $triple.getPredicate().getNameSpace(), true)</span>
#end
<span class="localName">$quad.getPredicate().getLocalName()</span>
<span class="localName">$triple.getPredicate().getLocalName()</span>
</dt>
#end
<dd>
#if($quad.getObject().isURI() && $quad.getObject().getURI().startsWith("http"))
<a href="$quad.getObject().getURI()" property="$quad.getPredicate().toString()">$esc.html($quad.getObject())</a>
#elseif ($quad.getObject().isLiteral())
<span property="$quad.getPredicate().toString()">$esc.html($quad.getObject().getLiteral().getLexicalForm())</span>
#if($triple.getObject().isURI() && $triple.getObject().getURI().startsWith("http"))
<a href="$triple.getObject().getURI()" property="$triple.getPredicate().toString()">$esc.html($triple.getObject())</a>
#elseif ($triple.getObject().isLiteral())
<span property="$triple.getPredicate().toString()">$esc.html($triple.getObject().getLiteral().getLexicalForm())</span>
#else
<span property="$quad.getPredicate().toString()">$esc.html($quad.getObject())</span>
<span property="$triple.getPredicate().toString()">$esc.html($triple.getObject())</span>
#end
#if( $quad.getPredicate().toString().equals("http://fedora.info/definitions/v4/rest-api#digest") )
#if( $triple.getPredicate().toString().equals("http://fedora.info/definitions/v4/rest-api#digest") )
<a href="$topic/fcr:fixity">check fixity</a>
#end
</dd>
#set ($last_quad = $quad)
#set ($last_quad = $triple)

#end
</dl>
Expand All @@ -43,5 +43,5 @@
#macro( isObject $sub )
#set($type = $anynode.createURI("http://fedora.info/definitions/v4/repository#mixinTypes"))
#set($object = $anynode.createLiteral("fedora:object"))
$rdf.find($nodeany, $sub, $type, $object).hasNext()
$rdf.find($sub, $type, $object).hasNext()
#end
12 changes: 6 additions & 6 deletions fcrepo-http-api/src/main/resources/views/fcr-fixity.vsl
@@ -1,5 +1,5 @@
#* @vtlvariable name="quad" type="com.hp.hpl.jena.sparql.core.Quad" *#
#* @vtlvariable name="rdf" type="com.hp.hpl.jena.sparql.core.DatasetGraph" *#
#* @vtlvariable name="triple" type="com.hp.hpl.jena.sparql.core.Quad" *#
#* @vtlvariable name="rdf" type="com.hp.hpl.jena.graph.Graph" *#
#* @vtlvariable name="model" type="com.hp.hpl.jena.rdf.model.Model" *#
<!DOCTYPE html>
#set( $title = $helpers.getObjectTitle($rdf, $topic) )
Expand Down Expand Up @@ -51,12 +51,12 @@
## output triples for fixity

#set($hasFixity = $nodeany.createURI("http://www.loc.gov/premis/rdf/v1#hasFixity"))
#set($fixities = $rdf.find($nodeany, $topic, $hasFixity, $nodeany))
#set($fixities = $rdf.find($topic, $hasFixity, $nodeany))
#if ($fixities.hasNext())
#set($quad = $fixities.next())
#set($sub = $nodeany.createURI($quad.getObject().getURI()))
#set($triple = $fixities.next())
#set($sub = $nodeany.createURI($triple.getObject().getURI()))
<div class="panel-heading">
<h4>Fixity Properties <br/><small><a href="$quad.getObject().getURI()">$esc.html($helpers.getObjectTitle($rdf, $sub))</a></small></h4>
<h4>Fixity Properties <br/><small><a href="$triple.getObject().getURI()">$esc.html($helpers.getObjectTitle($rdf, $sub))</a></small></h4>
</div>
<div class="panel-body">
#triples($sub)
Expand Down
2 changes: 1 addition & 1 deletion fcrepo-http-api/src/main/resources/views/nt-file.vsl
Expand Up @@ -52,7 +52,7 @@

## output triples for the content node

#if ($rdf.find($nodeany, $contentNode, $nodeany, $nodeany).hasNext())
#if ($rdf.find($contentNode, $nodeany, $nodeany).hasNext())
<div class="panel-heading">
<a href="$contentNode" class="btn btn-success pull-right"><span class="glyphicon glyphicon-download"></span> Download</a>
<h4>Content Properties <br/><small><a href="$contentNode.getURI()">$esc.html($helpers.getObjectTitle($rdf, $contentNode))</a></small></h4>
Expand Down
Expand Up @@ -652,7 +652,7 @@ public void testCreateNewObjectWithSparql() throws Exception {
MediaType.valueOf(contentTypeSPARQLUpdate), "b", toInputStream("x"));

assertEquals(CREATED.getStatusCode(), actual.getStatus());
verify(mockObject).updatePropertiesDataset(identifierConverter, "x");
verify(mockObject).updateProperties(eq(identifierConverter), eq("x"), any(RdfStream.class));
}

@Test
Expand Down

0 comments on commit ba3dcf9

Please sign in to comment.