Skip to content

Commit

Permalink
Move RDF serialization logic into JcrRdfTools, retrieve child node
Browse files Browse the repository at this point in the history
information
  • Loading branch information
cbeer committed May 13, 2013
1 parent 75cda25 commit 376bb9f
Show file tree
Hide file tree
Showing 7 changed files with 274 additions and 172 deletions.
99 changes: 9 additions & 90 deletions fcrepo-kernel/src/main/java/org/fcrepo/FedoraResource.java
@@ -1,25 +1,18 @@
package org.fcrepo;

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
import com.hp.hpl.jena.update.GraphStore;
import com.hp.hpl.jena.update.GraphStoreFactory;
import com.hp.hpl.jena.update.UpdateAction;
import org.fcrepo.utils.FedoraJcrTypes;
import org.fcrepo.utils.JcrPropertyStatementListener;
import org.fcrepo.utils.NamespaceTools;
import org.fcrepo.utils.JcrRdfTools;
import org.modeshape.common.collection.Problems;
import org.modeshape.jcr.api.JcrConstants;
import org.modeshape.jcr.api.JcrTools;
import org.slf4j.Logger;

import javax.jcr.NamespaceRegistry;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeType;
Expand All @@ -30,8 +23,6 @@
import static org.fcrepo.services.ServiceHelpers.getObjectSize;
import static org.fcrepo.utils.FedoraTypesUtils.map;
import static org.fcrepo.utils.FedoraTypesUtils.nodetype2name;
import static org.fcrepo.utils.JcrRdfTools.addPropertyToModel;
import static org.fcrepo.utils.JcrRdfTools.getRDFNamespaceForJcrNamespace;
import static org.slf4j.LoggerFactory.getLogger;

public class FedoraResource extends JcrTools implements FedoraJcrTypes {
Expand Down Expand Up @@ -152,76 +143,6 @@ public Collection<String> getModels() throws RepositoryException {
return map(node.getMixinNodeTypes(), nodetype2name);
}


public Model getPropertiesModel() throws RepositoryException {

final Resource subject = getGraphSubject();

final Model model = ModelFactory.createDefaultModel();

final NamespaceRegistry namespaceRegistry = NamespaceTools.getNamespaceRegistry(getNode());
for (final String prefix : namespaceRegistry.getPrefixes()) {
final String nsURI = namespaceRegistry.getURI(prefix);
if (nsURI != null && !nsURI.equals("") &&
!prefix.equals("xmlns")) {

if (prefix.equals("jcr")) {
model.setNsPrefix("fedora-internal", getRDFNamespaceForJcrNamespace(nsURI));
} else {
model.setNsPrefix(prefix, getRDFNamespaceForJcrNamespace(nsURI));
}
}
}

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);
}

addJcrTreePropertiesToModel(subject, model);

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

model.register(listener);

return model;
}

private void addJcrTreePropertiesToModel(final Resource subject, final Model model) throws RepositoryException {
model.add(subject, model.createProperty("info:fedora/fedora-system:def/internal#hasParent"), getGraphSubject(node.getParent()));

final NodeIterator nodeIterator = node.getNodes();

long numberOfChildren = 0L;

while (nodeIterator.hasNext()) {
final Node childNode = nodeIterator.nextNode();

if (childNode.getName().equals(JcrConstants.JCR_CONTENT)) {
continue;
}

model.add(subject, model.createProperty("info:fedora/fedora-system:def/internal#hasChild"), getGraphSubject(childNode));
numberOfChildren += 1;
}

model.add(subject, model.createProperty("info:fedora/fedora-system:def/internal#numberOfChildren"), ResourceFactory.createTypedLiteral(numberOfChildren));
}

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

addPropertyToModel(subject, model, property);
}
}

