Skip to content

Commit

Permalink
Stop using the JCR type system for literals
Browse files Browse the repository at this point in the history
  • Loading branch information
cbeer committed Oct 24, 2014
1 parent f03ac97 commit cd3f906
Show file tree
Hide file tree
Showing 14 changed files with 73 additions and 376 deletions.
Expand Up @@ -15,7 +15,9 @@
*/
package org.fcrepo.integration.connector.file;

import com.hp.hpl.jena.rdf.model.RDFNode;
import org.fcrepo.kernel.FedoraResource;
import org.fcrepo.kernel.impl.rdf.converters.ValueConverter;
import org.fcrepo.kernel.impl.rdf.impl.DefaultIdentifierTranslator;
import org.fcrepo.kernel.impl.rdf.impl.PropertiesRdfContext;
import org.fcrepo.kernel.utils.iterators.RdfStream;
Expand All @@ -25,6 +27,7 @@
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
Expand All @@ -35,6 +38,8 @@
*/
public class BasicReadWriteFedoraFileSystemConnectorIT extends AbstractFedoraFileSystemConnectorIT {

private DefaultIdentifierTranslator subjects;

@Override
protected String federationName() {
return "federated";
Expand All @@ -58,6 +63,7 @@ protected String getFederationRoot() {
@Test
public void testWriteProperty() throws RepositoryException {
final Session session = repo.login();
subjects = new DefaultIdentifierTranslator(session);

final FedoraResource object = nodeService.getObject(session, testFilePath());
assertNotNull(object);
Expand All @@ -75,7 +81,10 @@ public void testWriteProperty() throws RepositoryException {
// Verify
final Property property = object.getNode().getProperty("fedora:name");
assertNotNull(property);
assertEquals("some-test-name", property.getValues()[0].toString());
final Value value = property.getValues()[0];

final RDFNode rdf = new ValueConverter(session, subjects).convert(value);
assertEquals("some-test-name", rdf.toString());

session.save();
session.logout();
Expand All @@ -84,6 +93,7 @@ public void testWriteProperty() throws RepositoryException {
@Test
public void testRemoveProperty() throws RepositoryException {
final Session session = repo.login();
subjects = new DefaultIdentifierTranslator(session);

final FedoraResource object = nodeService.getObject(session, testFilePath());
assertNotNull(object);
Expand All @@ -101,7 +111,9 @@ public void testRemoveProperty() throws RepositoryException {
// Verify property exists
final Property property = object.getNode().getProperty("fedora:remove");
assertNotNull(property);
assertEquals("some-property-to-remove", property.getValues()[0].getString());
final Value value = property.getValues()[0];
final RDFNode rdf = new ValueConverter(session, subjects).convert(value);
assertEquals("some-property-to-remove", rdf.toString());

final String sparqlRemove = "PREFIX fedora: <http://fedora.info/definitions/v4/rest-api#> " +
"DELETE {" +
Expand Down
Expand Up @@ -18,6 +18,7 @@
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;
import static javax.jcr.PropertyType.URI;
import static javax.jcr.PropertyType.WEAKREFERENCE;
Expand Down Expand Up @@ -174,7 +175,7 @@ public Value createValue(final ValueFactory valueFactory, final RDFNode data, fi
throws RepositoryException {
assert (valueFactory != null);

if (type == UNDEFINED) {
if (type == UNDEFINED || type == STRING) {
return valueConverter.reverse().convert(data);
} else if (data.isURIResource()
&& (type == REFERENCE || type == WEAKREFERENCE)) {
Expand Down
Expand Up @@ -61,8 +61,6 @@ protected Property doForward(final javax.jcr.Property property) {

if (isReferenceProperty.apply(property)) {
rdfLocalName = getReferencePropertyOriginalName(localName);
} else if (localName.contains("@")) {
rdfLocalName = localName.substring(0, localName.indexOf("@"));
} else {
rdfLocalName = localName;
}
Expand Down Expand Up @@ -162,19 +160,7 @@ public static String getPropertyNameFromPredicate(final NamespaceRegistry namesp
}
}

final StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append(prefix);
stringBuilder.append(":");
stringBuilder.append(rdfLocalname);


if (object != null && object.isLiteral() && !object.asLiteral().getLanguage().isEmpty()) {
stringBuilder.append("@");
stringBuilder.append(object.asLiteral().getLanguage());
}

final String propertyName = stringBuilder.toString();
final String propertyName = prefix + ":" + rdfLocalname;

LOGGER.debug("Took RDF predicate {} and translated it to JCR property {}", namespace, propertyName);

Expand Down
Expand Up @@ -16,13 +16,12 @@
package org.fcrepo.kernel.impl.rdf.converters;

import com.google.common.base.Converter;
import com.hp.hpl.jena.datatypes.BaseDatatype;
import com.hp.hpl.jena.datatypes.RDFDatatype;
import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
import com.hp.hpl.jena.datatypes.xsd.XSDDateTime;
import com.hp.hpl.jena.graph.NodeFactory;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
import org.fcrepo.kernel.FedoraResource;
import org.fcrepo.kernel.exception.RepositoryRuntimeException;
import org.slf4j.Logger;
Expand All @@ -33,8 +32,10 @@
import javax.jcr.Value;
import javax.jcr.ValueFactory;

import java.math.BigDecimal;
import java.util.regex.Pattern;

import static com.hp.hpl.jena.rdf.model.ResourceFactory.createLangLiteral;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createPlainLiteral;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createResource;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createTypedLiteral;
import static javax.jcr.PropertyType.BOOLEAN;
Expand Down Expand Up @@ -94,6 +95,8 @@ protected RDFNode doForward(final Value value) {
case WEAKREFERENCE:
case PATH:
return traverseLink(value);
case STRING:
return stringliteral2node(value.getString());
default:
return stringliteral2node(value.getString());
}
Expand Down Expand Up @@ -121,62 +124,39 @@ protected Value doBackward(final RDFNode resource) {

final Literal literal = resource.asLiteral();
final RDFDatatype dataType = literal.getDatatype();
final Object rdfValue = literal.getValue();

if (dataType == null && rdfValue instanceof String
|| (dataType != null && dataType.equals(XSDDatatype.XSDstring))) {
// short-circuit the common case
return valueFactory.createValue(literal.getString(), STRING);
} else if (rdfValue instanceof Boolean) {
return valueFactory.createValue((Boolean) 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(literal.getDouble());
} else if (rdfValue instanceof BigDecimal) {
return valueFactory.createValue((BigDecimal)literal.getValue());
} else if (rdfValue instanceof Float) {
return valueFactory.createValue(literal.getFloat());
} 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(literal.getInt());
} else if (rdfValue instanceof XSDDateTime
&& ((XSDDateTime) rdfValue).getNarrowedDatatype().equals(XSDDatatype.XSDdateTime)) {
return valueFactory.createValue(((XSDDateTime) rdfValue).asCalendar());

final String dataTypeUri;

if (dataType == null) {
dataTypeUri = "";
} else {
if (dataType != null && !dataType.getURI().isEmpty()) {
return valueFactory.createValue(literal.getString() + LITERAL_TYPE_SEP + dataType.getURI(), STRING);
} else {
return valueFactory.createValue(literal.getString(), STRING);
}
dataTypeUri = dataType.getURI();
}

return valueFactory.createValue(literal.getString()
+ LITERAL_TYPE_SEP + dataTypeUri
+ LITERAL_TYPE_SEP + literal.getLanguage(), STRING);
} catch (final RepositoryException e) {
throw new RepositoryRuntimeException(e);
}
}

private static Literal literal2node(final Object literal) {
final Literal result = createTypedLiteral(literal);
LOGGER.trace("Converting {} into {}", literal, result);
return result;
}

private static Literal literal2node(final Object o) {
return ResourceFactory.createTypedLiteral(o);
}

private static Literal stringliteral2node(final String literal) {
final int i = literal.indexOf(LITERAL_TYPE_SEP);

if (i < 0) {
return literal2node(literal);
final String[] split = literal.split(Pattern.quote(LITERAL_TYPE_SEP), 3);

if (split.length == 1) {
return literal2node(split[0]);
} else if (split.length == 3 && !split[2].isEmpty()) {
return createLangLiteral(split[0], split[2]);
} else if (split[1].isEmpty()) {
return createPlainLiteral(split[0]);
} else {
return createTypedLiteral(literal.substring(0, i),
new BaseDatatype(literal.substring(i + LITERAL_TYPE_SEP.length())));
return createTypedLiteral(split[0], NodeFactory.getType(split[1]));
}
}

Expand Down
Expand Up @@ -16,7 +16,6 @@
package org.fcrepo.kernel.impl.rdf.impl.mappings;

import static com.google.common.base.Throwables.propagate;
import static com.hp.hpl.jena.graph.NodeFactory.createLiteral;
import static com.hp.hpl.jena.graph.Triple.create;
import static org.fcrepo.kernel.impl.identifiers.NodeResourceConverter.nodeToResource;
import static org.slf4j.LoggerFactory.getLogger;
Expand All @@ -31,8 +30,6 @@

import com.google.common.base.Converter;
import com.google.common.collect.Iterators;
import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
import com.hp.hpl.jena.graph.impl.LiteralLabel;
import com.hp.hpl.jena.rdf.model.Resource;
import org.fcrepo.kernel.FedoraResource;
import org.fcrepo.kernel.impl.rdf.converters.PropertyConverter;
Expand Down Expand Up @@ -112,7 +109,7 @@ private Triple propertyvalue2triple(final Property p, final Value v) {

final Triple triple = create(graphSubjects.convert(p.getParent()).asNode(),
propertyConverter.convert(p).asNode(),
convertObject(p, v));
valueConverter.convert(v).asNode());

LOGGER.trace("Created triple: {} ", triple);
return triple;
Expand All @@ -121,26 +118,4 @@ private Triple propertyvalue2triple(final Property p, final Value v) {
}
}

private com.hp.hpl.jena.graph.Node convertObject(final Property p, final Value v) throws RepositoryException {
final com.hp.hpl.jena.graph.Node object = valueConverter.convert(v).asNode();

if (object.isLiteral()) {
final String propertyName = p.getName();
final int i = propertyName.indexOf("@");

if (i > 0) {
final LiteralLabel literal = object.getLiteral();
final String datatypeURI = literal.getDatatypeURI();

if (datatypeURI.isEmpty() || datatypeURI.equals(XSDDatatype.XSDstring.getURI())) {

final String lang = propertyName.substring(i + 1);
return createLiteral(literal.getLexicalForm(), lang, literal.getDatatype());
}
}
}

return object;
}

}
Expand Up @@ -34,6 +34,7 @@
import org.apache.commons.io.IOUtils;
import org.fcrepo.kernel.FedoraObject;
import org.fcrepo.kernel.exception.MalformedRdfException;
import org.fcrepo.kernel.impl.rdf.converters.ValueConverter;
import org.fcrepo.kernel.impl.rdf.impl.DefaultIdentifierTranslator;
import org.fcrepo.kernel.impl.rdf.impl.PropertiesRdfContext;
import org.fcrepo.kernel.services.ObjectService;
Expand All @@ -59,11 +60,14 @@ public class FedoraObjectImplIT extends AbstractIT {
private Session session;

private DefaultIdentifierTranslator subjects;
private ValueConverter valueConverter;


@Before
public void setUp() throws RepositoryException {
session = repo.login();
subjects = new DefaultIdentifierTranslator(session);
valueConverter = new ValueConverter(session, subjects);

}

Expand Down Expand Up @@ -105,10 +109,9 @@ public void testObjectGraph() throws Exception {
final Value[] values = object.getNode().getProperty("dc:title").getValues();
assertTrue(values.length > 0);

assertTrue(values[0]
.getString(),
values[0]
.getString().equals("This is an example title"));
final Value value1 = values[0];

assertEquals("This is an example title", valueConverter.convert(value1).toString());


object.updateProperties(subjects, "PREFIX myurn: <info:myurn/>\n" +
Expand All @@ -120,7 +123,7 @@ public void testObjectGraph() throws Exception {
.getNamespacePrefix("info:myurn/") +
":info").getValues()[0];

assertEquals("This is some example data", value.getString());
assertEquals("This is some example data", valueConverter.convert(value).asLiteral().getLexicalForm());

object.updateProperties(subjects, "PREFIX fedora-rels-ext: <"
+ RELATIONS_NAMESPACE + ">\n" +
Expand Down
Expand Up @@ -22,7 +22,6 @@
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createResource;
import static java.util.Arrays.asList;
import static javax.jcr.PropertyType.BINARY;
import static javax.jcr.PropertyType.LONG;
import static org.fcrepo.jcr.FedoraJcrTypes.FEDORA_TOMBSTONE;
import static org.fcrepo.kernel.RdfLexicon.DC_TITLE;
import static org.fcrepo.kernel.RdfLexicon.RDF_NAMESPACE;
Expand Down Expand Up @@ -57,6 +56,7 @@
import org.fcrepo.kernel.FedoraResource;
import org.fcrepo.kernel.exception.InvalidChecksumException;
import org.fcrepo.kernel.exception.MalformedRdfException;
import org.fcrepo.kernel.impl.rdf.converters.ValueConverter;
import org.fcrepo.kernel.impl.rdf.impl.DefaultIdentifierTranslator;
import org.fcrepo.kernel.impl.rdf.impl.PropertiesRdfContext;
import org.fcrepo.kernel.impl.rdf.impl.ReferencesRdfContext;
Expand Down Expand Up @@ -111,10 +111,13 @@ public class FedoraResourceImplIT extends AbstractIT {

private DefaultIdentifierTranslator subjects;

private ValueConverter valueConverter;

@Before
public void setUp() throws RepositoryException {
session = repo.login();
subjects = new DefaultIdentifierTranslator(session);
valueConverter = new ValueConverter(session, subjects);
}

@After
Expand Down Expand Up @@ -433,10 +436,10 @@ public void testUpdatingRdfTypedValues() throws RepositoryException {
+ createGraphSubjectNode(object).getURI()
+ "> example:int-property \"0\"^^xsd:long } "
+ "WHERE { }", new RdfStream());
assertEquals(LONG, object.getNode().getProperty("example:int-property")
.getType());
assertEquals(0L, object.getNode().getProperty("example:int-property")
.getValues()[0].getLong());
final Value value = object.getNode().getProperty("example:int-property")
.getValues()[0];

assertEquals(0L, valueConverter.convert(value).asLiteral().getLong());
}

@Test(expected = MalformedRdfException.class)
Expand Down Expand Up @@ -551,7 +554,8 @@ public boolean apply(final javax.jcr.Property property) {
final javax.jcr.Node skolemizedNode = session.getNodeByIdentifier(values[0].getString());

assertTrue(skolemizedNode.getPath().contains("/.well-known/genid/"));
assertEquals("xyz", skolemizedNode.getProperty("dc:title").getValues()[0].getString());
final Value value = skolemizedNode.getProperty("dc:title").getValues()[0];
assertEquals("xyz", valueConverter.convert(value).asLiteral().getString());

}

Expand Down

0 comments on commit cd3f906

Please sign in to comment.