Author: rwesten
Date: Mon Oct 14 13:50:10 2013
New Revision: 1531898
URL: http://svn.apache.org/r1531898
Log:
STANBOL-1166: Entityhub Model implementation for Sesame
Added:
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/ModelUtils.java
Modified:
stanbol/trunk/entityhub/model/sesame/ (props changed)
stanbol/trunk/entityhub/model/sesame/pom.xml
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/RdfRepresentation.java
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/RdfValueFactory.java
Propchange: stanbol/trunk/entityhub/model/sesame/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Oct 14 13:50:10 2013
@@ -0,0 +1,7 @@
+target
+
+.settings
+
+.project
+
+.classpath
Modified: stanbol/trunk/entityhub/model/sesame/pom.xml
URL:
http://svn.apache.org/viewvc/stanbol/trunk/entityhub/model/sesame/pom.xml?rev=1531898&r1=1531897&r2=1531898&view=diff
==============================================================================
--- stanbol/trunk/entityhub/model/sesame/pom.xml (original)
+++ stanbol/trunk/entityhub/model/sesame/pom.xml Mon Oct 14 13:50:10 2013
@@ -88,8 +88,7 @@
</dependency>
<dependency> <!-- the sesame repository API -->
<groupId>org.openrdf.sesame</groupId>
- <artifactId>sesame-repository-api</artifactId>
- <version>2.7.7</version>
+ <artifactId>sesame-model</artifactId>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
Added:
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/ModelUtils.java
URL:
http://svn.apache.org/viewvc/stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/ModelUtils.java?rev=1531898&view=auto
==============================================================================
---
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/ModelUtils.java
(added)
+++
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/ModelUtils.java
Mon Oct 14 13:50:10 2013
@@ -0,0 +1,134 @@
+package org.apache.stanbol.entityhub.model.sesame;
+
+import java.util.Iterator;
+
+import org.apache.commons.collections.IteratorUtils;
+import org.apache.commons.collections.Transformer;
+import org.apache.stanbol.entityhub.servicesapi.model.Representation;
+import org.apache.stanbol.entityhub.servicesapi.model.Text;
+import org.openrdf.model.BNode;
+import org.openrdf.model.Literal;
+import org.openrdf.model.URI;
+import org.openrdf.model.Value;
+import org.openrdf.model.datatypes.XMLDatatypeUtil;
+import org.openrdf.model.vocabulary.XMLSchema;
+
+/**
+ * Set of {@link Transformer}s used to convert Sesame {@link Value}s to
+ * Entityhub model instances.
+ *
+ * @author Rupert Westenthaler
+ *
+ */
+public class ModelUtils {
+
+ /**
+ * Transforms typed literals with datatype {@link XMLSchema#STRING} to
+ * {@link Text} instances as required by some {@link Representation}
+ * methods. This transformer is usually used in front of the
+ * {@link ModelUtils#VALUE_TRANSFORMER}.<p>
+ * <b>NOTE</b> that input values other as String literals are NOT
transformed!
+ */
+ protected static Transformer STRING_LITERAL_TO_TEXT_TRANSFORMER = new
Transformer() {
+
+ @Override
+ public Object transform(Object input) {
+ if(input instanceof Literal &&
XMLSchema.STRING.equals(((Literal)input).getDatatype())){
+ return new RdfText((Literal)input);
+ }
+ return input;
+ }
+ };
+ /**
+ * A {@link Value} to {@link Object} transformer intended to be used for
+ * {@link IteratorUtils#transformedIterator(Iterator, Transformer)} to
+ * convert
+ */
+ public static Transformer VALUE_TRANSFORMER = new Transformer() {
+
+ @Override
+ public Object transform(Object input) {
+ if(input instanceof Value){
+ Value sesameValue = (Value) input;
+ if(sesameValue instanceof URI){
+ return new RdfReference((URI)sesameValue);
+ } else if(sesameValue instanceof Literal){
+ Literal literal = (Literal)sesameValue;
+ if(literal.getDatatype() == null){ //TODO: adapt to RDF1.1
+ return new RdfText(literal);
+ } else {
+ return ModelUtils.transformTypedLiteral(literal);
+ }
+ } else {
+ return new RdfBNode((BNode)sesameValue);
+ }
+ } else { //do not transform objects of other types (incl. null)
+ return input;
+ }
+ }
+ };
+ /**
+ * Transforms Sesmae {@link Value}s to {@link String}
+ * Emits {@link Value#stringValue()}
+ */
+ public static Transformer VALUR_TO_STRING_TRANSFORMER = new Transformer() {
+
+ @Override
+ public String transform(Object input) {
+ return ((Value)input).stringValue();
+ }
+ };
+ /**
+ * Transforms a typed literal to the according java type.
+ * @param literal
+ * @return
+ */
+ private static Object transformTypedLiteral(Literal literal){
+ URI dataType = literal.getDatatype();
+ if(XMLSchema.INT.equals(dataType)){
+ return literal.intValue();
+ } else if(XMLSchema.LONG.equals(dataType)){
+ return literal.longValue();
+ } else if(XMLSchema.FLOAT.equals(dataType)){
+ return literal.floatValue();
+ } else if(XMLSchema.DOUBLE.equals(dataType)){
+ return literal.doubleValue();
+ } else if(XMLSchema.BOOLEAN.equals(dataType)){
+ return literal.booleanValue();
+ }else if(XMLSchema.INTEGER.equals(dataType)){
+ return literal.integerValue();
+ } else if(XMLSchema.DECIMAL.equals(dataType)){
+ return literal.decimalValue();
+ } else if(XMLSchema.STRING.equals(dataType)){ //explicit handle string
+ //to avoid going to a lot of equals checks
+ return literal.stringValue();
+ } else if(XMLDatatypeUtil.isCalendarDatatype(dataType)){
+ return literal.calendarValue().toGregorianCalendar().getTime();
+ } else if(XMLSchema.BYTE.equals(dataType)){
+ return literal.byteValue();
+ } else if(XMLSchema.SHORT.equals(dataType)){
+ return literal.shortValue();
+ //Start with the more exotic types at the end (for performance reasons)
+ } else if(XMLSchema.NON_NEGATIVE_INTEGER.equals(dataType) ||
+ XMLSchema.NON_POSITIVE_INTEGER.equals(dataType) ||
+ XMLSchema.NEGATIVE_INTEGER.equals(dataType) ||
+ XMLSchema.POSITIVE_INTEGER.equals(dataType)){
+ return literal.longValue();
+ } else if(XMLSchema.GDAY.equals(dataType) ||
+ XMLSchema.GMONTH.equals(dataType) ||
+ XMLSchema.GMONTHDAY.equals(dataType) ||
+ XMLSchema.GYEAR.equals(dataType) ||
+ XMLSchema.GYEARMONTH.equals(dataType)){
+ return literal.calendarValue().toGregorianCalendar().getTime();
+ } else if(XMLSchema.UNSIGNED_BYTE.equals(dataType)){
+ return literal.shortValue();
+ } else if(XMLSchema.UNSIGNED_SHORT.equals(dataType)){
+ return literal.intValue();
+ } else if(XMLSchema.UNSIGNED_INT.equals(dataType)){
+ return literal.longValue();
+ } else{
+ return literal.stringValue();
+ }
+ }
+
+}
Modified:
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/RdfRepresentation.java
URL:
http://svn.apache.org/viewvc/stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/RdfRepresentation.java?rev=1531898&r1=1531897&r2=1531898&view=diff
==============================================================================
---
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/RdfRepresentation.java
(original)
+++
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/RdfRepresentation.java
Mon Oct 14 13:50:10 2013
@@ -18,15 +18,12 @@ import org.apache.stanbol.entityhub.serv
import org.apache.stanbol.entityhub.servicesapi.model.Text;
import org.apache.stanbol.entityhub.servicesapi.model.UnsupportedTypeException;
import org.apache.stanbol.entityhub.servicesapi.util.ModelUtils;
-import org.openrdf.model.BNode;
import org.openrdf.model.Literal;
import org.openrdf.model.Model;
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.Value;
-import org.openrdf.model.datatypes.XMLDatatypeUtil;
import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.repository.RepositoryException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -55,61 +52,6 @@ public class RdfRepresentation implement
};
/**
- * Emits {@link Value#stringValue()}
- */
- protected Transformer stringTransformer = new Transformer() {
-
- @Override
- public String transform(Object input) {
- return ((Value)input).stringValue();
- }
- };
-
- /**
- * A {@link Value} to {@link Object} transformer intended to be used for
- * {@link IteratorUtils#transformedIterator(Iterator, Transformer)} to
- * convert
- */
- protected Transformer sesameTransformer = new Transformer() {
-
- @Override
- public Object transform(Object input) {
- if(input instanceof Value){
- Value sesameValue = (Value) input;
- if(sesameValue instanceof URI){
- return new RdfReference((URI)sesameValue);
- } else if(sesameValue instanceof Literal){
- Literal literal = (Literal)sesameValue;
- if(literal.getDatatype() == null){ //TODO: adapt to RDF1.1
- return new RdfText(literal);
- } else {
- return transformTypedLiteral(literal);
- }
- } else {
- return new RdfBNode((BNode)sesameValue);
- }
- } else { //do not transform objects of other types (incl. null)
- return input;
- }
- }
- };
- /**
- * Transforms typed literals with datatype {@link XMLSchema#STRING} to
- * {@link Text} instances as required by some {@link Representation}
- * methods. This transformer is usually used in front of the
- * {@link #sesameTransformer}.
- */
- protected Transformer stringLiteral2TextTransformer = new Transformer() {
-
- @Override
- public Object transform(Object input) {
- if(input instanceof Literal &&
XMLSchema.STRING.equals(((Literal)input).getDatatype())){
- return new RdfText((Literal)input);
- }
- return input;
- }
- };
- /**
* Creates a {@link Representation} for the parsed subject. Data will be
* added to the model.
* @param subject the subject
@@ -122,58 +64,7 @@ public class RdfRepresentation implement
this.factory = factory;
this.sesameFactory = factory.getSesameFactory();
}
- /**
- * Transforms a typed literal to the according java type.
- * @param literal
- * @return
- */
- protected Object transformTypedLiteral(Literal literal){
- URI dataType = literal.getDatatype();
- if(XMLSchema.INT.equals(dataType)){
- return literal.intValue();
- } else if(XMLSchema.LONG.equals(dataType)){
- return literal.longValue();
- } else if(XMLSchema.FLOAT.equals(dataType)){
- return literal.floatValue();
- } else if(XMLSchema.DOUBLE.equals(dataType)){
- return literal.doubleValue();
- } else if(XMLSchema.BOOLEAN.equals(dataType)){
- return literal.booleanValue();
- }else if(XMLSchema.INTEGER.equals(dataType)){
- return literal.integerValue();
- } else if(XMLSchema.DECIMAL.equals(dataType)){
- return literal.decimalValue();
- } else if(XMLSchema.STRING.equals(dataType)){ //explicit handle string
- //to avoid going to a lot of equals checks
- return literal.stringValue();
- } else if(XMLDatatypeUtil.isCalendarDatatype(dataType)){
- return literal.calendarValue().toGregorianCalendar().getTime();
- } else if(XMLSchema.BYTE.equals(dataType)){
- return literal.byteValue();
- } else if(XMLSchema.SHORT.equals(dataType)){
- return literal.shortValue();
- //Start with the more exotic types at the end (for performance reasons)
- } else if(XMLSchema.NON_NEGATIVE_INTEGER.equals(dataType) ||
- XMLSchema.NON_POSITIVE_INTEGER.equals(dataType) ||
- XMLSchema.NEGATIVE_INTEGER.equals(dataType) ||
- XMLSchema.POSITIVE_INTEGER.equals(dataType)){
- return literal.longValue();
- } else if(XMLSchema.GDAY.equals(dataType) ||
- XMLSchema.GMONTH.equals(dataType) ||
- XMLSchema.GMONTHDAY.equals(dataType) ||
- XMLSchema.GYEAR.equals(dataType) ||
- XMLSchema.GYEARMONTH.equals(dataType)){
- return literal.calendarValue().toGregorianCalendar().getTime();
- } else if(XMLSchema.UNSIGNED_BYTE.equals(dataType)){
- return literal.shortValue();
- } else if(XMLSchema.UNSIGNED_SHORT.equals(dataType)){
- return literal.intValue();
- } else if(XMLSchema.UNSIGNED_INT.equals(dataType)){
- return literal.longValue();
- } else{
- return literal.stringValue();
- }
- }
+
@Override
public void add(String field, Object value) throws
IllegalArgumentException {
if(field == null){
@@ -321,7 +212,7 @@ public class RdfRepresentation implement
IteratorUtils.transformedIterator(
model.filter(subject, property, null).iterator(),
objectTransFormer), // get the object from the statement
- sesameTransformer); // transform the values
+
org.apache.stanbol.entityhub.model.sesame.ModelUtils.VALUE_TRANSFORMER); //
transform the values
}
@Override
@@ -344,7 +235,7 @@ public class RdfRepresentation implement
//transform results
iterator = IteratorUtils.transformedIterator(
iterator, // the already filtered values
- sesameTransformer); // need to be transformed
+
org.apache.stanbol.entityhub.model.sesame.ModelUtils.VALUE_TRANSFORMER); //
need to be transformed
}
return (Iterator<T>)iterator;
}
@@ -365,15 +256,15 @@ public class RdfRepresentation implement
model.filter(subject, property, null).iterator(),
objectTransFormer), // get the object from the
statement
new ValueTypeFilter<Text>(languages)), //filter languages
- stringLiteral2TextTransformer), //transform strings to Text
- sesameTransformer); //transform to Text instances
+
org.apache.stanbol.entityhub.model.sesame.ModelUtils.STRING_LITERAL_TO_TEXT_TRANSFORMER),
//transform strings to Text
+
org.apache.stanbol.entityhub.model.sesame.ModelUtils.VALUE_TRANSFORMER);
//transform to Text instances
}
@Override
@SuppressWarnings("unchecked")
public Iterator<String> getFieldNames() {
return (Iterator<String>)IteratorUtils.transformedIterator(
- model.predicates().iterator(), stringTransformer);
+ model.predicates().iterator(),
org.apache.stanbol.entityhub.model.sesame.ModelUtils.VALUR_TO_STRING_TRANSFORMER);
}
@Override
@@ -457,7 +348,7 @@ public class RdfRepresentation implement
model.filter(subject, property, null).iterator(),
objectTransFormer), // get the object from the statement
new ValueTypeFilter<Reference>(Reference.class)), //filter
references
- sesameTransformer); //transform to Text instances
+
org.apache.stanbol.entityhub.model.sesame.ModelUtils.VALUE_TRANSFORMER);
//transform to Text instances
}
@Override
@@ -476,8 +367,8 @@ public class RdfRepresentation implement
model.filter(subject, property, null).iterator(),
objectTransFormer), // get the object from the
statement
new ValueTypeFilter<Text>(Text.class)), //filter plain
literals
- stringLiteral2TextTransformer),
- sesameTransformer); //transform to Text instances
+
org.apache.stanbol.entityhub.model.sesame.ModelUtils.STRING_LITERAL_TO_TEXT_TRANSFORMER),
+
org.apache.stanbol.entityhub.model.sesame.ModelUtils.VALUE_TRANSFORMER);
//transform to Text instances
}
@Override
@@ -613,6 +504,15 @@ public class RdfRepresentation implement
addReference(field, reference);
}
}
+ /**
+ * Getter for the Model used by this Representation <p>
+ * Note that this model might also contain triples with other subjects as
+ * the one used by this representation.
+ * @return the model used by this representation.
+ */
+ public Model getModel() {
+ return model;
+ }
public URI getURI() {
return subject;
Modified:
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/RdfValueFactory.java
URL:
http://svn.apache.org/viewvc/stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/RdfValueFactory.java?rev=1531898&r1=1531897&r2=1531898&view=diff
==============================================================================
---
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/RdfValueFactory.java
(original)
+++
stanbol/trunk/entityhub/model/sesame/src/main/java/org/apache/stanbol/entityhub/model/sesame/RdfValueFactory.java
Mon Oct 14 13:50:10 2013
@@ -8,6 +8,7 @@ import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.Map;
import java.util.Set;
@@ -133,11 +134,18 @@ public class RdfValueFactory implements
throw new IllegalArgumentException("The parsed id MUST NOT be
empty!");
} else {
//use the set model if present
- Model model = this.model == null ? new TreeModel() : this.model;
- URI subject = sesameFactory.createURI(id);
- return new RdfRepresentation(subject, model, this);
+ return createRdfRepresentation(sesameFactory.createURI(id));
}
}
+ /**
+ * Creates a {@link RdfRepresentation} for the parsed {@link URI}
+ * @param subject the URI
+ * @return the {@link RdfRepresentation}
+ */
+ public RdfRepresentation createRdfRepresentation(URI subject) {
+ Model model = this.model == null ? new TreeModel() : this.model;
+ return new RdfRepresentation(subject, model, this);
+ }
@Override
public Text createText(Object value) throws UnsupportedTypeException,
IllegalArgumentException {
@@ -171,4 +179,29 @@ public class RdfValueFactory implements
public org.openrdf.model.ValueFactory getSesameFactory(){
return sesameFactory;
}
+ /**
+ * Converts any {@link Representation} implementation to a {@link
RdfRepresentation}
+ * backed by a Sesame {@link Model}.
+ * @param representation the representation
+ * @return the {@link RdfRepresentation}
+ */
+ public RdfRepresentation toRdfRepresentation(Representation
representation) {
+ if(representation instanceof RdfRepresentation){
+ return (RdfRepresentation) representation;
+ } else if(representation != null){
+ //create the Clerezza Represenation
+ RdfRepresentation rdfRep = createRdfRepresentation(
+ sesameFactory.createURI(representation.getId()));
+ //Copy all values field by field
+ for (Iterator<String> fields = representation.getFieldNames();
fields.hasNext();) {
+ String field = fields.next();
+ for (Iterator<Object> fieldValues = representation.get(field);
fieldValues.hasNext();) {
+ rdfRep.add(field, fieldValues.next());
+ }
+ }
+ return rdfRep;
+ } else {
+ return null;
+ }
+ }
}