Skip to content

Commit

Permalink
RDF based in JCR hierarchy now being constructed in iterator mode
Browse files Browse the repository at this point in the history
  • Loading branch information
ajs6f committed Oct 16, 2013
1 parent 55fcf4d commit be6ebee
Show file tree
Hide file tree
Showing 9 changed files with 213 additions and 215 deletions.
Expand Up @@ -16,13 +16,28 @@

package org.fcrepo.kernel.rdf.impl;

import static com.google.common.base.Predicates.not;
import static com.google.common.base.Throwables.propagate;
import static com.google.common.collect.Iterators.filter;
import static com.google.common.collect.Iterators.transform;
import static com.hp.hpl.jena.graph.NodeFactory.createLiteral;
import static com.hp.hpl.jena.graph.Triple.create;
import static com.hp.hpl.jena.vocabulary.RDF.type;
import static java.lang.Boolean.TRUE;
import static org.fcrepo.kernel.RdfLexicon.CONTAINER;
import static org.fcrepo.kernel.RdfLexicon.HAS_CHILD;
import static org.fcrepo.kernel.RdfLexicon.HAS_PARENT;
import static org.fcrepo.kernel.RdfLexicon.INLINED_RESOURCE;
import static org.fcrepo.kernel.RdfLexicon.MEMBERSHIP_OBJECT;
import static org.fcrepo.kernel.RdfLexicon.MEMBERSHIP_PREDICATE;
import static org.fcrepo.kernel.RdfLexicon.MEMBERSHIP_SUBJECT;
import static org.fcrepo.kernel.RdfLexicon.MEMBERS_INLINED;
import static org.fcrepo.kernel.RdfLexicon.MEMBER_SUBJECT;
import static org.fcrepo.kernel.RdfLexicon.PAGE;
import static org.fcrepo.kernel.RdfLexicon.PAGE_OF;
import static org.fcrepo.kernel.utils.FedoraTypesUtils.isInternalNode;
import static org.modeshape.jcr.api.JcrConstants.JCR_CONTENT;
import static org.slf4j.LoggerFactory.getLogger;

import java.util.Iterator;

Expand All @@ -31,7 +46,11 @@
import org.fcrepo.kernel.rdf.GraphSubjects;
import org.fcrepo.kernel.rdf.NodeRdfContext;
import org.fcrepo.kernel.services.LowLevelStorageService;
import org.fcrepo.kernel.utils.JcrRdfTools;
import org.fcrepo.kernel.utils.iterators.NodeIterator;
import org.slf4j.Logger;

