Skip to content

Commit

Permalink
add tests for converting between jcr and rdf types
Browse files Browse the repository at this point in the history
  • Loading branch information
cbeer committed Jun 18, 2013
1 parent d0aaf0b commit 75e69b6
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 49 deletions.
57 changes: 27 additions & 30 deletions fcrepo-kernel/src/main/java/org/fcrepo/utils/JcrRdfTools.java
Expand Up @@ -43,6 +43,8 @@
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionIterator;

import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
import com.hp.hpl.jena.rdf.model.Literal;
import org.fcrepo.RdfLexicon;
import org.fcrepo.rdf.GraphSubjects;
import org.fcrepo.services.LowLevelStorageService;
Expand Down Expand Up @@ -531,27 +533,29 @@ public static Value createValue(final Node node,
} else if (data.isLiteral() && type == PropertyType.UNDEFINED) {
// the JCR schema doesn't know what this should be; so introspect
// the RDF and try to figure it out
final Object rdfValue = data.asLiteral().getValue();
final Literal literal = data.asLiteral();
final RDFDatatype dataType = literal.getDatatype();
final Object rdfValue = literal.getValue();

if (rdfValue instanceof Boolean) {
return valueFactory.createValue((Boolean) rdfValue);
} else if (rdfValue instanceof Byte) {
return valueFactory.createValue((Byte) rdfValue);
} else if (rdfValue instanceof Byte || (dataType != null && dataType.getJavaClass() == Byte.class)) {
return valueFactory.createValue(literal.getByte());
} else if (rdfValue instanceof Double) {
return valueFactory.createValue((Double) rdfValue);
} else if (rdfValue instanceof Float) {
return valueFactory.createValue((Float) rdfValue);
} else if (rdfValue instanceof Long || (dataType != null && dataType.getJavaClass() == Long.class)) {
return valueFactory.createValue(literal.getLong());
} else if (rdfValue instanceof Short || (dataType != null && dataType.getJavaClass() == Short.class)) {
return valueFactory.createValue(literal.getShort());
} else if (rdfValue instanceof Integer) {
return valueFactory.createValue((Integer) rdfValue);
} else if (rdfValue instanceof Long) {
return valueFactory.createValue((Long) rdfValue);
} else if (rdfValue instanceof Short) {
return valueFactory.createValue((Short) rdfValue);
} else if (rdfValue instanceof XSDDateTime) {
return valueFactory.createValue(((XSDDateTime) rdfValue)
.asCalendar());
} else {
return valueFactory.createValue(data.asLiteral().getString(),
return valueFactory.createValue(literal.getString(),
PropertyType.STRING);
}

Expand Down Expand Up @@ -606,51 +610,44 @@ public static void addPropertyToModel(final Resource subject,
final com.hp.hpl.jena.rdf.model.Property predicate =
getPredicateForProperty.apply(property);

final String stringValue = v.getString();

RDFDatatype datatype = null;

switch (v.getType()) {
case BOOLEAN:
datatype =
model.createTypedLiteral(v.getBoolean()).getDatatype();
model.addLiteral(subject, predicate, v.getBoolean());
break;
case DATE:
datatype = model.createTypedLiteral(v.getDate()).getDatatype();
model.add(subject, predicate, ResourceFactory.createTypedLiteral(v.getDate()));
break;
case DECIMAL:
datatype =
model.createTypedLiteral(v.getDecimal()).getDatatype();
model.add(subject, predicate, ResourceFactory.createTypedLiteral(v.getDecimal()));
break;
case DOUBLE:
datatype =
model.createTypedLiteral(v.getDouble()).getDatatype();
model.addLiteral(subject, predicate, v.getDouble());
break;
case LONG:
datatype = model.createTypedLiteral(v.getLong()).getDatatype();
model.addLiteral(subject, predicate, v.getLong());
break;
case URI:
model.add(subject, predicate, model.createResource(stringValue));
model.add(subject, predicate, model.createResource(v.getString()));
return;
case REFERENCE:
case WEAKREFERENCE:
model.add(subject, predicate, model
.createResource("info:fedora" +
property.getSession()
.getNodeByIdentifier(stringValue).getPath()));
return;
.getNodeByIdentifier(v.getString()).getPath()));
break;
case PATH:
model.add(subject, predicate, model
.createResource("info:fedora" + stringValue));
return;
.createResource("info:fedora" + v.getString()));
break;

default:
model.add(subject, predicate, v.getString());

}

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


}

