Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Improvements to templating
  • Loading branch information
ajs6f committed Jan 22, 2013
1 parent 0048ec8 commit 223e001
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 55 deletions.
Expand Up @@ -2,7 +2,6 @@

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
Expand All @@ -18,17 +17,13 @@
import org.codehaus.jackson.map.ObjectMapper;
import org.fcrepo.ffmodeshapeprototype.identifiers.PidMinter;
import org.fcrepo.ffmodeshapeprototype.identifiers.UUIDPidMinter;
import org.infinispan.schematic.document.ParsingException;
import org.modeshape.common.SystemFailureException;
import org.modeshape.common.collection.Problems;
import org.modeshape.common.logging.Logger;
import org.modeshape.jcr.ConfigurationException;
import org.modeshape.jcr.JcrRepository;
import org.modeshape.jcr.ModeShapeEngine;
import org.modeshape.jcr.RepositoryConfiguration;

import freemarker.ext.beans.BeansWrapper;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.ObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

Expand Down Expand Up @@ -74,7 +69,10 @@ public AbstractResource() throws ConfigurationException,

if (freemarker == null) {
freemarker = new Configuration();
freemarker.setObjectWrapper(new DefaultObjectWrapper());
logger.debug("Setting up Freemarker oject wrapper");
BeansWrapper objWrapper = new BeansWrapper();
objWrapper.setExposureLevel(BeansWrapper.EXPOSE_ALL);
freemarker.setObjectWrapper(objWrapper);
// Specify the data source where the template files come from.
freemarker.setClassForTemplateLoading(this.getClass(),
"/freemarker");
Expand All @@ -99,7 +97,7 @@ protected Response deleteResource(final String path)
}