import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterators;
import com.hp.hpl.jena.graph.Node;
Expand All @@ -46,6 +65,9 @@
*/
public class HierarchyRdfContext extends NodeRdfContext {

private static final Logger LOGGER = getLogger(HierarchyRdfContext.class);


/**
* Default constructor.
*
Expand All @@ -58,20 +80,39 @@ public HierarchyRdfContext(final javax.jcr.Node node,
super(node, graphSubjects, lowLevelStorageService);
if (node.getDepth() > 0) {
concat(parentContext());
}
final Node pageContext = graphSubjects.getContext().asNode();
concat(new Triple[] {
create(pageContext, type.asNode(), PAGE.asNode()),
create(pageContext, PAGE_OF.asNode(), subject())});

if (JcrRdfTools.isContainer(node)) {
concat(containerContext(pageContext));

}
if (node.hasNodes()) {
concat(childrenContext());
concat(childrenContext(pageContext));
}
}

private Triple[] containerContext(final Node pageContext) {
return new Triple[] {
create(pageContext, MEMBERS_INLINED.asNode(),
createLiteral(TRUE.toString())),
create(subject(), type.asNode(), CONTAINER.asNode()),
create(subject(), MEMBERSHIP_SUBJECT.asNode(), subject()),
create(subject(), MEMBERSHIP_PREDICATE.asNode(), HAS_CHILD
.asNode()),
create(subject(), MEMBERSHIP_OBJECT.asNode(), MEMBER_SUBJECT
.asNode())};
}

private Iterator<Triple> parentContext() throws RepositoryException {
final javax.jcr.Node parentNode = node().getParent();
final Node parentNodeSubject =
graphSubjects().getGraphSubject(parentNode).asNode();
return new PropertiesRdfContext(parentNode, graphSubjects(), lowLevelStorageService())
.concat(Iterators
.forArray(new Triple[] {
.concat(new Triple[] {
create(subject(), HAS_PARENT.asNode(),
parentNodeSubject),
create(parentNodeSubject, HAS_CHILD.asNode(),
Expand All @@ -80,16 +121,43 @@ private Iterator<Triple> parentContext() throws RepositoryException {
INLINED_RESOURCE.asNode(),
parentNodeSubject)

}));
});

}

private Iterator<Triple> childrenContext() throws RepositoryException {
Iterators.filter(new NodeIterator(node().getNodes()), nastyChildren);

return null;
private Iterator<Triple> childrenContext(final Node pageContext) throws RepositoryException {
final Iterator<javax.jcr.Node> niceChildren =
filter(new NodeIterator(node().getNodes()), not(nastyChildren));
final Iterator<Triple> results = Iterators.concat(transform(niceChildren,
child2triples(pageContext)));
return results;
}

private Function<javax.jcr.Node, Iterator<Triple>> child2triples(
final Node pageContext) {
return new Function<javax.jcr.Node, Iterator<Triple>>() {

@Override
public Iterator<Triple> apply(final javax.jcr.Node child) {
try {
final Node childSubject =
graphSubjects().getGraphSubject(child).asNode();
LOGGER.debug("Creating triples for child node: {}", child);
return new PropertiesRdfContext(child, graphSubjects(),
lowLevelStorageService()).concat(new Triple[] {
create(pageContext, INLINED_RESOURCE.asNode(),
childSubject),
create(childSubject, HAS_PARENT.asNode(),
subject()),
create(subject(), HAS_CHILD.asNode(),
childSubject)});
} catch (final RepositoryException e) {
throw propagate(e);
}
}
};
};

/**
* Children for whom we will not generate triples.
*/
Expand All @@ -98,6 +166,7 @@ private Iterator<Triple> childrenContext() throws RepositoryException {

@Override
public boolean apply(final javax.jcr.Node n) {
LOGGER.debug("Testing child node {}", n);
try {
return (isInternalNode.apply(n) || n.getName().equals(
JCR_CONTENT));
Expand Down
Expand Up @@ -146,9 +146,7 @@ private Node propertyvalue2node(final Property p, final Value v) {
case REFERENCE:
case WEAKREFERENCE:
case PATH:
final javax.jcr.Node refNode = p.getNode();
return getGraphSubject(refNode);

return traverseLink(p,v);
default:
return literal2node(v.getString());
}
Expand All @@ -157,6 +155,23 @@ private Node propertyvalue2node(final Property p, final Value v) {
}
}

private Node traverseLink(final Property p, final Value v)
throws RepositoryException {
final javax.jcr.Node refNode;
if (p.isMultiple()) {
if (v.getType() == PATH) {
refNode = p.getParent().getNode(v.getString());
} else {
refNode = p.getSession().getNodeByIdentifier(v.getString());
}
} else {
// directly traverses the link
refNode = p.getNode();

}
return getGraphSubject(refNode);
}

private static Node literal2node(final Object literal) {
return createTypedLiteral(literal).asNode();
}
Expand Down
Expand Up @@ -226,7 +226,7 @@ public boolean apply(final Property p) {
@Override
public boolean apply(final Node n) {
checkArgument(n != null,
"null is neither multiple or not multiple!");
"null is neither internal nor not internal!");
try {
final NodeType primaryNodeType = n.getPrimaryNodeType();
return primaryNodeType != null
Expand Down

0 comments on commit be6ebee

Please sign in to comment.