Skip to content

Commit

Permalink
Added in logic to select templates based on primaryType, broke a bunc…
Browse files Browse the repository at this point in the history
…h of tests, oh, well, it's Friday
  • Loading branch information
ajs6f committed May 17, 2013
1 parent 387c6a9 commit 0508b35
Show file tree
Hide file tree
Showing 9 changed files with 158 additions and 34 deletions.
Expand Up @@ -3,18 +3,26 @@

import static javax.ws.rs.core.Response.status;
import static javax.ws.rs.core.Response.Status.FORBIDDEN;
import static org.slf4j.LoggerFactory.getLogger;

import javax.jcr.security.AccessControlException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

import org.slf4j.Logger;

@Provider
public class AccessControlExceptionMapper implements
ExceptionMapper<AccessControlException> {

private static final Logger logger =
getLogger(AccessControlExceptionMapper.class);

@Override
public Response toResponse(final AccessControlException arg0) {
public Response toResponse(final AccessControlException e) {
logger.error("AccessControlExceptionMapper intercepted exception: \n",
e);
return status(FORBIDDEN).build();
}

Expand Down
Expand Up @@ -3,18 +3,25 @@

import static javax.ws.rs.core.Response.status;
import static javax.ws.rs.core.Response.Status.NOT_FOUND;
import static org.slf4j.LoggerFactory.getLogger;

import javax.jcr.PathNotFoundException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

import org.slf4j.Logger;

@Provider
public class PathNotFoundExceptionMapper implements
ExceptionMapper<PathNotFoundException> {

private static final Logger logger =
getLogger(PathNotFoundExceptionMapper.class);

@Override
public Response toResponse(final PathNotFoundException arg0) {
public Response toResponse(final PathNotFoundException e) {
logger.error("PathNotFoundExceptionMapper intercepted exception: \n", e);
return status(NOT_FOUND).build();
}

Expand Down
Expand Up @@ -3,19 +3,24 @@

import static com.google.common.base.Throwables.getStackTraceAsString;
import static javax.ws.rs.core.Response.serverError;
import static org.slf4j.LoggerFactory.getLogger;

import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

import org.slf4j.Logger;

@Provider
public class WildcardExceptionMapper implements ExceptionMapper<Exception> {

Boolean showStackTrace = true;

private static final Logger logger = getLogger(WildcardExceptionMapper.class);

@Override
public Response toResponse(final Exception e) {

logger.error("Exception intercepted by WildcardExceptionMapper: \n",e);
return serverError().entity(
showStackTrace ? getStackTraceAsString(e) : null).build();
}
Expand Down
Expand Up @@ -2,8 +2,12 @@
package org.fcrepo.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 com.hp.hpl.jena.graph.Node.createURI;
import static javax.ws.rs.core.MediaType.TEXT_HTML;
import static javax.ws.rs.core.MediaType.TEXT_HTML_TYPE;
import static org.fcrepo.utils.JcrRdfTools.getRDFNamespaceForJcrNamespace;
import static org.slf4j.LoggerFactory.getLogger;

import java.io.IOException;
Expand All @@ -13,9 +17,14 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

import javax.annotation.PostConstruct;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeTypeIterator;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
Expand All @@ -26,23 +35,40 @@
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.context.Context;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.fcrepo.session.SessionFactory;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.google.common.collect.ImmutableMap;
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.sparql.core.Quad;

@Provider
@Component
public class HtmlProvider implements MessageBodyWriter<Dataset> {

@Autowired
SessionFactory sessionFactory;

static Node primaryTypePredicate =
createURI(getRDFNamespaceForJcrNamespace("http://www.jcp.org/jcr/1.0") +
"primaryType");

VelocityEngine velocity = new VelocityEngine();

Template template;
static final String templatesLocation = "/views";

Map<String, Template> templatesMap;

static final String templateFilenameExtension = ".vsl";

private static final Logger logger = getLogger(HtmlProvider.class);

@PostConstruct
void init() throws IOException {
void init() throws IOException, RepositoryException {
final Properties properties = new Properties();
final URL propertiesUrl =
getClass().getResource("/velocity.properties");
Expand All @@ -51,7 +77,43 @@ void init() throws IOException {
properties.load(propertiesStream);
}
velocity.init(properties);
template = velocity.getTemplate("template.xhtml");

final Session session = sessionFactory.getSession();
ImmutableMap.Builder<String, Template> templatesMapBuilder = builder();
try {
for (final NodeTypeIterator primaryNodeTypes =
session.getWorkspace().getNodeTypeManager()
.getPrimaryNodeTypes(); primaryNodeTypes.hasNext();) {
final String primaryNodeTypeName =
primaryNodeTypes.nextNodeType().getName();
try {
final String templateLocation =
templatesLocation + "/" + primaryNodeTypeName +
templateFilenameExtension;
final Template template =
velocity.getTemplate(templateLocation);
template.setName(primaryNodeTypeName);
logger.debug("Found template: {}", templateLocation);
templatesMapBuilder.put(primaryNodeTypeName, template);
logger.debug(
"which we will use for nodes with primary type: {}",
primaryNodeTypeName);
} catch (ResourceNotFoundException e) {
logger.debug(
"Didn't find template for nodes with primary type: {}",
primaryNodeTypeName);
/*
* we don't care-- just means we don't have an HTML
* representation
* available for that kind of node
*/
}
templatesMap = templatesMapBuilder.build();
}

} finally {
session.logout();
}
}

@Override
Expand All @@ -61,16 +123,27 @@ public void writeTo(final Dataset rdf, final Class<?> type,
final MultivaluedMap<String, Object> httpHeaders,
final OutputStream entityStream) throws IOException,
WebApplicationException {

logger.debug("Writing an HTML response for: {}", rdf);
// add a Content-type header
httpHeaders.put("Content-type", of((Object) TEXT_HTML));

final Context context = new VelocityContext();
context.put("rdf", rdf);
// the contract of MessageBodyWriter is not to close the stream
// after writing to it
template.merge(context, new OutputStreamWriter(entityStream));

for (final Iterator<Quad> typeStatements =
rdf.asDatasetGraph().find(ANY, ANY, primaryTypePredicate, ANY); typeStatements
.hasNext();) {
final Quad statement = typeStatements.next();
final String nodeType =
(String) statement.asTriple().getObject().getLiteral()
.getValue();
final Template nodeTypeTemplate = templatesMap.get(nodeType);
// the contract of MessageBodyWriter is not to close the stream
// after writing to it
nodeTypeTemplate.merge(context,
new OutputStreamWriter(entityStream));
}
}

@Override
Expand Down
11 changes: 0 additions & 11 deletions fcrepo-http-commons/src/main/resources/template.xhtml

This file was deleted.

15 changes: 15 additions & 0 deletions fcrepo-http-commons/src/main/resources/views/nt:file.vsl
@@ -0,0 +1,15 @@
<html>
#set($quads = $rdf.asDatasetGraph().find())
<head>
<title>nt:folder profile</title>
</head>

<body>
#foreach($quad in $quads)
<div>
<span>$quad.asTriple()</span>
</div>
#end
</body>

</htmL>
15 changes: 15 additions & 0 deletions fcrepo-http-commons/src/main/resources/views/nt:folder.vsl
@@ -0,0 +1,15 @@
<html>
#set($quads = $rdf.asDatasetGraph().find())
<head>
<title>nt:folder profile</title>
</head>

<body>
#foreach($quad in $quads)
<div>
<span>$quad.asTriple()</span>
</div>
#end
</body>

</htmL>
7 changes: 4 additions & 3 deletions fcrepo-kernel/src/main/java/org/fcrepo/FedoraResource.java
Expand Up @@ -5,6 +5,8 @@
import static org.fcrepo.utils.FedoraTypesUtils.getVersionHistory;
import static org.fcrepo.utils.FedoraTypesUtils.map;
import static org.fcrepo.utils.FedoraTypesUtils.nodetype2name;
import static org.fcrepo.utils.JcrRdfTools.getJcrPropertiesModel;
import static org.fcrepo.utils.JcrRdfTools.getJcrVersionsModel;
import static org.slf4j.LoggerFactory.getLogger;

import java.util.Calendar;
Expand All @@ -19,7 +21,6 @@

import org.fcrepo.utils.FedoraJcrTypes;
import org.fcrepo.utils.JcrPropertyStatementListener;
import org.fcrepo.utils.JcrRdfTools;
import org.modeshape.common.collection.Problems;
import org.modeshape.jcr.api.JcrConstants;
import org.modeshape.jcr.api.JcrTools;
Expand Down Expand Up @@ -165,7 +166,7 @@ public GraphStore updateGraph(String sparqlUpdateStatement) throws RepositoryExc

public GraphStore getGraphStore() throws RepositoryException {

final Model model = JcrRdfTools.getJcrPropertiesModel(node);
final Model model = getJcrPropertiesModel(node);

listener = new JcrPropertyStatementListener(node.getSession());

Expand All @@ -177,7 +178,7 @@ public GraphStore getGraphStore() throws RepositoryException {
}

public GraphStore getVersionGraphStore() throws RepositoryException {
final Model model = JcrRdfTools.getJcrVersionsModel(node);
final Model model = getJcrVersionsModel(node);

GraphStore graphStore = GraphStoreFactory.create(model);

Expand Down
33 changes: 22 additions & 11 deletions fcrepo-kernel/src/main/java/org/fcrepo/utils/JcrRdfTools.java
@@ -1,7 +1,18 @@
package org.fcrepo.utils;

import static com.google.common.base.Preconditions.checkArgument;
import static javax.jcr.PropertyType.BINARY;
import static javax.jcr.PropertyType.BOOLEAN;
import static javax.jcr.PropertyType.DATE;
import static javax.jcr.PropertyType.DECIMAL;
import static javax.jcr.PropertyType.DOUBLE;
import static javax.jcr.PropertyType.LONG;
import static javax.jcr.PropertyType.PATH;
import static javax.jcr.PropertyType.REFERENCE;
import static javax.jcr.PropertyType.URI;
import static javax.jcr.PropertyType.WEAKREFERENCE;
import static org.fcrepo.utils.FedoraJcrTypes.FCR_CONTENT;
import static org.fcrepo.utils.FedoraTypesUtils.getPredicateForProperty;
import static org.slf4j.LoggerFactory.getLogger;

import java.util.Set;
Expand Down Expand Up @@ -330,42 +341,42 @@ public static void addPropertyToModel(final Resource subject, final Model model,
*/
public static void addPropertyToModel(final Resource subject, final Model model, final Property property, Value v) throws RepositoryException {

if (v.getType() == PropertyType.BINARY) {
if (v.getType() == BINARY) {
// exclude binary types from property serialization
return;
}

final com.hp.hpl.jena.rdf.model.Property predicate = FedoraTypesUtils.getPredicateForProperty.apply(property);
final com.hp.hpl.jena.rdf.model.Property predicate = getPredicateForProperty.apply(property);

final String stringValue = v.getString();

RDFDatatype datatype = null;

switch (v.getType()) {

case PropertyType.BOOLEAN:
case BOOLEAN:
datatype = model.createTypedLiteral(v.getBoolean()).getDatatype();
break;
case PropertyType.DATE:
case DATE:
datatype = model.createTypedLiteral(v.getDate()).getDatatype();
break;
case PropertyType.DECIMAL:
case DECIMAL:
datatype = model.createTypedLiteral(v.getDecimal()).getDatatype();
break;
case PropertyType.DOUBLE:
case DOUBLE:
datatype = model.createTypedLiteral(v.getDouble()).getDatatype();
break;
case PropertyType.LONG:
case LONG:
datatype = model.createTypedLiteral(v.getLong()).getDatatype();
break;
case PropertyType.URI:
case URI:
model.add(subject, predicate, model.createResource(stringValue));
return;
case PropertyType.REFERENCE:
case PropertyType.WEAKREFERENCE:
case REFERENCE:
case WEAKREFERENCE:
model.add(subject, predicate, model.createResource("info:fedora" + property.getSession().getNodeByIdentifier(stringValue).getPath()));
return;
case PropertyType.PATH:
case PATH:
model.add(subject, predicate, model.createResource("info:fedora" + stringValue));
return;

Expand Down

0 comments on commit 0508b35

Please sign in to comment.