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/28 10:16:13 UTC

[3/4] git commit: MARMOTTA-556: added hydra pages' links

MARMOTTA-556: added hydra pages' links


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

Branch: refs/heads/MARMOTTA-556
Commit: 718c304bf27fe0f06b51d4cbe6cf902439e50285
Parents: f89825a
Author: Sergio Fernández <wi...@apache.org>
Authored: Tue Oct 28 09:48:49 2014 +0100
Committer: Sergio Fernández <wi...@apache.org>
Committed: Tue Oct 28 09:48:49 2014 +0100

----------------------------------------------------------------------
 .../marmotta/platform/ldf/api/LdfService.java   |  11 +-
 .../platform/ldf/services/LdfServiceImpl.java   |  39 +-
 .../apache/marmotta/platform/ldf/vocab/SSD.java | 582 +++++++++++++++++++
 .../platform/ldf/webservices/LdfWebService.java |  53 +-
 4 files changed, 649 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/718c304b/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 e8f84ce..2b4cd0a 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
@@ -42,7 +42,7 @@ public interface LdfService {
      * @param page number of page (starting with 1)
      * @return fragment
      */
-    Model getFragment(String subject, String predicate, String object, int page) throws RepositoryException, IllegalArgumentException;
+    Model getFragment(String subject, String predicate, String object, int page, java.net.URI uri) throws RepositoryException, IllegalArgumentException;
 
     /**
      * Gets a fragment matching the specified triple fragment pattern
@@ -52,9 +52,10 @@ public interface LdfService {
      * @param predicate fragmnent predicate
      * @param object fragment object
      * @param page number of page (starting with 1)
+     * @param uri uri requested
      * @return fragment
      */
-    Model getFragment(URI subject, URI predicate, Value object, int page) throws RepositoryException, IllegalArgumentException;
+    Model getFragment(URI subject, URI predicate, Value object, int page, java.net.URI uri) throws RepositoryException, IllegalArgumentException;
 
     /**
      * Gets a fragment matching the specified quad fragment pattern
@@ -65,9 +66,10 @@ public interface LdfService {
      * @param object fragment object
      * @param context named graph
      * @param page number of page (starting with 1)
+     * @param uri uri requested
      * @return fragment
      */
-    Model getFragment(String subject, String predicate, String object, String context, int page) throws RepositoryException, IllegalArgumentException;
+    Model getFragment(String subject, String predicate, String object, String context, int page, java.net.URI uri) throws RepositoryException, IllegalArgumentException;
 
     /**
      * Gets a fragment matching the specified quad fragment pattern
@@ -78,8 +80,9 @@ public interface LdfService {
      * @param object fragment object
      * @param context named graph
      * @param page number of page (starting with 1)
+     * @param uri uri requested
      * @return fragment
      */
-    Model getFragment(URI subject, URI predicate, Value object, Resource context, int page) throws RepositoryException, IllegalArgumentException;
+    Model getFragment(URI subject, URI predicate, Value object, Resource context, int page, java.net.URI uri) throws RepositoryException, IllegalArgumentException;
 
 }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/718c304b/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 d6fac6c..f776e03 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
@@ -18,13 +18,13 @@
 package org.apache.marmotta.platform.ldf.services;
 
 import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.marmotta.commons.sesame.repository.ResultUtils;
 import org.apache.marmotta.commons.vocabulary.XSD;
 import org.apache.marmotta.platform.core.api.triplestore.SesameService;
 import org.apache.marmotta.platform.ldf.api.LdfService;
 import org.apache.marmotta.platform.ldf.vocab.HYDRA;
+import org.apache.marmotta.platform.ldf.vocab.SSD;
 import org.apache.marmotta.platform.ldf.vocab.VOID;
 import org.openrdf.model.*;
 import org.openrdf.model.impl.TreeModel;
@@ -37,9 +37,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.inject.Inject;
+import javax.ws.rs.core.UriBuilder;
 import java.net.URISyntaxException;