protected InputStream renderTemplate(final String templatename,
final Map<String, Object> map) throws RepositoryException,
final Map<String, ?> map) throws RepositoryException,
IOException, TemplateException {

final Template template = freemarker.getTemplate(templatename);
Expand Down
Expand Up @@ -5,24 +5,28 @@
import java.util.Calendar;
import java.util.Map;

import javax.jcr.ItemExistsException;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.version.VersionException;
import javax.jcr.version.VersionManager;
import javax.ws.rs.*;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.modeshape.jcr.ConfigurationException;
import org.modeshape.jcr.api.JcrTools;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;

import freemarker.template.TemplateException;
Expand Down Expand Up @@ -51,8 +55,8 @@ public Response getDatastreams(@PathParam("pid") final String pid)
@SuppressWarnings("unchecked")
final Builder<Node> datastreams = new Builder<Node>().addAll(root
.getNode(pid).getNodes());
final Map<String, Object> map = ImmutableMap.of("datastreams",
(Object) datastreams.build());
final Map<String, ImmutableSet<Node>> map = ImmutableMap.of(
"datastreams", datastreams.build());
return Response.ok()
.entity(renderTemplate("listDatastreams.ftl", map)).build();
} else {
Expand Down Expand Up @@ -113,24 +117,12 @@ public Response modifyDatastream(@PathParam("pid") final String pid,
String dspath = "/" + pid + "/" + dsid;

if (session.hasPermission(dspath, "add_node")) {
if (!session.nodeExists(dspath)) {
return Response
.status(Response.Status.CREATED)
.entity(addDatastreamNode(dspath, contentType,
requestBodyStream, session).toString()).build();
} else {
if (session.hasPermission(dspath, "remove")) {
session.removeItem(dspath);
session.save();
return Response
.ok()
.entity(addDatastreamNode(dspath, contentType,
requestBodyStream, session).toString())
.build();

} else
return four01;
}
return Response
.status(Response.Status.CREATED)
.entity(addDatastreamNode(dspath, contentType,
requestBodyStream, session).toString()).build();

} else {
return four01;
}
Expand All @@ -140,16 +132,21 @@ private Node addDatastreamNode(final String dspath,
final MediaType contentType, final InputStream requestBodyStream,
final Session session) throws RepositoryException, IOException {

if (session.nodeExists(dspath))
session.removeItem(dspath);

Boolean created = false;
if (!session.nodeExists(dspath)) {
created = true;
}
final Node ds = jcrTools.uploadFile(session, dspath, requestBodyStream);
ds.addMixin("fedora:datastream");
ds.setProperty("fedora:contentType", contentType.toString());

ds.addMixin("fedora:owned");
ds.setProperty("fedora:ownerId", "Fedo Radmin");
if (created) {
ds.setProperty("fedora:created", Calendar.getInstance());
}
ds.setProperty("jcr:lastModified", Calendar.getInstance());

session.save();
return ds;
}
Expand All @@ -161,15 +158,20 @@ public Response getDatastream(@PathParam("pid") final String pid,
@PathParam("dsid") final String dsid) throws RepositoryException,
IOException, TemplateException {

final Node root = ws.getSession().getRootNode();
final Node obj = ws.getSession().getNode("/" + pid);

if (root.hasNode(pid + "/" + dsid)) {
if (obj.hasNode(dsid)) {
Node ds = obj.getNode(dsid);
PropertyIterator i = ds.getProperties();
ImmutableMap.Builder<String, String> b = new ImmutableMap.Builder<String, String>();
while (i.hasNext()) {
Property p = i.nextProperty();
b.put(p.getName(), p.toString());
}
return Response
.ok()
.entity(renderTemplate("datastreamProfile.ftl",
ImmutableMap.of("ds",
(Object) root.getNode(pid + "/" + dsid),
"obj", (Object) root.getNode(pid))))
ImmutableMap.of("ds", ds, "properties", b.build())))
.build();
} else {
return four04;
Expand Down Expand Up @@ -208,7 +210,7 @@ public Response getDatastreamHistory(@PathParam("pid") final String pid,
return Response
.ok()
.entity(renderTemplate("datastreamHistory.ftl",
ImmutableMap.of("ds", (Object) ds))).build();
ImmutableMap.of("ds", ds))).build();
} else {
return four04;
}
Expand Down
18 changes: 13 additions & 5 deletions src/main/java/org/fcrepo/ffmodeshapeprototype/FedoraObjects.java
Expand Up @@ -3,6 +3,8 @@
import java.io.IOException;

import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeType;
Expand Down Expand Up @@ -65,14 +67,20 @@ public Response ingest(@PathParam("pid") final String pid)
public Response getObjectInXML(@PathParam("pid") final String pid)
throws RepositoryException, IOException, TemplateException {

final Node root = ws.getSession().getRootNode();
final Session session = ws.getSession();

if (root.hasNode(pid)) {
if (session.nodeExists("/" + pid)) {
final Node obj = session.getNode("/" + pid);
PropertyIterator i = obj.getProperties();
ImmutableMap.Builder<String, String> b = new ImmutableMap.Builder<String, String>();
while (i.hasNext()) {
Property p = i.nextProperty();
b.put(p.getName(), p.toString());
}
return Response
.ok()
.entity(renderTemplate("objectProfile.ftl",
ImmutableMap.of("obj", (Object) root.getNode(pid))))
.build();
.entity(renderTemplate("objectProfile.ftl", ImmutableMap
.of("obj", obj, "properties", b.build()))).build();
} else {
return four04;
}
Expand Down
5 changes: 5 additions & 0 deletions src/main/resources/fedora-node-types.cnd
Expand Up @@ -21,6 +21,11 @@
* Any Fedora resource.
*/
[fedora:resource] > mix:created, mix:lastModified, mix:versionable mixin abstract

/*
* Temporary for us until we better understand the use of jcr:created.
*/
- fedora:created (STRING) COPY


/*
Expand Down
4 changes: 2 additions & 2 deletions src/main/resources/freemarker/datastreamProfile.ftl
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<datastreamProfile xmlns="http://www.fedora.info/definitions/1/0/management/"
pid="${obj.getName()}" dsID="${ds.getName()}">
pid="${ds.getParent().getName()}" dsID="${ds.getName()}">
<dsLabel>${ds.getName()}</dsLabel>
<dsVersionID></dsVersionID>
<dsCreateDate>${ds.getProperty("jcr:created").getString()}</dsCreateDate>
<dsCreateDate>${properties.get("fedora:created")}</dsCreateDate>
<dsState>A</dsState>
<dsMIME></dsMIME>
<dsFormatURI></dsFormatURI>
Expand Down
6 changes: 3 additions & 3 deletions src/main/resources/freemarker/objectProfile.ftl
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<objectProfile xmlns="http://www.fedora.info/definitions/1/0/access/">
<objLabel>${obj.getName()}</objLabel>
<objOwnerId>${obj.getProperty("fedora:ownerId").getString()}</objOwnerId>
<objOwnerId>${properties.get("fedora:ownerId")}</objOwnerId>
<objModels>
</objModels>
<objCreateDate>${obj.getProperty("jcr:created").getString()}</objCreateDate>
<objLastModDate>${obj.getProperty("jcr:lastModified").getString()}</objLastModDate>
<objCreateDate>${properties.get("jcr:created")}</objCreateDate>
<objLastModDate>${properties.get("jcr:lastModified")}</objLastModDate>
<objDissIndexViewURL>http://example.com</objDissIndexViewURL>
<objItemIndexViewURL>${obj.getPath()}</objItemIndexViewURL>
<objState>A</objState>
Expand Down
Expand Up @@ -73,7 +73,7 @@ public void testMutateDatastream() throws Exception {

PutMethod method_2 = new PutMethod("http://localhost:" + SERVER_PORT + "/objects/asdf/datastreams/vcxz");
status = client.executeMethod(method_2);
assertEquals(200, status);
assertEquals(201, status);
}

@Test
Expand Down

0 comments on commit 223e001

Please sign in to comment.