You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by rw...@apache.org on 2013/12/16 10:18:22 UTC
svn commit: r1551134 [2/2] - in /stanbol/trunk/entityhub: jersey/
jersey/src/main/java/org/apache/stanbol/entityhub/jersey/fragment/
jersey/src/main/java/org/apache/stanbol/entityhub/jersey/parsers/
jersey/src/main/java/org/apache/stanbol/entityhub/jer...
Added: stanbol/trunk/entityhub/web/clerezza/pom.xml
URL: http://svn.apache.org/viewvc/stanbol/trunk/entityhub/web/clerezza/pom.xml?rev=1551134&view=auto
==============================================================================
--- stanbol/trunk/entityhub/web/clerezza/pom.xml (added)
+++ stanbol/trunk/entityhub/web/clerezza/pom.xml Mon Dec 16 09:18:20 2013
@@ -0,0 +1,178 @@
+<?xml version="1.0"?>
+ <!--
+ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the
+ NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF
+ licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file
+ except in compliance with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing
+ permissions and limitations under the License.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>apache-stanbol-entityhub</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <relativePath>../..</relativePath>
+ </parent>
+
+ <artifactId>org.apache.stanbol.entityhub.web.clerezza</artifactId>
+ <packaging>bundle</packaging>
+
+ <name>Apache Stanbol Entityhub Web: Clerezza Model Serializer</name>
+ <description>Provides RDF serializers for the Clerezza Model implementation</description>
+
+ <licenses>
+ <license>
+ <name>Apache Software License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ <comments>A business-friendly OSS license</comments>
+ </license>
+ </licenses>
+
+ <scm>
+ <connection>
+ scm:svn:http://svn.apache.org/repos/asf/stanbol/trunk/entityhub/web/clerezza
+ </connection>
+ <developerConnection>
+ scm:svn:https://svn.apache.org/repos/asf/stanbol/trunk/entityhub/web/clerezza
+ </developerConnection>
+ <url>http://stanbol.apache.org</url>
+ </scm>
+
+ <build>
+ <!-- make it an OSGi bundle -->
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Import-Package>
+ *
+ </Import-Package>
+ <Private-Package>
+ org.apache.stanbol.entityhub.web.writer.clerezza; version=${project.version}
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-scr-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+
+ <!-- dependencies on other Stanbol modules -->
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.commons.web.base</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.commons.indexedgraph</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <!-- Jersey and Freemarker -->
+ <!-- dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.commons.web.viewable</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency -->
+
+ <!-- dependencies on other Entityhub modules -->
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.entityhub.servicesapi</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <!-- dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.entityhub.core</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency -->
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.entityhub.model.clerezza</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.entityhub.query.clerezza</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.entityhub.ldpath</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.entityhub.jersey</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+
+
+ <!-- LD Path -->
+ <!-- imported via entityhub.ldpath
+ <dependency>
+ <groupId>at.newmedialab.ldpath</groupId>
+ <artifactId>ldpath-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>at.newmedialab.ldpath</groupId>
+ <artifactId>ldpath-core-bundle</artifactId>
+ </dependency> -->
+
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ </dependency>
+
+
+ <!-- Servlet API for handling ServletContext -->
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </dependency>
+
+ <!-- OSGi tax -->
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.scr.annotations</artifactId>
+ </dependency>
+
+ <!-- for tests -->
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-simple</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+</project>
Added: stanbol/trunk/entityhub/web/clerezza/src/license/THIRD-PARTY.properties
URL: http://svn.apache.org/viewvc/stanbol/trunk/entityhub/web/clerezza/src/license/THIRD-PARTY.properties?rev=1551134&view=auto
==============================================================================
--- stanbol/trunk/entityhub/web/clerezza/src/license/THIRD-PARTY.properties (added)
+++ stanbol/trunk/entityhub/web/clerezza/src/license/THIRD-PARTY.properties Mon Dec 16 09:18:20 2013
@@ -0,0 +1,29 @@
+# Generated by org.codehaus.mojo.license.AddThirdPartyMojo
+#-------------------------------------------------------------------------------
+# Already used licenses in project :
+# - Apache Software License
+# - Apache Software License, Version 2.0
+# - BSD License
+# - Common Development And Distribution License (CDDL), Version 1.0
+# - Common Development And Distribution License (CDDL), Version 1.1
+# - Common Public License, Version 1.0
+# - Eclipse Public License, Version 1.0
+# - GNU General Public License (GPL), Version 2 with classpath exception
+# - GNU Lesser General Public License (LGPL)
+# - GNU Lesser General Public License (LGPL), Version 2.1
+# - ICU License
+# - MIT License
+# - New BSD License
+# - Public Domain License
+# - Similar to Apache License but with the acknowledgment clause removed
+#-------------------------------------------------------------------------------
+# Please fill the missing licenses for dependencies :
+#
+#
+#Tue Jan 22 15:36:38 CET 2013
+asm--asm--3.1=BSD License
+javax.servlet--servlet-api--2.5=Common Development And Distribution License (CDDL), Version 1.0
+org.codehaus.jettison--jettison--1.3=The Apache Software License, Version 2.0
+org.osgi--org.osgi.compendium--4.1.0=The Apache Software License, Version 2.0
+org.osgi--org.osgi.core--4.1.0=The Apache Software License, Version 2.0
+xerces--xercesImpl--2.7.1=The Apache Software License, Version 2.0
Added: stanbol/trunk/entityhub/web/clerezza/src/main/java/org/apache/stanbol/entityhub/web/writer/clerezza/ClerezzaModelWriter.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/entityhub/web/clerezza/src/main/java/org/apache/stanbol/entityhub/web/writer/clerezza/ClerezzaModelWriter.java?rev=1551134&view=auto
==============================================================================
--- stanbol/trunk/entityhub/web/clerezza/src/main/java/org/apache/stanbol/entityhub/web/writer/clerezza/ClerezzaModelWriter.java (added)
+++ stanbol/trunk/entityhub/web/clerezza/src/main/java/org/apache/stanbol/entityhub/web/writer/clerezza/ClerezzaModelWriter.java Mon Dec 16 09:18:20 2013
@@ -0,0 +1,305 @@
+package org.apache.stanbol.entityhub.web.writer.clerezza;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.clerezza.rdf.core.LiteralFactory;
+import org.apache.clerezza.rdf.core.MGraph;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.TypedLiteral;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.rdf.core.serializedform.Serializer;
+import org.apache.clerezza.rdf.core.serializedform.SupportedFormat;
+import org.apache.clerezza.rdf.ontologies.RDF;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.stanbol.commons.indexedgraph.IndexedMGraph;
+import org.apache.stanbol.commons.namespaceprefix.NamespacePrefixService;
+import org.apache.stanbol.entityhub.model.clerezza.RdfRepresentation;
+import org.apache.stanbol.entityhub.model.clerezza.RdfValueFactory;
+import org.apache.stanbol.entityhub.query.clerezza.RdfQueryResultList;
+import org.apache.stanbol.entityhub.servicesapi.defaults.NamespaceEnum;
+import org.apache.stanbol.entityhub.servicesapi.model.Entity;
+import org.apache.stanbol.entityhub.servicesapi.model.Representation;
+import org.apache.stanbol.entityhub.servicesapi.model.rdf.RdfResourceEnum;
+import org.apache.stanbol.entityhub.servicesapi.query.FieldQuery;
+import org.apache.stanbol.entityhub.servicesapi.query.QueryResultList;
+import org.apache.stanbol.entityhub.web.ModelWriter;
+import org.apache.stanbol.entityhub.web.fieldquery.FieldQueryToJsonUtils;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component(immediate=true)
+@Service
+public class ClerezzaModelWriter implements ModelWriter {
+
+ private final Logger log = LoggerFactory.getLogger(ClerezzaModelWriter.class);
+
+ /**
+ * {@link MediaType} instance for {@link SupportedFormat#TURTLE}
+ */
+ public static final MediaType TURTLE_TYPE = MediaType.valueOf(SupportedFormat.TURTLE);
+ /**
+ * {@link MediaType} instance for <code>application/ld+json</code>
+ */
+ public static final MediaType JSONLD_TYPE = MediaType.valueOf("application/ld+json");
+ /**
+ * {@link MediaType} instance for {@link SupportedFormat#N3}
+ */
+ public static final MediaType N3_TYPE = MediaType.valueOf(SupportedFormat.N3);
+ /**
+ * {@link MediaType} instance for {@link SupportedFormat#RDF_JSON}
+ */
+ public static final MediaType RDF_JSON_TYPE = MediaType.valueOf(SupportedFormat.RDF_JSON);
+ /**
+ * {@link MediaType} instance for {@link SupportedFormat#RDF_XML}
+ */
+ public static final MediaType RDF_XML_TYPE = MediaType.valueOf(SupportedFormat.RDF_XML);
+ /**
+ * {@link MediaType} instance for {@link SupportedFormat#X_TURTLE}
+ */
+ public static final MediaType X_TURTLE_TYPE = MediaType.valueOf(SupportedFormat.X_TURTLE);
+ /**
+ * Read-only list of the supported RDF formats
+ */
+ public static final List<MediaType> SUPPORTED_RDF_TYPES = Collections.unmodifiableList(
+ Arrays.asList(TURTLE_TYPE, JSONLD_TYPE, N3_TYPE, RDF_JSON_TYPE, RDF_XML_TYPE, X_TURTLE_TYPE));
+
+ //some Concepts and Relations we use to represent Entities
+ private final static UriRef FOAF_DOCUMENT = new UriRef(NamespaceEnum.foaf+"Document");
+ private final static UriRef FOAF_PRIMARY_TOPIC = new UriRef(NamespaceEnum.foaf+"primaryTopic");
+ private final static UriRef FOAF_PRIMARY_TOPIC_OF = new UriRef(NamespaceEnum.foaf+"isPrimaryTopicOf");
+ private final static UriRef SIGN_SITE = new UriRef(RdfResourceEnum.site.getUri());
+// private final static UriRef ENTITY_TYPE = new UriRef(RdfResourceEnum.Entity.getUri());
+ private final static RdfValueFactory valueFactory = RdfValueFactory.getInstance();
+ /**
+ * The URI used for the query result list (static for all responses)
+ */
+ private static final UriRef QUERY_RESULT_LIST = new UriRef(RdfResourceEnum.QueryResultSet.getUri());
+ /**
+ * The property used for all results
+ */
+ private static final UriRef QUERY_RESULT = new UriRef(RdfResourceEnum.queryResult.getUri());
+ /**
+ * The property used for the JSON serialised FieldQuery (STANBOL-298)
+ */
+ private static final UriRef FIELD_QUERY = new UriRef(RdfResourceEnum.query.getUri());
+
+ /**
+ * This Serializer only supports UTF-8
+ */
+ public static final String CHARSET = Charset.forName("UTF-8").toString();
+
+ /**
+ * The literal factory used (currently {@link LiteralFactory#getInstance()},
+ * but we might use a custom one for Stanbol therefore it is better to
+ * have it as a field
+ */
+ static final LiteralFactory literalFactory = LiteralFactory.getInstance();
+
+ /**
+ * The Clerezza {@link Serializer} service
+ */
+ @Reference
+ protected Serializer ser;
+
+ @Reference(cardinality=ReferenceCardinality.OPTIONAL_UNARY)
+ protected NamespacePrefixService nsPrefixService;
+
+ @Override
+ public Class<? extends Representation> getNativeType() {
+ return RdfRepresentation.class;
+ }
+
+ @Override
+ public List<MediaType> supportedMediaTypes() {
+ return SUPPORTED_RDF_TYPES;
+ }
+
+ @Override
+ public MediaType getBestMediaType(MediaType mediaType) {
+ for(MediaType supported : SUPPORTED_RDF_TYPES){
+ if(supported.isCompatible(mediaType)){
+ return supported;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void write(Representation rep, OutputStream out, MediaType mediaType) throws WebApplicationException,
+ IOException {
+ writeRdf(toRDF(rep), out, mediaType);
+ }
+
+ @Override
+ public void write(Entity entity, OutputStream out, MediaType mediaType) throws WebApplicationException,
+ IOException {
+ writeRdf(toRDF(entity),out,mediaType);
+
+ }
+
+ @Override
+ public void write(QueryResultList<?> result, OutputStream out, MediaType mediaType) throws WebApplicationException,
+ IOException {
+ MGraph queryRdf = toRDF(result);
+ //we need also to the JSON formatted FieldQuery as a literal to the
+ //RDF data.
+ FieldQuery query = result.getQuery();
+ if(query != null){
+ try {
+ JSONObject fieldQueryJson = FieldQueryToJsonUtils.toJSON(query,
+ nsPrefixService);
+ if(fieldQueryJson != null){
+ //add the triple with the fieldQuery
+ queryRdf.add(new TripleImpl(QUERY_RESULT_LIST, FIELD_QUERY,
+ literalFactory.createTypedLiteral(fieldQueryJson.toString())));
+ }
+ } catch (JSONException e) {
+ log.warn(String.format("Unable to serialize Fieldquery '%s' to JSON! "
+ + "Query response will not contain the serialized query.",
+ query),e);
+ }
+ }
+ //now serialise the data
+ writeRdf(queryRdf,out,mediaType);
+ }
+
+ /**
+ * @param tc
+ * @param out
+ * @param mediaType
+ */
+ private void writeRdf(TripleCollection tc, OutputStream out, MediaType mediaType) {
+ String charset = mediaType.getParameters().get("charset");
+ if(charset == null){
+ charset = ModelWriter.DEFAULT_CHARSET;
+ }
+ if(!CHARSET.equalsIgnoreCase(charset)){
+ log.warn("Unsupported Charset {} requested (will use {})!",charset,CHARSET);
+ }
+ ser.serialize(out, tc , new StringBuilder(mediaType.getType())
+ .append('/').append(mediaType.getSubtype()).toString());
+ }
+
+ private MGraph toRDF(Representation representation) {
+ MGraph graph = new IndexedMGraph();
+ addRDFTo(graph, representation);
+ return graph;
+ }
+
+ private void addRDFTo(MGraph graph, Representation representation) {
+ graph.addAll(valueFactory.toRdfRepresentation(representation).getRdfGraph());
+ }
+
+ private TripleCollection toRDF(Entity entity) {
+ MGraph graph = new IndexedMGraph();
+ addRDFTo(graph, entity);
+ return graph;
+ }
+
+ private void addRDFTo(MGraph graph, Entity entity) {
+ addRDFTo(graph, entity.getRepresentation());
+ addRDFTo(graph, entity.getMetadata());
+ //now add some triples that represent the Sign
+ addEntityTriplesToGraph(graph, entity);
+ }
+
+
+ /**
+ * Adds the Triples that represent the Sign to the parsed graph. Note that
+ * this method does not add triples for the representation. However it adds
+ * the triple (sign,singRepresentation,representation)
+ *
+ * @param graph the graph to add the triples
+ * @param sign the sign
+ */
+ private void addEntityTriplesToGraph(MGraph graph, Entity sign) {
+ UriRef id = new UriRef(sign.getId());
+ UriRef metaId = new UriRef(sign.getMetadata().getId());
+ //add the FOAF triples between metadata and content
+ graph.add(new TripleImpl(id, FOAF_PRIMARY_TOPIC_OF, metaId));
+ graph.add(new TripleImpl(metaId, FOAF_PRIMARY_TOPIC, metaId));
+ graph.add(new TripleImpl(metaId, RDF.type, FOAF_DOCUMENT));
+ //add the site to the metadata
+ //TODO: this should be the HTTP URI and not the id of the referenced site
+ TypedLiteral siteName = literalFactory.createTypedLiteral(sign.getSite());
+ graph.add(new TripleImpl(metaId, SIGN_SITE, siteName));
+
+ }
+
+ private MGraph toRDF(QueryResultList<?> resultList) {
+ final MGraph resultGraph;
+ Class<?> type = resultList.getType();
+ if (String.class.isAssignableFrom(type)) {
+ resultGraph = new IndexedMGraph(); //create a new Graph
+ for (Object result : resultList) {
+ //add a triple to each reference in the result set
+ resultGraph.add(new TripleImpl(QUERY_RESULT_LIST, QUERY_RESULT, new UriRef(result.toString())));
+ }
+ } else {
+ //first determine the type of the resultList
+ final boolean isSignType;
+ if (Representation.class.isAssignableFrom(type)) {
+ isSignType = false;
+ } else if (Representation.class.isAssignableFrom(type)) {
+ isSignType = true;
+ } else {
+ //incompatible type -> throw an Exception
+ throw new IllegalArgumentException("Parsed type " + type + " is not supported");
+ }
+ //special treatment for RdfQueryResultList for increased performance
+ if (resultList instanceof RdfQueryResultList) {
+ resultGraph = ((RdfQueryResultList) resultList).getResultGraph();
+ if (isSignType) { //if we build a ResultList for Signs, that we need to do more things
+ //first remove all triples representing results
+ Iterator<Triple> resultTripleIt = resultGraph.filter(QUERY_RESULT_LIST, QUERY_RESULT, null);
+ while (resultTripleIt.hasNext()) {
+ resultTripleIt.next();
+ resultTripleIt.remove();
+ }
+ //now add the Sign specific triples and add result triples
+ //to the Sign IDs
+ for (Object result : resultList) {
+ UriRef signId = new UriRef(((Entity) result).getId());
+ addEntityTriplesToGraph(resultGraph, (Entity) result);
+ resultGraph.add(new TripleImpl(QUERY_RESULT_LIST, QUERY_RESULT, signId));
+ }
+ }
+ } else { //any other implementation of the QueryResultList interface
+ resultGraph = new IndexedMGraph(); //create a new graph
+ if (Representation.class.isAssignableFrom(type)) {
+ for (Object result : resultList) {
+ UriRef resultId;
+ if (!isSignType) {
+ addRDFTo(resultGraph, (Representation) result);
+ resultId = new UriRef(((Representation) result).getId());
+ } else {
+ addRDFTo(resultGraph, (Entity) result);
+ resultId = new UriRef(((Entity) result).getId());
+ }
+ //Note: In case of Representation this Triple points to
+ // the representation. In case of Signs it points to
+ // the sign.
+ resultGraph.add(new TripleImpl(QUERY_RESULT_LIST, QUERY_RESULT, resultId));
+ }
+ }
+ }
+ }
+ return resultGraph;
+ }
+}
Added: stanbol/trunk/entityhub/web/clerezza/src/main/resources/OSGI-INF/metatype/metatype.properties
URL: http://svn.apache.org/viewvc/stanbol/trunk/entityhub/web/clerezza/src/main/resources/OSGI-INF/metatype/metatype.properties?rev=1551134&view=auto
==============================================================================
--- stanbol/trunk/entityhub/web/clerezza/src/main/resources/OSGI-INF/metatype/metatype.properties (added)
+++ stanbol/trunk/entityhub/web/clerezza/src/main/resources/OSGI-INF/metatype/metatype.properties Mon Dec 16 09:18:20 2013
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+org.apache.stanbol.entityhub.web.writer.clerezza.ClerzzaModelWriter.name=Apache Stanbol Entityhub IO ModelWriter for Clerezza
+org.apache.stanbol.entityhub.web.writer.clerezza.ClerzzaModelWriter.description=ModelWirter for various RDF formats \
+based on Apache Clerezza. Provides native support for serializing the Clerezza Model implementation.
Propchange: stanbol/trunk/entityhub/web/sesame/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Dec 16 09:18:20 2013
@@ -0,0 +1,7 @@
+.project
+
+target
+
+.settings
+
+.classpath
Added: stanbol/trunk/entityhub/web/sesame/pom.xml
URL: http://svn.apache.org/viewvc/stanbol/trunk/entityhub/web/sesame/pom.xml?rev=1551134&view=auto
==============================================================================
--- stanbol/trunk/entityhub/web/sesame/pom.xml (added)
+++ stanbol/trunk/entityhub/web/sesame/pom.xml Mon Dec 16 09:18:20 2013
@@ -0,0 +1,152 @@
+<?xml version="1.0"?>
+ <!--
+ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the
+ NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF
+ licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file
+ except in compliance with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing
+ permissions and limitations under the License.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>apache-stanbol-entityhub</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <relativePath>../..</relativePath>
+ </parent>
+
+ <artifactId>org.apache.stanbol.entityhub.web.sesame</artifactId>
+ <packaging>bundle</packaging>
+
+ <name>Apache Stanbol Entityhub Web: Sesame Model Serializer</name>
+ <description>Provides RDF serializers based on the Sesame Model implementation</description>
+
+ <licenses>
+ <license>
+ <name>Apache Software License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ <comments>A business-friendly OSS license</comments>
+ </license>
+ </licenses>
+
+ <scm>
+ <connection>
+ scm:svn:http://svn.apache.org/repos/asf/stanbol/trunk/entityhub/web/sesame
+ </connection>
+ <developerConnection>
+ scm:svn:https://svn.apache.org/repos/asf/stanbol/trunk/entityhub/web/sesame
+ </developerConnection>
+ <url>http://stanbol.apache.org</url>
+ </scm>
+
+ <build>
+ <!-- make it an OSGi bundle -->
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Import-Package>
+ *
+ </Import-Package>
+ <Private-Package>
+ org.apache.stanbol.entityhub.web.writer.sesame; version=${project.version}
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-scr-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+
+ <!-- dependencies on other Stanbol modules -->
+
+ <!-- dependencies on other Entityhub modules -->
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.entityhub.servicesapi</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.entityhub.model.sesame</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.entityhub.query.sesame</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.entityhub.ldpath</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.entityhub.jersey</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+
+
+ <!-- Sesame IO -->
+ <dependency>
+ <groupId>org.openrdf.sesame</groupId>
+ <artifactId>sesame-rio-api</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ </dependency>
+
+
+ <!-- Servlet API for handling ServletContext -->
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </dependency>
+
+ <!-- OSGi tax -->
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.scr.annotations</artifactId>
+ </dependency>
+
+ <!-- for tests -->
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-simple</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+</project>
Added: stanbol/trunk/entityhub/web/sesame/src/license/THIRD-PARTY.properties
URL: http://svn.apache.org/viewvc/stanbol/trunk/entityhub/web/sesame/src/license/THIRD-PARTY.properties?rev=1551134&view=auto
==============================================================================
--- stanbol/trunk/entityhub/web/sesame/src/license/THIRD-PARTY.properties (added)
+++ stanbol/trunk/entityhub/web/sesame/src/license/THIRD-PARTY.properties Mon Dec 16 09:18:20 2013
@@ -0,0 +1,29 @@
+# Generated by org.codehaus.mojo.license.AddThirdPartyMojo
+#-------------------------------------------------------------------------------
+# Already used licenses in project :
+# - Apache Software License
+# - Apache Software License, Version 2.0
+# - BSD License
+# - Common Development And Distribution License (CDDL), Version 1.0
+# - Common Development And Distribution License (CDDL), Version 1.1
+# - Common Public License, Version 1.0
+# - Eclipse Public License, Version 1.0
+# - GNU General Public License (GPL), Version 2 with classpath exception
+# - GNU Lesser General Public License (LGPL)
+# - GNU Lesser General Public License (LGPL), Version 2.1
+# - ICU License
+# - MIT License
+# - New BSD License
+# - Public Domain License
+# - Similar to Apache License but with the acknowledgment clause removed
+#-------------------------------------------------------------------------------
+# Please fill the missing licenses for dependencies :
+#
+#
+#Tue Jan 22 15:36:38 CET 2013
+asm--asm--3.1=BSD License
+javax.servlet--servlet-api--2.5=Common Development And Distribution License (CDDL), Version 1.0
+org.codehaus.jettison--jettison--1.3=The Apache Software License, Version 2.0
+org.osgi--org.osgi.compendium--4.1.0=The Apache Software License, Version 2.0
+org.osgi--org.osgi.core--4.1.0=The Apache Software License, Version 2.0
+xerces--xercesImpl--2.7.1=The Apache Software License, Version 2.0
Added: stanbol/trunk/entityhub/web/sesame/src/main/java/org/apache/stanbol/entityhub/web/writer/sesame/SesameModelWriter.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/entityhub/web/sesame/src/main/java/org/apache/stanbol/entityhub/web/writer/sesame/SesameModelWriter.java?rev=1551134&view=auto
==============================================================================
--- stanbol/trunk/entityhub/web/sesame/src/main/java/org/apache/stanbol/entityhub/web/writer/sesame/SesameModelWriter.java (added)
+++ stanbol/trunk/entityhub/web/sesame/src/main/java/org/apache/stanbol/entityhub/web/writer/sesame/SesameModelWriter.java Mon Dec 16 09:18:20 2013
@@ -0,0 +1,265 @@
+package org.apache.stanbol.entityhub.web.writer.sesame;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.stanbol.commons.namespaceprefix.NamespacePrefixService;
+import org.apache.stanbol.entityhub.model.sesame.RdfRepresentation;
+import org.apache.stanbol.entityhub.model.sesame.RdfValueFactory;
+import org.apache.stanbol.entityhub.servicesapi.defaults.NamespaceEnum;
+import org.apache.stanbol.entityhub.servicesapi.model.Entity;
+import org.apache.stanbol.entityhub.servicesapi.model.Representation;
+import org.apache.stanbol.entityhub.servicesapi.model.rdf.RdfResourceEnum;
+import org.apache.stanbol.entityhub.servicesapi.query.FieldQuery;
+import org.apache.stanbol.entityhub.servicesapi.query.QueryResultList;
+import org.apache.stanbol.entityhub.web.ModelWriter;
+import org.apache.stanbol.entityhub.web.fieldquery.FieldQueryToJsonUtils;
+import org.apache.stanbol.entityhub.yard.sesame.SesameQueryResultList;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+import org.openrdf.model.Literal;
+import org.openrdf.model.Model;
+import org.openrdf.model.URI;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.model.impl.LinkedHashModel;
+import org.openrdf.model.impl.ValueFactoryImpl;
+import org.openrdf.rio.RDFFormat;
+import org.openrdf.rio.RDFHandlerException;
+import org.openrdf.rio.Rio;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component(immediate=true)
+@Service
+public class SesameModelWriter implements ModelWriter {
+
+ private final Logger log = LoggerFactory.getLogger(SesameModelWriter.class);
+
+ public static final MediaType TURTLE = MediaType.valueOf("text/turtle");
+ public static final MediaType JSONLD = MediaType.valueOf("application/ld+json");
+ public static final MediaType N3 = MediaType.valueOf("text/rdf+n3");
+ public static final MediaType N_TRIPLE = MediaType.valueOf("text/rdf+nt");
+ public static final MediaType RDF_JSON = MediaType.valueOf("application/rdf+json");
+ public static final MediaType RDF_XML = MediaType.valueOf("application/rdf+xml");
+ public static final MediaType X_TURTLE = MediaType.valueOf("application/x-turtle");
+
+ public static final List<MediaType> SUPPORTED_RDF_TYPES = Collections.unmodifiableList(
+ Arrays.asList(TURTLE, JSONLD, N3, N_TRIPLE, RDF_JSON, RDF_XML, X_TURTLE));
+
+ private final static RdfValueFactory valueFactory = RdfValueFactory.getInstance();
+ private final static ValueFactory sesameFactory = ValueFactoryImpl.getInstance();
+
+ private final static URI FOAF_DOCUMENT = sesameFactory.createURI(NamespaceEnum.foaf+"Document");
+ private final static URI FOAF_PRIMARY_TOPIC = sesameFactory.createURI(NamespaceEnum.foaf+"primaryTopic");
+ private final static URI FOAF_PRIMARY_TOPIC_OF = sesameFactory.createURI(NamespaceEnum.foaf+"isPrimaryTopicOf");
+ private final static URI RDF_TYPE = sesameFactory.createURI(NamespaceEnum.rdf+"type");
+ private final static URI EH_SIGN_SITE = sesameFactory.createURI(RdfResourceEnum.site.getUri());
+
+ /**
+ * The URI used for the query result list (static for all responses)
+ */
+ private static final URI QUERY_RESULT_LIST = sesameFactory.createURI(RdfResourceEnum.QueryResultSet.getUri());
+ /**
+ * The property used for all results
+ */
+ private static final URI QUERY_RESULT = sesameFactory.createURI(RdfResourceEnum.queryResult.getUri());
+ /**
+ * The property used for the JSON serialised FieldQuery (STANBOL-298)
+ */
+ private static final URI FIELD_QUERY = sesameFactory.createURI(RdfResourceEnum.query.getUri());
+
+
+ @Reference(cardinality=ReferenceCardinality.OPTIONAL_UNARY)
+ NamespacePrefixService nsPrefixService;
+
+ @Override
+ public Class<? extends Representation> getNativeType() {
+ return RdfRepresentation.class;
+ }
+
+ @Override
+ public List<MediaType> supportedMediaTypes() {
+ return SUPPORTED_RDF_TYPES;
+ }
+
+ @Override
+ public MediaType getBestMediaType(MediaType mediaType) {
+ for(MediaType supported : SUPPORTED_RDF_TYPES){
+ if(supported.isCompatible(mediaType)){
+ return supported;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void write(Representation rep, OutputStream out, MediaType mediaType) throws WebApplicationException,
+ IOException {
+ writeRdf(toRDF(rep), out, mediaType);
+ }
+
+ @Override
+ public void write(Entity entity, OutputStream out, MediaType mediaType) throws WebApplicationException,
+ IOException {
+ writeRdf(toRDF(entity), out, mediaType);
+ }
+
+ @Override
+ public void write(QueryResultList<?> result, OutputStream out, MediaType mediaType) throws WebApplicationException,
+ IOException {
+ Model queryRdf = toRDF(result);
+ //we need also to the JSON formatted FieldQuery as a literal to the
+ //RDF data.
+ FieldQuery query = result.getQuery();
+ if(query != null){
+ try {
+ JSONObject fieldQueryJson = FieldQueryToJsonUtils.toJSON(query,
+ nsPrefixService);
+ if(fieldQueryJson != null){
+ //add the triple with the fieldQuery
+ queryRdf.add(QUERY_RESULT_LIST, FIELD_QUERY,
+ sesameFactory.createLiteral(fieldQueryJson.toString()));
+ }
+ } catch (JSONException e) {
+ log.warn(String.format("Unable to serialize Fieldquery '%s' to JSON! "
+ + "Query response will not contain the serialized query.",
+ query),e);
+ }
+ }
+ //now serialise the data
+ writeRdf(queryRdf,out,mediaType);
+
+ }
+
+ /**
+ * @param data
+ * @param out
+ * @param mediaType
+ */
+ private void writeRdf(Model data, OutputStream out, MediaType mediaType) {
+ RDFFormat rdfFormat = Rio.getWriterFormatForMIMEType(mediaType.toString());
+ if(rdfFormat == null){
+ throw new IllegalStateException("JAX-RS called for unsupported mediaType '"
+ + mediaType +"'! If this is a valid RDF type this indicates a missing "
+ + "Sesame Serializer implementation. Otherwise please report this "
+ + "as a bug for the Stanbol Issue Tracker.");
+ }
+ try {
+ Rio.write(data, out, rdfFormat);
+ } catch (RDFHandlerException e) {
+ throw new WebApplicationException("Unable to serialize QueryResultList with requested Format '" +
+ rdfFormat +"'!", e);
+ }
+ }
+
+ private Model toRDF(Representation representation) {
+ return valueFactory.toRdfRepresentation(representation).getModel();
+ }
+
+ private void addRDFTo(Model graph, Representation representation) {
+ graph.addAll(valueFactory.toRdfRepresentation(representation).getModel());
+ }
+
+ private Model toRDF(Entity entity) {
+ Model graph = new LinkedHashModel();
+ addRDFTo(graph, entity);
+ return graph;
+ }
+
+ private void addRDFTo(Model graph, Entity entity) {
+ addRDFTo(graph, entity.getRepresentation());
+ addRDFTo(graph, entity.getMetadata());
+ //now add some triples that represent the Sign
+ addEntityTriplesToGraph(graph, entity);
+ }
+
+
+ /**
+ * Adds the Triples that represent the Sign to the parsed graph. Note that
+ * this method does not add triples for the representation. However it adds
+ * the triple (sign,singRepresentation,representation)
+ *
+ * @param graph the graph to add the triples
+ * @param sign the sign
+ */
+ private void addEntityTriplesToGraph(Model graph, Entity sign) {
+ URI id = sesameFactory.createURI(sign.getId());
+ URI metaId = sesameFactory.createURI(sign.getMetadata().getId());
+ //add the FOAF triples between metadata and content
+ graph.add(id, FOAF_PRIMARY_TOPIC_OF, metaId);
+ graph.add(metaId, FOAF_PRIMARY_TOPIC, metaId);
+ graph.add(metaId, RDF_TYPE, FOAF_DOCUMENT);
+ //add the site to the metadata
+ //TODO: this should be the HTTP URI and not the id of the referenced site
+ Literal siteName = sesameFactory.createLiteral(sign.getSite());
+ graph.add(metaId, EH_SIGN_SITE, siteName);
+
+ }
+
+ private Model toRDF(QueryResultList<?> resultList) {
+ final Model resultGraph;
+ Class<?> type = resultList.getType();
+ if (String.class.isAssignableFrom(type)) {
+ resultGraph = new LinkedHashModel(); //create a new Graph
+ for (Object result : resultList) {
+ //add a triple to each reference in the result set
+ resultGraph.add(QUERY_RESULT_LIST, QUERY_RESULT, sesameFactory.createURI(result.toString()));
+ }
+ } else {
+ //first determine the type of the resultList
+ final boolean isSignType;
+ if (Representation.class.isAssignableFrom(type)) {
+ isSignType = false;
+ } else if (Representation.class.isAssignableFrom(type)) {
+ isSignType = true;
+ } else {
+ //incompatible type -> throw an Exception
+ throw new IllegalArgumentException("Parsed type " + type + " is not supported");
+ }
+ //special treatment for RdfQueryResultList for increased performance
+ if (resultList instanceof SesameQueryResultList) {
+ resultGraph = ((SesameQueryResultList) resultList).getModel();
+ if (isSignType) { //if we build a ResultList for Signs, we need to do more things
+ //first remove all triples representing results
+ resultGraph.filter(null, QUERY_RESULT, null).clear();
+ //now add the Sign specific triples and add result triples
+ //to the Sign IDs
+ for (Object result : resultList) {
+ URI signId = sesameFactory.createURI(((Entity) result).getId());
+ addEntityTriplesToGraph(resultGraph, (Entity) result);
+ resultGraph.add(QUERY_RESULT_LIST, QUERY_RESULT, signId);
+ }
+ }
+ } else { //any other implementation of the QueryResultList interface
+ resultGraph = new LinkedHashModel(); //create a new graph
+ if (Representation.class.isAssignableFrom(type)) {
+ for (Object result : resultList) {
+ URI resultId;
+ if (!isSignType) {
+ addRDFTo(resultGraph, (Representation) result);
+ resultId = sesameFactory.createURI(((Representation) result).getId());
+ } else {
+ addRDFTo(resultGraph, (Entity) result);
+ resultId = sesameFactory.createURI(((Entity) result).getId());
+ }
+ //Note: In case of Representation this Triple points to
+ // the representation. In case of Signs it points to
+ // the sign.
+ resultGraph.add(QUERY_RESULT_LIST, QUERY_RESULT, resultId);
+ }
+ }
+ }
+ }
+ return resultGraph;
+ }
+}
Added: stanbol/trunk/entityhub/web/sesame/src/main/resources/OSGI-INF/metatype/metatype.properties
URL: http://svn.apache.org/viewvc/stanbol/trunk/entityhub/web/sesame/src/main/resources/OSGI-INF/metatype/metatype.properties?rev=1551134&view=auto
==============================================================================
--- stanbol/trunk/entityhub/web/sesame/src/main/resources/OSGI-INF/metatype/metatype.properties (added)
+++ stanbol/trunk/entityhub/web/sesame/src/main/resources/OSGI-INF/metatype/metatype.properties Mon Dec 16 09:18:20 2013
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+org.apache.stanbol.entityhub.web.writer.sesame.SesameModelWriter.name=Apache Stanbol Entityhub IO ModelWriter for Clerezza
+org.apache.stanbol.entityhub.web.writer.sesame.ClerzzaModelWriter.description=ModelWirter for various RDF formats \
+based on Apache Clerezza. Provides native support for serializing the Clerezza Model implementation.