Skip to content

Commit

Permalink
serialize jcr properties using the correct rdf types.
Browse files Browse the repository at this point in the history
  • Loading branch information
cbeer committed May 10, 2013
1 parent cca4518 commit 623a1f7
Show file tree
Hide file tree
Showing 3 changed files with 222 additions and 74 deletions.
72 changes: 65 additions & 7 deletions fcrepo-kernel/src/main/java/org/fcrepo/FedoraResource.java
@@ -1,5 +1,6 @@
package org.fcrepo;

import com.hp.hpl.jena.datatypes.RDFDatatype;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
Expand All @@ -19,6 +20,7 @@
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
Expand Down Expand Up @@ -47,7 +49,7 @@ public FedoraResource() {

/**
* Construct a FedoraObject from an existing JCR Node
* @param n an existing JCR node to treat as an fcrepo object
* @param node an existing JCR node to treat as an fcrepo object
*/
public FedoraResource(final Node node) {
super(false);
Expand Down Expand Up @@ -177,6 +179,23 @@ public Model getPropertiesModel() throws RepositoryException {

final PropertyIterator properties = node.getProperties();

addJcrPropertiesToModel(subject, model, properties);

if (node.hasNode(JcrConstants.JCR_CONTENT)) {
final Resource contentSubject = ResourceFactory.createResource("info:fedora" + node.getPath() + "/fcr:content");
model.add(subject, model.createProperty("info:fedora/fedora-system:def/internal#hasContent"), contentSubject);
final PropertyIterator contentProperties = node.getNode(JcrConstants.JCR_CONTENT).getProperties();
addJcrPropertiesToModel(contentSubject, model, contentProperties);
}

listener = new JcrPropertyStatementListener(subject, getNode());

model.register(listener);

return model;
}

private void addJcrPropertiesToModel(Resource subject, Model model, PropertyIterator properties) throws RepositoryException {
while (properties.hasNext()) {
final Property property = properties.nextProperty();

Expand All @@ -185,21 +204,55 @@ public Model getPropertiesModel() throws RepositoryException {
final Value[] values = property.getValues();

for(Value v : values) {
model.add(subject, ResourceFactory.createProperty(getRDFNamespaceForJcrNamespace(nsProperty.getNamespaceURI()), nsProperty.getLocalName()), v.getString());
addValueToModel(subject, model, nsProperty, v);
}

} else {
final Value value = property.getValue();
model.add(subject, ResourceFactory.createProperty(getRDFNamespaceForJcrNamespace(nsProperty.getNamespaceURI()), nsProperty.getLocalName()), value.getString());
addValueToModel(subject, model, nsProperty, value);
}

}
}

listener = new JcrPropertyStatementListener(subject, getNode());
private Model addValueToModel(final Resource subject, final Model model, final Namespaced nsProperty, Value v) throws RepositoryException {
RDFDatatype datatype = null;
final com.hp.hpl.jena.rdf.model.Property predicate = ResourceFactory.createProperty(getRDFNamespaceForJcrNamespace(nsProperty.getNamespaceURI()), nsProperty.getLocalName());

final String stringValue = v.getString();

switch (v.getType()) {

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

model.register(listener);
}

return model;
if ( datatype == null) {
return model.add(subject, predicate, stringValue);
} else {
return model.add(subject, predicate, stringValue, datatype);
}
}

public Problems getGraphProblems() throws RepositoryException {
Expand All @@ -210,10 +263,15 @@ public Problems getGraphProblems() throws RepositoryException {
}
}

public Resource getGraphSubject() throws RepositoryException {

public static Resource getGraphSubject(final Node node) throws RepositoryException {
return ResourceFactory.createResource("info:fedora" + node.getPath());
}

public Resource getGraphSubject() throws RepositoryException {
return getGraphSubject(node);
}

public GraphStore updateGraph(String sparqlUpdateStatement) throws RepositoryException {
final GraphStore store = getGraphStore();
UpdateAction.parseExecute(sparqlUpdateStatement, store);
Expand Down
@@ -0,0 +1,157 @@
package org.fcrepo.integration;

import com.hp.hpl.jena.datatypes.RDFDatatype;
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.graph.Node_Literal;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
import com.hp.hpl.jena.shared.PrefixMapping;
import com.hp.hpl.jena.sparql.util.NodeFactory;
import org.fcrepo.Datastream;
import org.fcrepo.FedoraResource;
import org.fcrepo.exception.InvalidChecksumException;
import org.fcrepo.services.DatastreamService;
import org.fcrepo.services.NodeService;
import org.fcrepo.services.ObjectService;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;

import javax.inject.Inject;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

@ContextConfiguration({"/spring-test/repo.xml"})
public class FedoraResourceIT extends AbstractIT {

protected Logger logger;

@Inject
Repository repo;

@Inject
NodeService nodeService;

@Inject
ObjectService objectService;


@Inject
DatastreamService datastreamService;

@Before
public void setLogger() {
logger = LoggerFactory.getLogger(this.getClass());
}

@Test
public void testRandomNodeGraph() throws IOException, RepositoryException {
Session session = repo.login();

final FedoraResource object = nodeService.findOrCreateObject(session, "/testNodeGraph");

assertEquals("info:fedora/testNodeGraph", object.getGraphSubject().toString());

logger.warn(object.getGraphStore().toString());
Node s = Node.createURI("info:fedora/testNodeGraph");
Node p = Node.createURI("info:fedora/fedora-system:def/internal#primaryType");
Node o = Node.createLiteral("nt:unstructured");
assertTrue(object.getGraphStore().getDefaultGraph().contains(s, p, o));
session.logout();
}

@Test
public void testObjectGraph() throws IOException, RepositoryException {
Session session = repo.login();

final FedoraResource object = objectService.createObject(session, "/testObjectGraph");

assertEquals("info:fedora/testObjectGraph", object.getGraphSubject().toString());

logger.warn(object.getGraphStore().toString());

// jcr property
Node s = Node.createURI("info:fedora/testObjectGraph");
Node p = Node.createURI("info:fedora/fedora-system:def/internal#uuid");
Node o = Node.createLiteral(object.getNode().getIdentifier());
assertTrue(object.getGraphStore().getDefaultGraph().contains(s, p, o));


// multivalued property
p = Node.createURI("info:fedora/fedora-system:def/internal#mixinTypes");
o = Node.createLiteral("fedora:resource");
assertTrue(object.getGraphStore().getDefaultGraph().contains(s, p, o));

o = Node.createLiteral("fedora:object");
assertTrue(object.getGraphStore().getDefaultGraph().contains(s, p, o));

session.logout();
}


@Test
public void testDatastreamGraph() throws IOException, RepositoryException, InvalidChecksumException {
Session session = repo.login();

objectService.createObject(session, "/testDatastreamGraphParent");

datastreamService.createDatastreamNode(session, "/testDatastreamGraph", "text/plain", new ByteArrayInputStream("123456789test123456789".getBytes()));


final FedoraResource object = nodeService.getObject(session, "/testDatastreamGraph");

object.getNode().setProperty("fedorarelsext:isPartOf", session.getNode("/testDatastreamGraphParent"));

assertEquals("info:fedora/testDatastreamGraph", object.getGraphSubject().toString());

logger.warn(object.getGraphStore().toString());

// jcr property
Node s = Node.createURI("info:fedora/testDatastreamGraph");
Node p = Node.createURI("info:fedora/fedora-system:def/internal#uuid");
Node o = Node.createLiteral(object.getNode().getIdentifier());
assertTrue(object.getGraphStore().getDefaultGraph().contains(s, p, o));


// multivalued property
p = Node.createURI("info:fedora/fedora-system:def/internal#mixinTypes");
o = Node.createLiteral("fedora:resource");
assertTrue(object.getGraphStore().getDefaultGraph().contains(s, p, o));

o = Node.createLiteral("fedora:datastream");
assertTrue(object.getGraphStore().getDefaultGraph().contains(s, p, o));


// relations
p = Node.createURI("info:fedora/fedora-system:def/relations-external#isPartOf");
o = Node.createURI("info:fedora/testDatastreamGraphParent");
assertTrue(object.getGraphStore().getDefaultGraph().contains(s, p, o));

p = Node.createURI("info:fedora/fedora-system:def/internal#hasContent");
o = Node.createURI("info:fedora/testDatastreamGraph/fcr:content");
assertTrue(object.getGraphStore().getDefaultGraph().contains(s, p, o));

// content properties
s = Node.createURI("info:fedora/testDatastreamGraph/fcr:content");
p = Node.createURI("info:fedora/fedora-system:def/internal#mimeType");
o = Node.createLiteral("text/plain");
assertTrue(object.getGraphStore().getDefaultGraph().contains(s, p, o));

p = Node.createURI("info:fedora/size");
o = Node.createLiteral("22", ModelFactory.createDefaultModel().createTypedLiteral(22L).getDatatype());
assertTrue(object.getGraphStore().getDefaultGraph().contains(s, p, o));



session.logout();
}
}

This file was deleted.

0 comments on commit 623a1f7

Please sign in to comment.