public Problems getGraphProblems() throws RepositoryException {
if (listener != null) {
return listener.getProblems();
Expand All @@ -230,15 +151,6 @@ public Problems getGraphProblems() 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 All @@ -247,7 +159,14 @@ public GraphStore updateGraph(String sparqlUpdateStatement) throws RepositoryExc
}

public GraphStore getGraphStore() throws RepositoryException {
GraphStore graphStore = GraphStoreFactory.create(getPropertiesModel());

final Model model = JcrRdfTools.getJcrPropertiesModel(node);

listener = new JcrPropertyStatementListener(node);

model.register(listener);

GraphStore graphStore = GraphStoreFactory.create(model);

return graphStore;
}
Expand Down
Expand Up @@ -11,7 +11,10 @@
import javax.jcr.RepositoryException;
import javax.jcr.Value;

import static org.fcrepo.utils.JcrRdfTools.getGraphSubject;
import static org.fcrepo.utils.JcrRdfTools.getNodeFromGraphSubject;
import static org.fcrepo.utils.JcrRdfTools.getPropertyNameFromPredicate;
import static org.fcrepo.utils.JcrRdfTools.isFedoraGraphSubject;
import static org.fcrepo.utils.NodePropertiesTools.appendOrReplaceNodeProperty;
import static org.fcrepo.utils.NodePropertiesTools.getPropertyType;
import static org.fcrepo.utils.NodePropertiesTools.removeNodeProperty;
Expand All @@ -24,11 +27,9 @@ public class JcrPropertyStatementListener extends StatementListener {
private static final Logger logger = getLogger(JcrPropertyStatementListener.class);

private final Node node;
private final Resource subject;

public JcrPropertyStatementListener(final Resource subject, final Node node) {
public JcrPropertyStatementListener(final Node node) throws RepositoryException {
this.node = node;
this.subject = subject;
this.problems = new SimpleProblems();
}

Expand All @@ -41,17 +42,21 @@ public void addedStatement( Statement s ) {
logger.trace(">> added statement " + s);

try {
// if it's not about our node, ignore it.
if(!s.getSubject().equals(subject)) {
final Resource subject = s.getSubject();

// if it's not about a node, ignore it.
if(!isFedoraGraphSubject.apply(subject)) {
return;
}

final Node subjectNode = getNodeFromGraphSubject(node.getSession(), subject);

// extract the JCR propertyName from the predicate
final String propertyName = getPropertyNameFromPredicate(node, s.getPredicate());
final String propertyName = getPropertyNameFromPredicate(subjectNode, s.getPredicate());

if(validateModificationsForPropertyName(propertyName)) {
final Value v = JcrRdfTools.createValue(node, s.getObject(), getPropertyType(node, propertyName));
appendOrReplaceNodeProperty(node, propertyName, v);
final Value v = JcrRdfTools.createValue(subjectNode, s.getObject(), getPropertyType(subjectNode, propertyName));
appendOrReplaceNodeProperty(subjectNode, propertyName, v);
}
} catch (RepositoryException e) {
throw new RuntimeException(e);
Expand All @@ -68,17 +73,21 @@ public void removedStatement( Statement s ) {
logger.trace(">> removed statement " + s);

try {
// if it's not about our node, we don't care.
if(!s.getSubject().equals(subject)) {
return;
}
final Resource subject = s.getSubject();

// if it's not about a node, we don't care.
if(!isFedoraGraphSubject.apply(subject)) {
return;
}

final Node subjectNode = getNodeFromGraphSubject(node.getSession(), subject);

final String propertyName = getPropertyNameFromPredicate(node, s.getPredicate());
final String propertyName = getPropertyNameFromPredicate(subjectNode, s.getPredicate());

// if the property doesn't exist, we don't need to worry about it.
if (node.hasProperty(propertyName) && validateModificationsForPropertyName(propertyName)) {
final Value v = JcrRdfTools.createValue(node, s.getObject(), getPropertyType(node, propertyName));
removeNodeProperty(node, propertyName, v);
if (subjectNode.hasProperty(propertyName) && validateModificationsForPropertyName(propertyName)) {
final Value v = JcrRdfTools.createValue(subjectNode, s.getObject(), getPropertyType(subjectNode, propertyName));
removeNodeProperty(subjectNode, propertyName, v);
}

} catch (RepositoryException e) {
Expand Down

0 comments on commit 376bb9f

Please sign in to comment.