/**
Expand Down
91 changes: 72 additions & 19 deletions fcrepo-kernel/src/test/java/org/fcrepo/utils/JcrRdfToolsTest.java
Expand Up @@ -12,6 +12,7 @@
import static org.mockito.Mockito.when;
import static org.slf4j.LoggerFactory.getLogger;

import java.math.BigDecimal;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
Expand All @@ -31,6 +32,8 @@
import javax.jcr.Workspace;
import javax.jcr.nodetype.NodeType;

import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.update.GraphStore;
import com.hp.hpl.jena.update.GraphStoreFactory;
import org.fcrepo.RdfLexicon;
Expand Down Expand Up @@ -203,6 +206,16 @@ public void shouldReturnNullIfItFailstoMapRDFResourcesToJcrNodes()
.createResource("info:fedora/does-not-exist")));
}

@Test
public void shouldDetermineIfAGraphResourceIsAJcrNode() throws RepositoryException {
GraphSubjects mockFactory = mock(GraphSubjects.class);
Resource mockSubject = mock(Resource.class);
when(mockFactory.isFedoraGraphSubject(mockSubject)).thenReturn(true);
assertTrue(JcrRdfTools.isFedoraGraphSubject(mockFactory, mockSubject));

verify(mockFactory).isFedoraGraphSubject(mockSubject);
}

@Test
public void testGetPropertiesModel() throws RepositoryException {
final String fakeInternalUri = "info:fedora/test/jcr";
Expand Down Expand Up @@ -377,7 +390,7 @@ public void shouldMapRdfValuesToJcrPropertyValues()
JcrRdfTools.createValue(mockNode, n, 0);
verify(mockValueFactory).createValue(true);

n = ResourceFactory.createTypedLiteral((byte) 1);
n = ResourceFactory.createTypedLiteral("1", XSDDatatype.XSDbyte);
JcrRdfTools.createValue(mockNode, n, 0);
verify(mockValueFactory).createValue((byte) 1);

Expand All @@ -393,11 +406,11 @@ public void shouldMapRdfValuesToJcrPropertyValues()
JcrRdfTools.createValue(mockNode, n, 0);
verify(mockValueFactory).createValue(4);

n = ResourceFactory.createTypedLiteral((long) 5);
n = ResourceFactory.createTypedLiteral("5", XSDDatatype.XSDlong);
JcrRdfTools.createValue(mockNode, n, 0);
verify(mockValueFactory).createValue(5);

n = ResourceFactory.createTypedLiteral((short) 6);
n = ResourceFactory.createTypedLiteral("6", XSDDatatype.XSDshort);
JcrRdfTools.createValue(mockNode, n, 0);
verify(mockValueFactory).createValue((short) 6);

Expand Down Expand Up @@ -499,7 +512,9 @@ public void shouldAddMultivaluedPropertiesToModel()
@Test
public void shouldMapJcrTypesToRdfDataTypes() throws RepositoryException {
final javax.jcr.Property mockProperty = mock(javax.jcr.Property.class);
final Property mockPredicate = mock(Property.class);
final Resource mockSubject = ResourceFactory.createResource("some-resource-uri");
final Model mockModel = ModelFactory.createDefaultModel();
final Property mockPredicate = mockModel.createProperty("some-predicate-uri");

@SuppressWarnings("unchecked")
final Function<javax.jcr.Property, com.hp.hpl.jena.rdf.model.Property> mockPredicateFactoryFunc =
Expand All @@ -512,50 +527,88 @@ public void shouldMapJcrTypesToRdfDataTypes() throws RepositoryException {
FedoraTypesUtils.getPredicateForProperty = mockPredicateFactoryFunc;

try {
final Resource mockSubject = mock(Resource.class);
final Model mockModel = mock(Model.class);

Value mockValue = mock(Value.class);
Value mockValue;


mockValue = mock(Value.class);
when(mockValue.getType()).thenReturn(PropertyType.BOOLEAN);
when(mockValue.getBoolean()).thenReturn(true);
JcrRdfTools.addPropertyToModel(mockSubject, mockModel, mockProperty, mockValue);
assertTrue(mockModel.contains(mockSubject, mockPredicate, ResourceFactory.createTypedLiteral(true)));

mockValue = mock(Value.class);
Calendar mockCalendar = Calendar.getInstance();
when(mockValue.getType()).thenReturn(PropertyType.DATE);
when(mockValue.getDate()).thenReturn(mockCalendar);
JcrRdfTools.addPropertyToModel(mockSubject, mockModel, mockProperty, mockValue);
assertTrue(mockModel.contains(mockSubject, mockPredicate, ResourceFactory.createTypedLiteral(mockCalendar)));

mockValue = mock(Value.class);
when(mockValue.getType()).thenReturn(PropertyType.DECIMAL);
when(mockValue.getDecimal()).thenReturn(BigDecimal.valueOf(0.0));
JcrRdfTools.addPropertyToModel(mockSubject, mockModel, mockProperty, mockValue);
assertTrue(mockModel.contains(mockSubject, mockPredicate, ResourceFactory.createTypedLiteral(BigDecimal.valueOf(0.0))));

mockValue = mock(Value.class);
when(mockValue.getType()).thenReturn(PropertyType.DOUBLE);
when(mockValue.getDouble()).thenReturn((double)0);
JcrRdfTools.addPropertyToModel(mockSubject, mockModel, mockProperty, mockValue);
assertTrue(mockModel.contains(mockSubject, mockPredicate, ResourceFactory.createTypedLiteral((double)0)));

mockValue = mock(Value.class);
when(mockValue.getType()).thenReturn(PropertyType.LONG);
when(mockValue.getLong()).thenReturn(0L);
JcrRdfTools.addPropertyToModel(mockSubject, mockModel, mockProperty, mockValue);
assertTrue(mockModel.contains(mockSubject, mockPredicate, ResourceFactory.createTypedLiteral(0L)));


mockValue = mock(Value.class);
when(mockValue.getType()).thenReturn(PropertyType.STRING);
when(mockValue.getString()).thenReturn("XYZ");
JcrRdfTools.addPropertyToModel(mockSubject, mockModel, mockProperty, mockValue);
assertTrue(mockModel.contains(mockSubject, mockPredicate, ResourceFactory.createTypedLiteral("XYZ")));

mockValue = mock(Value.class);
when(mockValue.getType()).thenReturn(PropertyType.URI);
when(mockValue.getString()).thenReturn("info:fedora");
when(mockModel.createResource("info:fedora")).thenReturn(
ResourceFactory.createResource("info:fedora"));

JcrRdfTools.addPropertyToModel(mockSubject, mockModel,
mockProperty, mockValue);
verify(mockModel).add(mockSubject, mockPredicate,
ResourceFactory.createResource("info:fedora"));
mockProperty, mockValue);

assertTrue(mockModel.contains(mockSubject, mockPredicate, ResourceFactory.createResource("info:fedora")));

mockValue = mock(Value.class);
when(mockProperty.getSession()).thenReturn(mockSession);
when(mockSession.getNodeByIdentifier("uuid")).thenReturn(mockNode);
when(mockNode.getPath()).thenReturn("/abc");
when(mockModel.createResource("info:fedora/abc")).thenReturn(
ResourceFactory.createResource("info:fedora/abc"));

when(mockValue.getType()).thenReturn(PropertyType.REFERENCE);
when(mockValue.getString()).thenReturn("uuid");
JcrRdfTools.addPropertyToModel(mockSubject, mockModel,
mockProperty, mockValue);

// verify(mockModel).add(mockSubject, mockPredicate, ResourceFactory.createResource("info:fedora/abc"));

assertTrue(mockModel.contains(mockSubject, mockPredicate, ResourceFactory.createResource("info:fedora/abc")));

mockValue = mock(Value.class);
when(mockValue.getType()).thenReturn(PropertyType.WEAKREFERENCE);
when(mockValue.getString()).thenReturn("uuid");
when(mockNode.getPath()).thenReturn("/def");
JcrRdfTools.addPropertyToModel(mockSubject, mockModel,
mockProperty, mockValue);

// verify(mockModel).add(mockSubject, mockPredicate, ResourceFactory.createResource("info:fedora/abc"));

assertTrue(mockModel.contains(mockSubject, mockPredicate, ResourceFactory.createResource("info:fedora/def")));

mockValue = mock(Value.class);
when(mockValue.getType()).thenReturn(PropertyType.PATH);
when(mockValue.getString()).thenReturn("/abc");
when(mockValue.getString()).thenReturn("/ghi");
JcrRdfTools.addPropertyToModel(mockSubject, mockModel,
mockProperty, mockValue);

verify(mockModel, times(3)).add(mockSubject, mockPredicate,
ResourceFactory.createResource("info:fedora/abc"));
assertTrue(mockModel.contains(mockSubject, mockPredicate, ResourceFactory.createResource("info:fedora/ghi")));


} finally {
FedoraTypesUtils.getPredicateForProperty = holdPredicate;
Expand Down

0 comments on commit 75e69b6

Please sign in to comment.