-import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -55,17 +56,17 @@ public class LdfServiceImpl implements LdfService {
     private SesameService sesameService;
 
     @Override
-    public Model getFragment(String subjectStr, String predicateStr, String objectStr, int page) throws RepositoryException, IllegalArgumentException {
-        return getFragment(subjectStr, predicateStr, objectStr, null, page);
+    public Model getFragment(String subjectStr, String predicateStr, String objectStr, int page, java.net.URI uri) throws RepositoryException, IllegalArgumentException {
+        return getFragment(subjectStr, predicateStr, objectStr, null, page, uri);
     }
 
     @Override
-    public Model getFragment(URI subject, URI predicate, Value object, int page) throws RepositoryException, IllegalArgumentException {
-        return getFragment(subject, predicate, object, null, page);
+    public Model getFragment(URI subject, URI predicate, Value object, int page, java.net.URI uri) throws RepositoryException, IllegalArgumentException {
+        return getFragment(subject, predicate, object, null, page, uri);
     }
 
     @Override
-    public Model getFragment(String subjectStr, String predicateStr, String objectStr, String contextStr, int page) throws RepositoryException, IllegalArgumentException {
+    public Model getFragment(String subjectStr, String predicateStr, String objectStr, String contextStr, int page, java.net.URI uri) throws RepositoryException, IllegalArgumentException {
         final ValueFactoryImpl vf = new ValueFactoryImpl();
 
         URI subject = null;
@@ -108,20 +109,19 @@ public class LdfServiceImpl implements LdfService {
             }
         }
 
-        return getFragment(subject, predicate, object, context, page);
+        return getFragment(subject, predicate, object, context, page, uri);
     }
 
     @Override
-    public Model getFragment(URI subject, URI predicate, Value object, Resource context, int page) throws RepositoryException, IllegalArgumentException {
+    public Model getFragment(URI subject, URI predicate, Value object, Resource context, int page, java.net.URI uri) throws RepositoryException, IllegalArgumentException {
         final RepositoryConnection conn = sesameService.getConnection();
-        final List<Statement> statements;
         try {
             conn.begin();
 
             //first get the triple fragment for ordering by a fixed criteria
             //TODO: do this effectively
             final RepositoryResult<Statement> results = conn.getStatements(subject, predicate, object, true, context);
-            statements = FluentIterable.from(ResultUtils.iterable(results)).toSortedList(new Comparator<Statement>() {
+            final List<Statement> statements = FluentIterable.from(ResultUtils.iterable(results)).toSortedList(new Comparator<Statement>() {
                 @Override
                 public int compare(Statement s1, Statement s2) {
                     int subjectComparison = s1.getSubject().stringValue().compareTo(s2.getSubject().stringValue());
@@ -165,11 +165,15 @@ public class LdfServiceImpl implements LdfService {
             model.addAll(filteredStatements);
 
             //and add ldf metadata
-            Resource dataset = context != null ? context : vf.createBNode();
+            URI dataset = vf.createURI(UriBuilder.fromUri(uri).replaceQuery(null).build().toASCIIString());
             model.add(dataset, RDF.TYPE, VOID.Dataset);
             model.add(dataset, RDF.TYPE, HYDRA.Collection);
+            if (context != null) {
+                model.add(dataset, VOID.inDataset, context);
+                model.add(dataset, SSD.namedGraph, context);
+            }
 
-            Resource fragment = vf.createBNode(); //TODO
+            Resource fragment = vf.createBNode(String.format("fragment-%tFT%<tH-%<tM-%<tS.%<tL", new Date()));
             model.add(dataset, VOID.subset, fragment);
             model.add(fragment, RDF.TYPE, HYDRA.Collection);
             if (offset != 0 && limit != size) {
@@ -178,8 +182,13 @@ public class LdfServiceImpl implements LdfService {
             model.add(fragment, VOID.triples, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer));
             model.add(fragment, HYDRA.totalItems, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer));
             model.add(fragment, HYDRA.itemsPerPage, vf.createLiteral(Integer.toString(LdfService.PAGE_SIZE), XSD.Integer));
-            //TODO: HYDRA_FIRSTPAGE, HYDRA_PREVIOUSPAGE, HYDRA_NEXTPAGE
-
+            model.add(fragment, HYDRA.firstPage, vf.createURI(UriBuilder.fromUri(uri).queryParam("page", 1).build().toASCIIString()));
+            if (offset > 0) {
+                model.add(fragment, HYDRA.previousPage, vf.createURI(UriBuilder.fromUri(uri).queryParam("page", page-1).build().toASCIIString()));
+            }
+            if (offset + limit < statements.size()) {
+                model.add(fragment, HYDRA.nextPage, vf.createURI(UriBuilder.fromUri(uri).queryParam("page", page+1).build().toASCIIString()));
+            }
             //TODO: hydra controls
 
             return model;

http://git-wip-us.apache.org/repos/asf/marmotta/blob/718c304b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/SSD.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/SSD.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/SSD.java
new file mode 100644
index 0000000..9c15375
--- /dev/null
+++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/vocab/SSD.java
@@ -0,0 +1,582 @@
+/*
+ * 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 Sparql-service-description.
+ * Prefix: {@code <http://www.w3.org/ns/sparql-service-description#>}
+ */
+public class SSD {
+
+    /** {@code http://www.w3.org/ns/sparql-service-description#} **/
+    public static final String NAMESPACE = "http://www.w3.org/ns/sparql-service-description#";
+
+    /** {@code sparql-service-description} **/
+    public static final String PREFIX = "sparql-service-description";
+
+    /**
+     * Aggregate
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#Aggregate}.
+     * <p>
+     * An instance of sd:Aggregate represents an aggregate that may be used
+	 * in a SPARQL aggregate query (for instance in a HAVING clause or SELECT
+	 * expression) besides the standard list of supported aggregates COUNT,
+	 * SUM, MIN, MAX, AVG, GROUP_CONCAT, and SAMPLE.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#Aggregate">Aggregate</a>
+     */
+    public static final URI Aggregate;
+
+    /**
+     * available graph descriptions
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#availableGraphs}.
+     * <p>
+     * Relates an instance of sd:Service to a description of the graphs which
+	 * are allowed in the construction of a dataset either via the SPARQL
+	 * Protocol, with FROM/FROM NAMED clauses in a query, or with USING/USING
+	 * NAMED in an update request, if the service limits the scope of dataset
+	 * construction.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#availableGraphs">availableGraphs</a>
+     */
+    public static final URI availableGraphs;
+
+    /**
+     * Basic Federated Query
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#BasicFederatedQuery}.
+     * <p>
+     * sd:BasicFederatedQuery, when used as the object of the sd:feature
+	 * property, indicates that the SPARQL service supports basic federated
+	 * query using the SERVICE keyword as defined by SPARQL 1.1 Federation
+	 * Extensions.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#BasicFederatedQuery">BasicFederatedQuery</a>
+     */
+    public static final URI BasicFederatedQuery;
+
+    /**
+     * Dataset
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#Dataset}.
+     * <p>
+     * An instance of sd:Dataset represents a RDF Dataset comprised of a
+	 * default graph and zero or more named graphs.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#Dataset">Dataset</a>
+     */
+    public static final URI Dataset;
+
+    /**
+     * default dataset description
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#defaultDataset}.
+     * <p>
+     * Relates an instance of sd:Service to a description of the default
+	 * dataset available when no explicit dataset is specified in the query,
+	 * update request or via protocol parameters.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#defaultDataset">defaultDataset</a>
+     */
+    public static final URI defaultDataset;
+
+    /**
+     * default entailment regime
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#defaultEntailmentRegime}.
+     * <p>
+     * Relates an instance of sd:Service with a resource representing an
+	 * entailment regime used for basic graph pattern matching. This property
+	 * is intended for use when a single entailment regime by default applies
+	 * to all graphs in the default dataset of the service. In situations
+	 * where a different entailment regime applies to a specific graph in the
+	 * dataset, the sd:entailmentRegime property should be used to indicate
+	 * this fact in the description of that graph.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#defaultEntailmentRegime">defaultEntailmentRegime</a>
+     */
+    public static final URI defaultEntailmentRegime;
+
+    /**
+     * default graph
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#defaultGraph}.
+     * <p>
+     * Relates an instance of sd:Dataset to the description of its default
+	 * graph.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#defaultGraph">defaultGraph</a>
+     */
+    public static final URI defaultGraph;
+
+    /**
+     * default supported entailment profile
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#defaultSupportedEntailmentProfile}.
+     * <p>
+     * Relates an instance of sd:Service with a resource representing a
+	 * supported profile of the default entailment regime (as declared by
+	 * sd:defaultEntailmentRegime).
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#defaultSupportedEntailmentProfile">defaultSupportedEntailmentProfile</a>
+     */
+    public static final URI defaultSupportedEntailmentProfile;
+
+    /**
+     * Dereferences URIs
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#DereferencesURIs}.
+     * <p>
+     * sd:DereferencesURIs, when used as the object of the sd:feature
+	 * property, indicates that a SPARQL service will dereference URIs used
+	 * in FROM/FROM NAMED and USING/USING NAMED clauses and use the resulting
+	 * RDF in the dataset during query evaluation.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#DereferencesURIs">DereferencesURIs</a>
+     */
+    public static final URI DereferencesURIs;
+
+    /**
+     * Empty Graphs
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#EmptyGraphs}.
+     * <p>
+     * sd:EmptyGraphs, when used as the object of the sd:feature property,
+	 * indicates that the underlying graph store supports empty graphs. A
+	 * graph store that supports empty graphs MUST NOT remove graphs that are
+	 * left empty after triples are removed from them.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#EmptyGraphs">EmptyGraphs</a>
+     */
+    public static final URI EmptyGraphs;
+
+    /**
+     * endpoint
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#endpoint}.
+     * <p>
+     * The SPARQL endpoint of an sd:Service that implements the SPARQL
+	 * Protocol service. The object of the sd:endpoint property is an IRI.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#endpoint">endpoint</a>
+     */
+    public static final URI endpoint;
+
+    /**
+     * Entailment Profile
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#EntailmentProfile}.
+     * <p>
+     * An instance of sd:EntailmentProfile represents a profile of an
+	 * entailment regime. An entailment profile MAY impose restrictions on
+	 * what constitutes valid RDF with respect to entailment.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#EntailmentProfile">EntailmentProfile</a>
+     */
+    public static final URI EntailmentProfile;
+
+    /**
+     * Entailment Regime
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#EntailmentRegime}.
+     * <p>
+     * An instance of sd:EntailmentRegime represents an entailment regime
+	 * used in basic graph pattern matching (as described by SPARQL 1.1 Query
+	 * Language).
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#EntailmentRegime">EntailmentRegime</a>
+     */
+    public static final URI EntailmentRegime;
+
+    /**
+     * entailment regime
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#entailmentRegime}.
+     * <p>
+     * Relates a named graph description with a resource representing an
+	 * entailment regime used for basic graph pattern matching over that
+	 * graph.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#entailmentRegime">entailmentRegime</a>
+     */
+    public static final URI entailmentRegime;
+
+    /**
+     * extension aggregate
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#extensionAggregate}.
+     * <p>
+     * Relates an instance of sd:Service to an aggregate that may be used in
+	 * a SPARQL aggregate query (for instance in a HAVING clause or SELECT
+	 * expression) besides the standard list of supported aggregates COUNT,
+	 * SUM, MIN, MAX, AVG, GROUP_CONCAT, and SAMPLE
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#extensionAggregate">extensionAggregate</a>
+     */
+    public static final URI extensionAggregate;
+
+    /**
+     * extension function
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#extensionFunction}.
+     * <p>
+     * Relates an instance of sd:Service to a function that may be used in a
+	 * SPARQL SELECT expression or a FILTER, HAVING, GROUP BY, ORDER BY, or
+	 * BIND clause.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#extensionFunction">extensionFunction</a>
+     */
+    public static final URI extensionFunction;
+
+    /**
+     * Feature
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#Feature}.
+     * <p>
+     * An instance of sd:Feature represents a feature of a SPARQL service.
+	 * Specific types of features include functions, aggregates, languages,
+	 * and entailment regimes and profiles. This document defines five
+	 * instances of sd:Feature: sd:DereferencesURIs, sd:UnionDefaultGraph,
+	 * sd:RequiresDataset, sd:EmptyGraphs, and sd:BasicFederatedQuery.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#Feature">Feature</a>
+     */
+    public static final URI Feature;
+
+    /**
+     * feature
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#feature}.
+     * <p>
+     * Relates an instance of sd:Service with a resource representing a
+	 * supported feature.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#feature">feature</a>
+     */
+    public static final URI feature;
+
+    /**
+     * Function
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#Function}.
+     * <p>
+     * An instance of sd:Function represents a function that may be used in a
+	 * SPARQL SELECT expression or a FILTER, HAVING, GROUP BY, ORDER BY, or
+	 * BIND clause.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#Function">Function</a>
+     */
+    public static final URI Function;
+
+    /**
+     * graph
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#graph}.
+     * <p>
+     * Relates a named graph to its graph description.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#graph">graph</a>
+     */
+    public static final URI graph;
+
+    /**
+     * Graph
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#Graph}.
+     * <p>
+     * An instance of sd:Graph represents the description of an RDF graph.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#Graph">Graph</a>
+     */
+    public static final URI Graph;
+
+    /**
+     * Graph Collection
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#GraphCollection}.
+     * <p>
+     * An instance of sd:GraphCollection represents a collection of zero or
+	 * more named graph descriptions. Each named graph description belonging
+	 * to an sd:GraphCollection MUST be linked with the sd:namedGraph
+	 * predicate.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#GraphCollection">GraphCollection</a>
+     */
+    public static final URI GraphCollection;
+
+    /**
+     * input format
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#inputFormat}.
+     * <p>
+     * Relates an instance of sd:Service to a format that is supported for
+	 * parsing RDF input; for example, via a SPARQL 1.1 Update LOAD
+	 * statement, or when URIs are dereferenced in FROM/FROM
+	 * NAMED/USING/USING NAMED clauses.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#inputFormat">inputFormat</a>
+     */
+    public static final URI inputFormat;
+
+    /**
+     * Language
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#Language}.
+     * <p>
+     * An instance of sd:Language represents one of the SPARQL languages,
+	 * including specific configurations providing particular features or
+	 * extensions. This document defines three instances of sd:Language:
+	 * sd:SPARQL10Query, sd:SPARQL11Query, and sd:SPARQL11Update.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#Language">Language</a>
+     */
+    public static final URI Language;
+
+    /**
+     * language extension
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#languageExtension}.
+     * <p>
+     * Relates an instance of sd:Service to a resource representing an
+	 * implemented extension to the SPARQL Query or Update language.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#languageExtension">languageExtension</a>
+     */
+    public static final URI languageExtension;
+
+    /**
+     * name
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#name}.
+     * <p>
+     * Relates a named graph to the name by which it may be referenced in a
+	 * FROM/FROM NAMED clause. The object of the sd:name property is an IRI.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#name">name</a>
+     */
+    public static final URI name;
+
+    /**
+     * named graph
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#namedGraph}.
+     * <p>
+     * Relates an instance of sd:GraphCollection (or its subclass sd:Dataset)
+	 * to the description of one of its named graphs. The description of such
+	 * a named graph MUST include the sd:name property and MAY include the
+	 * sd:graph property.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#namedGraph">namedGraph</a>
+     */
+    public static final URI namedGraph;
+
+    /**
+     * Named Graph
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#NamedGraph}.
+     * <p>
+     * An instance of sd:NamedGraph represents a named graph having a name
+	 * (via sd:name) and an optional graph description (via sd:graph).
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#NamedGraph">NamedGraph</a>
+     */
+    public static final URI NamedGraph;
+
+    /**
+     * property feature
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#propertyFeature}.
+     * <p>
+     * Relates an instance of sd:Service to a resource representing an
+	 * implemented feature that extends the SPARQL Query or Update language
+	 * and that is accessed by using the named property.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#propertyFeature">propertyFeature</a>
+     */
+    public static final URI propertyFeature;
+
+    /**
+     * Requires Dataset
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#RequiresDataset}.
+     * <p>
+     * sd:RequiresDataset, when used as the object of the sd:feature
+	 * property, indicates that the SPARQL service requires an explicit
+	 * dataset declaration (based on either FROM/FROM NAMED clauses in a
+	 * query, USING/USING NAMED clauses in an update, or the appropriate
+	 * SPARQL Protocol parameters).
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#RequiresDataset">RequiresDataset</a>
+     */
+    public static final URI RequiresDataset;
+
+    /**
+     * result format
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#resultFormat}.
+     * <p>
+     * Relates an instance of sd:Service to a format that is supported for
+	 * serializing query results.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#resultFormat">resultFormat</a>
+     */
+    public static final URI resultFormat;
+
+    /**
+     * Service
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#Service}.
+     * <p>
+     * An instance of sd:Service represents a SPARQL service made available
+	 * via the SPARQL Protocol.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#Service">Service</a>
+     */
+    public static final URI Service;
+
+    /**
+     * SPARQL 1.0 Query
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#SPARQL10Query}.
+     * <p>
+     * sd:SPARQL10Query is an sd:Language representing the SPARQL 1.0 Query
+	 * language.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#SPARQL10Query">SPARQL10Query</a>
+     */
+    public static final URI SPARQL10Query;
+
+    /**
+     * SPARQL 1.1 Query
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#SPARQL11Query}.
+     * <p>
+     * sd:SPARQL11Query is an sd:Language representing the SPARQL 1.1 Query
+	 * language.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#SPARQL11Query">SPARQL11Query</a>
+     */
+    public static final URI SPARQL11Query;
+
+    /**
+     * SPARQL 1.1 Update
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#SPARQL11Update}.
+     * <p>
+     * sd:SPARQLUpdate is an sd:Language representing the SPARQL 1.1 Update
+	 * language.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#SPARQL11Update">SPARQL11Update</a>
+     */
+    public static final URI SPARQL11Update;
+
+    /**
+     * supported entailment profile
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#supportedEntailmentProfile}.
+     * <p>
+     * Relates a named graph description with a resource representing a
+	 * supported profile of the entailment regime (as declared by
+	 * sd:entailmentRegime) used for basic graph pattern matching over that
+	 * graph.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#supportedEntailmentProfile">supportedEntailmentProfile</a>
+     */
+    public static final URI supportedEntailmentProfile;
+
+    /**
+     * supported language
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#supportedLanguage}.
+     * <p>
+     * Relates an instance of sd:Service to a SPARQL language (e.g. Query and
+	 * Update) that it implements.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#supportedLanguage">supportedLanguage</a>
+     */
+    public static final URI supportedLanguage;
+
+    /**
+     * Union Default Graph
+     * <p>
+     * {@code http://www.w3.org/ns/sparql-service-description#UnionDefaultGraph}.
+     * <p>
+     * sd:UnionDefaultGraph, when used as the object of the sd:feature
+	 * property, indicates that the default graph of the dataset used during
+	 * query and update evaluation (when an explicit dataset is not
+	 * specified) is comprised of the union of all the named graphs in that
+	 * dataset.
+     *
+     * @see <a href="http://www.w3.org/ns/sparql-service-description#UnionDefaultGraph">UnionDefaultGraph</a>
+     */
+    public static final URI UnionDefaultGraph;
+
+    static {
+        ValueFactory factory = ValueFactoryImpl.getInstance();
+
+        Aggregate = factory.createURI(SSD.NAMESPACE, "Aggregate");
+        availableGraphs = factory.createURI(SSD.NAMESPACE, "availableGraphs");
+        BasicFederatedQuery = factory.createURI(SSD.NAMESPACE, "BasicFederatedQuery");
+        Dataset = factory.createURI(SSD.NAMESPACE, "Dataset");
+        defaultDataset = factory.createURI(SSD.NAMESPACE, "defaultDataset");
+        defaultEntailmentRegime = factory.createURI(SSD.NAMESPACE, "defaultEntailmentRegime");
+        defaultGraph = factory.createURI(SSD.NAMESPACE, "defaultGraph");
+        defaultSupportedEntailmentProfile = factory.createURI(SSD.NAMESPACE, "defaultSupportedEntailmentProfile");
+        DereferencesURIs = factory.createURI(SSD.NAMESPACE, "DereferencesURIs");
+        EmptyGraphs = factory.createURI(SSD.NAMESPACE, "EmptyGraphs");
+        endpoint = factory.createURI(SSD.NAMESPACE, "endpoint");
+        EntailmentProfile = factory.createURI(SSD.NAMESPACE, "EntailmentProfile");
+        EntailmentRegime = factory.createURI(SSD.NAMESPACE, "EntailmentRegime");
+        entailmentRegime = factory.createURI(SSD.NAMESPACE, "entailmentRegime");
+        extensionAggregate = factory.createURI(SSD.NAMESPACE, "extensionAggregate");
+        extensionFunction = factory.createURI(SSD.NAMESPACE, "extensionFunction");
+        Feature = factory.createURI(SSD.NAMESPACE, "Feature");
+        feature = factory.createURI(SSD.NAMESPACE, "feature");
+        Function = factory.createURI(SSD.NAMESPACE, "Function");
+        graph = factory.createURI(SSD.NAMESPACE, "graph");
+        Graph = factory.createURI(SSD.NAMESPACE, "Graph");
+        GraphCollection = factory.createURI(SSD.NAMESPACE, "GraphCollection");
+        inputFormat = factory.createURI(SSD.NAMESPACE, "inputFormat");
+        Language = factory.createURI(SSD.NAMESPACE, "Language");
+        languageExtension = factory.createURI(SSD.NAMESPACE, "languageExtension");
+        name = factory.createURI(SSD.NAMESPACE, "name");
+        namedGraph = factory.createURI(SSD.NAMESPACE, "namedGraph");
+        NamedGraph = factory.createURI(SSD.NAMESPACE, "NamedGraph");
+        propertyFeature = factory.createURI(SSD.NAMESPACE, "propertyFeature");
+        RequiresDataset = factory.createURI(SSD.NAMESPACE, "RequiresDataset");
+        resultFormat = factory.createURI(SSD.NAMESPACE, "resultFormat");
+        Service = factory.createURI(SSD.NAMESPACE, "Service");
+        SPARQL10Query = factory.createURI(SSD.NAMESPACE, "SPARQL10Query");
+        SPARQL11Query = factory.createURI(SSD.NAMESPACE, "SPARQL11Query");
+        SPARQL11Update = factory.createURI(SSD.NAMESPACE, "SPARQL11Update");
+        supportedEntailmentProfile = factory.createURI(SSD.NAMESPACE, "supportedEntailmentProfile");
+        supportedLanguage = factory.createURI(SSD.NAMESPACE, "supportedLanguage");
+        UnionDefaultGraph = factory.createURI(SSD.NAMESPACE, "UnionDefaultGraph");
+    }
+
+    private SSD() {
+        //static access only
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/718c304b/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 37b554c..5a838c0 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
@@ -1,3 +1,20 @@
+/*
+ * 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.webservices;
 
 import org.apache.commons.lang3.StringUtils;
@@ -15,8 +32,7 @@ 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 javax.ws.rs.core.*;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Arrays;
@@ -46,24 +62,26 @@ public class LdfWebService {
     private static final String UUID_PATTERN = "{uuid:[^#?]+}";
 
     @GET
-    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(page), accept);
+    public Response getFragment(@QueryParam("subject") @DefaultValue("") final String subject,
+                                @QueryParam("predicate") @DefaultValue("") final String predicate,
+                                @QueryParam("object") @DefaultValue("") final String object,
+                                @QueryParam("page") @DefaultValue("1") final String page,
+                                @HeaderParam("Accept") final String accept,
+                                @Context final UriInfo uriInfo) {
+        return getFragment(subject, predicate, object, null, Integer.parseInt(page), accept, uriInfo);
     }
 
     @GET
     @Path(UUID_PATTERN)
-    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) {
+    public Response getFragment(@QueryParam("subject") @DefaultValue("") final String subject,
+                                @QueryParam("predicate") @DefaultValue("") final String predicate,
+                                @QueryParam("object") @DefaultValue("") final String object,
+                                @QueryParam("page") @DefaultValue("1") final String page,
+                                @PathParam("uuid") final String uuid,
+                                @HeaderParam("Accept") final String accept,
+                                @Context final UriInfo uriInfo) {
         final String context = buildContextUri(uuid);
-        return getFragment(subject, predicate, object, context, Integer.parseInt(page), accept);
+        return getFragment(subject, predicate, object, context, Integer.parseInt(page), accept, uriInfo);
     }
 
     private Response getFragment(final String subject,
@@ -71,11 +89,12 @@ public class LdfWebService {
                                  final String object,
                                  final String context,
                                  final int page,
-                                 final String accept) {
+                                 final String accept,
+                                 final UriInfo uriInfo) {
 
         final Model fragment;
         try {
-            fragment = ldfService.getFragment(subject, predicate, object, context, page);
+            fragment = ldfService.getFragment(subject, predicate, object, context, page, uriInfo.getRequestUri());
         } catch (RepositoryException e) {
             return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
         } catch (IllegalArgumentException e) {