You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by ss...@apache.org on 2013/10/03 17:07:06 UTC

[07/22] MARMOTTA-85: restructure modules to support modular backends - first draft of kiwi store backend - MARMOTTA-87: first draft of native store backend - first draft of bigdata store backend

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache-kiwi/src/main/java/org/apache/marmotta/platform/ldcache/webservices/LinkedDataCachingWebService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache-kiwi/src/main/java/org/apache/marmotta/platform/ldcache/webservices/LinkedDataCachingWebService.java b/platform/marmotta-ldcache-kiwi/src/main/java/org/apache/marmotta/platform/ldcache/webservices/LinkedDataCachingWebService.java
new file mode 100644
index 0000000..983228a
--- /dev/null
+++ b/platform/marmotta-ldcache-kiwi/src/main/java/org/apache/marmotta/platform/ldcache/webservices/LinkedDataCachingWebService.java
@@ -0,0 +1,306 @@
+/**
+ * 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.ldcache.webservices;
+
+import org.apache.marmotta.commons.sesame.model.Namespaces;
+import org.apache.marmotta.ldclient.api.endpoint.Endpoint;
+import org.apache.marmotta.ldclient.api.provider.DataProvider;
+import org.apache.marmotta.ldclient.model.ClientResponse;
+import org.apache.marmotta.ldclient.provider.rdf.LinkedDataProvider;
+import org.apache.marmotta.platform.core.api.triplestore.SesameService;
+import org.apache.marmotta.platform.ldcache.api.endpoint.LinkedDataEndpointService;
+import org.apache.marmotta.platform.ldcache.services.ldcache.LDCacheSailProvider;
+import org.openrdf.model.URI;
+import org.openrdf.repository.RepositoryConnection;
+import org.openrdf.rio.RDFHandler;
+import org.openrdf.rio.rdfxml.util.RDFXMLPrettyWriter;
+import org.slf4j.Logger;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.ws.rs.*;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import java.io.ByteArrayOutputStream;
+import java.util.*;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+/**
+ * Add file description here!
+ * <p/>
+ * User: sschaffe
+ */
+@ApplicationScoped
+@Path("/cache")
+public class LinkedDataCachingWebService {
+
+    @Inject
+    private Logger log;
+
+    @Inject
+    private LinkedDataEndpointService endpointService;
+
+    @Inject
+    private SesameService sesameService;
+
+    @Inject
+    private LDCacheSailProvider cacheSailProvider;
+
+
+    @GET
+    @Path("/live")
+    public Response retrieveLive(@QueryParam("uri") String uri) {
+        if(cacheSailProvider.isEnabled()) {
+            try {
+                ClientResponse response = cacheSailProvider.getLDClient().retrieveResource(uri);
+
+                RepositoryConnection con = response.getTriples().getConnection();
+                con.begin();
+
+                ByteArrayOutputStream out = new ByteArrayOutputStream();
+                RDFHandler handler = new RDFXMLPrettyWriter(out);
+                con.export(handler);
+
+                con.commit();
+                con.close();
+
+
+                return Response.ok().entity( new String(out.toByteArray(), "utf-8")).build();
+            } catch (Exception e) {
+                log.error("exception while retrieving resource",e);
+                return Response.status(500).entity(e.getMessage()).build();
+            }
+        } else {
+            return Response.status(Status.SERVICE_UNAVAILABLE).entity("caching is disabled").build();
+        }
+    }
+
+    @GET
+    @Path("/cached")
+    public Response retrieveCached(@QueryParam("uri") String uri) {
+        if(cacheSailProvider.isEnabled()) {
+            URI resource = sesameService.getValueFactory().createURI(uri);
+
+
+            try {
+                cacheSailProvider.getLDCache().refreshResource(resource, false);
+
+                return Response.ok().build();
+            } catch (Exception e) {
+                log.error("exception while retrieving resource",e);
+                return Response.status(500).entity(e.getMessage()).build();
+            }
+        } else {
+            return Response.status(Status.SERVICE_UNAVAILABLE).entity("caching is disabled").build();
+        }
+
+    }
+
+    @GET
+    @Path("/refresh")
+    public Response refreshCached(@QueryParam("uri") String uri) {
+
+        if(cacheSailProvider.isEnabled()) {
+            URI resource = sesameService.getValueFactory().createURI(uri);
+
+
+            try {
+                cacheSailProvider.getLDCache().refreshResource(resource, true);
+
+                return Response.ok().build();
+            } catch (Exception e) {
+                log.error("exception while retrieving resource",e);
+                return Response.status(500).entity(e.getMessage()).build();
+            }
+        } else {
+            return Response.status(Status.SERVICE_UNAVAILABLE).entity("caching is disabled").build();
+        }
+
+    }
+
+    @POST
+    @Path("/expire")
+    public Response expireCache(@QueryParam("uri") String uri) {
+
+        if(cacheSailProvider.isEnabled()) {
+            if (uri != null) {
+                URI resource = sesameService.getValueFactory().createURI(uri);
+                cacheSailProvider.getLDCache().expire(resource);
+            } else {
+                cacheSailProvider.getLDCache().expireAll();
+            }
+
+            return Response.ok().build();
+        } else {
+            return Response.status(Status.SERVICE_UNAVAILABLE).entity("caching is disabled").build();
+        }
+    }
+
+    @POST
+    @Path("/endpoint")
+    public Response registerEndpoint(@QueryParam("name") String name,
+                                     @QueryParam("prefix") String prefix,
+                                     @QueryParam("endpoint") String endpointUrl,
+                                     @QueryParam("kind") String type,
+                                     @QueryParam("mimetype") String mimetype,
+                                     @QueryParam("expiry") long expiry) {
+
+        if(cacheSailProvider.isEnabled()) {
+            if (type == null || !getProviderNames().contains(type.toLowerCase())) {
+                type = LinkedDataProvider.PROVIDER_NAME;
+            }
+
+            // Check for valid Regex
+            if (prefix != null) {
+                try {
+                    if (prefix.startsWith(Endpoint.REGEX_INDICATOR)) {
+                        Pattern.compile(prefix.substring(Endpoint.REGEX_INDICATOR.length()));
+                    } else {
+                        Pattern.compile(prefix);
+                    }
+                } catch (PatternSyntaxException pse) {
+                    return Response.status(Status.BAD_REQUEST).entity("Invalid Regex in prefix detected").build();
+                }
+            }
+            if (endpointUrl != null) {
+                endpointUrl = endpointUrl.replace('<', '{').replace('>', '}');
+            } else {
+                endpointUrl = "";
+            }
+            if (mimetype == null) {
+                mimetype ="";
+            }
+            Endpoint endpoint = new Endpoint(name, type, prefix, endpointUrl, mimetype, expiry);
+            endpointService.addEndpoint(endpoint);
+
+            cacheSailProvider.updateEndpoints();
+
+
+            return Response.ok().build();
+        } else {
+            return Response.status(Status.SERVICE_UNAVAILABLE).entity("caching is disabled").build();
+        }
+
+    }
+
+    @GET
+    @Path("/endpoint/list")
+    @Produces("application/json")
+    public Response listEndpoints() {
+
+        List<Map<String, Object>> result = new LinkedList<Map<String, Object>>();
+        for(Endpoint endpoint : endpointService.listEndpoints()) {
+            result.add(buildEndpointJSON(endpoint, false));
+        }
+        for(Endpoint endpoint : cacheSailProvider.getVolatileEndpoints()) {
+            result.add(buildEndpointJSON(endpoint, true));
+        }
+
+        return Response.ok().entity(result).build();
+    }
+
+    @GET
+    @Path("/provider/list")
+    @Produces(Namespaces.MIME_TYPE_JSON)
+    public Response listProviders() {
+        if(cacheSailProvider.isEnabled()) {
+            return Response.ok(getProviderNames()).build();
+        } else {
+            return Response.status(Status.SERVICE_UNAVAILABLE).entity("caching is disabled").build();
+        }
+    }
+
+
+    @GET
+    @Path("/endpoint/{id}")
+    @Produces("application/json")
+    public Response retrieveEndpoint(@PathParam("id") String id) {
+
+        Endpoint endpoint = endpointService.getEndpoint(id);
+        if (endpoint == null) return notFound(id);
+
+
+        return Response.ok().entity(buildEndpointJSON(endpoint, false)).build();
+    }
+
+    @DELETE
+    @Path("/endpoint/{id}")
+    public Response removeEndpoint(@PathParam("id") String id) {
+
+        Endpoint endpoint = endpointService.getEndpoint(id);
+        if (endpoint == null) return notFound(id);
+
+        endpointService.removeEndpoint(endpoint);
+
+        cacheSailProvider.updateEndpoints();
+
+        return Response.ok().build();
+    }
+
+    @POST
+    @Path("/endpoint/{id}/enable")
+    public Response enableEndpoint(@PathParam("id") String id, @QueryParam("enable") @DefaultValue("true") boolean enable) {
+        Endpoint endpoint = endpointService.getEndpoint(id);
+        if (endpoint == null) return notFound(id);
+
+        endpoint.setActive(enable);
+        endpointService.updateEndpoint(endpoint);
+
+        cacheSailProvider.updateEndpoints();
+
+        return Response.ok().build();
+    }
+
+    private Response notFound(String id) {
+        return Response.status(Status.NOT_FOUND).entity("No endpoint with id " + id + " found!").build();
+    }
+
+    @POST
+    @Path("/endpoint/{id}/disable")
+    public Response disableEndpoint(@PathParam("id") String id) {
+        return enableEndpoint(id, false);
+    }
+
+
+    private Map<String, Object> buildEndpointJSON(Endpoint endpoint, boolean isVolatile) {
+        HashMap<String, Object> resultMap = new HashMap<String, Object>();
+        resultMap.put("id",endpoint.getName().replaceAll("[^A-Za-z0-9 ]", "").toLowerCase());
+        resultMap.put("name",endpoint.getName());
+        resultMap.put("endpoint",endpoint.getEndpointUrl());
+        resultMap.put("expiry", endpoint.getDefaultExpiry());
+        resultMap.put("prefix",endpoint.getUriPattern());
+        resultMap.put("kind",endpoint.getType().toString());
+        resultMap.put("mimetype",endpoint.getContentTypes());
+        resultMap.put("active", endpoint.isActive());
+        resultMap.put("volatile", isVolatile);
+
+        return resultMap;
+    }
+
+
+    private Set<String> getProviderNames() {
+        Set<String> result = new HashSet<String>();
+
+        for(DataProvider provider : cacheSailProvider.getLDClient().getDataProviders()) {
+            result.add(provider.getName().toLowerCase());
+        }
+
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache-kiwi/src/main/resources/META-INF/beans.xml
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache-kiwi/src/main/resources/META-INF/beans.xml b/platform/marmotta-ldcache-kiwi/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..461858e
--- /dev/null
+++ b/platform/marmotta-ldcache-kiwi/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/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache-kiwi/src/main/resources/config-defaults.properties
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache-kiwi/src/main/resources/config-defaults.properties b/platform/marmotta-ldcache-kiwi/src/main/resources/config-defaults.properties
new file mode 100644
index 0000000..750de20
--- /dev/null
+++ b/platform/marmotta-ldcache-kiwi/src/main/resources/config-defaults.properties
@@ -0,0 +1,49 @@
+#
+# 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.
+#
+
+###############################################################################
+# LMF LD caching configuration
+###############################################################################
+
+# enable/disable automatic caching of remote resources from the Linked Data Cloud; enabling leads to many
+# HTTP requests when querying and should be considered with care
+ldcache.enabled = true
+
+# default expiry time in seconds if not otherwise given (default: 1 day)
+ldcache.expiry = 86400
+
+# minimum expiry time before which a resource is refreshed from the linked data cloud (use to avoid too short expiry times returned by servers)
+ldcache.minexpiry = 3600
+
+# how long to wait in ms when no data is sent over a connection
+ldcache.so_timeout = 60000
+
+# how long to wait in ms until a connection is established
+ldcache.connection_timeout = 10000
+
+# how many http retrievals to run at most in parallel
+ldcache.max_parallel_requests = 10
+
+# Sample for a cache entry
+ldcache.sample.dbpedia.name = DBPedia Sparql
+ldcache.sample.dbpedia.kind = SPARQL
+ldcache.sample.dbpedia.prefix = http://dbpedia\\.org.*
+ldcache.sample.dbpedia.endpoint = http://dbpedia.org/sparql
+ldcache.sample.dbpedia.mimetype =
+ldcache.sample.dbpedia.expiry = 86400
+

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache-kiwi/src/main/resources/config-descriptions.properties
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache-kiwi/src/main/resources/config-descriptions.properties b/platform/marmotta-ldcache-kiwi/src/main/resources/config-descriptions.properties
new file mode 100644
index 0000000..7d6b4b4
--- /dev/null
+++ b/platform/marmotta-ldcache-kiwi/src/main/resources/config-descriptions.properties
@@ -0,0 +1,41 @@
+#
+# 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.
+#
+
+###############################################################################
+# LMF LD caching configuration
+###############################################################################
+
+ldcache.enabled.description = enable/disable automatic caching of remote resources from the Linked Data Cloud; \
+  enabling leads to many HTTP requests when querying and should be considered with care
+ldcache.enabled.type = java.lang.Boolean
+
+ldcache.expiry.description = default expiry time in seconds if not otherwise given (default: 1 day)
+ldcache.expiry.type = java.lang.Integer(3600|0)
+
+ldcache.minexpiry.description = minimum expiry time before which a resource is refreshed from the linked data cloud \
+  (use to avoid too short expiry times returned by servers)
+ldcache.minexpiry.type = java.lang.Integer(60|0)
+
+ldcache.so_timeout.description = how long to wait in ms when no data is sent over a connection
+ldcache.so_timeout.type = java.lang.Integer(1000|1000)
+
+ldcache.connection_timeout.description = how long to wait in ms until a connection is established
+ldcache.connection_timeout.type = java.lang.Integer(1000|1000)
+
+ldcache.max_parallel_requests.description = how many http retrievals to run at most in parallel
+ldcache.max_parallel_requests.type = java.lang.Integer(1|1|100)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache-kiwi/src/main/resources/kiwi-module.properties
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache-kiwi/src/main/resources/kiwi-module.properties b/platform/marmotta-ldcache-kiwi/src/main/resources/kiwi-module.properties
new file mode 100644
index 0000000..3f3dd4e
--- /dev/null
+++ b/platform/marmotta-ldcache-kiwi/src/main/resources/kiwi-module.properties
@@ -0,0 +1,35 @@
+#
+# 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=Linked Data Caching
+subtitle = Endpoints and Caches
+
+icon_small = /admin/img/ld-caching.png
+
+baseurl=/cache
+
+webservices=org.apache.marmotta.platform.ldcache.webservices.LinkedDataCachingWebService
+
+adminpage.0.title=About
+adminpage.0.link=/admin/about.html
+
+adminpage.1.title=Configuration
+adminpage.1.link=/admin/configuration.html
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/about.html
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/about.html b/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/about.html
new file mode 100644
index 0000000..f26a249
--- /dev/null
+++ b/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/about.html
@@ -0,0 +1,264 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+<!--###BEGIN_HEAD###-->
+<title>Linked Data Caching</title>
+<link rel="stylesheet" type="text/css"
+	href="../../core/public/style/center.css" />
+<!--###END_HEAD###-->
+</head>
+<body>
+	<!--###BEGIN_CONTENT###-->
+	<h1>
+		<a id="Introduction"></a>Introduction<a class="section_anchor"
+			href="#Introduction"></a>
+	</h1>
+	<p>
+		Apache Marmotta can optionally be extended with a Linked
+		Data Caching Module that transparently retrieves resources from the
+		Linked Data Cloud when they are needed (e.g. when querying a relation
+		to a remote resource) and caches them transparently. Linked Data
+		Caching is integrated at the triple store level and thus available to
+		all services accessing the triple store, including the SPARQL endpoint.
+	</p>
+	<h1>
+		<a id="Functionality"></a>Functionality<a class="section_anchor"
+			href="#Functionality"></a>
+	</h1>
+	<h2>
+		<a id="Transparent_Linked_Data_Access"></a>Transparent Linked Data
+		Access<a class="section_anchor" href="#Transparent_Linked_Data_Access"></a>
+	</h2>
+	<p>The Linked Data Caching module is a powerful component for
+		integrating with other Linked Data servers, either on the public
+		Linked Data Cloud or from local severs deployed in an intranet. It
+		provides transparent access to resources on Linked Data-aware servers.
+		When enabled, it is triggered when the triples of a non-local resource
+		are requested from the triple store. A typical case where this can
+		happen is when a local resource links to a resource in the Linked Data
+		Cloud using a triple and a query to the system requests information
+		about this external resource.</p>
+	<p>For example, the FOAF description of a user in the Marmotta might
+		contain a reference to the FOAF file of a user at some external
+		location:</p>
+	<pre class="prettyprint">
+		<span class="kwd">local</span><span class="pun">:</span><span
+			class="pln">peter foaf</span><span class="pun">:</span><span
+			class="pln">knows </span><span class="pun">&lt;</span><span
+			class="pln">http</span><span class="pun">:</span><span class="com">//example.com/john.rdf&gt;</span>
+	</pre>
+	<p>A query could then ask for all the names of persons that peter
+		knows, e.g. in SPARQL:</p>
+	<pre class="prettyprint">
+		<span class="pln">SELECT </span><span class="pun">?</span><span
+			class="pln">name WHERE </span><span class="pun">{</span><span
+			class="pln"> </span><span class="kwd">local</span><span class="pun">:</span><span
+			class="pln">peter foaf</span><span class="pun">:</span><span
+			class="pln">knows </span><span class="pun">?</span><span class="pln">p </span><span
+			class="pun">.</span><span class="pln"> </span><span class="pun">?</span><span
+			class="pln">p foaf</span><span class="pun">:</span><span class="pln">name </span><span
+			class="pun">?</span><span class="pln">name </span><span class="pun">}</span>
+	</pre>
+	<p>
+		When evaluating the query, the Linked Data Caching module would then
+		transparently retrieve the resource <em>http://example.com/john.rdf</em>
+		and try to answer the query using the triples contained therein.
+	</p>
+	<h2>
+		<a id="Local_Caching"></a>Local Caching<a class="section_anchor"
+			href="#Local_Caching"></a>
+	</h2>
+	<p>When the triple data of a remote resource are retrieved, they
+		are cached locally in the Linked Media Framework's triple store in a
+		special named graph called "cache", together with provenance and cache
+		expiry information. The cache graph is special in the sense that
+		resources in this graph are by default not considered for direct
+		indexing in the semantic search (i.e. a foaf:Person retrieved from the
+		Linked Data Cloud will not be returned by the Semantic Search
+		component), and triples and resources in this graph are not included
+		in versioning.</p>
+	<p>A query to a resource is answered from the local cache as long
+		as the entry is not expired, i.e. subsequent queries to a resource
+		will be significantly faster than the first query as long as they are
+		carried out within a certain time frame. The expiry date of a resource
+		in the cache is determined in two ways:</p>
+	<ul>
+		<li>if the Linked Data server providing the original resource
+			sends an "Expires" header, the value of the header defines the expiry
+			date of the local cache entry</li>
+		<li>otherwise, if there is an endpoint configuration for the URI
+			prefix of the resource, the expiry time of the endpoint is used</li>
+		<li>otherwise, the default expiry time configured in the
+			configuration variable ldcache.expiry is used</li>
+	</ul>
+	<p></p>
+	<h2>
+		<a id="Modes_of_Operation"></a>Modes of Operation<a
+			class="section_anchor" href="#Modes_of_Operation"></a>
+	</h2>
+	<p>Since the Linked Data Cloud is distributed over the Web and some
+		services might not provide the reliability or availability necessary,
+		or some servers are not yet Linked Data aware, the Linked Data Caching
+		Module offers different modes of operation for accessing resources:</p>
+	<ul>
+		<li><strong>Linked Data</strong> (direct Linked Data access):
+			makes use of the HTTP content negotiation to directly retrieve a
+			Linked Data resource from the Web as defined in the Linked Data
+			Principles. This is the default behaviour if nothing else has been
+			configured</li>
+		<li><strong>Cache</strong> (access to a resource or entity cache
+			endpoint): retrieves the triples of a resource from a defined server
+			by accessing a cache endpoint. This is e.g. useful if there is a
+			local cache of a public server (e.g. to improve reliability or
+			performance) or if there is a "traditional" RDF server that does not
+			offer Linked Data access</li>
+		<li><strong>SPARQL</strong> (access to a resource via a SPARQL
+			endpoint): retrieves the triples of a resource from a defined SPARQL
+			endpoint by issuing a query for all triples with the resource as
+			subject. This is e.g. useful for traditional RDF servers that are
+			extended by a SPARQL endpoint using e.g. Joseki or other tools.</li>
+		<li><strong>NONE</strong> (block access to the resource): does
+			not try to retrieve the external resource. Useful for blocking access
+			for known "bad" Linked Data servers. For example, many Linked Data
+			sources contain references to Wikipedia, which does not offer its
+			data as Linked Data directly.</li>
+	</ul>
+	<p></p>
+	<p>The different modes of operation can be configured as described
+		below. In addition to the RDF/XML format, the Linked Data Caching
+		Module also supports additional RDF serialisation formats that can be
+		configured for certain Linked Data servers.</p>
+	<h1>
+		<a id="Configuration"></a>Configuration<a class="section_anchor"
+			href="#Configuration"></a>
+	</h1>
+	<p>The Linked Data Caching Module can be configured using Marmotta
+		configuration mechanism. The following section describes the
+		configuration options used.</p>
+	<h2>
+		<a id="Configuration_Options"></a>Configuration Options<a
+			class="section_anchor" href="#Configuration_Options"></a>
+	</h2>
+	<p>The following options affect the general behaviour of the Linked
+		Data Caching Module:</p>
+	<ul>
+		<li>ldcache.enabled (true/false): if set to true, transparent
+			Linked Data Caching is enabled; if set to false, remote resources
+			will never be retrieved</li>
+		<li>ldcache.fallback (true/false): try to retrieve a resource
+			using ordinary Linked Data call if no endpoint is specified; when set
+			to false, this option will not retrieve any remote resources except
+			those defined with endpoints; can be used to provide transparent
+			caching only to some specific Linked Data servers</li>
+		<li>ldcache.expiry (seconds): defines the default expiry time for
+			a resource in the cache if the server does not provide an "Expires"
+			header and the endpoint definition does not have an expiry time
+			(default: 1 day)</li>
+		<li>ldcache.fetchall (true/false): if set to true, even a query
+			for all resources will include the resources that are cached locally;
+			the default is set to false because this might lead to unexpected
+			behaviour and crawling of the whole Linked Data Cloud if not used
+			with care</li>
+	</ul>
+	<h2>
+		<a id="Endpoint_Configuration"></a>Endpoint Configuration<a
+			class="section_anchor" href="#Endpoint_Configuration"></a>
+	</h2>
+	<p>The Linked Data Caching Module allows to define URI prefix to
+		endpoint mappings. These can be used to either redirect Linked Data
+		queries to cache or SPARQL endpoints for improving performance or
+		accessing non-Linked Data resources, or for setting different
+		parameters for certain server. An endpoint definition consists of the
+		following parameters:</p>
+	<ul>
+		<li><strong>name</strong> (string): the public name of the
+			endpoint, used for displaying</li>
+		<li><strong>prefix</strong> (uri): the prefix of URIs that are
+			redirected to the endpoint; if a resource requested from the cache
+			has this prefix, it is handled by this endpoint</li>
+		<li><strong>kind</strong> (SPARQL/LINKEDDATA/CACHE/NONE): the
+			operation mode of the endpoint (see above)</li>
+		<li><strong>endpoint</strong> (uri with parameters): the URI
+			under which the endpoint can be accessed. Depending on the mode,
+			certain parameters will be replaced by actual values in the URI:
+		<ul>
+			<li>CACHE: the parameter {uri} will be replaced by the actual
+				URI of the requested resource, e.g. <span class="tt">http://api.sindice.com/v2/cache?url={uri}</span>
+			</li>
+			<li>SPARQL: the parameter {query} will be replaced by the SPARQL
+				query, the parameter {contenttype} will be replaced by the MIME type
+				to be requested from the server, e.g. <span class="tt">http://sparql.sindice.com/sparql?default-graph-uri=&amp;query={query}&amp;format={contenttype}</span>
+			</li>
+		</ul>
+		</li>
+		<li><strong>mimetype</strong> the MIME type to request/expect
+			from the endpoint; depends on the mode of operation:
+		<ul>
+			<li>CACHE/LINKEDDATA: any RDF serialization supported by the
+				Marmotta, e.g. application/rdf+xml, text/rdf+n3, ...</li>
+			<li>SPARQL: any SPARQL result format, e.g.
+				application/sparql-results+xml</li>
+		</ul>
+		</li>
+		<li><strong>expiry</strong> (seconds): the default expiry time
+			for this endpoint if not provided by the server itself</li>
+	</ul>
+	<h2>
+		<a id="Webservice"></a>Webservice<a class="section_anchor"
+			href="#Webservice"></a>
+	</h2>
+	<p>
+		Endpoints are configured using the Linked Data Caching Webservice
+		available under
+		<span class="tt">&lt;APPDIR&gt;/cache/endpoint</span>
+		; the Webservice provides the following operations for managing
+		endpoints:
+	</p>
+	<ul>
+		<li><span class="tt">POST
+				&lt;APPDIR&gt;/cache/endpoint?name=...&amp;prefix=...&amp;endpoint=...&amp;kind=...&amp;mimetype=...&amp;expiry=...</span>
+			will create a new endpoint with the given parameters</li>
+		<li><span class="tt">GET &lt;APPDIR&gt;/cache/endpoint/list</span> will return a
+			list of configured endpoints in JSON</li>
+		<li><span class="tt">GET &lt;APPDIR&gt;/cache/endpoint/{id}</span> will return
+			the endpoint configuration for the endpoint with the given internal
+			ID</li>
+		<li><span class="tt">DELETE &lt;APPDIR&gt;/cache/endpoint/{id}</span> will
+			delete the endpoint configuration for the endpoint with the given
+			internal ID</li>
+	</ul>
+	<p></p>
+	<p>In addition to managing endpoints, the webservice also offers
+		two methods for retrieving resources:</p>
+	<ul>
+		<li><span class="tt">GET &lt;APPDIR&gt;/cache/live?uri=...</span> directly
+			retrieves a resource from the endpoints or Linked Data Cloud without
+			caching it locally; used for testing endpoints</li>
+		<li><span class="tt">GET &lt;APPDIR&gt;/cache/cached?uri=...</span> refreshes
+			the resource with the given URI and returns nothing; the resource can
+			then be retrieved using the normal resource access webservices</li>
+	</ul>
+	<p></p>
+	<p>For your convenience, the Marmotta administration interface offers a
+		simple UI for adding, listing and removing endpoint definitions.</p>
+	<!--###END_CONTENT###-->
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/configuration.html
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/configuration.html b/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/configuration.html
new file mode 100644
index 0000000..9a53ed3
--- /dev/null
+++ b/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/configuration.html
@@ -0,0 +1,83 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+<!--###BEGIN_HEAD###-->
+    <title>Core Module Configuration</title>
+    <script type="text/javascript" src="../../webjars/jquery/1.8.2/jquery.min.js"></script>
+    <script type="text/javascript" src="../../core/public/js/widgets/property_config.js"></script>
+    <script type="text/javascript" src="widgets/lmf_ldcache.js"></script>
+    <script type="text/javascript" src="../../core/public/js/widgets/configurator/configurator.js"></script>
+    <link type="text/css" rel="stylesheet" href="../../core/public/js/widgets/configurator/style.css">
+    <script type="text/javascript">
+        jQuery(document).ready(function(){
+            var options = {
+                url : _SERVER_URL,
+                container : "lmf_configurator",
+                blacklist:['ldcache.endpoint.','ldcache.sample.'],
+                prefix : 'ldcache'
+            }
+            var configurator = new Configurator(options);
+            $('#lmf_ldcache').lmf_ldcache({host:_SERVER_URL});
+        });
+    </script>
+    <style type="text/css">
+        
+       .endpoint_status.on {
+            background-color: darkGreen;
+        }
+        .endpoint_status {
+            background-color: red;
+            border-radius: 10px 10px 10px 10px;
+            display: inline-block;
+            float: right;
+            height: 20px;
+            width: 20px;
+        }
+        
+    </style>
+<!--###END_HEAD###-->
+</head>
+<body>
+<div id="main">
+<div id="contents">
+<!--###BEGIN_CONTENT###-->
+<h1>Linked Data Cache Configuration</h1>
+        <p>
+            Here you can configure the Marmotta Linked Data Cache mechanism.
+        </p>
+        <p>        
+            The configuration contains:
+        </p>
+        <ul>
+            <li><a href="#lmf_configurator">Generic Parameter Configuration</a></li>
+            <li><a href="#lmf_ldcache">LD-Cache Configuration</a></li>
+        </ul>
+        <div id="lmf_configurator">
+            <h4>Loading configurator</h4>
+        </div>
+        <div id="lmf_ldcache">
+            <h4>Loading cache config</h4>
+        </div>
+<!--###END_CONTENT###-->
+</div>
+</div>
+</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/img/ld-caching.png
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/img/ld-caching.png b/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/img/ld-caching.png
new file mode 100755
index 0000000..b358706
Binary files /dev/null and b/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/img/ld-caching.png differ

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/widgets/lmf_ldcache.js
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/widgets/lmf_ldcache.js b/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/widgets/lmf_ldcache.js
new file mode 100644
index 0000000..ee32b22
--- /dev/null
+++ b/platform/marmotta-ldcache-kiwi/src/main/resources/web/admin/widgets/lmf_ldcache.js
@@ -0,0 +1,360 @@
+/*
+ * 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.
+ */
+/**
+ * Created by . User: Thomas Kurz Date: 18.02.11 Time: 18:46 To change this
+ * template use File | Settings | File Templates.
+ */
+(function($) {
+
+    var contentBox;
+
+    var programs;
+    var buttonset;
+
+    var loadS;
+
+    // new program
+    var name;
+    var kind;
+    var prefix;
+    var endpoint;
+    var mime;
+    var expiry;
+
+    var samples;
+    var samp;
+
+    var loader;
+
+    $.fn.lmf_ldcache = function(options) {
+        var settings = {
+            host : 'http://localhost:8080/LMF/'
+        }
+
+        function addProgram() {
+
+            if (name.val() == '') {
+                alert("name may not be empty!");
+                return;
+            }
+            if (prefix.val() == '') {
+                alert("prefix may not be empty!");
+                return;
+            }
+            /*if (endpoint.val() == '') {
+                alert("endpoint may not be empty!");
+                return;
+            }
+            if (mime.val() == '') {
+                alert("mimetype may not be empty!");
+                return;
+            }*/
+            if (expiry.val() == '') {
+                alert("expiry may not be empty!");
+                return;
+            }
+            var url = settings.host + "cache/endpoint?name=" + encodeURIComponent(name.val()) + '&prefix='
+                    + encodeURIComponent(prefix.val()) + '&endpoint=' + encodeURIComponent(endpoint.val()) + '&mimetype='
+                    + encodeURIComponent(mime.val()) + '&kind=' + encodeURIComponent(kind.val()) + '&expiry='
+                    + encodeURIComponent(expiry.val());
+            loader.html("<span>Save Values</span>");
+            // upload
+            $.ajax({
+                type : "POST",
+                url : url,
+                contentType : "text/plain",
+                success : function() {
+                    loader.html("");
+                    $.getJSON(settings.host + "cache/endpoint/list", function(data) {
+                        writePrograms(data);
+                    });
+                    alert("success");
+                },
+                error : function(jXHR) {
+                    loader.html("");
+                    alert("Error: " + jXHR.responseText);
+                }
+            });
+        }
+
+        function removeProgram(b) {
+            var url = settings.host + "cache/endpoint/" + b.attr('data-id');
+            $.ajax({
+                type : "DELETE",
+                url : url,
+                success : function() {
+                    $.getJSON(settings.host + "cache/endpoint/list", function(data) {
+                        writePrograms(data);
+                    });
+                    alert("success");
+                },
+                error : function(jXHR, textStatus) {
+                    alert("Error: " + jXHR.responseText);
+                }
+            });
+        }
+        function activateProgram(b, active) {
+            var enable = active || (b.attr('data-active') !== "true"),
+            url = settings.host + "cache/endpoint/" + b.attr('data-id') + "/enable?enable=" + enable;
+            
+            $.ajax({
+                type : "POST",
+                url : url,
+                success : function() {
+                    $.getJSON(settings.host + "cache/endpoint/list", function(data) {
+                        writePrograms(data);
+                    });
+                },
+                error : function(jXHR, textStatus) {
+                    alert("Error: " + jXHR.responseText);
+                }
+            });
+        }
+        
+        function writeSample(data) {
+            // contains method
+            var contains = function(array, obj) {
+                var i = array.length;
+                while (i--) {
+                    if (array[i] == obj) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+            var sorted = [];
+            for (property in data) {
+                property = property.substring(15);
+                property = property.substring(0, property.indexOf('.'));
+                if (!contains(sorted, property)) {
+                    sorted.push(property);
+                }
+            }
+            sorted.sort();
+            samples = data;
+            samp = $('<select/>').change(function() {
+                loadSample(this);
+            });
+            var d = $("<div></div>");
+            loadS.append(d);
+            d.append('<br>Load Sample: ');
+            d.append(samp);
+            samp.append('<option>---select---</option>');
+            for (property in sorted) {
+                samp.append('<option>' + sorted[property] + '</option>');
+            }
+        }
+
+        function loadSample() {
+            if (samp.val() != '---select---') {
+                var x = samp.val();
+                name.val(samples['ldcache.sample.' + x + '.name'].value);
+                kind.val(samples['ldcache.sample.' + x + '.kind'].value);
+                prefix.val(samples['ldcache.sample.' + x + '.prefix'].value);
+                endpoint.val(samples['ldcache.sample.' + x + '.endpoint'].value);
+                mime.val(samples['ldcache.sample.' + x + '.mimetype'].value);
+                expiry.val(samples['ldcache.sample.' + x + '.expiry'].value);
+            } else {
+                var x = samp.val();
+                name.val('');
+                kind.val('');
+                prefix.val('');
+                endpoint.val('');
+                mime.val('');
+                expiry.val('');
+            }
+        }
+
+        function writePrograms(ps) {
+            if (ps.length == 0) {
+                programs.text("no endpoints defined");
+                return;
+            }
+            var table = $("<table class='simple_table'/>");
+            var tr = $("<tr class='title' valign='top' style='font-weight:bold;color: white;background-color:gray;'/>");
+            tr.append($("<td/>").html("&nbsp;"));
+            tr.append($("<td/>").text("Name"));
+            tr.append($("<td/>").text("Kind"));
+            tr.append($("<td/>").text("Prefix"));
+            tr.append($("<td/>").text("Endpoint"));
+            tr.append($("<td/>").text("Mimetype"));
+            tr.append($("<td/>").text("Expiry"));
+            tr.append($("<td/>").text("Actions"));
+            table.append(tr);
+            
+            function buildIcon(enabled) {
+                var icon = $("<span>", {'class': "endpoint_status"});
+                if (enabled) icon.addClass("on");
+                return icon;
+            }
+
+            function ctToString(obj) {
+                var ret = "";
+                for(var i = 0; i < obj.length; i++)  {
+                    ret += obj[i].mime;
+                    if(i != obj.length-1) ret += ",";
+                }
+                return ret;
+            }
+
+            for ( var i = 0; i < ps.length; i++) {
+                if(!ps[i].volatile) {
+                    var delBtn = $("<button/>").text("delete");
+                    delBtn.attr('data-id', ps[i].id);
+                    delBtn.click(function() {
+                        removeProgram($(this));
+                    });
+                    var modBtn = $("<button>", {text: (ps[i].active?"deactivate":"activate"), 'data-id': ps[i].id, 'data-active':ps[i].active})
+                    modBtn.click(function() {
+                        activateProgram($(this));
+                    });
+                }
+                var col = "";
+                if (i % 2) {
+                    col = "even";
+                } else {
+                    col = "odd";
+                }
+                var tr = $("<tr class='" + col + "'/>");
+                $("<td/>").append(buildIcon(ps[i].active)).appendTo(tr);
+                $("<td/>").text(ps[i].name || '').appendTo(tr);
+                $("<td/>").text(ps[i].kind || '').appendTo(tr);
+                $("<td/>").text(ps[i].prefix || '').appendTo(tr);
+                $("<td/>").text(ps[i].endpoint || '').appendTo(tr);
+                $("<td/>").text(ps[i].mimetype != undefined ? ctToString(ps[i].mimetype) : '').appendTo(tr);
+                $("<td/>").text(ps[i].expiry || '').appendTo(tr);
+                if(!ps[i].volatile) {
+                    $("<td/>").append(modBtn).append(delBtn).appendTo(tr);
+                } else {
+                    $("<td>autoregistered</td>").appendTo(tr);
+                }
+                table.append(tr);
+            }
+            programs.empty().append(table);
+        }
+
+        function writeContent() {
+            // set Buttons
+            var button = $("<button/>", {
+                disabled : true
+            }).text("Upload");
+
+            programs = $("<div/>").text('loading');
+            var newprogram = $("<table/>");
+            buttonset = $("<div/>");
+            button.click(function() {
+                addProgram();
+            });
+
+            loader = $("<div/>");
+            buttonset.append(button);
+            buttonset.append(loader);
+
+            loadS = $("<div style='float: right;margin-top: -60px;'></div>");
+
+            contentBox.html("<h2 style='margin-bottom: 10px;'>LD-Cache Endpoints</h2>");
+            contentBox.append(programs);
+            contentBox.append("<h4 style='margin-bottom: 10px;margin-top: 25px'>Add LD-Cache Endpoint</h4>");
+            contentBox.append(loadS);
+            contentBox.append(newprogram);
+            contentBox.append(buttonset);
+
+            $.getJSON(settings.host + "config/list?prefix=ldcache.sample", function(data) {
+                writeSample(data);
+            });
+            $.getJSON(settings.host + "cache/endpoint/list", function(data) {
+                writePrograms(data);
+            });
+
+            // add new program stuff
+            name = $("<input style='width: 100%;' type='text' size='100'>");
+            kind = $("<select>");
+            $.getJSON(settings.host + "cache/provider/list", function(data) {
+                kind.empty();
+                for ( var d in data) {
+                    $("<option/>", {
+                        value : data[d],
+                        text : data[d]
+                    }).appendTo(kind);
+                }
+                $("<option/>", {
+                    value : "NONE",
+                    text : "NONE (Blacklist)"
+                }).appendTo(kind);
+            }).complete(function() {
+                button.removeAttr("disabled");
+            });
+            prefix = $("<input style='width: 100%;' type='text' size='100'>");
+            endpoint = $("<input style='width: 100%;' type='text' size='100'>");
+            mime = $("<input style='width: 100%;' type='text' size='100'>");
+            expiry = $("<input style='width: 100%;' type='text' size='100'>");
+
+            newprogram.append("<tr class='title'><td>Name</td><td>Value</td></tr>")
+
+            var tr1 = $("<tr></tr>");
+            tr1.append("<td>Name</td>");
+            var td1 = $("<td></td>").append(name);
+            tr1.append(td1);
+            newprogram.append(tr1);
+
+            var tr2 = $("<tr></tr>");
+            tr2.append("<td>Kind / Provider</td>");
+            var td2 = $("<td></td>").append(kind);
+            tr2.append(td2);
+            newprogram.append(tr2);
+
+            var tr3 = $("<tr></tr>");
+            tr3.append("<td>Prefix</td>");
+            var td3 = $("<td></td>").append(prefix);
+            tr3.append(td3);
+            newprogram.append(tr3);
+
+            var tr4 = $("<tr></tr>");
+            tr4.append("<td>Enpoint</td>");
+            var td4 = $("<td></td>").append(endpoint);
+            tr4.append(td4);
+            newprogram.append(tr4);
+
+            var tr5 = $("<tr></tr>");
+            tr5.append("<td>Mimetype</td>");
+            var td5 = $("<td></td>").append(mime);
+            tr5.append(td5);
+            newprogram.append(tr5);
+
+            var tr6 = $("<tr></tr>");
+            tr6.append("<td>Expiry Time</td>");
+            var td6 = $("<td></td>").append(expiry);
+            tr6.append(td6);
+            newprogram.append(tr6);
+        }
+
+        return this.each(function() {
+            // merge options
+            if (options) {
+                $.extend(settings, options);
+            }
+            contentBox = $(this);
+            // build skeleton
+
+            writeContent();
+
+            // $.getJSON(settings.host+"import/types",
+            // function(data){write(data);});
+        });
+    };
+})(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache/pom.xml
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache/pom.xml b/platform/marmotta-ldcache/pom.xml
deleted file mode 100644
index b9c52e9..0000000
--- a/platform/marmotta-ldcache/pom.xml
+++ /dev/null
@@ -1,199 +0,0 @@
-<?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.2.0-incubating-SNAPSHOT</version>
-        <relativePath>../../parent</relativePath>
-    </parent>
-
-    <artifactId>marmotta-ldcache</artifactId>
-    <packaging>jar</packaging>
-
-    <name>Apache Marmotta Platform: Linked Data Caching</name>
-    <description>
-        Provides transparent Linked Data Caching in the LMF triple store. When a resource is queried using e.g. LDPath
-        or SPARQL and it represents an external resource (e.g. on DBPedia or GeoNames), the resource is transparently
-        fetched on demand and cached locally.
-    </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.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 LMF 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>0.10.0</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>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.marmotta</groupId>
-            <artifactId>marmotta-core</artifactId>
-            <version>${project.parent.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.marmotta</groupId>
-            <artifactId>ldclient-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.marmotta</groupId>
-            <artifactId>ldclient-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.marmotta</groupId>
-            <artifactId>ldclient-provider-rdf</artifactId>
-        </dependency>
-        <!--
-        <dependency>
-            <groupId>org.apache.marmotta</groupId>
-            <artifactId>ldclient-provider-xml</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.marmotta</groupId>
-            <artifactId>ldclient-provider-html</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.marmotta</groupId>
-            <artifactId>ldclient-provider-ldap</artifactId>
-        </dependency>
-        -->
-        <dependency>
-            <groupId>org.apache.marmotta</groupId>
-            <artifactId>ldcache-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.marmotta</groupId>
-            <artifactId>ldcache-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.marmotta</groupId>
-            <artifactId>ldcache-sail-kiwi</artifactId>
-        </dependency>
-
-
-    </dependencies>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/api/endpoint/LinkedDataEndpointService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/api/endpoint/LinkedDataEndpointService.java b/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/api/endpoint/LinkedDataEndpointService.java
deleted file mode 100644
index b6bd8cd..0000000
--- a/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/api/endpoint/LinkedDataEndpointService.java
+++ /dev/null
@@ -1,87 +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.ldcache.api.endpoint;
-
-import org.apache.marmotta.ldclient.api.endpoint.Endpoint;
-import org.openrdf.model.URI;
-
-import java.util.List;
-
-/**
- * A service for managing Linked Data endpoints.
- * <p/>
- * User: sschaffe
- */
-public interface LinkedDataEndpointService {
-
-    /**
-     * Add a new endpoint to the system. The endpoint will be persisted in the database.
-     *
-     * @param endpoint
-     */
-    public void addEndpoint(Endpoint endpoint);
-
-    /**`
-     * Update the endpoint passed as argument in the database.
-     *
-     * @param endpoint
-     */
-    public void updateEndpoint(Endpoint endpoint);
-
-    /**
-     * List all endpoints registered in the system.
-     *
-     * @return a list of endpoints in the order they were added to the database.
-     */
-    public List<Endpoint> listEndpoints();
-
-    /**
-     * Remove the endpoint given as argument. The endpoint will be deleted in the database.
-     *
-     * @param endpoint
-     */
-    public void removeEndpoint(Endpoint endpoint);
-
-    /**
-     * Return the endpoint with the given ID.
-     *
-     * @param id ID of the endpoint to return.
-     * @return
-     */
-    public Endpoint getEndpoint(String id);
-
-
-
-    /**
-     * Retrieve the endpoint matching the KiWiUriResource passed as argument. The endpoint is determined by
-     * matching the endpoint's URI prefix with the resource URI. If no matching endpoint exists, returns null.
-     * The LinkedDataClientService can then decide (based on configuration) whether to try with a standard
-     * LinkedDataRequest or ignore the request.
-     *
-     * @param resource the KiWiUriResource to check.
-     */
-    public Endpoint getEndpoint(URI resource);
-
-    /**
-     * Test whether an endpoint definition for the given url pattern already exists.
-     *
-     * @param urlPattern
-     * @return
-     */
-    public boolean hasEndpoint(String urlPattern);
-}

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/model/filter/LDCacheIgnoreFilter.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/model/filter/LDCacheIgnoreFilter.java b/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/model/filter/LDCacheIgnoreFilter.java
deleted file mode 100644
index 9e3614f..0000000
--- a/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/model/filter/LDCacheIgnoreFilter.java
+++ /dev/null
@@ -1,32 +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.ldcache.model.filter;
-
-import org.apache.marmotta.commons.sesame.filter.resource.ResourceFilter;
-
-/**
- * This filter can be used to define as CDI services additional filters that allow to ignore resources when
- * caching. The advantage of this approach over "blacklisting" is that filters defined in this way do not even
- * create a cache entry, they ignore the resource early on.
- *
- * The filter should return true in case the resource should be ignored.
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public interface LDCacheIgnoreFilter extends ResourceFilter {
-}

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/model/filter/MarmottaNotCachedFilter.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/model/filter/MarmottaNotCachedFilter.java b/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/model/filter/MarmottaNotCachedFilter.java
deleted file mode 100644
index cd6ae95..0000000
--- a/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/model/filter/MarmottaNotCachedFilter.java
+++ /dev/null
@@ -1,85 +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.ldcache.model.filter;
-
-import org.apache.marmotta.commons.sesame.filter.resource.ResourceFilter;
-import org.apache.marmotta.platform.core.model.filter.MarmottaLocalFilter;
-import org.apache.marmotta.platform.core.util.CDIContext;
-import org.apache.marmotta.platform.ldcache.services.ldcache.LDCacheSailProvider;
-import org.openrdf.model.BNode;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.repository.RepositoryException;
-
-/**
- * Accept only resources that are considered "not cached", i.e. do not have an entry in the caching table.
- * <p/>
- * Author: Sebastian Schaffert
- */
-public class MarmottaNotCachedFilter implements ResourceFilter {
-
-    private LDCacheSailProvider cacheSailProvider;
-    private MarmottaLocalFilter marmottaLocalFilter;
-
-    public MarmottaNotCachedFilter() {
-        cacheSailProvider = CDIContext.getInstance(LDCacheSailProvider.class);
-        marmottaLocalFilter = CDIContext.getInstance(MarmottaLocalFilter.class);
-    }
-
-
-    private static MarmottaNotCachedFilter instance = null;
-
-    public static MarmottaNotCachedFilter getInstance() {
-        if(instance == null) {
-            instance = new MarmottaNotCachedFilter();
-        }
-        return instance;
-    }
-
-
-    /**
-     * Return false in case the filter does not accept the resource passed as argument, true otherwise.
-     *
-     *
-     * @param resource
-     * @return
-     */
-    @Override
-    public boolean accept(Resource resource) {
-        if(resource instanceof BNode) {
-            return true;
-        }
-        if(!cacheSailProvider.isEnabled()) {
-            return true;
-        }
-
-        if(marmottaLocalFilter.accept(resource)) {
-            return true;
-        }
-
-        URI uri = (URI)resource;
-
-        try {
-            return !cacheSailProvider.getLDCache().isCached(uri.stringValue());
-        } catch (RepositoryException e) {
-            return false;
-        }
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/services/endpoint/LinkedDataEndpointServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/services/endpoint/LinkedDataEndpointServiceImpl.java b/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/services/endpoint/LinkedDataEndpointServiceImpl.java
deleted file mode 100644
index 5fc55fa..0000000
--- a/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/services/endpoint/LinkedDataEndpointServiceImpl.java
+++ /dev/null
@@ -1,211 +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.ldcache.services.endpoint;
-
-import org.apache.marmotta.platform.ldcache.api.endpoint.LinkedDataEndpointService;
-import com.google.common.base.Joiner;
-import org.apache.marmotta.platform.core.api.config.ConfigurationService;
-import org.apache.marmotta.commons.http.ContentType;
-import org.apache.marmotta.commons.http.MarmottaHttpUtils;
-import org.apache.marmotta.ldclient.api.endpoint.Endpoint;
-import org.openrdf.model.URI;
-import org.slf4j.Logger;
-
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Add file description here!
- * <p/>
- * User: sschaffe
- */
-@ApplicationScoped
-public class LinkedDataEndpointServiceImpl implements LinkedDataEndpointService {
-
-    @Inject
-    private Logger log;
-
-
-    @Inject
-    private ConfigurationService configurationService;
-
-
-    private static Endpoint[] blacklist = new Endpoint[] {
-        new Endpoint("HolyGoat", "NONE","^http://www\\.holygoat\\.co\\.uk","","",86400l),
-        new Endpoint("KiWi Project","NONE","^http://www\\.kiwi-project\\.eu/","","",86400l)
-    };
-
-    @PostConstruct
-    public void initialize() {
-        log.trace("LDEndpointService starting up...");
-    }
-
-
-    /**
-     * Add a new endpoint to the system. The endpoint will be persisted in the database.
-     *
-     * @param endpoint
-     */
-    @Override
-    public void addEndpoint(Endpoint endpoint) {
-        storeEndpoint(endpoint);
-    }
-
-    /**
-     * `
-     * Update the endpoint passed as argument in the database.
-     *
-     * @param endpoint
-     */
-    @Override
-    public void updateEndpoint(Endpoint endpoint) {
-        storeEndpoint(endpoint);
-    }
-
-    /**
-     * List all endpoints registered in the system.
-     *
-     * @return a list of endpoints in the order they were added to the database.
-     */
-    @Override
-    public List<Endpoint> listEndpoints() {
-        List<Endpoint> result = new ArrayList<Endpoint>();
-        for(String label : listEndpointLabels()) {
-            result.add(getEndpointByLabel(label));
-        }
-        for(Endpoint e : blacklist) {
-            if(!result.contains(e)) {
-                result.add(e);
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Remove the endpoint given as argument. The endpoint will be deleted in the database.
-     *
-     * @param endpoint
-     */
-    @Override
-    public void removeEndpoint(Endpoint endpoint) {
-        String label = endpoint.getName().replaceAll("[^A-Za-z0-9 ]", "").toLowerCase();
-
-        List<String> keys = configurationService.listConfigurationKeys("ldcache.endpoint."+label);
-        for(String key : keys) {
-            configurationService.removeConfiguration(key);
-        }
-    }
-
-    /**
-     * Return the endpoint with the given ID.
-     *
-     * @param id ID of the endpoint to return.
-     * @return
-     */
-    @Override
-    public Endpoint getEndpoint(String id) {
-        for(Endpoint endpoint : listEndpoints()) {
-            if(endpoint.getName().replaceAll("[^A-Za-z0-9 ]", "").toLowerCase().equals(id)) return endpoint;
-        }
-        return null;
-    }
-
-    /**
-     * Retrieve the endpoint matching the KiWiUriResource passed as argument. The endpoint is determined by
-     * matching the endpoint's URI prefix with the resource URI. If no matching endpoint exists, returns null.
-     * The LinkedDataClientService can then decide (based on configuration) whether to try with a standard
-     * LinkedDataRequest or ignore the request.
-     *
-     * @param resource the KiWiUriResource to check.
-     */
-    @Override
-    public Endpoint getEndpoint(URI resource) {
-        for(Endpoint endpoint : listEndpoints()) {
-            if (endpoint.handles(resource.stringValue())) return endpoint;
-        }
-
-        return null;
-    }
-
-    /**
-     * Test whether an endpoint definition for the given url pattern already exists.
-     *
-     * @param urlPattern
-     * @return
-     */
-    @Override
-    public boolean hasEndpoint(String urlPattern) {
-        for(Endpoint endpoint : listEndpoints()) {
-            if(endpoint.getUriPattern() != null && endpoint.getUriPattern().equals(urlPattern)) return true;
-        }
-        return false;
-    }
-
-
-    private void storeEndpoint(Endpoint endpoint) {
-
-        String label = endpoint.getName().replaceAll("[^A-Za-z0-9 ]", "").toLowerCase();
-        configurationService.setConfiguration("ldcache.endpoint."+label+".name", endpoint.getName());
-        configurationService.setIntConfiguration("ldcache.endpoint." + label + ".prio", endpoint.getPriority());
-        configurationService.setConfiguration("ldcache.endpoint." + label + ".provider", endpoint.getType());
-        configurationService.setConfiguration("ldcache.endpoint." + label + ".pattern", endpoint.getUriPattern());
-        configurationService.setConfiguration("ldcache.endpoint." + label + ".service", endpoint.getEndpointUrl());
-        configurationService.setLongConfiguration("ldcache.endpoint." + label + ".expiry", endpoint.getDefaultExpiry());
-        configurationService.setBooleanConfiguration("ldcache.endpoint." + label + ".active", endpoint.isActive());
-        configurationService.setConfiguration(
-                "ldcache.endpoint." + label + ".contenttype",
-                Joiner.on(",").join(endpoint.getContentTypes())
-        );
-    }
-
-
-    private Endpoint getEndpointByLabel(String label) {
-        Endpoint endpoint = new Endpoint();
-
-        endpoint.setName(configurationService.getStringConfiguration("ldcache.endpoint."+label+".name"));
-        endpoint.setPriority(configurationService.getIntConfiguration("ldcache.endpoint." + label + ".prio"));
-        endpoint.setType(configurationService.getStringConfiguration("ldcache.endpoint." + label + ".provider"));
-        endpoint.setUriPattern(configurationService.getStringConfiguration("ldcache.endpoint." + label + ".pattern"));
-        endpoint.setEndpointUrl(configurationService.getStringConfiguration("ldcache.endpoint." + label + ".service"));
-        endpoint.setDefaultExpiry(configurationService.getLongConfiguration("ldcache.endpoint." + label + ".expiry"));
-        endpoint.setActive(configurationService.getBooleanConfiguration("ldcache.endpoint." + label + ".active"));
-        endpoint.setContentTypes(new HashSet<ContentType>(
-                MarmottaHttpUtils.parseAcceptHeader(
-                        configurationService.getStringConfiguration("ldcache.endpoint." + label + ".contenttype",""))
-        ));
-
-        return endpoint;
-    }
-
-
-    private Collection<String> listEndpointLabels() {
-        Set<String> labels = new HashSet<String>();
-        for(String key : configurationService.listConfigurationKeys("ldcache.endpoint")) {
-            String[] components = key.split("\\.");
-            labels.add(components[2]);
-        }
-        return labels;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/d655b517/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/services/ldcache/LDCacheSailProvider.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/services/ldcache/LDCacheSailProvider.java b/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/services/ldcache/LDCacheSailProvider.java
deleted file mode 100644
index 28de597..0000000
--- a/platform/marmotta-ldcache/src/main/java/org/apache/marmotta/platform/ldcache/services/ldcache/LDCacheSailProvider.java
+++ /dev/null
@@ -1,239 +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.ldcache.services.ldcache;
-
-import com.google.common.collect.Lists;
-import org.apache.marmotta.commons.sesame.filter.OneOfFilter;
-import org.apache.marmotta.commons.sesame.filter.SesameFilter;
-import org.apache.marmotta.commons.sesame.filter.resource.ResourceFilter;
-import org.apache.marmotta.commons.sesame.filter.statement.StatementFilter;
-import org.apache.marmotta.platform.core.model.filter.MarmottaLocalFilter;
-import org.apache.marmotta.platform.ldcache.api.endpoint.LinkedDataEndpointService;
-import org.apache.marmotta.platform.core.api.config.ConfigurationService;
-import org.apache.marmotta.platform.core.api.http.HttpClientService;
-import org.apache.marmotta.platform.core.api.triplestore.NotifyingSailProvider;
-import org.apache.marmotta.platform.core.api.triplestore.SesameService;
-import org.apache.marmotta.platform.core.events.ConfigurationChangedEvent;
-
-import org.apache.marmotta.commons.sesame.filter.NotFilter;
-import org.apache.marmotta.ldcache.sail.KiWiLinkedDataSail;
-import org.apache.marmotta.ldcache.services.LDCache;
-import org.apache.marmotta.ldclient.api.endpoint.Endpoint;
-import org.apache.marmotta.ldclient.api.ldclient.LDClientService;
-import org.apache.marmotta.ldclient.model.ClientConfiguration;
-import org.apache.marmotta.platform.ldcache.model.filter.LDCacheIgnoreFilter;
-import org.openrdf.model.Resource;
-import org.openrdf.sail.NotifyingSail;
-import org.openrdf.sail.helpers.NotifyingSailWrapper;
-import org.slf4j.Logger;
-
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.event.Observes;
-import javax.enterprise.inject.Instance;
-import javax.inject.Inject;
-import javax.inject.Named;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A sail provider service that allows wrapping a transparent Linked Data caching component around the
- * main SAIL.
- *
- * <p/>
- * Author: Sebastian Schaffert (sschaffert@apache.org)
- */
-@ApplicationScoped
-public class LDCacheSailProvider implements NotifyingSailProvider {
-
-    public static final String LDCACHE_ENABLED = "ldcache.enabled";
-    @Inject
-    private Logger log;
-
-    @Inject
-    private LinkedDataEndpointService endpointService;
-
-    @Inject
-    private ConfigurationService configurationService;
-
-    @Inject
-    private SesameService sesameService;
-
-    @Inject
-    private HttpClientService         httpClientService;
-
-    @Inject
-    private Instance<LDCacheIgnoreFilter> ignoreFilters;
-
-    private Set<Endpoint> volatileEndpoints;
-
-    private ClientConfiguration ldclientConfig;
-
-    private KiWiLinkedDataSail  sail;
-
-    /**
-     * Return the name of the provider. Used e.g. for displaying status information or logging.
-     *
-     * @return
-     */
-    @Override
-    public String getName() {
-        return "Linked Data Caching";
-    }
-
-
-    /**
-     * Return true if this sail provider is enabled in the configuration.
-     *
-     * @return
-     */
-    @Override
-    public boolean isEnabled() {
-        return configurationService.getBooleanConfiguration(LDCACHE_ENABLED,true);
-    }
-
-    public void configurationChanged(@Observes ConfigurationChangedEvent e) {
-        if(e.containsChangedKey(LDCACHE_ENABLED)) {
-            sesameService.restart();
-
-            if(!isEnabled()) {
-                sail = null;
-            }
-        }
-    }
-
-
-    @PostConstruct
-    public void initialize() {
-        volatileEndpoints = new HashSet<Endpoint>();
-        ldclientConfig = new ClientConfiguration();
-        updateConfig();
-    }
-
-    public void updateEndpoints() {
-        HashSet<Endpoint> endpoints = new HashSet<Endpoint>();
-        endpoints.addAll(endpointService.listEndpoints());
-        endpoints.addAll(volatileEndpoints);
-
-        ldclientConfig.setEndpoints(endpoints);
-
-        if(sail != null &&  sail.getLDCache() != null) {
-            sail.getLDCache().reload();
-        }
-    }
-
-
-    public void updateConfig() {
-        ldclientConfig.setDefaultExpiry(configurationService.getLongConfiguration("ldcache.expiry", 86400L));
-        ldclientConfig.setMinimumExpiry(configurationService.getLongConfiguration("ldcache.minexpiry", 3600L));
-        ldclientConfig.setSocketTimeout(configurationService.getIntConfiguration("ldcache.so_timeout", 60000));
-        ldclientConfig.setConnectionTimeout(configurationService.getIntConfiguration("ldcache.connection_timeout", 10000));
-        ldclientConfig.setMaxParallelRequests(configurationService.getIntConfiguration("ldcache.max_parallel_requests",10));
-
-        HashSet<Endpoint> endpoints = new HashSet<Endpoint>();
-        endpoints.addAll(endpointService.listEndpoints());
-        endpoints.addAll(volatileEndpoints);
-        ldclientConfig.setEndpoints(endpoints);
-
-        ldclientConfig.setHttpClient(httpClientService.getHttpClient());
-
-        if(sail != null &&  sail.getLDCache() != null) {
-            sail.getLDCache().reload();
-        }
-    }
-
-    /**
-     * Create the sail wrapper provided by this SailProvider
-     *
-     * @param parent the parent sail to wrap by the provider
-     * @return the wrapped sail
-     */
-    @Override
-    public NotifyingSailWrapper createSail(NotifyingSail parent) {
-        Set<SesameFilter<Resource>> filters = new HashSet<SesameFilter<Resource>>();
-        filters.add(MarmottaLocalFilter.getInstance());
-        filters.addAll(Lists.newArrayList(ignoreFilters));
-
-        SesameFilter<Resource> cacheFilters = new OneOfFilter<Resource>(filters);
-
-        String cache_context = configurationService.getCacheContext();
-        sail = new KiWiLinkedDataSail(parent, new NotFilter<Resource>(cacheFilters), cache_context, ldclientConfig);
-        return sail;
-    }
-
-
-    /**
-     * Return the Linked Data Client used by the caching system (e.g. for debugging).
-     * @return
-     */
-    public LDClientService getLDClient() {
-        if(sail != null) {
-            return sail.getLDCache().getLDClient();
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Return the caching backend used by the caching system (e.g. for debugging)
-     * @return
-     */
-    public LDCache getLDCache() {
-        if(sail != null) {
-            return sail.getLDCache();
-        } else {
-            return null;
-        }
-    }
-
-
-    /**
-     * Add a volatile (in-memory) endpoint to the LDClient configuration. Can be used by other services for auto-registering
-     * LDClient endpoints for special endpoints.
-     *
-     * @param endpoint
-     */
-    public void addVolatileEndpoint(Endpoint endpoint) {
-        if(!volatileEndpoints.contains(endpoint)) {
-            volatileEndpoints.add(endpoint);
-            updateEndpoints();
-        }
-    }
-
-
-    /**
-     * Remove a volatile (in-memory) endpoint from the LDClient configuration.
-     * @param endpoint
-     */
-    public void removeVolatileEndpoint(Endpoint endpoint) {
-        if(volatileEndpoints.contains(endpoint)) {
-            volatileEndpoints.remove(endpoint);
-            updateEndpoints();
-        }
-    }
-
-    /**
-     * Return all configured volatile endpoints.
-     * @return
-     */
-    public Set<Endpoint> getVolatileEndpoints() {
-        return new HashSet<Endpoint>(volatileEndpoints);
-    }
-}