You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by ja...@apache.org on 2014/03/12 12:41:04 UTC

git commit: MARMOTTA-440: aligned LDP implementation with the curren WD (http://www.w3.org/TR/2014/WD-ldp-20140311/) Implementation Report available at https://wiki.apache.org/marmotta/LDPImplementationReport/2014-03-11

Repository: marmotta
Updated Branches:
  refs/heads/ldp 96097b4dd -> 673ddc35d


MARMOTTA-440: aligned LDP implementation with the curren WD (http://www.w3.org/TR/2014/WD-ldp-20140311/)
Implementation Report available at https://wiki.apache.org/marmotta/LDPImplementationReport/2014-03-11


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

Branch: refs/heads/ldp
Commit: 673ddc35dbf9bfd66df49ceb1e3db5a3ba7a238f
Parents: 96097b4
Author: Jakob Frank <ja...@apache.org>
Authored: Wed Mar 12 12:36:28 2014 +0100
Committer: Jakob Frank <ja...@apache.org>
Committed: Wed Mar 12 12:40:26 2014 +0100

----------------------------------------------------------------------
 .../apache/marmotta/commons/vocabulary/LDP.java | 119 +++++--------------
 .../platform/ldp/api/LdpBinaryStoreService.java |   3 +
 .../ldp/services/LdpBinaryStoreServiceImpl.java |  16 +++
 .../platform/ldp/services/LdpServiceImpl.java   |  30 ++++-
 .../marmotta/platform/ldp/util/LdpUtils.java    |  20 ++++
 .../platform/ldp/webservices/LdpWebService.java |   5 +-
 6 files changed, 98 insertions(+), 95 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/673ddc35/commons/marmotta-sesame-tools/marmotta-model-vocabs/src/main/java/org/apache/marmotta/commons/vocabulary/LDP.java
----------------------------------------------------------------------
diff --git a/commons/marmotta-sesame-tools/marmotta-model-vocabs/src/main/java/org/apache/marmotta/commons/vocabulary/LDP.java b/commons/marmotta-sesame-tools/marmotta-model-vocabs/src/main/java/org/apache/marmotta/commons/vocabulary/LDP.java
index aa17814..d76ca13 100644
--- a/commons/marmotta-sesame-tools/marmotta-model-vocabs/src/main/java/org/apache/marmotta/commons/vocabulary/LDP.java
+++ b/commons/marmotta-sesame-tools/marmotta-model-vocabs/src/main/java/org/apache/marmotta/commons/vocabulary/LDP.java
@@ -17,6 +17,7 @@
 package org.apache.marmotta.commons.vocabulary;
 
 import org.openrdf.model.URI;
+import org.openrdf.model.Value;
 import org.openrdf.model.ValueFactory;
 import org.openrdf.model.impl.ValueFactoryImpl;
 
@@ -29,104 +30,46 @@ public class LDP {
 
     public static final String PREFIX = "ldp";
 
-    /**
-     * FIXME: Not yet part of the official vocab, but used in the Spec. (2014-03-11)
-     */
-    public static final URI DirectContainer;
-
-    /**
-     * FIXME: Not yet part of the official vocab, but used in the Spec. (2014-02-18)
-     */
+    
+    
     public static final URI BasicContainer;
-
-    /**
-     * FIXME: Not yet part of the official vocab, but used in the Spec. (2014-03-11)
-     */
-    public static final URI IndirectContainer;
-
-    /**
-     * A Linked Data Platform Resource (LDPR) that also conforms to
-     * additional patterns and conventions for managing membership.
-     * Readers should refer to the specification defining this ontology for the list of
-     * behaviors associated with it.
-     */
     public static final URI Container;
-
-    /**
-     * A resource that represents a limited set of members of a LDP Container.
-     */
-    public static final URI Page;
-
-    /**
-     * A HTTP-addressable resource with a linked data representation.
-     */
-    public static final URI Resource;
-
-    /**
-     * A HTTP-addressable resource with a RDF Source representation.
-     * FIXME: Not yet part of the vocab, but used in the spec. (2014-03-11)
-     */
-    public static final URI RDFSource;
-
-    /**
-     * A HTTP-addressable resource with a Non-RDF Source representation.
-     * FIXME: Not yet part of the vocab, but used in the spec. (2014-03-11)
-     */
-    public static final URI NonRdfResource;
-
-    /**
-     * FIXME: Not yet part of the vocab, but used in the spec. (2014-02-24)
-     */
     public static final URI contains;
-
-    /**
-     * List of predicates that indicate the ascending order of the members in a page.
-     */
-    public static final URI containerSortPredicates;
-
-    /**
-     * FIXME: Not yet part of the vocab, but used in the spec. (2014-02-18)
-     */
+    public static final URI DirectContainer;
+    public static final URI hasMemberRelation;
+    public static final URI IndirectContainer;
+    public static final URI insertedContentRelation;
+    public static final URI isMemberOfRelation;
     public static final URI member;
-
-    /**
-     * Indicates which predicate of the container should be used to determine the membership.
-     */
-    public static final URI membershipPredicate;
-
-    /**
-     * Indicates which resource is the subject for the members of the container.
-     */
-    public static final URI membershipSubject;
-
-    /**
-     * From a known page, how to indicate the next or last page as rdf:nil.
-     */
-    public static final URI nextPage;
-
-    /**
-     * Associated a page with its container.
-     */
-    public static final URI pageOf;
-
+    public static final URI membershipResource;
+    public static final URI MemberSubject;
+    public static final URI NonRdfResource;
+    public static final URI PreferContainment;
+    public static final URI PreferEmptyContainer;
+    public static final URI PreferMembership;
+    public static final URI RDFSource;
+    public static final URI Resource;
 
     static {
         ValueFactory factory = ValueFactoryImpl.getInstance();
-        DirectContainer = factory.createURI(LDP.NAMESPACE, "DirectContainer"); //TODO: missing term in the vocab
         BasicContainer = factory.createURI(LDP.NAMESPACE, "BasicContainer"); //TODO: missing term in the vocab
+        Container = factory.createURI(LDP.NAMESPACE, "Container"); //TODO: missing term in the vocab
+        contains = factory.createURI(LDP.NAMESPACE, "contains"); //TODO: missing term in the vocab
+        DirectContainer = factory.createURI(LDP.NAMESPACE, "DirectContainer"); //TODO: missing term in the vocab
+        hasMemberRelation = factory.createURI(LDP.NAMESPACE, "hasMemberRelation"); //TODO: missing term in the vocab
         IndirectContainer = factory.createURI(LDP.NAMESPACE, "IndirectContainer"); //TODO: missing term in the vocab
-        Container = factory.createURI(LDP.NAMESPACE, "Container");
-        Page = factory.createURI(LDP.NAMESPACE, "Page");
-        Resource = factory.createURI(LDP.NAMESPACE, "Resource");
-        RDFSource = factory.createURI(LDP.NAMESPACE, "RDFSource"); //TODO: missing term in the vocab
+        insertedContentRelation = factory.createURI(LDP.NAMESPACE, "insertedContentRelation"); //TODO: missing term in the vocab
+        isMemberOfRelation = factory.createURI(LDP.NAMESPACE, "isMemberOfRelation"); //TODO: missing term in the vocab
+        member = factory.createURI(LDP.NAMESPACE, "member"); //TODO: missing term in the vocab
+        membershipResource = factory.createURI(LDP.NAMESPACE, "membershipResource"); //TODO: missing term in the vocab
+        MemberSubject = factory.createURI(LDP.NAMESPACE, "MemberSubject"); //TODO: missing term in the vocab
         NonRdfResource = factory.createURI(LDP.NAMESPACE, "NonRdfResource"); //TODO: missing term in the vocab
-        contains = factory.createURI(LDP.NAMESPACE, "contains");
-        containerSortPredicates = factory.createURI(LDP.NAMESPACE, "containerSortPredicates");
-        member = factory.createURI(LDP.NAMESPACE, "member");
-        membershipPredicate = factory.createURI(LDP.NAMESPACE, "membershipPredicate");
-        membershipSubject = factory.createURI(LDP.NAMESPACE, "membershipSubject");
-        nextPage = factory.createURI(LDP.NAMESPACE, "nextPage");
-        pageOf = factory.createURI(LDP.NAMESPACE, "pageOf");
+        PreferContainment = factory.createURI(LDP.NAMESPACE, "PreferContainment"); //TODO: missing term in the vocab
+        PreferEmptyContainer = factory.createURI(LDP.NAMESPACE, "PreferEmptyContainer"); //TODO: missing term in the vocab
+        PreferMembership = factory.createURI(LDP.NAMESPACE, "PreferMembership"); //TODO: missing term in the vocab
+        RDFSource = factory.createURI(LDP.NAMESPACE, "RDFSource"); //TODO: missing term in the vocab
+        Resource = factory.createURI(LDP.NAMESPACE, "Resource"); //TODO: missing term in the vocab
+
     }
 
 }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/673ddc35/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/api/LdpBinaryStoreService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/api/LdpBinaryStoreService.java b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/api/LdpBinaryStoreService.java
index 6e8f46a..6624a8e 100644
--- a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/api/LdpBinaryStoreService.java
+++ b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/api/LdpBinaryStoreService.java
@@ -41,4 +41,7 @@ public interface LdpBinaryStoreService {
     String getHash(String resource);
 
     String getHash(URI uri);
+
+    boolean delete(URI uri);
+    boolean delete(String resource);
 }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/673ddc35/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/services/LdpBinaryStoreServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/services/LdpBinaryStoreServiceImpl.java b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/services/LdpBinaryStoreServiceImpl.java
index 09f34c6..290f658 100644
--- a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/services/LdpBinaryStoreServiceImpl.java
+++ b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/services/LdpBinaryStoreServiceImpl.java
@@ -129,4 +129,20 @@ public class LdpBinaryStoreServiceImpl implements LdpBinaryStoreService {
     public String getHash(URI uri) {
         return getHash(uri.stringValue());
     }
+
+    @Override
+    public boolean delete(URI uri) {
+        return delete(uri.stringValue());
+    }
+
+    @Override
+    public boolean delete(String resource) {
+        try {
+            final Path file = getFile(resource);
+            return Files.deleteIfExists(file);
+        } catch (IOException | URISyntaxException e) {
+            log.error("Error while deleting {}: {}", resource, e.getMessage());
+            return false;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/673ddc35/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/services/LdpServiceImpl.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/services/LdpServiceImpl.java b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/services/LdpServiceImpl.java
index 1aa1425..1e9acb0 100644
--- a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/services/LdpServiceImpl.java
+++ b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/services/LdpServiceImpl.java
@@ -122,7 +122,7 @@ public class LdpServiceImpl implements LdpService {
 
     @Override
     public boolean isNonRdfSourceResource(RepositoryConnection connection, String resource) throws RepositoryException {
-        return isRdfSourceResource(connection, buildURI(resource));
+        return isNonRdfSourceResource(connection, buildURI(resource));
     }
 
     @Override
@@ -252,11 +252,14 @@ public class LdpServiceImpl implements LdpService {
 
         final Literal now = valueFactory.createLiteral(new Date());
 
+        // FIXME: This is redundant if the container already existed as a Resource!
+        connection.add(container, RDF.TYPE, LDP.Resource, ldpContext);
+        connection.add(container, RDF.TYPE, LDP.RDFSource, ldpContext);
+        // end
         connection.add(container, RDF.TYPE, LDP.Container, ldpContext);
         // TODO: For the future we might need to check for other container types here first.
         connection.add(container, RDF.TYPE, LDP.BasicContainer, ldpContext);
 
-        connection.add(container, LDP.contains, resource, ldpContext);
         connection.remove(container, DCTERMS.modified, null, ldpContext);
         connection.add(container, DCTERMS.modified, now, ldpContext);
 
@@ -272,6 +275,8 @@ public class LdpServiceImpl implements LdpService {
             Literal format = valueFactory.createLiteral(type);
             URI binaryResource = valueFactory.createURI(resource.stringValue() + LdpUtils.getExtension(type));
 
+            connection.add(container, LDP.contains, binaryResource, ldpContext);
+
             connection.add(binaryResource, DCTERMS.created, now, ldpContext);
             connection.add(binaryResource, DCTERMS.modified, now, ldpContext);
             connection.add(binaryResource, RDF.TYPE, LDP.Resource, ldpContext);
@@ -290,6 +295,7 @@ public class LdpServiceImpl implements LdpService {
             return binaryResource.stringValue();
         } else {
             log.debug("POST creates new LDP-RR, data provided as {}", rdfFormat.getName());
+            connection.add(container, LDP.contains, resource, ldpContext);
 
             // FIXME: We are (are we?) allowed to filter out server-managed properties here
             connection.add(stream, resource.stringValue(), rdfFormat, resource);
@@ -402,7 +408,7 @@ public class LdpServiceImpl implements LdpService {
         final Literal now = connection.getValueFactory().createLiteral(new Date());
 
         // Delete corresponding containment and membership triples (Sec. 5.2.5.1)
-        RepositoryResult<Statement> stmts = connection.getStatements(null, LDP.member, resource, false, ldpContext);
+        RepositoryResult<Statement> stmts = connection.getStatements(null, LDP.contains, resource, false, ldpContext);
         try {
             while (stmts.hasNext()) {
                 Statement st = stmts.next();
@@ -413,8 +419,22 @@ public class LdpServiceImpl implements LdpService {
         } finally {
             stmts.close();
         }
-        // FIXME: 5.2.5.2 When an LDPR identified by the object of a containment triple is deleted, and the LDPC server created an associated LDP-RS, the LDPC server must also remove the associated LDP-RS it created.
-        // FIXME: Delete LDP-NR (binary)
+        // Sec. 5.2.5.2: When an LDPR identified by the object of a containment triple is deleted, and the LDPC server created an associated LDP-RS, the LDPC server must also remove the associated LDP-RS it created.
+        RepositoryResult<Statement> associated = connection.getStatements(resource, DCTERMS.isFormatOf, null, false, ldpContext);
+        try {
+            while (associated.hasNext()) {
+                Statement st = associated.next();
+                if (st.getObject() instanceof Resource) {
+                    connection.remove((Resource) st.getObject(), null, null);
+                }
+                connection.remove(st);
+            }
+        } finally {
+            associated.close();
+        }
+
+        // Delete LDP-NR (binary)
+        binaryStore.delete(resource);
 
         // Delete the resource meta
         connection.remove(resource, null, null, ldpContext);

http://git-wip-us.apache.org/repos/asf/marmotta/blob/673ddc35/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/util/LdpUtils.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/util/LdpUtils.java b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/util/LdpUtils.java
index ceba28d..039c923 100644
--- a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/util/LdpUtils.java
+++ b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/util/LdpUtils.java
@@ -18,6 +18,7 @@
 package org.apache.marmotta.platform.ldp.util;
 
 import info.aduna.iteration.CloseableIteration;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.marmotta.commons.vocabulary.LDP;
 import org.apache.marmotta.commons.vocabulary.XSD;
 import org.apache.tika.mime.MimeTypeException;
@@ -27,10 +28,14 @@ import org.openrdf.model.URI;
 import org.openrdf.model.vocabulary.DCTERMS;
 import org.openrdf.model.vocabulary.RDF;
 import org.openrdf.repository.RepositoryException;
+import org.openrdf.rio.RDFFormat;
 import org.openrdf.rio.RDFHandlerException;
+import org.openrdf.rio.RDFParserRegistry;
 import org.openrdf.rio.RDFWriter;
 
 import javax.ws.rs.core.MediaType;
+import java.util.Iterator;
+import java.util.Set;
 
 /**
  * Various Util-Methods for the {@link org.apache.marmotta.platform.ldp.api.LdpService}.
@@ -111,4 +116,19 @@ public class LdpUtils {
         writer.endRDF();
     }
 
+    public static String getAcceptPostHeader(String extraFormats) {
+        final Set<RDFFormat> rdfFormats = RDFParserRegistry.getInstance().getKeys();
+        final StringBuilder sb = new StringBuilder();
+        for (RDFFormat rdfFormat : rdfFormats) {
+            sb.append(rdfFormat.getDefaultMIMEType());
+            sb.append(", ");
+        }
+        if (StringUtils.isNotBlank(extraFormats)) {
+            sb.append(extraFormats);
+        } else {
+            sb.delete(sb.length()-2, sb.length());
+        }
+        return sb.toString();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/673ddc35/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/webservices/LdpWebService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/webservices/LdpWebService.java b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/webservices/LdpWebService.java
index 8bf49b4..0901011 100644
--- a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/webservices/LdpWebService.java
+++ b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/webservices/LdpWebService.java
@@ -61,6 +61,7 @@ import java.util.UUID;
 public class LdpWebService {
 
     public static final String PATH = "/ldp"; //FIXME: imho this should be root '/' (jakob)
+    public static final String LDP_SERVER_CONSTRAINTS = "https://wiki.apache.org/marmotta/LDPImplementationReport/2014-03-11";
 
     private Logger log = org.slf4j.LoggerFactory.getLogger(this.getClass());
 
@@ -439,7 +440,7 @@ public class LdpWebService {
                 builder.allow("GET", "HEAD", "POST", "PATCH", "OPTIONS");
                 // Sec. 4.2.3 / Sec. ??
                 // TODO: LDP Interaction Model!
-                builder.header("Accept-Post", "text/turtle, */*");
+                builder.header("Accept-Post", LdpUtils.getAcceptPostHeader("*/*"));
                 // Sec. 4.2.7.1
                 builder.header("Accept-Patch", RdfPatchParser.MIME_TYPE);
             }
@@ -517,7 +518,7 @@ public class LdpWebService {
      */
     protected Response.ResponseBuilder createResponse(Response.ResponseBuilder rb) {
         // Link rel='describedby' (Sec. 5.2.11)
-        rb.link("http://wiki.apache.org/marmotta/LDPImplementationReport", "describedby");
+        rb.link(LDP_SERVER_CONSTRAINTS, "describedby");
 
         return rb;
     }