Skip to content

Commit

Permalink
Update fcr:transform to use RdfStreams internally
Browse files Browse the repository at this point in the history
  • Loading branch information
cbeer committed Oct 14, 2014
1 parent 64c9b10 commit b89a1ad
Show file tree
Hide file tree
Showing 14 changed files with 127 additions and 108 deletions.
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 @@ -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 @@ -16,7 +16,7 @@
package org.fcrepo.transform;

import com.google.common.base.Function;
import com.hp.hpl.jena.query.Dataset;
import org.fcrepo.kernel.utils.iterators.RdfStream;

import java.io.InputStream;

Expand All @@ -26,15 +26,15 @@
*
* @author cbeer
*/
public interface Transformation<T> extends Function<Dataset, T> {
public interface Transformation<T> extends Function<RdfStream, T> {

/**
* Execute a transform on a dataset
* @param dataset
* @param stream
* @return transformed dataset
*/
@Override
T apply(final Dataset dataset);
T apply(final RdfStream stream);

/**
* Get the Query the transformation is using
Expand Down
Expand Up @@ -53,26 +53,28 @@
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.fcrepo.http.api.FedoraBaseResource;
import com.google.common.annotations.VisibleForTesting;
import org.fcrepo.http.api.ContentExposingResource;
import org.fcrepo.http.commons.domain.Prefer;
import org.fcrepo.kernel.FedoraResource;
import org.fcrepo.kernel.utils.iterators.RdfStream;
import org.fcrepo.transform.TransformationFactory;
import org.jvnet.hk2.annotations.Optional;
import org.modeshape.jcr.api.JcrTools;
import org.slf4j.Logger;
import org.springframework.context.annotation.Scope;

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

/**
* Endpoint for transforming object properties using stored
* or POSTed transformations.
*
* @author cbeer
*/
@Scope("prototype")
@Scope("request")
@Path("/{path: .*}/fcr:transform")
public class FedoraTransform extends FedoraBaseResource {
public class FedoraTransform extends ContentExposingResource {

@Inject
protected Session session;
Expand All @@ -83,6 +85,23 @@ public class FedoraTransform extends FedoraBaseResource {
@Optional
private TransformationFactory transformationFactory;

@PathParam("path") protected String externalPath;

/**
* Default entry point
*/
public FedoraTransform() { }

/**
* Create a new FedoraNodes instance for a given path
* @param externalPath
*/
@VisibleForTesting
public FedoraTransform(final String externalPath) {
this.externalPath = externalPath;
}


/**
* Register the LDPath configuration tree in JCR
*
Expand Down Expand Up @@ -121,31 +140,27 @@ public void setUpRepositoryConfiguration() throws RepositoryException, IOExcepti
/**
* Execute an LDpath program transform
*
* @param externalPath
* @return Binary blob
* @throws RepositoryException
*/
@GET
@Path("{program}")
@Produces({APPLICATION_JSON})
@Timed
public Object evaluateLdpathProgram(@PathParam("path")
final String externalPath, @PathParam("program")
final String program) throws RepositoryException {
public Object evaluateLdpathProgram(@PathParam("program") final String program,
@HeaderParam("Prefer") final Prefer prefer)
throws RepositoryException, IOException {

final FedoraResource object = getResourceFromPath(externalPath);
final RdfStream rdfStream = getResourceTriples(prefer).session(session)
.topic(translator().reverse().convert(resource().getNode()).asNode());

final Dataset propertiesDataset =
object.getPropertiesDataset(translator());

return getNodeTypeTransform(object.getNode(), program).apply(propertiesDataset);
return getNodeTypeTransform(resource().getNode(), program).apply(rdfStream);

}

/**
* Get the LDPath output as a JSON stream appropriate for e.g. Solr
*
* @param externalPath
* @param requestBodyStream
* @return LDPath as a JSON stream
* @throws RepositoryException
Expand All @@ -157,26 +172,34 @@ public Object evaluateLdpathProgram(@PathParam("path")
contentTypeResultsXML, contentTypeResultsBIO, contentTypeTurtle,
contentTypeN3, contentTypeNTriples, contentTypeRDFXML})
@Timed
public Object evaluateTransform(@PathParam("path")
final String externalPath, @HeaderParam("Content-Type")
final MediaType contentType, final InputStream requestBodyStream)
throws RepositoryException {
public Object evaluateTransform(@HeaderParam("Content-Type") final MediaType contentType,
@HeaderParam("Prefer") final Prefer prefer,
final InputStream requestBodyStream)
throws RepositoryException, IOException {

if (transformationFactory == null) {
transformationFactory = new TransformationFactory();
}

final FedoraResource object = getResourceFromPath(externalPath);

final Dataset propertiesDataset =
object.getPropertiesDataset(translator());
final RdfStream rdfStream = getResourceTriples(prefer).session(session)
.topic(translator().reverse().convert(resource().getNode()).asNode());

return transformationFactory.getTransform(contentType, requestBodyStream).apply(propertiesDataset);
return transformationFactory.getTransform(contentType, requestBodyStream).apply(rdfStream);

}

@Override
protected Session session() {
return session;
}

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

@Override
protected void addResourceHttpHeaders(final FedoraResource resource) {

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

import static com.hp.hpl.jena.query.DatasetFactory.create;
import static com.hp.hpl.jena.query.ResultSetFormatter.output;
import static com.hp.hpl.jena.query.ResultSetFormatter.toModel;
import static com.hp.hpl.jena.sparql.resultset.ResultsFormat.FMT_RDF_N3;
Expand Down Expand Up @@ -46,7 +45,6 @@
import static org.apache.jena.riot.WebContent.contentTypeTurtle;
import static org.apache.jena.riot.WebContent.contentTypeTurtleAlt1;
import static org.apache.jena.riot.WebContent.contentTypeTurtleAlt2;
import static org.fcrepo.kernel.impl.rdf.SerializationUtils.unifyDatasetModel;

import java.io.OutputStream;

Expand Down Expand Up @@ -88,7 +86,7 @@ public void write(final OutputStream entityStream) {

if (resultsFormat == FMT_UNKNOWN) {
final String format = contentTypeToLang(mediaType.toString()).getName().toUpperCase();
final Model model = unifyDatasetModel(create(toModel(results)));
final Model model = toModel(results);
model.write(entityStream, format);
} else {
output(entityStream, results, resultsFormat);
Expand Down
Expand Up @@ -17,13 +17,13 @@

import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;

import org.apache.marmotta.ldpath.LDPath;
import org.apache.marmotta.ldpath.backend.jena.GenericJenaBackend;
import org.apache.marmotta.ldpath.exception.LDPathParseException;
import org.fcrepo.kernel.utils.iterators.RdfStream;
import org.fcrepo.transform.Transformation;
import org.slf4j.Logger;

Expand All @@ -46,8 +46,6 @@
import static com.google.common.collect.Maps.transformValues;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createResource;
import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
import static org.fcrepo.kernel.impl.rdf.SerializationUtils.getDatasetSubject;
import static org.fcrepo.kernel.impl.rdf.SerializationUtils.unifyDatasetModel;
import static org.modeshape.jcr.api.JcrConstants.JCR_CONTENT;
import static org.modeshape.jcr.api.JcrConstants.JCR_DATA;
import static org.slf4j.LoggerFactory.getLogger;
Expand Down Expand Up @@ -137,13 +135,12 @@ public static LDPathTransform getNodeTypeTransform(final Node node,
}

@Override
public Map<String, Collection<Object>> apply(final Dataset dataset) {
public Map<String, Collection<Object>> apply(final RdfStream stream) {
try {
final LDPath<RDFNode> ldpathForResource =
getLdpathResource(dataset);
getLdpathResource(stream);

final Resource context =
createResource(getDatasetSubject(dataset).getURI());
final Resource context = createResource(stream.topic().getURI());

final Map<String, Collection<?>> wildcardCollection =
ldpathForResource.programQuery(context, new InputStreamReader(
Expand Down Expand Up @@ -173,12 +170,12 @@ public int hashCode() {

/**
* Get the LDPath resource for an object
* @param dataset
* @param rdfStream
* @return the LDPath resource for the given object
*/
private static LDPath<RDFNode> getLdpathResource(final Dataset dataset) {
private static LDPath<RDFNode> getLdpathResource(final RdfStream rdfStream) {

return new LDPath<>(new GenericJenaBackend(unifyDatasetModel(dataset)));
return new LDPath<>(new GenericJenaBackend(rdfStream.asModel()));

}

Expand Down
Expand Up @@ -15,22 +15,20 @@
*/
package org.fcrepo.transform.transformations;

import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.rdf.model.Model;

import org.apache.commons.io.IOUtils;
import org.fcrepo.kernel.utils.iterators.RdfStream;
import org.fcrepo.transform.Transformation;

import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;

import static org.fcrepo.kernel.impl.rdf.SerializationUtils.unifyDatasetModel;

/**
* SPARQL Query-based transforms
*
Expand All @@ -50,10 +48,10 @@ public SparqlQueryTransform(final InputStream query) {
}

@Override
public QueryExecution apply(final Dataset dataset) {
public QueryExecution apply(final RdfStream rdfStream) {

try {
final Model model = unifyDatasetModel(dataset);
final Model model = rdfStream.asModel();
final Query sparqlQuery =
QueryFactory.create(IOUtils.toString(query));

Expand Down

0 comments on commit b89a1ad

Please sign in to comment.