You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by wi...@apache.org on 2014/10/27 09:01:37 UTC

[1/9] git commit: MARMOTTA-556: added new platform module for supporting Linked Data Fragments

Repository: marmotta
Updated Branches:
  refs/heads/MARMOTTA-556 [created] ec0b81967


MARMOTTA-556: added new platform module for supporting Linked Data Fragments


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/1a963336
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/1a963336
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/1a963336

Branch: refs/heads/MARMOTTA-556
Commit: 1a9633367cc4c70241580d58e8b8002433f8c67c
Parents: 85e5ff3
Author: Sergio Fernández <wi...@apache.org>
Authored: Fri Oct 24 12:52:15 2014 +0200
Committer: Sergio Fernández <wi...@apache.org>
Committed: Fri Oct 24 12:52:15 2014 +0200

----------------------------------------------------------------------
 platform/marmotta-ldf/pom.xml    | 260 ++++++++++++++++++++++++++++++++++
 platform/marmotta-ldp/pom.xml    |   2 +-
 platform/marmotta-sparql/pom.xml |   2 +-
 platform/pom.xml                 |  12 +-
 4 files changed, 268 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/1a963336/platform/marmotta-ldf/pom.xml
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/pom.xml b/platform/marmotta-ldf/pom.xml
new file mode 100644
index 0000000..cc3fd49
--- /dev/null
+++ b/platform/marmotta-ldf/pom.xml
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.marmotta</groupId>
+        <artifactId>marmotta-parent</artifactId>
+        <version>3.3.0-SNAPSHOT</version>
+        <relativePath>../../parent</relativePath>
+    </parent>
+
+    <artifactId>marmotta-ldf</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Apache Marmotta Platform: Linked Data Fragments</name>
+    <description>Provides support for the Linked Data Fragmets.</description>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin> <!-- generate JRebel Configuration -->
+                    <groupId>org.zeroturnaround</groupId>
+                    <artifactId>jrebel-maven-plugin</artifactId>
+                    <version>1.1.3</version>
+                    <executions>
+                        <execution>
+                            <id>generate-rebel-xml</id>
+                            <phase>process-resources</phase>
+                            <goals>
+                                <goal>generate</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                    <configuration>
+                        <relativePath>../../</relativePath>
+                        <rootPath>$${rebel.root}</rootPath>
+                        <classpath>
+                            <resources>
+                                <resource><!-- default resource --></resource>
+                                <resource><directory>src/main/resources</directory></resource>
+                            </resources>
+                        </classpath>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+
+        <plugins>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.marmotta</groupId>
+                <artifactId>buildinfo-maven-plugin</artifactId>
+                <configuration>
+                    <systemProperties>
+                        <systemProperty>user.name</systemProperty>
+                        <systemProperty>user.timezone</systemProperty>
+                        <systemProperty>java.vm.vendor</systemProperty>
+                        <systemProperty>java.vm.version</systemProperty>
+                        <systemProperty>java.vm.name</systemProperty>
+                        <systemProperty>java.runtime.version</systemProperty>
+                        <systemProperty>os.name</systemProperty>
+                        <systemProperty>os.version</systemProperty>
+                        <systemProperty>os.arch</systemProperty>
+                    </systemProperties>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>extract</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <executions>
+                    <!--
+                    <execution>
+                        <id>aggregate</id>
+                        <goals>
+                            <goal>aggregate</goal>
+                        </goals>
+                        <phase>site</phase>
+                    </execution>
+                    -->
+                    <execution>
+                        <!-- configure how the REST API documentation will be produced -->
+                        <id>restapi</id>
+                        <configuration>
+                            <doclet>com.lunatech.doclets.jax.jaxrs.JAXRSDoclet</doclet>
+
+                            <name>REST API</name>
+                            <description>REST API for Marmotta Webservices</description>
+
+                            <outputDirectory>${project.build.outputDirectory}/doc</outputDirectory>
+                            <reportOutputDirectory>${project.build.outputDirectory}/web/doc</reportOutputDirectory>
+                            <destDir>rest</destDir>
+
+                            <docletArtifact>
+                                <groupId>com.lunatech.jax-doclets</groupId>
+                                <artifactId>doclets</artifactId>
+                                <version>${jax.doclets.version}</version>
+                            </docletArtifact>
+                            <additionalparam>
+                                -jaxrscontext {BASE}
+                                -charset UTF-8
+                            </additionalparam>
+
+                            <!--
+                                                        <stylesheetfile>${project.parent.basedir}/config/doc/doclet.css</stylesheetfile>
+                            -->
+
+                            <header><![CDATA[<!--###BEGIN_CONTENT###--><div class="javadoc">]]></header>
+                            <footer><![CDATA[</div><!--###END_CONTENT###-->]]></footer>
+                            <encoding>UTF-8</encoding>
+                            <detectOfflineLinks>false</detectOfflineLinks>
+
+                            <!-- For the project-reports page -->
+                        </configuration>
+                        <goals>
+                            <goal>javadoc</goal>
+                        </goals>
+                        <phase>generate-resources</phase>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+            </plugin>
+
+        </plugins>
+
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.marmotta</groupId>
+            <artifactId>marmotta-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.resteasy</groupId>
+            <artifactId>resteasy-cdi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.resteasy</groupId>
+            <artifactId>resteasy-jackson2-provider</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.jaxrs</groupId>
+            <artifactId>jackson-jaxrs-json-provider</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.module</groupId>
+            <artifactId>jackson-module-jaxb-annotations</artifactId>
+        </dependency>
+        
+        <!-- testing -->
+        <dependency>
+            <groupId>org.apache.marmotta</groupId>
+            <artifactId>marmotta-core</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${jetty.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlet</artifactId>
+            <version>${jetty.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.weld.se</groupId>
+            <artifactId>weld-se-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.el</groupId>
+            <artifactId>javax.el-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.jayway.restassured</groupId>
+            <artifactId>rest-assured</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-library</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.marmotta</groupId>
+            <artifactId>marmotta-sesame-matchers</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.openrdf.sesame</groupId>
+            <artifactId>sesame-sail-memory</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+</project>

http://git-wip-us.apache.org/repos/asf/marmotta/blob/1a963336/platform/marmotta-ldp/pom.xml
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/pom.xml b/platform/marmotta-ldp/pom.xml
index 8675e32..e396eae 100644
--- a/platform/marmotta-ldp/pom.xml
+++ b/platform/marmotta-ldp/pom.xml
@@ -28,7 +28,7 @@
     <artifactId>marmotta-ldp</artifactId>
     <packaging>jar</packaging>
 
-    <name>Apache Marmotta Platform: LDP</name>
+    <name>Apache Marmotta Platform: Linked Data Platform 1.0</name>
     <description>
         Provides support for the current working draft of the
         Linked Data Platform 1.0 specification.

http://git-wip-us.apache.org/repos/asf/marmotta/blob/1a963336/platform/marmotta-sparql/pom.xml
----------------------------------------------------------------------
diff --git a/platform/marmotta-sparql/pom.xml b/platform/marmotta-sparql/pom.xml
index 6fa236a..3114bda 100644
--- a/platform/marmotta-sparql/pom.xml
+++ b/platform/marmotta-sparql/pom.xml
@@ -28,7 +28,7 @@
     <artifactId>marmotta-sparql</artifactId>
     <packaging>jar</packaging>
 
-    <name>Apache Marmotta Platform: SPARQL Endpoint</name>
+    <name>Apache Marmotta Platform: SPARQL 1.1</name>
     <description>
         Provides support for SPARQL 1.1 Queries and Updates and offers different 
         UIs for exploring SPARQL results.

http://git-wip-us.apache.org/repos/asf/marmotta/blob/1a963336/platform/pom.xml
----------------------------------------------------------------------
diff --git a/platform/pom.xml b/platform/pom.xml
index 2a44408..adf7f80 100644
--- a/platform/pom.xml
+++ b/platform/pom.xml
@@ -70,20 +70,20 @@
         <module>backends</module>
         <module>ldcache</module>
 
-        <!-- LDP -->
-        <module>marmotta-ldp</module>
-
         <!-- generic modules -->
+        <module>marmotta-sparql</module>
+        <module>marmotta-ldp</module>
         <module>marmotta-ldpath</module>
+        <module>marmotta-ldf</module>
+
+        <!-- security modules -->
         <module>marmotta-security</module>
-        <module>marmotta-sparql</module>
         <module>marmotta-user</module>
 
-        <module>marmotta-versioning-common</module>
-
         <!-- KiWi backend specific modules -->
         <module>marmotta-reasoner-kiwi</module>
         <module>marmotta-versioning-kiwi</module>
+        <module>marmotta-versioning-common</module>
 
         <!-- Cloud Integration -->
         <module>marmotta-zookeeper</module>


[2/9] git commit: MARMOTTA-556: added basic service implementation of Linked Data Fragments

Posted by wi...@apache.org.
MARMOTTA-556: added basic service implementation of Linked Data Fragments


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/d0dbb7d5
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/d0dbb7d5
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/d0dbb7d5

Branch: refs/heads/MARMOTTA-556
Commit: d0dbb7d59c63780ac5acfb1f18a49769b3c8e550
Parents: 1a96333
Author: Sergio Fernández <wi...@apache.org>
Authored: Fri Oct 24 18:31:25 2014 +0200
Committer: Sergio Fernández <wi...@apache.org>
Committed: Fri Oct 24 18:31:25 2014 +0200

----------------------------------------------------------------------
 platform/marmotta-ldf/pom.xml                   |   4 +
 .../marmotta/platform/ldf/api/LdfService.java   |  65 +++++++++++
 .../platform/ldf/logging/LdfLoggingModule.java  |  55 +++++++++
 .../platform/ldf/services/LdfServiceImpl.java   |  62 ++++++++++
 .../platform/ldf/sesame/PagedRDFHandler.java    | 114 +++++++++++++++++++
 5 files changed, 300 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/d0dbb7d5/platform/marmotta-ldf/pom.xml
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/pom.xml b/platform/marmotta-ldf/pom.xml
index cc3fd49..de1ae45 100644
--- a/platform/marmotta-ldf/pom.xml
+++ b/platform/marmotta-ldf/pom.xml
@@ -165,6 +165,10 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.openrdf.sesame</groupId>
+            <artifactId>sesame-rio-api</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.jboss.resteasy</groupId>
             <artifactId>resteasy-cdi</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/marmotta/blob/d0dbb7d5/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
new file mode 100644
index 0000000..2d7e3e2
--- /dev/null
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
@@ -0,0 +1,65 @@
+package org.apache.marmotta.platform.ldf.api;
+
+import org.openrdf.model.Model;
+import org.openrdf.model.Resource;
+import org.openrdf.model.URI;
+import org.openrdf.rio.RDFFormat;
+/*
+ * 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.
+ */
+import org.openrdf.model.Value;
+import org.openrdf.repository.RepositoryException;
+
+import java.io.OutputStream;
+
+/**
+ * Linked Media Fragments service
+ *
+ * @author Sergio Fernández
+ */
+public interface LdfService {
+
+    /**
+     * Writes a fragment matching the specified triple fragment pattern
+     * specified (null values are wildcards).
+     *
+     * @param subject fragment subject
+     * @param predicate fragmnent predicate
+     * @param object fragment object
+     * @param offset index at which to start the page
+     * @param limit maximum number of triples
+     * @param format RDF serialization
+     * @param out output stream where write the fragment
+     */
+    void writeFragment(URI subject, URI predicate, Value object, int offset, int limit, RDFFormat format, OutputStream out) throws RepositoryException;
+
+    /**
+     * Writes a fragment matching the specified quad fragment pattern
+     * specified (null values are wildcards).
+     *
+     * @param subject fragment subject
+     * @param predicate fragmnent predicate
+     * @param object fragment object
+     * @param context named graph
+     * @param offset index at which to start the page
+     * @param limit maximum number of triples
+     * @param format RDF serialization
+     * @param out output stream where write the fragment
+     */
+    void writeFragment(URI subject, URI predicate, Value object, Resource context, int offset, int limit, RDFFormat format, OutputStream out) throws RepositoryException;
+
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/d0dbb7d5/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/logging/LdfLoggingModule.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/logging/LdfLoggingModule.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/logging/LdfLoggingModule.java
new file mode 100644
index 0000000..54a6495
--- /dev/null
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/logging/LdfLoggingModule.java
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+package org.apache.marmotta.platform.ldf.logging;
+
+import ch.qos.logback.classic.Level;
+import org.apache.marmotta.platform.core.logging.BaseLoggingModule;
+
+import javax.enterprise.context.ApplicationScoped;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Logging Module for LDF
+ *
+ * @author Sergio Fernández
+ */
+@ApplicationScoped
+public class LdfLoggingModule extends BaseLoggingModule {
+
+    @Override
+    public String getId() {
+        return "ldf";
+    }
+
+    @Override
+    public String getName() {
+        return "LDF";
+    }
+
+    @Override
+    public Collection<String> getPackages() {
+        return Collections.singleton("org.apache.marmotta.platform.ldf");
+    }
+
+    @Override
+    public Level getDefaultLevel() {
+        return Level.DEBUG;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/d0dbb7d5/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
new file mode 100644
index 0000000..49ca8ff
--- /dev/null
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ */
+package org.apache.marmotta.platform.ldf.services;
+
+import org.apache.marmotta.commons.sesame.repository.ResultUtils;
+import org.apache.marmotta.platform.core.api.triplestore.SesameService;
+import org.apache.marmotta.platform.ldf.api.LdfService;
+import org.apache.marmotta.platform.ldf.sesame.PagedRDFHandler;
+import org.openrdf.model.*;
+import org.openrdf.repository.RepositoryConnection;
+import org.openrdf.repository.RepositoryException;
+import org.openrdf.repository.RepositoryResult;
+import org.openrdf.rio.*;
+
+import javax.inject.Inject;
+import java.io.OutputStream;
+
+/**
+ * Linked Media Fragments service implementation
+ *
+ * @author Sergio Fernández
+ */
+public class LdfServiceImpl implements LdfService {
+
+    @Inject
+    private SesameService sesameService;
+
+    @Override
+    public void writeFragment(URI subject, URI predicate, Value object, int offset, int limit, RDFFormat format, OutputStream out) throws RepositoryException {
+        writeFragment(subject, predicate, object, null, offset, limit, format, out);
+    }
+
+    @Override
+    public void writeFragment(URI subject, URI predicate, Value object, Resource context, int offset, int limit, RDFFormat format, OutputStream out) throws RepositoryException {
+        final RepositoryConnection conn = sesameService.getConnection();
+        try {
+            conn.begin();
+            RepositoryResult<Statement> statements = conn.getStatements(subject, predicate, object, true, context);
+            RDFHandler handler = new PagedRDFHandler(Rio.createWriter(format, out), offset, limit);
+            Rio.write(ResultUtils.iterable(statements), handler);
+        } catch (RDFHandlerException e) {
+            e.printStackTrace();
+        } finally {
+            conn.close();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/d0dbb7d5/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/PagedRDFHandler.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/PagedRDFHandler.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/PagedRDFHandler.java
new file mode 100644
index 0000000..36f59cf
--- /dev/null
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/PagedRDFHandler.java
@@ -0,0 +1,114 @@
+/*
+ * 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.
+ */
+package org.apache.marmotta.platform.ldf.sesame;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import org.openrdf.model.Literal;
+import org.openrdf.model.Resource;
+import org.openrdf.model.Statement;
+import org.openrdf.rio.RDFHandler;
+import org.openrdf.rio.RDFHandlerException;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Paginates statements before sending them to the delegated RDFHandler.
+ * (TODO: find a more performance solution)
+ *
+ * @author Sergio Fernández
+ */
+public class PagedRDFHandler implements RDFHandler {
+
+    private List<Statement> statements;
+    private RDFHandler handler;
+    private int offset;
+    private int limit;
+
+    /**
+     * Constructs a PagedRDFHandler with a delegate handler
+     *
+     * @param handler The handler to delegate the calls to
+     */
+    public PagedRDFHandler(RDFHandler handler, int offset, int limit) {
+        super();
+        this.statements = new ArrayList<>();
+        this.handler = handler;
+        this.offset = offset;
+        this.limit = limit;
+    }
+
+    @Override
+    public void startRDF() throws RDFHandlerException {
+        handler.startRDF();
+    }
+
+    @Override
+    public void endRDF() throws RDFHandlerException {
+        //first order by a fixed criteria
+        Collections.sort(statements, new Comparator<Statement>() {
+            @Override
+            public int compare(Statement s1, Statement s2) {
+                int subjectComparison = s1.getSubject().stringValue().compareTo(s2.getSubject().stringValue());
+                int predicatedComparison = s1.getPredicate().stringValue().compareTo(s2.getPredicate().stringValue());
+
+                if (subjectComparison != 0) {
+                    return subjectComparison;
+                } else if (predicatedComparison != 0) {
+                    return predicatedComparison;
+                } else if((s1.getObject() instanceof Literal) && (s2.getObject() instanceof Resource)) {
+                    return 1;
+                } else if((s1.getObject() instanceof Resource) && (s2.getObject() instanceof Literal)) {
+                    return -1;
+                } else {
+                    return s1.getObject().stringValue().compareTo(s2.getObject().stringValue());
+                }
+            }
+        });
+
+        //then filter
+        List<Statement> filteredStatements = Lists.newArrayList(Iterables.limit(statements, 20));
+
+        //send statements to delegate writer
+        for (Statement statement : filteredStatements) {
+            handler.handleStatement(statement);
+        }
+
+        //and actually end the rdf
+        handler.endRDF();
+    }
+
+    @Override
+    public void handleNamespace(String prefix, String uri) throws RDFHandlerException {
+        handler.handleNamespace(prefix, uri);
+    }
+
+    @Override
+    public void handleStatement(Statement statement) throws RDFHandlerException {
+        statements.add(statement);
+    }
+
+    @Override
+    public void handleComment(String comment) throws RDFHandlerException {
+        handler.handleComment(comment);
+    }
+
+}


[4/9] git commit: MARMOTTA-556: fixed api usage

Posted by wi...@apache.org.
MARMOTTA-556: fixed api usage


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/4bcec931
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/4bcec931
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/4bcec931

Branch: refs/heads/MARMOTTA-556
Commit: 4bcec931608f6150eddb1f14867560d1c72b3201
Parents: 30d351d
Author: Sergio Fernández <wi...@apache.org>
Authored: Fri Oct 24 19:45:14 2014 +0200
Committer: Sergio Fernández <wi...@apache.org>
Committed: Fri Oct 24 19:45:14 2014 +0200

----------------------------------------------------------------------
 .../marmotta/platform/ldf/services/LdfServiceImpl.java       | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/4bcec931/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
index f9e1ea5..9da59b8 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
@@ -41,17 +41,17 @@ public class LdfServiceImpl implements LdfService {
     private SesameService sesameService;
 
     @Override
-    public void writeFragment(URI subject, URI predicate, Value object, int offset, int limit, RDFFormat format, OutputStream out) throws RepositoryException {
-        writeFragment(subject, predicate, object, null, offset, limit, format, out);
+    public void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException {
+        writeFragment(subject, predicate, object, null, page, format, out);
     }
 
     @Override
-    public void writeFragment(URI subject, URI predicate, Value object, Resource context, int offset, int limit, RDFFormat format, OutputStream out) throws RepositoryException {
+    public void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException {
         final RepositoryConnection conn = sesameService.getConnection();
         try {
             conn.begin();
             RepositoryResult<Statement> statements = conn.getStatements(subject, predicate, object, true, context);
-            RDFHandler handler = new LdfRDFHandler(Rio.createWriter(format, out), context, offset, limit);
+            RDFHandler handler = new LdfRDFHandler(Rio.createWriter(format, out), context, page);
             Rio.write(ResultUtils.iterable(statements), handler);
         } catch (RDFHandlerException e) {
             e.printStackTrace();


[9/9] git commit: MARMOTTA-556: minor details in the ldf module

Posted by wi...@apache.org.
MARMOTTA-556: minor details in the ldf module


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/ec0b8196
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/ec0b8196
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/ec0b8196

Branch: refs/heads/MARMOTTA-556
Commit: ec0b81967b46126035c3edaeebf836557be7b697
Parents: 22d16b3
Author: Sergio Fernández <wi...@apache.org>
Authored: Mon Oct 27 09:01:18 2014 +0100
Committer: Sergio Fernández <wi...@apache.org>
Committed: Mon Oct 27 09:01:18 2014 +0100

----------------------------------------------------------------------
 .../marmotta/platform/ldf/api/LdfService.java   |  8 +--
 .../platform/ldf/services/LdfServiceImpl.java   |  8 +--
 .../platform/ldf/sesame/LdfRDFHandler.java      | 55 +++++++++++---------
 .../src/main/resources/META-INF/beans.xml       | 28 ++++++++++
 .../src/main/resources/kiwi-module.properties   | 28 ++++++++++
 5 files changed, 95 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/ec0b8196/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
index a1d2dce..c2d7dff 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
@@ -46,7 +46,7 @@ public interface LdfService {
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
-    void writeFragment(String subject, String predicate, String object, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException;
+    void writeFragment(String subject, String predicate, String object, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException, IllegalArgumentException;
 
     /**
      * Writes a fragment matching the specified triple fragment pattern
@@ -59,7 +59,7 @@ public interface LdfService {
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
-    void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException;
+    void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException, IllegalArgumentException;
 
     /**
      * Writes a fragment matching the specified quad fragment pattern
@@ -73,7 +73,7 @@ public interface LdfService {
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
-    void writeFragment(String subject, String predicate, String object, String context, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException;
+    void writeFragment(String subject, String predicate, String object, String context, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException, IllegalArgumentException;
 
     /**
      * Writes a fragment matching the specified quad fragment pattern
@@ -87,6 +87,6 @@ public interface LdfService {
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
-    void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException;
+    void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException, IllegalArgumentException;
 
 }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/ec0b8196/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
index 580cb25..4ccdfeb 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
@@ -48,17 +48,17 @@ public class LdfServiceImpl implements LdfService {
     private SesameService sesameService;
 
     @Override
-    public void writeFragment(String subjectStr, String predicateStr, String objectStr, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException {
+    public void writeFragment(String subjectStr, String predicateStr, String objectStr, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException, IllegalArgumentException {
         writeFragment(subjectStr, predicateStr, objectStr, null, page, format, out);
     }
 
     @Override
-    public void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException {
+    public void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException, IllegalArgumentException {
         writeFragment(subject, predicate, object, null, page, format, out);
     }
 
     @Override
-    public void writeFragment(String subjectStr, String predicateStr, String objectStr, String contextStr, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException {
+    public void writeFragment(String subjectStr, String predicateStr, String objectStr, String contextStr, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException, IllegalArgumentException {
         final ValueFactoryImpl vf = new ValueFactoryImpl();
 
         URI subject = null;
@@ -105,7 +105,7 @@ public class LdfServiceImpl implements LdfService {
     }
 
     @Override
-    public void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException {
+    public void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException, IllegalArgumentException {
         final RepositoryConnection conn = sesameService.getConnection();
         try {
             conn.begin();

http://git-wip-us.apache.org/repos/asf/marmotta/blob/ec0b8196/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
index 5164705..34ed85b 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
@@ -29,6 +29,7 @@ import org.openrdf.model.Statement;
 import org.openrdf.model.impl.StatementImpl;
 import org.openrdf.model.impl.ValueFactoryImpl;
 import org.openrdf.model.vocabulary.RDF;
+import org.openrdf.model.vocabulary.RDFS;
 import org.openrdf.rio.RDFHandler;
 import org.openrdf.rio.RDFHandlerException;
 
@@ -104,6 +105,8 @@ public class LdfRDFHandler implements RDFHandler {
 
     @Override
     public void endRDF() throws RDFHandlerException {
+        final ValueFactoryImpl vf = new ValueFactoryImpl();
+
         //first order by a fixed criteria
         Collections.sort(statements, new Comparator<Statement>() {
             @Override
@@ -128,33 +131,37 @@ public class LdfRDFHandler implements RDFHandler {
         final int size = statements.size();
         final int offset = LdfService.PAGE_SIZE * (page - 1);
         if (offset > size) {
-            throw new RDFHandlerException("page " + page + " can't be generated");
-        }
-        final int limit = LdfService.PAGE_SIZE < size-offset ? LdfService.PAGE_SIZE : size-offset;
-        List<Statement> filteredStatements = statements.subList(offset, limit);
-
-        //send statements to delegate writer
-        for (Statement statement : filteredStatements) {
-            handler.handleStatement(statement);
-        }
-
-        //add ldf metadata
-        final ValueFactoryImpl vf = new ValueFactoryImpl();
+            //throw new RDFHandlerException("page " + page + " can't be generated");
+            Resource error = this.context != null ? this.context : vf.createBNode();
+            handler.handleStatement(new StatementImpl(error, RDF.TYPE, HYDRA.Error));
+            handler.handleStatement(new StatementImpl(error, RDFS.COMMENT, vf.createLiteral("page " + page + " can't be generated", "en")));
+        } else {
+            final int limit = LdfService.PAGE_SIZE < size - offset ? LdfService.PAGE_SIZE : size - offset;
+            List<Statement> filteredStatements = statements.subList(offset, limit);
+
+            //send statements to delegate writer
+            for (Statement statement : filteredStatements) {
+                handler.handleStatement(statement);
+            }
 
-        Resource dataset = this.context != null ? this.context : vf.createBNode();
-        handler.handleStatement(new StatementImpl(dataset, RDF.TYPE, VOID.Dataset));
-        handler.handleStatement(new StatementImpl(dataset, RDF.TYPE, HYDRA.Collection));
+            //add ldf metadata
+            Resource dataset = this.context != null ? this.context : vf.createBNode();
+            handler.handleStatement(new StatementImpl(dataset, RDF.TYPE, VOID.Dataset));
+            handler.handleStatement(new StatementImpl(dataset, RDF.TYPE, HYDRA.Collection));
 
-        Resource fragment = vf.createBNode(); //TODO
-        handler.handleStatement(new StatementImpl(dataset, VOID.subset, fragment));
-        handler.handleStatement(new StatementImpl(fragment, RDF.TYPE, HYDRA.Collection));
-        if (offset != 0 && limit != size) handler.handleStatement(new StatementImpl(fragment, RDF.TYPE, HYDRA.PagedCollection));
-        handler.handleStatement(new StatementImpl(fragment, VOID.triples, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)));
-        handler.handleStatement(new StatementImpl(fragment, HYDRA.totalItems, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)));
-        handler.handleStatement(new StatementImpl(fragment, HYDRA.itemsPerPage, vf.createLiteral(Integer.toString(LdfService.PAGE_SIZE), XSD.Integer)));
-        //TODO: HYDRA_FIRSTPAGE, HYDRA_PREVIOUSPAGE, HYDRA_NEXTPAGE
+            Resource fragment = vf.createBNode(); //TODO
+            handler.handleStatement(new StatementImpl(dataset, VOID.subset, fragment));
+            handler.handleStatement(new StatementImpl(fragment, RDF.TYPE, HYDRA.Collection));
+            if (offset != 0 && limit != size) {
+                handler.handleStatement(new StatementImpl(fragment, RDF.TYPE, HYDRA.PagedCollection));
+            }
+            handler.handleStatement(new StatementImpl(fragment, VOID.triples, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)));
+            handler.handleStatement(new StatementImpl(fragment, HYDRA.totalItems, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)));
+            handler.handleStatement(new StatementImpl(fragment, HYDRA.itemsPerPage, vf.createLiteral(Integer.toString(LdfService.PAGE_SIZE), XSD.Integer)));
+            //TODO: HYDRA_FIRSTPAGE, HYDRA_PREVIOUSPAGE, HYDRA_NEXTPAGE
 
-        //TODO: hydra controls
+            //TODO: hydra controls
+        }
 
         //and actually end the rdf
         handler.endRDF();

http://git-wip-us.apache.org/repos/asf/marmotta/blob/ec0b8196/platform/marmotta-ldf/src/main/resources/META-INF/beans.xml
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/resources/META-INF/beans.xml b/platform/marmotta-ldf/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..6a9575d
--- /dev/null
+++ b/platform/marmotta-ldf/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans
+        xmlns="http://java.sun.com/xml/ns/javaee"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="
+      http://java.sun.com/xml/ns/javaee
+      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
+
+</beans>

http://git-wip-us.apache.org/repos/asf/marmotta/blob/ec0b8196/platform/marmotta-ldf/src/main/resources/kiwi-module.properties
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/resources/kiwi-module.properties b/platform/marmotta-ldf/src/main/resources/kiwi-module.properties
new file mode 100644
index 0000000..ee47136
--- /dev/null
+++ b/platform/marmotta-ldf/src/main/resources/kiwi-module.properties
@@ -0,0 +1,28 @@
+#
+# 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.
+#
+
+name=LDF
+weight = 60
+container = Query and Update
+container.weight = 12
+
+baseurl=/ldf
+
+subtitle = Linked Data Fragments
+
+webservices=org.apache.marmotta.platform.ldf.webservices.LdfWebService


[5/9] git commit: MARMOTTA-556: fixed api

Posted by wi...@apache.org.
MARMOTTA-556: fixed api


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/374d3811
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/374d3811
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/374d3811

Branch: refs/heads/MARMOTTA-556
Commit: 374d38116730db078187b4c076e979d226525be8
Parents: 4bcec93
Author: Sergio Fernández <wi...@apache.org>
Authored: Fri Oct 24 19:47:04 2014 +0200
Committer: Sergio Fernández <wi...@apache.org>
Committed: Fri Oct 24 19:47:04 2014 +0200

----------------------------------------------------------------------
 .../apache/marmotta/platform/ldf/api/LdfService.java    | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/374d3811/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
index c0a9876..1652818 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
@@ -32,6 +32,8 @@ import java.io.OutputStream;
  */
 public interface LdfService {
 
+    final static int PAGE_SIZE = 100;
+
     /**
      * Writes a fragment matching the specified triple fragment pattern
      * specified (null values are wildcards).
@@ -39,12 +41,11 @@ public interface LdfService {
      * @param subject fragment subject
      * @param predicate fragmnent predicate
      * @param object fragment object
-     * @param offset index at which to start the page
-     * @param limit maximum number of triples
+     * @param page number of page (starting with 1)
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
-    void writeFragment(URI subject, URI predicate, Value object, int offset, int limit, RDFFormat format, OutputStream out) throws RepositoryException;
+    void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException;
 
     /**
      * Writes a fragment matching the specified quad fragment pattern
@@ -54,11 +55,10 @@ public interface LdfService {
      * @param predicate fragmnent predicate
      * @param object fragment object
      * @param context named graph
-     * @param offset index at which to start the page
-     * @param limit maximum number of triples
+     * @param page number of page (starting with 1)
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
-    void writeFragment(URI subject, URI predicate, Value object, Resource context, int offset, int limit, RDFFormat format, OutputStream out) throws RepositoryException;
+    void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException;
 
 }


[8/9] git commit: MARMOTTA-556: fixed dataset support

Posted by wi...@apache.org.
MARMOTTA-556: fixed dataset support


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/22d16b35
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/22d16b35
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/22d16b35

Branch: refs/heads/MARMOTTA-556
Commit: 22d16b352a87d1ac7366f79b027a6137da756ebc
Parents: d99de51
Author: Sergio Fernández <wi...@apache.org>
Authored: Fri Oct 24 22:02:25 2014 +0200
Committer: Sergio Fernández <wi...@apache.org>
Committed: Fri Oct 24 22:02:25 2014 +0200

----------------------------------------------------------------------
 .../marmotta/platform/ldf/api/LdfService.java   |  9 +++---
 .../platform/ldf/services/LdfServiceImpl.java   | 14 ++++-----
 .../platform/ldf/sesame/LdfRDFHandler.java      |  2 +-
 .../platform/ldf/webservices/LdfWebService.java | 33 +++++++-------------
 4 files changed, 25 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/22d16b35/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
index 9496589..a1d2dce 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
@@ -22,6 +22,7 @@ import org.openrdf.model.URI;
 import org.openrdf.rio.RDFFormat;
 import org.openrdf.model.Value;
 import org.openrdf.repository.RepositoryException;
+import org.openrdf.rio.RDFHandlerException;
 
 import java.io.OutputStream;
 
@@ -45,7 +46,7 @@ public interface LdfService {
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
-    void writeFragment(String subject, String predicate, String object, int page, RDFFormat format, OutputStream out) throws RepositoryException;
+    void writeFragment(String subject, String predicate, String object, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException;
 
     /**
      * Writes a fragment matching the specified triple fragment pattern
@@ -58,7 +59,7 @@ public interface LdfService {
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
-    void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException;
+    void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException;
 
     /**
      * Writes a fragment matching the specified quad fragment pattern
@@ -72,7 +73,7 @@ public interface LdfService {
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
-    void writeFragment(String subject, String predicate, String object, String context, int page, RDFFormat format, OutputStream out) throws RepositoryException;
+    void writeFragment(String subject, String predicate, String object, String context, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException;
 
     /**
      * Writes a fragment matching the specified quad fragment pattern
@@ -86,6 +87,6 @@ public interface LdfService {
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
-    void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException;
+    void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException;
 
 }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/22d16b35/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
index 3f906da..580cb25 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
@@ -48,17 +48,17 @@ public class LdfServiceImpl implements LdfService {
     private SesameService sesameService;
 
     @Override
-    public void writeFragment(String subjectStr, String predicateStr, String objectStr, int page, RDFFormat format, OutputStream out) throws RepositoryException {
+    public void writeFragment(String subjectStr, String predicateStr, String objectStr, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException {
         writeFragment(subjectStr, predicateStr, objectStr, null, page, format, out);
     }
 
     @Override
-    public void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException {
+    public void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException {
         writeFragment(subject, predicate, object, null, page, format, out);
     }
 
     @Override
-    public void writeFragment(String subjectStr, String predicateStr, String objectStr, String contextStr, int page, RDFFormat format, OutputStream out) throws RepositoryException {
+    public void writeFragment(String subjectStr, String predicateStr, String objectStr, String contextStr, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException {
         final ValueFactoryImpl vf = new ValueFactoryImpl();
 
         URI subject = null;
@@ -105,17 +105,17 @@ public class LdfServiceImpl implements LdfService {
     }
 
     @Override
-    public void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException {
+    public void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException, RDFHandlerException {
         final RepositoryConnection conn = sesameService.getConnection();
         try {
             conn.begin();
             RepositoryResult<Statement> statements = conn.getStatements(subject, predicate, object, true, context);
             RDFHandler handler = new LdfRDFHandler(Rio.createWriter(format, out), context, page);
             Rio.write(ResultUtils.iterable(statements), handler);
-        } catch (RDFHandlerException e) {
-            e.printStackTrace();
         } finally {
-            conn.close();
+            if (conn != null && conn.isOpen()) {
+                conn.close();
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/marmotta/blob/22d16b35/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
index 2ba0e21..5164705 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
@@ -128,7 +128,7 @@ public class LdfRDFHandler implements RDFHandler {
         final int size = statements.size();
         final int offset = LdfService.PAGE_SIZE * (page - 1);
         if (offset > size) {
-            throw new IllegalArgumentException("page " + page + " can't be generated");
+            throw new RDFHandlerException("page " + page + " can't be generated");
         }
         final int limit = LdfService.PAGE_SIZE < size-offset ? LdfService.PAGE_SIZE : size-offset;
         List<Statement> filteredStatements = statements.subList(offset, limit);

http://git-wip-us.apache.org/repos/asf/marmotta/blob/22d16b35/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java
index cc09402..0cc1f09 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java
@@ -9,6 +9,7 @@ import org.apache.marmotta.platform.core.util.WebServiceUtil;
 import org.apache.marmotta.platform.ldf.api.LdfService;
 import org.openrdf.repository.RepositoryException;
 import org.openrdf.rio.RDFFormat;
+import org.openrdf.rio.RDFHandlerException;
 import org.openrdf.rio.Rio;
 
 import javax.enterprise.context.ApplicationScoped;
@@ -50,7 +51,6 @@ public class LdfWebService {
                                 @QueryParam("object") @DefaultValue("") String object,
                                 @QueryParam("page") @DefaultValue("1") String page,
                                 @HeaderParam("Accept") String accept) {
-        System.out.println("1");
         return getFragment(subject, predicate, object, null, Integer.parseInt(page), accept);
     }
 
@@ -62,7 +62,6 @@ public class LdfWebService {
                                 @QueryParam("page") @DefaultValue("1") String page,
                                 @PathParam("uuid") String uuid,
                                 @HeaderParam("Accept") String accept) {
-        System.out.println("2");
         final String context = buildContextUri(uuid);
         return getFragment(subject, predicate, object, context, Integer.parseInt(page), accept);
     }
@@ -73,26 +72,19 @@ public class LdfWebService {
                                  final String context,
                                  final int page,
                                  final String accept) {
-        System.out.println("3");
         final RDFFormat format = getFormat(accept);
 
-        try {
-            StreamingOutput stream = new StreamingOutput() {
-                @Override
-                public void write(OutputStream outputStream) throws IOException, WebApplicationException {
-                    try {
-                        ldfService.writeFragment(subject, predicate, object, context, page, format, outputStream);
-                    } catch (RepositoryException e) {
-                        throw new WebApplicationException(e);
-                    }
+        StreamingOutput stream = new StreamingOutput() {
+            @Override
+            public void write(OutputStream outputStream) throws IOException, WebApplicationException {
+                try {
+                    ldfService.writeFragment(subject, predicate, object, context, page, format, outputStream);
+                } catch (RepositoryException | RDFHandlerException | IllegalArgumentException e) {
+                    throw new WebApplicationException(e);
                 }
-            };
-            return Response.ok(stream).build();
-        } catch (WebApplicationException e) {
-            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
-        } catch (IllegalArgumentException e) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-        }
+            }
+        };
+        return Response.ok(stream).build();
     }
 
     private RDFFormat getFormat(String accept) {
@@ -105,8 +97,7 @@ public class LdfWebService {
 
     private String buildContextUri(String uuid) {
         if (StringUtils.isNotBlank(uuid)) {
-            String root = configurationService.getBaseUri();
-            return root.substring(0, root.length() - 1) + WebServiceUtil.getResourcePath(this) + "/" + uuid;
+            return configurationService.getBaseUri() + ConfigurationService.CONTEXT_PATH + "/" + uuid;
         } else {
             return null;
         }


[3/9] git commit: MARMOTTA-556: added basic ldf metadata

Posted by wi...@apache.org.
MARMOTTA-556: added basic ldf metadata


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/30d351dc
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/30d351dc
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/30d351dc

Branch: refs/heads/MARMOTTA-556
Commit: 30d351dc62b2a1063cc2ded881a26bd2ed852ccc
Parents: d0dbb7d
Author: Sergio Fernández <wi...@apache.org>
Authored: Fri Oct 24 19:41:18 2014 +0200
Committer: Sergio Fernández <wi...@apache.org>
Committed: Fri Oct 24 19:41:18 2014 +0200

----------------------------------------------------------------------
 .../marmotta/platform/ldf/api/LdfService.java   |  11 +-
 .../platform/ldf/services/LdfServiceImpl.java   |   4 +-
 .../platform/ldf/sesame/LdfRDFHandler.java      | 179 ++++++
 .../platform/ldf/sesame/PagedRDFHandler.java    | 114 ----
 .../marmotta/platform/ldf/vocab/HYDRA.java      | 600 +++++++++++++++++++
 .../marmotta/platform/ldf/vocab/VOID.java       | 435 ++++++++++++++
 6 files changed, 1221 insertions(+), 122 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/30d351dc/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
index 2d7e3e2..c0a9876 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
@@ -1,9 +1,3 @@
-package org.apache.marmotta.platform.ldf.api;
-
-import org.openrdf.model.Model;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.rio.RDFFormat;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements. See the NOTICE file
@@ -21,6 +15,11 @@ import org.openrdf.rio.RDFFormat;
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.marmotta.platform.ldf.api;
+
+import org.openrdf.model.Resource;
+import org.openrdf.model.URI;
+import org.openrdf.rio.RDFFormat;
 import org.openrdf.model.Value;
 import org.openrdf.repository.RepositoryException;
 

http://git-wip-us.apache.org/repos/asf/marmotta/blob/30d351dc/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
index 49ca8ff..f9e1ea5 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
@@ -20,7 +20,7 @@ package org.apache.marmotta.platform.ldf.services;
 import org.apache.marmotta.commons.sesame.repository.ResultUtils;
 import org.apache.marmotta.platform.core.api.triplestore.SesameService;
 import org.apache.marmotta.platform.ldf.api.LdfService;
-import org.apache.marmotta.platform.ldf.sesame.PagedRDFHandler;
+import org.apache.marmotta.platform.ldf.sesame.LdfRDFHandler;
 import org.openrdf.model.*;
 import org.openrdf.repository.RepositoryConnection;
 import org.openrdf.repository.RepositoryException;
@@ -51,7 +51,7 @@ public class LdfServiceImpl implements LdfService {
         try {
             conn.begin();
             RepositoryResult<Statement> statements = conn.getStatements(subject, predicate, object, true, context);
-            RDFHandler handler = new PagedRDFHandler(Rio.createWriter(format, out), offset, limit);
+            RDFHandler handler = new LdfRDFHandler(Rio.createWriter(format, out), context, offset, limit);
             Rio.write(ResultUtils.iterable(statements), handler);
         } catch (RDFHandlerException e) {
             e.printStackTrace();

http://git-wip-us.apache.org/repos/asf/marmotta/blob/30d351dc/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
new file mode 100644
index 0000000..dcafb3a
--- /dev/null
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
@@ -0,0 +1,179 @@
+/*
+ * 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.
+ */
+package org.apache.marmotta.platform.ldf.sesame;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import org.apache.marmotta.commons.vocabulary.XSD;
+import org.apache.marmotta.platform.ldf.vocab.HYDRA;
+import org.apache.marmotta.platform.ldf.vocab.VOID;
+import org.openrdf.model.Literal;
+import org.openrdf.model.Resource;
+import org.openrdf.model.Statement;
+import org.openrdf.model.impl.StatementImpl;
+import org.openrdf.model.impl.ValueFactoryImpl;
+import org.openrdf.model.vocabulary.RDF;
+import org.openrdf.rio.RDFHandler;
+import org.openrdf.rio.RDFHandlerException;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Specialized statements handler doing some LDF specific thing,
+ * such as paging or metadata generation, before sending them to
+ * the delegated RDFHandler.
+ *
+ * (TODO: find a more performance solution)
+ *
+ * @author Sergio Fernández
+ */
+public class LdfRDFHandler implements RDFHandler {
+
+    public final static int PAGE_SIZE = 100;
+
+    private List<Statement> statements;
+    private final RDFHandler handler;
+    private final Resource context;
+    private final int page;
+
+    /**
+     * Constructs a PagedRDFHandler with a delegate handler
+     *
+     * @param handler The handler to delegate the calls to
+     */
+    public LdfRDFHandler(RDFHandler handler) {
+        this(handler, null, 1);
+    }
+
+    /**
+     * Constructs a PagedRDFHandler with a delegate handler
+     *
+     * @param handler The handler to delegate the calls to
+     * @param page number of page (starting with 1)
+     */
+    public LdfRDFHandler(RDFHandler handler, int page) {
+        this(handler, null, page);
+    }
+
+    /**
+     * Constructs a PagedRDFHandler with a delegate handler
+     *
+     * @param handler The handler to delegate the calls to
+     * @param context dataset
+     */
+    public LdfRDFHandler(RDFHandler handler, Resource context) {
+        this(handler, context, 1);
+    }
+
+    /**
+     * Constructs a PagedRDFHandler with a delegate handler
+     *
+     * @param handler The handler to delegate the calls to
+     * @param context dataset
+     * @param page number of page (starting with 1)
+     */
+    public LdfRDFHandler(RDFHandler handler, Resource context, int page) {
+        super();
+        this.statements = new ArrayList<>();
+        this.handler = handler;
+        this.context = context;
+        this.page = page;
+    }
+
+    @Override
+    public void startRDF() throws RDFHandlerException {
+        handler.startRDF();
+    }
+
+    @Override
+    public void endRDF() throws RDFHandlerException {
+        //first order by a fixed criteria
+        Collections.sort(statements, new Comparator<Statement>() {
+            @Override
+            public int compare(Statement s1, Statement s2) {
+                int subjectComparison = s1.getSubject().stringValue().compareTo(s2.getSubject().stringValue());
+                int predicatedComparison = s1.getPredicate().stringValue().compareTo(s2.getPredicate().stringValue());
+                if (subjectComparison != 0) {
+                    return subjectComparison;
+                } else if (predicatedComparison != 0) {
+                    return predicatedComparison;
+                } else if((s1.getObject() instanceof Literal) && (s2.getObject() instanceof Resource)) {
+                    return 1;
+                } else if((s1.getObject() instanceof Resource) && (s2.getObject() instanceof Literal)) {
+                    return -1;
+                } else {
+                    return s1.getObject().stringValue().compareTo(s2.getObject().stringValue());
+                }
+            }
+        });
+
+        //then filter
+        final int size = statements.size();
+        final int offset = PAGE_SIZE * (page - 1);
+        if (offset > size) {
+            throw new IllegalArgumentException("page " + page + " can't be generated");
+        }
+        final int limit = PAGE_SIZE < size-offset ? PAGE_SIZE : size-offset;
+        List<Statement> filteredStatements = statements.subList(offset, limit);
+
+        //send statements to delegate writer
+        for (Statement statement : filteredStatements) {
+            handler.handleStatement(statement);
+        }
+
+        //add ldf metadata
+        final ValueFactoryImpl vf = new ValueFactoryImpl();
+
+        Resource dataset = this.context != null ? this.context : vf.createBNode();
+        handler.handleStatement(new StatementImpl(dataset, RDF.TYPE, VOID.Dataset));
+        handler.handleStatement(new StatementImpl(dataset, RDF.TYPE, HYDRA.Collection));
+
+        Resource fragment = vf.createBNode(); //TODO
+        handler.handleStatement(new StatementImpl(dataset, VOID.subset, fragment));
+        handler.handleStatement(new StatementImpl(fragment, RDF.TYPE, HYDRA.Collection));
+        if (offset != 0 && limit != size) handler.handleStatement(new StatementImpl(fragment, RDF.TYPE, HYDRA.PagedCollection));
+        handler.handleStatement(new StatementImpl(fragment, VOID.triples, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)));
+        handler.handleStatement(new StatementImpl(fragment, HYDRA.totalItems, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)));
+        handler.handleStatement(new StatementImpl(fragment, HYDRA.itemsPerPage, vf.createLiteral(Integer.toString(PAGE_SIZE), XSD.Integer)));
+        //TODO: HYDRA_FIRSTPAGE, HYDRA_PREVIOUSPAGE, HYDRA_NEXTPAGE
+
+        //TODO: hydra controls
+
+        //and actually end the rdf
+        handler.endRDF();
+    }
+
+    @Override
+    public void handleNamespace(String prefix, String uri) throws RDFHandlerException {
+        handler.handleNamespace(prefix, uri);
+    }
+
+    @Override
+    public void handleStatement(Statement statement) throws RDFHandlerException {
+        statements.add(statement);
+    }
+
+    @Override
+    public void handleComment(String comment) throws RDFHandlerException {
+        handler.handleComment(comment);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/30d351dc/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/PagedRDFHandler.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/PagedRDFHandler.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/PagedRDFHandler.java
deleted file mode 100644
index 36f59cf..0000000
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/PagedRDFHandler.java
+++ /dev/null
@@ -1,114 +0,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.
- */
-package org.apache.marmotta.platform.ldf.sesame;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.rio.RDFHandler;
-import org.openrdf.rio.RDFHandlerException;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Paginates statements before sending them to the delegated RDFHandler.
- * (TODO: find a more performance solution)
- *
- * @author Sergio Fernández
- */
-public class PagedRDFHandler implements RDFHandler {
-
-    private List<Statement> statements;
-    private RDFHandler handler;
-    private int offset;
-    private int limit;
-
-    /**
-     * Constructs a PagedRDFHandler with a delegate handler
-     *
-     * @param handler The handler to delegate the calls to
-     */
-    public PagedRDFHandler(RDFHandler handler, int offset, int limit) {
-        super();
-        this.statements = new ArrayList<>();
-        this.handler = handler;
-        this.offset = offset;
-        this.limit = limit;
-    }
-
-    @Override
-    public void startRDF() throws RDFHandlerException {
-        handler.startRDF();
-    }
-
-    @Override
-    public void endRDF() throws RDFHandlerException {
-        //first order by a fixed criteria
-        Collections.sort(statements, new Comparator<Statement>() {
-            @Override
-            public int compare(Statement s1, Statement s2) {
-                int subjectComparison = s1.getSubject().stringValue().compareTo(s2.getSubject().stringValue());
-                int predicatedComparison = s1.getPredicate().stringValue().compareTo(s2.getPredicate().stringValue());
-
-                if (subjectComparison != 0) {
-                    return subjectComparison;
-                } else if (predicatedComparison != 0) {
-                    return predicatedComparison;
-                } else if((s1.getObject() instanceof Literal) && (s2.getObject() instanceof Resource)) {
-                    return 1;
-                } else if((s1.getObject() instanceof Resource) && (s2.getObject() instanceof Literal)) {
-                    return -1;
-                } else {
-                    return s1.getObject().stringValue().compareTo(s2.getObject().stringValue());
-                }
-            }
-        });
-
-        //then filter
-        List<Statement> filteredStatements = Lists.newArrayList(Iterables.limit(statements, 20));
-
-        //send statements to delegate writer
-        for (Statement statement : filteredStatements) {
-            handler.handleStatement(statement);
-        }
-
-        //and actually end the rdf
-        handler.endRDF();
-    }
-
-    @Override
-    public void handleNamespace(String prefix, String uri) throws RDFHandlerException {
-        handler.handleNamespace(prefix, uri);
-    }
-
-    @Override
-    public void handleStatement(Statement statement) throws RDFHandlerException {
-        statements.add(statement);
-    }
-
-    @Override
-    public void handleComment(String comment) throws RDFHandlerException {
-        handler.handleComment(comment);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/30d351dc/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/HYDRA.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/HYDRA.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/HYDRA.java
new file mode 100644
index 0000000..3bc261d
--- /dev/null
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/HYDRA.java
@@ -0,0 +1,600 @@
+/*
+ * 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.
+ */
+package org.apache.marmotta.platform.ldf.vocab;
+
+import org.openrdf.model.URI;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.model.impl.ValueFactoryImpl;
+
+/**
+ * Namespace Hydra.
+ * Prefix: {@code <http://www.w3.org/ns/hydra/core#>}
+ */
+public class HYDRA {
+
+    /** {@code http://www.w3.org/ns/hydra/core#} **/
+    public static final String NAMESPACE = "http://www.w3.org/ns/hydra/core#";
+
+    /** {@code hydra} **/
+    public static final String PREFIX = "hydra";
+
+    /**
+     * ApiDocumentation
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#ApiDocumentation}.
+     * <p>
+     * The Hydra API documentation class
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#ApiDocumentation">ApiDocumentation</a>
+     */
+    public static final URI ApiDocumentation;
+
+    /**
+     * apiDocumentation
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#apiDocumentation}.
+     * <p>
+     * A link to the API documentation
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#apiDocumentation">apiDocumentation</a>
+     */
+    public static final URI apiDocumentation;
+
+    /**
+     * Hydra Class
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#Class}.
+     * <p>
+     * The class of Hydra classes. Hydra classes and their instances are
+     * dereferenceable resources.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#Class">Class</a>
+     */
+    public static final URI Class;
+
+    /**
+     * Collection
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#Collection}.
+     * <p>
+     * A collection holding references to a number of related resources.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#Collection">Collection</a>
+     */
+    public static final URI Collection;
+
+    /**
+     * CreateResourceOperation
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#CreateResourceOperation}.
+     * <p>
+     * A CreateResourceOperation is a HTTP operation which expects an input
+	 * of the type specified by hydra:expects and creates a resource of the
+	 * type specified by hydra:returns.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#CreateResourceOperation">CreateResourceOperation</a>
+     */
+    public static final URI CreateResourceOperation;
+
+    /**
+     * DeleteResourceOperation
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#DeleteResourceOperation}.
+     * <p>
+     * A DeleteResourceOperation is a HTTP operation that deletes a resource.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#DeleteResourceOperation">DeleteResourceOperation</a>
+     */
+    public static final URI DeleteResourceOperation;
+
+    /**
+     * description
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#description}.
+     * <p>
+     * A description.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#description">description</a>
+     */
+    public static final URI description;
+
+    /**
+     * entrypoint
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#entrypoint}.
+     * <p>
+     * A link to main entry point of the Web API
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#entrypoint">entrypoint</a>
+     */
+    public static final URI entrypoint;
+
+    /**
+     * Error
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#Error}.
+     * <p>
+     * A runtime error, used to report information beyond the returned status
+	 * code.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#Error">Error</a>
+     */
+    public static final URI Error;
+
+    /**
+     * expects
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#expects}.
+     * <p>
+     * The information expected by the Web API.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#expects">expects</a>
+     */
+    public static final URI expects;
+
+    /**
+     * first page
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#firstPage}.
+     * <p>
+     * The first page of an interlinked set of PagedCollections
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#firstPage">firstPage</a>
+     */
+    public static final URI firstPage;
+
+    /**
+     * freetext query
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#freetextQuery}.
+     * <p>
+     * A property representing a freetext query.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#freetextQuery">freetextQuery</a>
+     */
+    public static final URI freetextQuery;
+
+    /**
+     * IRI Template
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#IriTemplate}.
+     * <p>
+     * The class of IRI templates.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#IriTemplate">IriTemplate</a>
+     */
+    public static final URI IriTemplate;
+
+    /**
+     * IriTemplateMapping
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#IriTemplateMapping}.
+     * <p>
+     * A mapping from an IRI template variable to a property.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#IriTemplateMapping">IriTemplateMapping</a>
+     */
+    public static final URI IriTemplateMapping;
+
+    /**
+     * items per page
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#itemsPerPage}.
+     * <p>
+     * The maximum number of items referenced by each single PagedCollection
+	 * in a set of interlinked PagedCollections.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#itemsPerPage">itemsPerPage</a>
+     */
+    public static final URI itemsPerPage;
+
+    /**
+     * last page
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#lastPage}.
+     * <p>
+     * The last page of an interlinked set of PagedCollections
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#lastPage">lastPage</a>
+     */
+    public static final URI lastPage;
+
+    /**
+     * Link
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#Link}.
+     * <p>
+     * The class of properties representing links.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#Link">Link</a>
+     */
+    public static final URI Link;
+
+    /**
+     * mapping
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#mapping}.
+     * <p>
+     * A variable-to-property mapping of the IRI template.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#mapping">mapping</a>
+     */
+    public static final URI mapping;
+
+    /**
+     * member
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#member}.
+     * <p>
+     * A member of the collection
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#member">member</a>
+     */
+    public static final URI member;
+
+    /**
+     * method
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#method}.
+     * <p>
+     * The HTTP method.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#method">method</a>
+     */
+    public static final URI method;
+
+    /**
+     * next page
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#nextPage}.
+     * <p>
+     * The page following the current instance in an interlinked set of
+	 * PagedCollections
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#nextPage">nextPage</a>
+     */
+    public static final URI nextPage;
+
+    /**
+     * Operation
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#Operation}.
+     * <p>
+     * An operation.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#Operation">Operation</a>
+     */
+    public static final URI Operation;
+
+    /**
+     * operation
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#operation}.
+     * <p>
+     * An operation supported by the Hydra resource
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#operation">operation</a>
+     */
+    public static final URI operation;
+
+    /**
+     * PagedCollection
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#PagedCollection}.
+     * <p>
+     * A PagedCollection is a subclass of Collection with the only difference
+	 * that its members are sorted and only a subset of all members are
+	 * returned in a single PagedCollection. To get the other members, the
+	 * nextPage/previousPage properties have to be used.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#PagedCollection">PagedCollection</a>
+     */
+    public static final URI PagedCollection;
+
+    /**
+     * previous page
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#previousPage}.
+     * <p>
+     * The page preceding the current instance in an interlinked set of
+	 * PagedCollections
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#previousPage">previousPage</a>
+     */
+    public static final URI previousPage;
+
+    /**
+     * property
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#property}.
+     * <p>
+     * A property
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#property">property</a>
+     */
+    public static final URI property;
+
+    /**
+     * ready-only
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#readonly}.
+     * <p>
+     * True if the property is read-only, false otherwise.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#readonly">readonly</a>
+     */
+    public static final URI readonly;
+
+    /**
+     * ReplaceResourceOperation
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#ReplaceResourceOperation}.
+     * <p>
+     * A ReplaceResourceOperation is a HTTP operation which overwrites a
+	 * resource. It expects data of the type specified in hydra:expects and
+	 * results in a resource of the type specified by hydra:returns.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#ReplaceResourceOperation">ReplaceResourceOperation</a>
+     */
+    public static final URI ReplaceResourceOperation;
+
+    /**
+     * required
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#required}.
+     * <p>
+     * True if the property is required, false otherwise.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#required">required</a>
+     */
+    public static final URI required;
+
+    /**
+     * Hydra Resource
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#Resource}.
+     * <p>
+     * The class of dereferenceable resources.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#Resource">Resource</a>
+     */
+    public static final URI Resource;
+
+    /**
+     * returns
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#returns}.
+     * <p>
+     * The information returned by the Web API on success
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#returns">returns</a>
+     */
+    public static final URI returns;
+
+    /**
+     * search
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#search}.
+     * <p>
+     * A IRI template that can be used to query a collection
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#search">search</a>
+     */
+    public static final URI search;
+
+    /**
+     * status code
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#statusCode}.
+     * <p>
+     * The HTTP status code
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#statusCode">statusCode</a>
+     */
+    public static final URI statusCode;
+
+    /**
+     * Status code description
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#StatusCodeDescription}.
+     * <p>
+     * Additional information about a status code that might be returned.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#StatusCodeDescription">StatusCodeDescription</a>
+     */
+    public static final URI StatusCodeDescription;
+
+    /**
+     * status codes
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#statusCodes}.
+     * <p>
+     * Additional information about status codes that might be returned by
+	 * the Web API
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#statusCodes">statusCodes</a>
+     */
+    public static final URI statusCodes;
+
+    /**
+     * supported classes
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#supportedClass}.
+     * <p>
+     * A class known to be supported by the Web API
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#supportedClass">supportedClass</a>
+     */
+    public static final URI supportedClass;
+
+    /**
+     * supported operation
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#supportedOperation}.
+     * <p>
+     * An operation supported by instances of the specific Hydra class or the
+	 * target of the Hydra link
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#supportedOperation">supportedOperation</a>
+     */
+    public static final URI supportedOperation;
+
+    /**
+     * supported properties
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#supportedProperty}.
+     * <p>
+     * The properties known to be supported by a Hydra class
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#supportedProperty">supportedProperty</a>
+     */
+    public static final URI supportedProperty;
+
+    /**
+     * Supported Property
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#SupportedProperty}.
+     * <p>
+     * A property known to be supported by a Hydra class.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#SupportedProperty">SupportedProperty</a>
+     */
+    public static final URI SupportedProperty;
+
+    /**
+     * template
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#template}.
+     * <p>
+     * An IRI template as defined by RFC6570.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#template">template</a>
+     */
+    public static final URI template;
+
+    /**
+     * Templated Link
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#TemplatedLink}.
+     * <p>
+     * A templated link.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#TemplatedLink">TemplatedLink</a>
+     */
+    public static final URI TemplatedLink;
+
+    /**
+     * title
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#title}.
+     * <p>
+     * A title, often used along with a description.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#title">title</a>
+     */
+    public static final URI title;
+
+    /**
+     * total items
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#totalItems}.
+     * <p>
+     * The total number of items referenced by a collection or a set of
+	 * interlinked PagedCollections.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#totalItems">totalItems</a>
+     */
+    public static final URI totalItems;
+
+    /**
+     * variable
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#variable}.
+     * <p>
+     * An IRI template variable
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#variable">variable</a>
+     */
+    public static final URI variable;
+
+    /**
+     * write-only
+     * <p>
+     * {@code http://www.w3.org/ns/hydra/core#writeonly}.
+     * <p>
+     * True if the property is write-only, false otherwise.
+     *
+     * @see <a href="http://www.w3.org/ns/hydra/core#writeonly">writeonly</a>
+     */
+    public static final URI writeonly;
+
+    static {
+        ValueFactory factory = ValueFactoryImpl.getInstance();
+
+        ApiDocumentation = factory.createURI(HYDRA.NAMESPACE, "ApiDocumentation");
+        apiDocumentation = factory.createURI(HYDRA.NAMESPACE, "apiDocumentation");
+        Class = factory.createURI(HYDRA.NAMESPACE, "Class");
+        Collection = factory.createURI(HYDRA.NAMESPACE, "Collection");
+        CreateResourceOperation = factory.createURI(HYDRA.NAMESPACE, "CreateResourceOperation");
+        DeleteResourceOperation = factory.createURI(HYDRA.NAMESPACE, "DeleteResourceOperation");
+        description = factory.createURI(HYDRA.NAMESPACE, "description");
+        entrypoint = factory.createURI(HYDRA.NAMESPACE, "entrypoint");
+        Error = factory.createURI(HYDRA.NAMESPACE, "Error");
+        expects = factory.createURI(HYDRA.NAMESPACE, "expects");
+        firstPage = factory.createURI(HYDRA.NAMESPACE, "firstPage");
+        freetextQuery = factory.createURI(HYDRA.NAMESPACE, "freetextQuery");
+        IriTemplate = factory.createURI(HYDRA.NAMESPACE, "IriTemplate");
+        IriTemplateMapping = factory.createURI(HYDRA.NAMESPACE, "IriTemplateMapping");
+        itemsPerPage = factory.createURI(HYDRA.NAMESPACE, "itemsPerPage");
+        lastPage = factory.createURI(HYDRA.NAMESPACE, "lastPage");
+        Link = factory.createURI(HYDRA.NAMESPACE, "Link");
+        mapping = factory.createURI(HYDRA.NAMESPACE, "mapping");
+        member = factory.createURI(HYDRA.NAMESPACE, "member");
+        method = factory.createURI(HYDRA.NAMESPACE, "method");
+        nextPage = factory.createURI(HYDRA.NAMESPACE, "nextPage");
+        Operation = factory.createURI(HYDRA.NAMESPACE, "Operation");
+        operation = factory.createURI(HYDRA.NAMESPACE, "operation");
+        PagedCollection = factory.createURI(HYDRA.NAMESPACE, "PagedCollection");
+        previousPage = factory.createURI(HYDRA.NAMESPACE, "previousPage");
+        property = factory.createURI(HYDRA.NAMESPACE, "property");
+        readonly = factory.createURI(HYDRA.NAMESPACE, "readonly");
+        ReplaceResourceOperation = factory.createURI(HYDRA.NAMESPACE, "ReplaceResourceOperation");
+        required = factory.createURI(HYDRA.NAMESPACE, "required");
+        Resource = factory.createURI(HYDRA.NAMESPACE, "Resource");
+        returns = factory.createURI(HYDRA.NAMESPACE, "returns");
+        search = factory.createURI(HYDRA.NAMESPACE, "search");
+        statusCode = factory.createURI(HYDRA.NAMESPACE, "statusCode");
+        StatusCodeDescription = factory.createURI(HYDRA.NAMESPACE, "StatusCodeDescription");
+        statusCodes = factory.createURI(HYDRA.NAMESPACE, "statusCodes");
+        supportedClass = factory.createURI(HYDRA.NAMESPACE, "supportedClass");
+        supportedOperation = factory.createURI(HYDRA.NAMESPACE, "supportedOperation");
+        supportedProperty = factory.createURI(HYDRA.NAMESPACE, "supportedProperty");
+        SupportedProperty = factory.createURI(HYDRA.NAMESPACE, "SupportedProperty");
+        template = factory.createURI(HYDRA.NAMESPACE, "template");
+        TemplatedLink = factory.createURI(HYDRA.NAMESPACE, "TemplatedLink");
+        title = factory.createURI(HYDRA.NAMESPACE, "title");
+        totalItems = factory.createURI(HYDRA.NAMESPACE, "totalItems");
+        variable = factory.createURI(HYDRA.NAMESPACE, "variable");
+        writeonly = factory.createURI(HYDRA.NAMESPACE, "writeonly");
+    }
+
+    private HYDRA() {
+        //static access only
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/30d351dc/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/VOID.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/VOID.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/VOID.java
new file mode 100644
index 0000000..1affb0a
--- /dev/null
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/VOID.java
@@ -0,0 +1,435 @@
+/*
+ * 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.
+ */
+package org.apache.marmotta.platform.ldf.vocab;
+
+import org.openrdf.model.URI;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.model.impl.ValueFactoryImpl;
+
+/**
+ * Namespace Void.
+ * Prefix: {@code <http://rdfs.org/ns/void#>}
+ */
+public class VOID {
+
+    /** {@code http://rdfs.org/ns/void#} **/
+    public static final String NAMESPACE = "http://rdfs.org/ns/void#";
+
+    /** {@code void} **/
+    public static final String PREFIX = "void";
+
+    /**
+     * class
+     * <p>
+     * {@code http://rdfs.org/ns/void#class}.
+     * <p>
+     * The rdfs:Class that is the rdf:type of all entities in a class-based
+     * partition.
+     *
+     * @see <a href="http://rdfs.org/ns/void#class">class</a>
+     */
+    //public static final URI class;
+
+    /**
+     * classes
+     * <p>
+     * {@code http://rdfs.org/ns/void#classes}.
+     * <p>
+     * The total number of distinct classes in a void:Dataset. In other
+     * words, the number of distinct resources occuring as objects of
+     * rdf:type triples in the dataset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#classes">classes</a>
+     */
+    public static final URI classes;
+
+    /**
+     * class partition
+     * <p>
+     * {@code http://rdfs.org/ns/void#classPartition}.
+     * <p>
+     * A subset of a void:Dataset that contains only the entities of a
+     * certain rdfs:Class.
+     *
+     * @see <a href="http://rdfs.org/ns/void#classPartition">classPartition</a>
+     */
+    public static final URI classPartition;
+
+    /**
+     * Data Dump
+     * <p>
+     * {@code http://rdfs.org/ns/void#dataDump}.
+     * <p>
+     * An RDF dump, partial or complete, of a void:Dataset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#dataDump">dataDump</a>
+     */
+    public static final URI dataDump;
+
+    /**
+     * dataset
+     * <p>
+     * {@code http://rdfs.org/ns/void#Dataset}.
+     * <p>
+     * A set of RDF triples that are published, maintained or aggregated by a
+     * single provider.
+     *
+     * @see <a href="http://rdfs.org/ns/void#Dataset">Dataset</a>
+     */
+    public static final URI Dataset;
+
+    /**
+     * dataset description
+     * <p>
+     * {@code http://rdfs.org/ns/void#DatasetDescription}.
+     * <p>
+     * A web resource whose foaf:primaryTopic or foaf:topics include
+     * void:Datasets.
+     *
+     * @see <a href="http://rdfs.org/ns/void#DatasetDescription">DatasetDescription</a>
+     */
+    public static final URI DatasetDescription;
+
+    /**
+     * distinct objects
+     * <p>
+     * {@code http://rdfs.org/ns/void#distinctObjects}.
+     * <p>
+     * The total number of distinct objects in a void:Dataset. In other
+     * words, the number of distinct resources that occur in the object
+     * position of triples in the dataset. Literals are included in this
+     * count.
+     *
+     * @see <a href="http://rdfs.org/ns/void#distinctObjects">distinctObjects</a>
+     */
+    public static final URI distinctObjects;
+
+    /**
+     * distinct subjects
+     * <p>
+     * {@code http://rdfs.org/ns/void#distinctSubjects}.
+     * <p>
+     * The total number of distinct subjects in a void:Dataset. In other
+     * words, the number of distinct resources that occur in the subject
+     * position of triples in the dataset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#distinctSubjects">distinctSubjects</a>
+     */
+    public static final URI distinctSubjects;
+
+    /**
+     * number of documents
+     * <p>
+     * {@code http://rdfs.org/ns/void#documents}.
+     * <p>
+     * The total number of documents, for datasets that are published as a
+     * set of individual documents, such as RDF/XML documents or
+     * RDFa-annotated web pages. Non-RDF documents, such as web pages in HTML
+     * or images, are usually not included in this count. This property is
+     * intended for datasets where the total number of triples or entities is
+     * hard to determine. void:triples or void:entities should be preferred
+     * where practical.
+     *
+     * @see <a href="http://rdfs.org/ns/void#documents">documents</a>
+     */
+    public static final URI documents;
+
+    /**
+     * number of entities
+     * <p>
+     * {@code http://rdfs.org/ns/void#entities}.
+     * <p>
+     * The total number of entities that are described in a void:Dataset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#entities">entities</a>
+     */
+    public static final URI entities;
+
+    /**
+     * example resource of dataset
+     * <p>
+     * {@code http://rdfs.org/ns/void#exampleResource}.
+     *
+     * @see <a href="http://rdfs.org/ns/void#exampleResource">exampleResource</a>
+     */
+    public static final URI exampleResource;
+
+    /**
+     * feature
+     * <p>
+     * {@code http://rdfs.org/ns/void#feature}.
+     *
+     * @see <a href="http://rdfs.org/ns/void#feature">feature</a>
+     */
+    public static final URI feature;
+
+    /**
+     * in dataset
+     * <p>
+     * {@code http://rdfs.org/ns/void#inDataset}.
+     * <p>
+     * Points to the void:Dataset that a document is a part of.
+     *
+     * @see <a href="http://rdfs.org/ns/void#inDataset">inDataset</a>
+     */
+    public static final URI inDataset;
+
+    /**
+     * a link predicate
+     * <p>
+     * {@code http://rdfs.org/ns/void#linkPredicate}.
+     *
+     * @see <a href="http://rdfs.org/ns/void#linkPredicate">linkPredicate</a>
+     */
+    public static final URI linkPredicate;
+
+    /**
+     * linkset
+     * <p>
+     * {@code http://rdfs.org/ns/void#Linkset}.
+     * <p>
+     * A collection of RDF links between two void:Datasets.
+     *
+     * @see <a href="http://rdfs.org/ns/void#Linkset">Linkset</a>
+     */
+    public static final URI Linkset;
+
+    /**
+     * Objects Target
+     * <p>
+     * {@code http://rdfs.org/ns/void#objectsTarget}.
+     * <p>
+     * The dataset describing the objects of the triples contained in the
+     * Linkset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#objectsTarget">objectsTarget</a>
+     */
+    public static final URI objectsTarget;
+
+    /**
+     * open search description
+     * <p>
+     * {@code http://rdfs.org/ns/void#openSearchDescription}.
+     * <p>
+     * An OpenSearch description document for a free-text search service over
+     * a void:Dataset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#openSearchDescription">openSearchDescription</a>
+     */
+    public static final URI openSearchDescription;
+
+    /**
+     * number of properties
+     * <p>
+     * {@code http://rdfs.org/ns/void#properties}.
+     * <p>
+     * The total number of distinct properties in a void:Dataset. In other
+     * words, the number of distinct resources that occur in the predicate
+     * position of triples in the dataset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#properties">properties</a>
+     */
+    public static final URI properties;
+
+    /**
+     * property
+     * <p>
+     * {@code http://rdfs.org/ns/void#property}.
+     * <p>
+     * The rdf:Property that is the predicate of all triples in a
+     * property-based partition.
+     *
+     * @see <a href="http://rdfs.org/ns/void#property">property</a>
+     */
+    public static final URI property;
+
+    /**
+     * property partition
+     * <p>
+     * {@code http://rdfs.org/ns/void#propertyPartition}.
+     * <p>
+     * A subset of a void:Dataset that contains only the triples of a certain
+     * rdf:Property.
+     *
+     * @see <a href="http://rdfs.org/ns/void#propertyPartition">propertyPartition</a>
+     */
+    public static final URI propertyPartition;
+
+    /**
+     * root resource
+     * <p>
+     * {@code http://rdfs.org/ns/void#rootResource}.
+     * <p>
+     * A top concept or entry point for a void:Dataset that is structured in
+     * a tree-like fashion. All resources in a dataset can be reached by
+     * following links from its root resources in a small number of steps.
+     *
+     * @see <a href="http://rdfs.org/ns/void#rootResource">rootResource</a>
+     */
+    public static final URI rootResource;
+
+    /**
+     * has a SPARQL endpoint at
+     * <p>
+     * {@code http://rdfs.org/ns/void#sparqlEndpoint}.
+     *
+     * @see <a href="http://rdfs.org/ns/void#sparqlEndpoint">sparqlEndpoint</a>
+     */
+    public static final URI sparqlEndpoint;
+
+    /**
+     * Subjects Target
+     * <p>
+     * {@code http://rdfs.org/ns/void#subjectsTarget}.
+     * <p>
+     * The dataset describing the subjects of triples contained in the
+     * Linkset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#subjectsTarget">subjectsTarget</a>
+     */
+    public static final URI subjectsTarget;
+
+    /**
+     * has subset
+     * <p>
+     * {@code http://rdfs.org/ns/void#subset}.
+     *
+     * @see <a href="http://rdfs.org/ns/void#subset">subset</a>
+     */
+    public static final URI subset;
+
+    /**
+     * Target
+     * <p>
+     * {@code http://rdfs.org/ns/void#target}.
+     * <p>
+     * One of the two datasets linked by the Linkset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#target">target</a>
+     */
+    public static final URI target;
+
+    /**
+     * technical feature
+     * <p>
+     * {@code http://rdfs.org/ns/void#TechnicalFeature}.
+     * <p>
+     * A technical feature of a void:Dataset, such as a supported RDF
+     * serialization format.
+     *
+     * @see <a href="http://rdfs.org/ns/void#TechnicalFeature">TechnicalFeature</a>
+     */
+    public static final URI TechnicalFeature;
+
+    /**
+     * number of triples
+     * <p>
+     * {@code http://rdfs.org/ns/void#triples}.
+     * <p>
+     * The total number of triples contained in a void:Dataset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#triples">triples</a>
+     */
+    public static final URI triples;
+
+    /**
+     * has an URI look-up endpoint at
+     * <p>
+     * {@code http://rdfs.org/ns/void#uriLookupEndpoint}.
+     * <p>
+     * Defines a simple URI look-up protocol for accessing a dataset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#uriLookupEndpoint">uriLookupEndpoint</a>
+     */
+    public static final URI uriLookupEndpoint;
+
+    /**
+     * has URI regular expression pattern
+     * <p>
+     * {@code http://rdfs.org/ns/void#uriRegexPattern}.
+     * <p>
+     * Defines a regular expression pattern matching URIs in the dataset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#uriRegexPattern">uriRegexPattern</a>
+     */
+    public static final URI uriRegexPattern;
+
+    /**
+     * URI space
+     * <p>
+     * {@code http://rdfs.org/ns/void#uriSpace}.
+     * <p>
+     * A URI that is a common string prefix of all the entity URIs in a
+     * void:Dataset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#uriSpace">uriSpace</a>
+     */
+    public static final URI uriSpace;
+
+    /**
+     * vocabulary
+     * <p>
+     * {@code http://rdfs.org/ns/void#vocabulary}.
+     * <p>
+     * A vocabulary that is used in the dataset.
+     *
+     * @see <a href="http://rdfs.org/ns/void#vocabulary">vocabulary</a>
+     */
+    public static final URI vocabulary;
+
+    static {
+        ValueFactory factory = ValueFactoryImpl.getInstance();
+
+        //class = factory.createURI(VOID.NAMESPACE, "class");
+        classes = factory.createURI(VOID.NAMESPACE, "classes");
+        classPartition = factory.createURI(VOID.NAMESPACE, "classPartition");
+        dataDump = factory.createURI(VOID.NAMESPACE, "dataDump");
+        Dataset = factory.createURI(VOID.NAMESPACE, "Dataset");
+        DatasetDescription = factory.createURI(VOID.NAMESPACE, "DatasetDescription");
+        distinctObjects = factory.createURI(VOID.NAMESPACE, "distinctObjects");
+        distinctSubjects = factory.createURI(VOID.NAMESPACE, "distinctSubjects");
+        documents = factory.createURI(VOID.NAMESPACE, "documents");
+        entities = factory.createURI(VOID.NAMESPACE, "entities");
+        exampleResource = factory.createURI(VOID.NAMESPACE, "exampleResource");
+        feature = factory.createURI(VOID.NAMESPACE, "feature");
+        inDataset = factory.createURI(VOID.NAMESPACE, "inDataset");
+        linkPredicate = factory.createURI(VOID.NAMESPACE, "linkPredicate");
+        Linkset = factory.createURI(VOID.NAMESPACE, "Linkset");
+        objectsTarget = factory.createURI(VOID.NAMESPACE, "objectsTarget");
+        openSearchDescription = factory.createURI(VOID.NAMESPACE, "openSearchDescription");
+        properties = factory.createURI(VOID.NAMESPACE, "properties");
+        property = factory.createURI(VOID.NAMESPACE, "property");
+        propertyPartition = factory.createURI(VOID.NAMESPACE, "propertyPartition");
+        rootResource = factory.createURI(VOID.NAMESPACE, "rootResource");
+        sparqlEndpoint = factory.createURI(VOID.NAMESPACE, "sparqlEndpoint");
+        subjectsTarget = factory.createURI(VOID.NAMESPACE, "subjectsTarget");
+        subset = factory.createURI(VOID.NAMESPACE, "subset");
+        target = factory.createURI(VOID.NAMESPACE, "target");
+        TechnicalFeature = factory.createURI(VOID.NAMESPACE, "TechnicalFeature");
+        triples = factory.createURI(VOID.NAMESPACE, "triples");
+        uriLookupEndpoint = factory.createURI(VOID.NAMESPACE, "uriLookupEndpoint");
+        uriRegexPattern = factory.createURI(VOID.NAMESPACE, "uriRegexPattern");
+        uriSpace = factory.createURI(VOID.NAMESPACE, "uriSpace");
+        vocabulary = factory.createURI(VOID.NAMESPACE, "vocabulary");
+    }
+
+    private VOID() {
+        //static access only
+    }
+
+}


[6/9] git commit: MARMOTTA-556: added web service tier

Posted by wi...@apache.org.
MARMOTTA-556: added web service tier


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/205d4c12
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/205d4c12
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/205d4c12

Branch: refs/heads/MARMOTTA-556
Commit: 205d4c12dc40cf94515ba48b46015ff89e161773
Parents: 374d381
Author: Sergio Fernández <wi...@apache.org>
Authored: Fri Oct 24 20:23:39 2014 +0200
Committer: Sergio Fernández <wi...@apache.org>
Committed: Fri Oct 24 20:23:39 2014 +0200

----------------------------------------------------------------------
 .../marmotta/platform/ldf/api/LdfService.java   |  27 +++++
 .../platform/ldf/services/LdfServiceImpl.java   |  60 +++++++++++
 .../platform/ldf/sesame/LdfRDFHandler.java      |   9 +-
 .../platform/ldf/webservices/LdfWebService.java | 106 +++++++++++++++++++
 4 files changed, 197 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/205d4c12/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
index 1652818..9496589 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/api/LdfService.java
@@ -45,6 +45,19 @@ public interface LdfService {
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
+    void writeFragment(String subject, String predicate, String object, int page, RDFFormat format, OutputStream out) throws RepositoryException;
+
+    /**
+     * Writes a fragment matching the specified triple fragment pattern
+     * specified (null values are wildcards).
+     *
+     * @param subject fragment subject
+     * @param predicate fragmnent predicate
+     * @param object fragment object
+     * @param page number of page (starting with 1)
+     * @param format RDF serialization
+     * @param out output stream where write the fragment
+     */
     void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException;
 
     /**
@@ -59,6 +72,20 @@ public interface LdfService {
      * @param format RDF serialization
      * @param out output stream where write the fragment
      */
+    void writeFragment(String subject, String predicate, String object, String context, int page, RDFFormat format, OutputStream out) throws RepositoryException;
+
+    /**
+     * Writes a fragment matching the specified quad fragment pattern
+     * specified (null values are wildcards).
+     *
+     * @param subject fragment subject
+     * @param predicate fragmnent predicate
+     * @param object fragment object
+     * @param context named graph
+     * @param page number of page (starting with 1)
+     * @param format RDF serialization
+     * @param out output stream where write the fragment
+     */
     void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException;
 
 }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/205d4c12/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
index 9da59b8..dc8fd7c 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
@@ -17,18 +17,23 @@
  */
 package org.apache.marmotta.platform.ldf.services;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.marmotta.commons.sesame.repository.ResultUtils;
 import org.apache.marmotta.platform.core.api.triplestore.SesameService;
 import org.apache.marmotta.platform.ldf.api.LdfService;
 import org.apache.marmotta.platform.ldf.sesame.LdfRDFHandler;
 import org.openrdf.model.*;
+import org.openrdf.model.impl.ValueFactoryImpl;
 import org.openrdf.repository.RepositoryConnection;
 import org.openrdf.repository.RepositoryException;
 import org.openrdf.repository.RepositoryResult;
 import org.openrdf.rio.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.inject.Inject;
 import java.io.OutputStream;
+import java.net.URISyntaxException;
 
 /**
  * Linked Media Fragments service implementation
@@ -37,15 +42,70 @@ import java.io.OutputStream;
  */
 public class LdfServiceImpl implements LdfService {
 
+    private static final Logger log = LoggerFactory.getLogger(LdfServiceImpl.class);
+
     @Inject
     private SesameService sesameService;
 
     @Override
+    public void writeFragment(String subjectStr, String predicateStr, String objectStr, int page, RDFFormat format, OutputStream out) throws RepositoryException {
+        writeFragment(subjectStr, predicateStr, objectStr, null, page, format, out);
+    }
+
+    @Override
     public void writeFragment(URI subject, URI predicate, Value object, int page, RDFFormat format, OutputStream out) throws RepositoryException {
         writeFragment(subject, predicate, object, null, page, format, out);
     }
 
     @Override
+    public void writeFragment(String subjectStr, String predicateStr, String objectStr, String contextStr, int page, RDFFormat format, OutputStream out) throws RepositoryException {
+        final ValueFactoryImpl vf = new ValueFactoryImpl();
+
+        URI subject = null;
+        if (StringUtils.isNotBlank(subjectStr)) {
+            try {
+                new java.net.URI(subjectStr);
+                subject = vf.createURI(subjectStr);
+            } catch (URISyntaxException e) {
+                log.error("invalid subject '{}': {}", subjectStr, e.getMessage());
+            }
+        }
+
+        URI predicate = null;
+        if (StringUtils.isNotBlank(predicateStr)) {
+            try {
+                new java.net.URI(predicateStr);
+                predicate = vf.createURI(predicateStr);
+            } catch (URISyntaxException e) {
+                log.error("invalid predicate '{}': {}", predicateStr, e.getMessage());
+            }
+        }
+
+        Value object = null;
+        if (StringUtils.isNotBlank(objectStr)) {
+            try {
+                new java.net.URI(objectStr);
+                object = vf.createURI(objectStr);
+            } catch (URISyntaxException e) {
+                object = vf.createLiteral(objectStr);
+            }
+        }
+
+        URI context = null;
+        if (StringUtils.isNotBlank(contextStr)) {
+            try {
+                new java.net.URI(contextStr);
+                context = vf.createURI(contextStr);
+            } catch (URISyntaxException e) {
+                log.error("invalid context '{}': {}", contextStr, e.getMessage());
+            }
+        }
+
+        writeFragment(subject, predicate, object, context, page, format, out);
+    }
+
+
+    @Override
     public void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException {
         final RepositoryConnection conn = sesameService.getConnection();
         try {

http://git-wip-us.apache.org/repos/asf/marmotta/blob/205d4c12/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
index dcafb3a..2ba0e21 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/sesame/LdfRDFHandler.java
@@ -20,6 +20,7 @@ package org.apache.marmotta.platform.ldf.sesame;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import org.apache.marmotta.commons.vocabulary.XSD;
+import org.apache.marmotta.platform.ldf.api.LdfService;
 import org.apache.marmotta.platform.ldf.vocab.HYDRA;
 import org.apache.marmotta.platform.ldf.vocab.VOID;
 import org.openrdf.model.Literal;
@@ -47,8 +48,6 @@ import java.util.List;
  */
 public class LdfRDFHandler implements RDFHandler {
 
-    public final static int PAGE_SIZE = 100;
-
     private List<Statement> statements;
     private final RDFHandler handler;
     private final Resource context;
@@ -127,11 +126,11 @@ public class LdfRDFHandler implements RDFHandler {
 
         //then filter
         final int size = statements.size();
-        final int offset = PAGE_SIZE * (page - 1);
+        final int offset = LdfService.PAGE_SIZE * (page - 1);
         if (offset > size) {
             throw new IllegalArgumentException("page " + page + " can't be generated");
         }
-        final int limit = PAGE_SIZE < size-offset ? PAGE_SIZE : size-offset;
+        final int limit = LdfService.PAGE_SIZE < size-offset ? LdfService.PAGE_SIZE : size-offset;
         List<Statement> filteredStatements = statements.subList(offset, limit);
 
         //send statements to delegate writer
@@ -152,7 +151,7 @@ public class LdfRDFHandler implements RDFHandler {
         if (offset != 0 && limit != size) handler.handleStatement(new StatementImpl(fragment, RDF.TYPE, HYDRA.PagedCollection));
         handler.handleStatement(new StatementImpl(fragment, VOID.triples, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)));
         handler.handleStatement(new StatementImpl(fragment, HYDRA.totalItems, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)));
-        handler.handleStatement(new StatementImpl(fragment, HYDRA.itemsPerPage, vf.createLiteral(Integer.toString(PAGE_SIZE), XSD.Integer)));
+        handler.handleStatement(new StatementImpl(fragment, HYDRA.itemsPerPage, vf.createLiteral(Integer.toString(LdfService.PAGE_SIZE), XSD.Integer)));
         //TODO: HYDRA_FIRSTPAGE, HYDRA_PREVIOUSPAGE, HYDRA_NEXTPAGE
 
         //TODO: hydra controls

http://git-wip-us.apache.org/repos/asf/marmotta/blob/205d4c12/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java
new file mode 100644
index 0000000..dbfcb96
--- /dev/null
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java
@@ -0,0 +1,106 @@
+package org.apache.marmotta.platform.ldf.webservices;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.marmotta.commons.http.ContentType;
+import org.apache.marmotta.commons.http.MarmottaHttpUtils;
+import org.apache.marmotta.platform.core.api.config.ConfigurationService;
+import org.apache.marmotta.platform.core.api.exporter.ExportService;
+import org.apache.marmotta.platform.core.util.WebServiceUtil;
+import org.apache.marmotta.platform.ldf.api.LdfService;
+import org.openrdf.repository.RepositoryException;
+import org.openrdf.rio.RDFFormat;
+import org.openrdf.rio.Rio;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.ws.rs.*;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.StreamingOutput;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Linked Data Fragments web service implementation
+ *
+ * @author Sergio Fernández
+ */
+@ApplicationScoped
+@Path(LdfWebService.PATH)
+public class LdfWebService {
+
+    public static final String PATH = "/fragments";
+
+    @Inject
+    private LdfService ldfService;
+
+    @Inject
+    private ConfigurationService configurationService;
+
+    @Inject
+    private ExportService exportService;
+
+    private static final String UUID_PATTERN = "{uuid:[^#?]+}";
+
+    @GET
+    public Response getFragment(@QueryParam("subject") String subject,
+                                @QueryParam("predicate") String predicate,
+                                @QueryParam("object") String object,
+                                @QueryParam("page") String page,
+                                @HeaderParam("Accept") String accept) {
+        return getFragment(subject, predicate, object, null, Integer.parseInt(StringUtils.defaultString(page, "1")), accept);
+    }
+
+    @GET
+    @Path(UUID_PATTERN)
+    public Response getFragment(@QueryParam("subject") String subject,
+                                @QueryParam("predicate") String predicate,
+                                @QueryParam("object") String object,
+                                @QueryParam("page") String page,
+                                @PathParam("uuid") String uuid,
+                                @HeaderParam("Accept") String accept) {
+        final String context = buildContextUri(uuid);
+        return getFragment(subject, predicate, object, context, Integer.parseInt(StringUtils.defaultString(page, "1")), accept);
+    }
+
+    private Response getFragment(final String subject,
+                                final String predicate,
+                                final String object,
+                                final String context,
+                                final int page,
+                                final String accept) {
+        final RDFFormat format = getFormat(accept);
+
+        StreamingOutput stream = new StreamingOutput() {
+            @Override
+            public void write(OutputStream outputStream) throws IOException, WebApplicationException {
+                try {
+                    ldfService.writeFragment(subject, predicate, object, context, page, format, outputStream);
+                } catch (RepositoryException e) {
+                    throw new WebApplicationException(e);
+                }
+            }
+        };
+        return Response.ok(stream).build();
+    }
+
+    private RDFFormat getFormat(String accept) {
+        List<ContentType> acceptedTypes = MarmottaHttpUtils.parseAcceptHeader(accept);
+        List<ContentType> offeredTypes  = MarmottaHttpUtils.parseStringList(exportService.getProducedTypes());
+        offeredTypes.removeAll(Collections.unmodifiableList(Arrays.asList(new ContentType("text", "html"), new ContentType("application", "xhtml+xml"))));
+        final ContentType bestType = MarmottaHttpUtils.bestContentType(offeredTypes, acceptedTypes);
+        return Rio.getWriterFormatForMIMEType(bestType.getMime());
+    }
+
+    private String buildContextUri(String uuid) {
+        if (StringUtils.isNotBlank(uuid)) {
+            String root = configurationService.getBaseUri();
+            return root.substring(0, root.length() - 1) + WebServiceUtil.getResourcePath(this) + "/" + uuid;
+        } else {
+            return null;
+        }
+    }
+
+}


[7/9] git commit: MARMOTTA-556: fixed and improved some details

Posted by wi...@apache.org.
MARMOTTA-556: fixed and improved some details


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/d99de515
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/d99de515
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/d99de515

Branch: refs/heads/MARMOTTA-556
Commit: d99de51535956341d031d122a9dfa17fc100495c
Parents: 205d4c1
Author: Sergio Fernández <wi...@apache.org>
Authored: Fri Oct 24 21:08:57 2014 +0200
Committer: Sergio Fernández <wi...@apache.org>
Committed: Fri Oct 24 21:08:57 2014 +0200

----------------------------------------------------------------------
 .../platform/ldf/services/LdfServiceImpl.java   |  2 +-
 .../platform/ldf/webservices/LdfWebService.java | 59 +++++++++++---------
 2 files changed, 35 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/d99de515/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
index dc8fd7c..3f906da 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java
@@ -104,7 +104,6 @@ public class LdfServiceImpl implements LdfService {
         writeFragment(subject, predicate, object, context, page, format, out);
     }
 
-
     @Override
     public void writeFragment(URI subject, URI predicate, Value object, Resource context, int page, RDFFormat format, OutputStream out) throws RepositoryException {
         final RepositoryConnection conn = sesameService.getConnection();
@@ -119,4 +118,5 @@ public class LdfServiceImpl implements LdfService {
             conn.close();
         }
     }
+
 }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/d99de515/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java
index dbfcb96..cc09402 100644
--- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/webservices/LdfWebService.java
@@ -45,45 +45,54 @@ public class LdfWebService {
     private static final String UUID_PATTERN = "{uuid:[^#?]+}";
 
     @GET
-    public Response getFragment(@QueryParam("subject") String subject,
-                                @QueryParam("predicate") String predicate,
-                                @QueryParam("object") String object,
-                                @QueryParam("page") String page,
+    public Response getFragment(@QueryParam("subject") @DefaultValue("") String subject,
+                                @QueryParam("predicate") @DefaultValue("") String predicate,
+                                @QueryParam("object") @DefaultValue("") String object,
+                                @QueryParam("page") @DefaultValue("1") String page,
                                 @HeaderParam("Accept") String accept) {
-        return getFragment(subject, predicate, object, null, Integer.parseInt(StringUtils.defaultString(page, "1")), accept);
+        System.out.println("1");
+        return getFragment(subject, predicate, object, null, Integer.parseInt(page), accept);
     }
 
     @GET
     @Path(UUID_PATTERN)
-    public Response getFragment(@QueryParam("subject") String subject,
-                                @QueryParam("predicate") String predicate,
-                                @QueryParam("object") String object,
-                                @QueryParam("page") String page,
+    public Response getFragment(@QueryParam("subject") @DefaultValue("") String subject,
+                                @QueryParam("predicate") @DefaultValue("") String predicate,
+                                @QueryParam("object") @DefaultValue("") String object,
+                                @QueryParam("page") @DefaultValue("1") String page,
                                 @PathParam("uuid") String uuid,
                                 @HeaderParam("Accept") String accept) {
+        System.out.println("2");
         final String context = buildContextUri(uuid);
-        return getFragment(subject, predicate, object, context, Integer.parseInt(StringUtils.defaultString(page, "1")), accept);
+        return getFragment(subject, predicate, object, context, Integer.parseInt(page), accept);
     }
 
     private Response getFragment(final String subject,
-                                final String predicate,
-                                final String object,
-                                final String context,
-                                final int page,
-                                final String accept) {
+                                 final String predicate,
+                                 final String object,
+                                 final String context,
+                                 final int page,
+                                 final String accept) {
+        System.out.println("3");
         final RDFFormat format = getFormat(accept);
 
-        StreamingOutput stream = new StreamingOutput() {
-            @Override
-            public void write(OutputStream outputStream) throws IOException, WebApplicationException {
-                try {
-                    ldfService.writeFragment(subject, predicate, object, context, page, format, outputStream);
-                } catch (RepositoryException e) {
-                    throw new WebApplicationException(e);
+        try {
+            StreamingOutput stream = new StreamingOutput() {
+                @Override
+                public void write(OutputStream outputStream) throws IOException, WebApplicationException {
+                    try {
+                        ldfService.writeFragment(subject, predicate, object, context, page, format, outputStream);
+                    } catch (RepositoryException e) {
+                        throw new WebApplicationException(e);
+                    }
                 }
-            }
-        };
-        return Response.ok(stream).build();
+            };
+            return Response.ok(stream).build();
+        } catch (WebApplicationException e) {
+            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
+        } catch (IllegalArgumentException e) {
+            return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
+        }
     }
 
     private RDFFormat getFormat(String accept) {