/**
Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016. All rights reserved.
Contact:
SYSTAP, LLC DBA Blazegraph
2501 Calvert ST NW #106
Washington, DC 20008
licenses@blazegraph.com
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.bigdata.blueprints;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import org.openrdf.model.Literal;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.impl.ValueFactoryImpl;
import org.openrdf.model.vocabulary.RDFS;
import com.bigdata.rdf.internal.XSD;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Element;
/**
* Default implementation of a {@link BlueprintsValueFactory} for converting
* blueprints data to RDF and back again. Uses simple namespacing and URL
* encoding to round trip URIs.
*
* @author mikepersonick
*
*/
public class DefaultBlueprintsValueFactory implements BlueprintsValueFactory {
/**
* Namespace for non vertex and edge data (property names).
*/
public final String GRAPH_NAMESPACE;// = "http://www.bigdata.com/rdf/graph/";
/**
* Namespace for vertices.
*/
public final String VERTEX_NAMESPACE;// = "http://www.bigdata.com/rdf/graph/vertex/";
/**
* Namespace for edges.
*/
public final String EDGE_NAMESPACE;// = "http://www.bigdata.com/rdf/graph/edge/";
/**
* URI used for typing elements.
*/
public final URI TYPE;
/**
* URI used to represent a Vertex.
*/
public final URI VERTEX;
/**
* URI used to represent a Edge.
*/
public final URI EDGE;
/**
* URI used for labeling edges.
*/
public final URI LABEL;
/**
* The Sesame value factory for URIs and Literals.
*/
protected final ValueFactory vf;
/**
* Construct an instance with a simple Sesame ValueFactoryImpl.
*/
public DefaultBlueprintsValueFactory(final String graphNamespace,
final String vertexNamespace, final String edgeNamespace,
final URI type, final URI vertex, final URI edge, final URI label) {
this(new ValueFactoryImpl(), graphNamespace, vertexNamespace,
edgeNamespace, type, vertex, edge, label);
}
/**
* Construct an instance with the specified ValueFactoryImpl.
*/
public DefaultBlueprintsValueFactory(final ValueFactory vf,
final String graphNamespace, final String vertexNamespace,
final String edgeNamespace, final URI type, final URI vertex,
final URI edge, final URI label) {
this.vf = vf;
this.GRAPH_NAMESPACE = graphNamespace;
this.VERTEX_NAMESPACE = vertexNamespace;
this.EDGE_NAMESPACE = edgeNamespace;
this.TYPE = type;
this.VERTEX = vertex;
this.EDGE = edge;
this.LABEL = label;
}
@Override
public URI getTypeURI() {
return TYPE;
}
@Override
public URI getVertexURI() {
return VERTEX;
}
@Override
public URI getEdgeURI() {
return EDGE;
}
@Override
public URI getLabelURI() {
return LABEL;
}
/**
* {@inheritDoc}
*/
@Override
public URI toVertexURI(final Object key) {
try {
final String id = key.toString();
return vf.createURI(VERTEX_NAMESPACE, URLEncoder.encode(id, "UTF-8"));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
/**
* {@inheritDoc}
*/
@Override
public URI toEdgeURI(final Object key) {
try {
final String id = key.toString();
return vf.createURI(EDGE_NAMESPACE, URLEncoder.encode(id, "UTF-8"));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
/**
* {@inheritDoc}
*/
@Override
public URI toURI(final Element e) {
if (e instanceof Edge) {
return toEdgeURI(e.getId());
} else {
return toVertexURI(e.getId());
}
}
/**
* {@inheritDoc}
*/
@Override
public URI toPropertyURI(final String property) {
try {
if (property.equals("label")) {
/*
* Label is a reserved property for edge labels, we use
* rdfs:label for that.
*/
return RDFS.LABEL;
} else {
return vf.createURI(GRAPH_NAMESPACE, URLEncoder.encode(property, "UTF-8"));
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
// /**
// * Returns true if the URI is part of the vertex namespace.
// */
//// @Override
// public boolean isVertex(final URI uri) {
//
// final String s = uri.stringValue();
//
// return s.startsWith(VERTEX_NAMESPACE);
//
// }
//
// /**
// * Returns true if the URI is part of the edge namespace.
// */
//// @Override
// public boolean isEdge(final URI uri) {
//
// final String s = uri.stringValue();
//
// return s.startsWith(EDGE_NAMESPACE);
//
// }
//
// /**
// * Returns true if the URI is part of the property namespace.
// */
//// @Override
// public boolean isProperty(final URI uri) {
//
// return !isVertex(uri) && !isEdge(uri);
//
// }
// /**
// * {@inheritDoc}
// */
// @Override
// public String fromVertexURI(final URI uri) {
//
// return fromURI(uri);
//
// }
//
// /**
// * {@inheritDoc}
// */
// @Override
// public String fromEdgeURI(final URI uri) {
//
// return fromURI(uri);
//
// }
//
// /**
// * {@inheritDoc}
// */
// @Override
// public String fromPropertyURI(final URI uri) {
//
// return fromURI(uri);
//
// }
/**
* Round-trip a URI back into a graph element ID or property name.
*/
@Override
public String fromURI(final URI uri) {
if (uri == null) {
throw new IllegalArgumentException();
}
try {
return URLDecoder.decode(uri.getLocalName(), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
/**
* {@inheritDoc}
* <p>
* Supports: Float, Double, Integer, Long, Boolean, Short, Byte, and String.
*/
@Override
public Literal toLiteral(final Object value) {
// /*
// * Need to handle this better.
// */
// if (value instanceof Collection) {
// return vf.createLiteral(Arrays.toString(((Collection<?>) value).toArray()));
// }
if (value instanceof Float) {
return vf.createLiteral((Float) value);
} else if (value instanceof Double) {
return vf.createLiteral((Double) value);
} else if (value instanceof Integer) {
return vf.createLiteral((Integer) value);
} else if (value instanceof Long) {
return vf.createLiteral((Long) value);
} else if (value instanceof Boolean) {
return vf.createLiteral((Boolean) value);
} else if (value instanceof Short) {
return vf.createLiteral((Short) value);
} else if (value instanceof Byte) {
return vf.createLiteral((Byte) value);
} else if (value instanceof String) { // treat as string by default
return vf.createLiteral((String) value);
} else {
throw new IllegalArgumentException();
}
}
/**
* {@inheritDoc}
* <p>
* Return a graph property from a datatyped literal using its
* XSD datatype.
* <p>
* Supports: Float, Double, Integer, Long, Boolean, Short, Byte, and String.
*/
@Override
public Object fromLiteral(final Literal l) {
final URI datatype = l.getDatatype();
if (datatype == null) {
return l.getLabel();
} else if (datatype.equals(XSD.FLOAT)) {
return l.floatValue();
} else if (datatype.equals(XSD.DOUBLE)) {
return l.doubleValue();
} else if (datatype.equals(XSD.INT)) {
return l.intValue();
} else if (datatype.equals(XSD.LONG)) {
return l.longValue();
} else if (datatype.equals(XSD.BOOLEAN)) {
return l.booleanValue();
} else if (datatype.equals(XSD.SHORT)) {
return l.shortValue();
} else if (datatype.equals(XSD.BYTE)) {
return l.byteValue();
} else {
return l.getLabel();
}
}
}