Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Create minted hierarchy for blank nodes
  • Loading branch information
osmandin authored and Andrew Woods committed Jan 30, 2015
1 parent 024fef3 commit b643547
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 6 deletions.
6 changes: 5 additions & 1 deletion fcrepo-kernel-impl/pom.xml
Expand Up @@ -72,11 +72,15 @@
<artifactId>logback-classic</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</dependency>
<dependency>
<groupId>org.fcrepo</groupId>
<artifactId>fcrepo-mint</artifactId>
<version>${project.version}</version>
</dependency>

<!-- test gear -->
<dependency>
Expand Down
Expand Up @@ -16,7 +16,6 @@
package org.fcrepo.kernel.impl.rdf;

import static com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel;
import static java.util.UUID.randomUUID;
import static javax.jcr.PropertyType.REFERENCE;
import static javax.jcr.PropertyType.STRING;
import static javax.jcr.PropertyType.UNDEFINED;
Expand Down Expand Up @@ -51,6 +50,8 @@
import com.hp.hpl.jena.rdf.model.AnonId;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Statement;
import org.fcrepo.kernel.identifiers.PidMinter;
import org.fcrepo.kernel.impl.services.AbstractService;
import org.fcrepo.kernel.models.FedoraResource;
import org.fcrepo.kernel.RdfLexicon;
import org.fcrepo.kernel.exception.MalformedRdfException;
Expand All @@ -59,6 +60,7 @@
import org.fcrepo.kernel.identifiers.IdentifierConverter;
import org.fcrepo.kernel.impl.rdf.converters.ValueConverter;
import org.fcrepo.kernel.impl.utils.NodePropertiesTools;
import org.fcrepo.mint.UUIDPathMinter;
import org.modeshape.jcr.api.JcrTools;
import org.slf4j.Logger;

Expand Down Expand Up @@ -104,6 +106,7 @@ public class JcrRdfTools {

private static final Model m = createDefaultModel();

private static final PidMinter pidMinter = new UUIDPathMinter();

/**
* Constructor with even more context.
Expand Down Expand Up @@ -405,16 +408,27 @@ private Resource getSkolemizedResource(final IdentifierConverter<Resource, Fedor
final AnonId id = resource.asResource().getId();

if (!skolemizedBnodeMap.containsKey(id)) {
final Node orCreateNode = jcrTools.findOrCreateNode(session, skolemizedId());
jcrTools.findOrCreateNode(session, skolemizedPrefix());
final String pid = pidMinter.mintPid();
final String path = skolemizedPrefix() + pid;
final Node preexistingNode = getClosestExistingAncestor(session, path);
final Node orCreateNode = jcrTools.findOrCreateNode(session, path);
orCreateNode.addMixin(FEDORA_BLANKNODE);

if (preexistingNode != null) {
AbstractService.tagHierarchyWithPairtreeMixin(preexistingNode,
orCreateNode);
}

final Resource skolemizedSubject = nodeToResource(idTranslator).convert(orCreateNode);
skolemizedBnodeMap.put(id, skolemizedSubject);
}

return skolemizedBnodeMap.get(id);
}

private static String skolemizedId() {
return "/.well-known/genid/" + randomUUID();
private static String skolemizedPrefix() {
return "/.well-known/genid/";
}

}
Expand Up @@ -64,7 +64,13 @@ protected Node findNode(final Session session, final String path) {
}
}

private static void tagHierarchyWithPairtreeMixin(final Node baseNode, final Node createdNode)
/**
* Tag a hierarchy with {@link org.fcrepo.kernel.FedoraJcrTypes#FEDORA_PAIRTREE}
* @param baseNode Top most ancestor that should not be tagged
* @param createdNode Node whose parents should be tagged up to but not including {@code baseNode}
* @throws RepositoryException
*/
public static void tagHierarchyWithPairtreeMixin(final Node baseNode, final Node createdNode)
throws RepositoryException {
Node parent = createdNode.getParent();

Expand Down
Expand Up @@ -68,6 +68,7 @@
import javax.jcr.version.VersionManager;

import org.fcrepo.kernel.FedoraJcrTypes;
import org.fcrepo.kernel.impl.utils.FedoraTypesUtils;
import org.fcrepo.kernel.models.FedoraResource;
import org.fcrepo.kernel.impl.rdf.impl.DefaultIdentifierTranslator;
import org.fcrepo.kernel.impl.testutilities.TestPropertyIterator;
Expand Down Expand Up @@ -346,6 +347,29 @@ public void shouldCreateHashUriSubjects() throws RepositoryException {
verify(mockHashNode).addMixin(FEDORA_PAIRTREE);
}

@Test
public void shouldAddBlankNodePairtreeMixin() throws RepositoryException {
final Model m = createDefaultModel();
final Resource resource = createResource();
final Statement x = m.createStatement(resource,
createProperty("info:x"),
resource);
testObj.jcrTools = mock(JcrTools.class);
when(testObj.jcrTools.findOrCreateNode(eq(mockSession), anyString())).thenReturn(mockNode);
when(mockNode.getPath()).thenReturn("/x");
when(mockNode.getParent()).thenReturn(mockHashNode);
when(mockHashNode.getParent()).thenReturn(mockChildNode);
when(mockHashNode.isNew()).thenReturn(true);
when(FedoraTypesUtils.getClosestExistingAncestor(mockSession,"/.well-known/genid/"))
.thenReturn(mockChildNode);
final Statement statement = testObj.skolemize(testSubjects, x);
assertEquals("info:fedora/x", statement.getSubject().toString());
assertEquals("info:fedora/x", statement.getObject().toString());
verify(testObj.jcrTools).findOrCreateNode(mockSession, "/.well-known/genid/");
verify(mockNode).addMixin(FEDORA_BLANKNODE);
verify(mockNode.getParent()).addMixin(FEDORA_PAIRTREE);
}

@Test
public void shouldCreateHashUriSubjectsWithExistingHashUri() throws RepositoryException {
final Model m = createDefaultModel();
Expand Down

0 comments on commit b643547

Please sign in to comment.