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/02/25 11:58:00 UTC

git commit: MARMOTTA-440: first working version of rdf-patch - requires more testing - inclusion into ldp pending

Repository: marmotta
Updated Branches:
  refs/heads/ldp 8497e8419 -> e66e59d75


MARMOTTA-440: first working version of rdf-patch
 - requires more testing
 - inclusion into ldp pending


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

Branch: refs/heads/ldp
Commit: e66e59d75448920c413b08b95b637530bb673b08
Parents: 8497e84
Author: Jakob Frank <ja...@apache.org>
Authored: Tue Feb 25 11:56:55 2014 +0100
Committer: Jakob Frank <ja...@apache.org>
Committed: Tue Feb 25 11:56:55 2014 +0100

----------------------------------------------------------------------
 platform/marmotta-ldp/pom.xml                   |   2 +-
 .../marmotta/platform/ldp/api/LdpService.java   |  17 +++
 .../platform/ldp/patch/RdfPatchUtil.java        | 112 +++++++++++++++++++
 .../platform/ldp/patch/model/PatchLine.java     |  20 +++-
 .../ldp/patch/model/WildcardStatement.java      | 107 ++++++++++++++++++
 .../platform/ldp/util/LdpWebServiceUtils.java   |  17 +++
 .../platform/ldp/webservices/PATCH.java         |  17 +++
 .../marmotta-ldp/src/main/javacc/rdf-patch.jj   |  41 +++----
 .../platform/ldp/patch/RdfPatchParserTest.java  |  89 ---------------
 .../platform/ldp/patch/RdfPatchUtilTest.java    |  98 ++++++++++++++++
 .../ldp/patch/parser/RdfPatchParserTest.java    |  89 +++++++++++++++
 .../src/test/resources/illustrative.in.ttl      |  17 +++
 .../src/test/resources/illustrative.rdfp        |  21 +++-
 13 files changed, 535 insertions(+), 112 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/pom.xml
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/pom.xml b/platform/marmotta-ldp/pom.xml
index 6f8bdff..f79cb9a 100644
--- a/platform/marmotta-ldp/pom.xml
+++ b/platform/marmotta-ldp/pom.xml
@@ -86,7 +86,7 @@
                             <goal>javacc</goal>
                         </goals>
                         <configuration>
-                            <lookAhead>150</lookAhead>
+                            <lookAhead>1</lookAhead>
                             <isStatic>false</isStatic>
                         </configuration>
                     </execution>

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/api/LdpService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/api/LdpService.java b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/api/LdpService.java
index 9a746da..887aa8c 100644
--- a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/api/LdpService.java
+++ b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/api/LdpService.java
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.apache.marmotta.platform.ldp.api;
 
 import org.openrdf.model.Statement;

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/RdfPatchUtil.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/RdfPatchUtil.java b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/RdfPatchUtil.java
new file mode 100644
index 0000000..be43762
--- /dev/null
+++ b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/RdfPatchUtil.java
@@ -0,0 +1,112 @@
+/*
+ * 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.ldp.patch;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.marmotta.platform.ldp.patch.model.PatchLine;
+import org.apache.marmotta.platform.ldp.patch.parser.ParseException;
+import org.apache.marmotta.platform.ldp.patch.parser.RdfPatchParser;
+import org.openrdf.model.Resource;
+import org.openrdf.model.Statement;
+import org.openrdf.model.URI;
+import org.openrdf.model.Value;
+import org.openrdf.repository.Repository;
+import org.openrdf.repository.RepositoryConnection;
+import org.openrdf.repository.RepositoryException;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+/**
+ * Created by jakob on 2/25/14.
+ */
+public class RdfPatchUtil {
+
+    public static void applyPatch(Repository repository, String patch, Resource... contexts) throws RepositoryException, ParseException {
+        applyPatch(repository, getPatch(patch), contexts);
+    }
+
+    public static void applyPatch(Repository repository, InputStream patchSource, Resource... contexts) throws RepositoryException, ParseException {
+        applyPatch(repository, getPatch(patchSource), contexts);
+    }
+    public static void applyPatch(RepositoryConnection con, String patch, Resource... contexts) throws RepositoryException, ParseException {
+        applyPatch(con, getPatch(patch), contexts);
+    }
+    public static void applyPatch(RepositoryConnection con, InputStream patchSource, Resource... contexts) throws RepositoryException, ParseException {
+        applyPatch(con, getPatch(patchSource), contexts);
+    }
+
+    public static void applyPatch(Repository repository, List<PatchLine> patch, Resource... contexts) throws RepositoryException {
+        RepositoryConnection con = repository.getConnection();
+        try {
+            con.begin();
+            applyPatch(con, patch, contexts);
+            con.commit();
+        } catch (final Throwable t) {
+            con.rollback();
+            throw t;
+        } finally {
+            con.close();
+        }
+    }
+
+    public static void applyPatch(RepositoryConnection con, List<PatchLine> patch, Resource... contexts) throws RepositoryException {
+        Resource subject = null;
+        URI predicate = null;
+        Value object = null;
+
+        for (PatchLine patchLine : patch) {
+            final Statement statement = patchLine.getStatement();
+            subject = statement.getSubject()!=null? statement.getSubject():subject;
+            predicate = statement.getPredicate()!=null?statement.getPredicate():predicate;
+            object = statement.getObject()!=null?statement.getObject():object;
+
+            switch (patchLine.getOperator()) {
+                case ADD:
+                    con.add(subject, predicate, object, contexts);
+                    break;
+                case DEL:
+                    con.remove(subject, predicate, object, contexts);
+                    break;
+                default:
+                    throw new IllegalArgumentException("Unknown patch operation: " + patchLine.getOperator());
+            }
+        }
+    }
+
+    private static List<PatchLine> getPatch(InputStream is) throws ParseException {
+        RdfPatchParser parser = new RdfPatchParser(is);
+        return parser.parsePatch();
+    }
+
+    private static List<PatchLine> getPatch(String patch) throws ParseException {
+        try (InputStream is = IOUtils.toInputStream(patch)) {
+            return getPatch(is);
+        } catch (IOException e) {
+            // You can always close an InputStream on a String
+            assert(false);
+            return null;
+        }
+    }
+
+    private RdfPatchUtil() {
+        // static access only
+    }
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/model/PatchLine.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/model/PatchLine.java b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/model/PatchLine.java
index 971b86a..4e0da28 100644
--- a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/model/PatchLine.java
+++ b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/model/PatchLine.java
@@ -23,7 +23,25 @@ import org.openrdf.model.Statement;
  * Created by jakob on 2/24/14.
  */
 public class PatchLine {
-    public enum Operator {DEL, ADD}
+    public enum Operator {
+        DEL("D"),
+        ADD("A");
+
+        private final String cmd;
+
+        Operator(String cmd) {
+            this.cmd = cmd;
+        }
+
+        public static Operator fromCommand(String cmd) {
+            for (Operator op: values()) {
+                if (op.cmd.equalsIgnoreCase(cmd)) {
+                    return op;
+                }
+            }
+            throw new IllegalArgumentException("Unknown Operator: " + cmd);
+        }
+    }
 
 
     private final Operator operator;

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/model/WildcardStatement.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/model/WildcardStatement.java b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/model/WildcardStatement.java
new file mode 100644
index 0000000..a243d34
--- /dev/null
+++ b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/patch/model/WildcardStatement.java
@@ -0,0 +1,107 @@
+/*
+ * 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.ldp.patch.model;
+
+import org.apache.commons.lang3.ObjectUtils;
+import org.openrdf.model.Resource;
+import org.openrdf.model.Statement;
+import org.openrdf.model.URI;
+import org.openrdf.model.Value;
+
+/**
+ * Created by jakob on 2/25/14.
+ */
+public class WildcardStatement implements Statement {
+
+
+    private final Value object;
+    private final URI predicate;
+    private final Resource subject;
+
+    public WildcardStatement(Resource subject, URI predicate, Value object) {
+        this.object = object;
+        this.predicate = predicate;
+        this.subject = subject;
+    }
+
+    @Override
+    public Resource getSubject() {
+        return subject;
+    }
+
+    @Override
+    public URI getPredicate() {
+        return predicate;
+    }
+
+    @Override
+    public Value getObject() {
+        return object;
+    }
+
+    @Override
+    public Resource getContext() {
+        return null;
+    }
+
+    @Override
+    public int hashCode() {
+        return 961 * (subject!=null?subject.hashCode():0) + 31 * (predicate!=null?predicate.hashCode():0) + (object!=null?object.hashCode():0);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+
+        if (other instanceof Statement) {
+            Statement otherSt = (Statement)other;
+
+            // The object is potentially the cheapest to check, as types
+            // of these references might be different.
+
+            // In general the number of different predicates in sets of
+            // statements is the smallest, so predicate equality is checked
+            // last.
+            return ObjectUtils.equals(object, otherSt.getObject()) && ObjectUtils.equals(subject, otherSt.getSubject())
+                    && ObjectUtils.equals(predicate, otherSt.getPredicate());
+        }
+
+        return false;
+    }
+
+    /**
+     * Gives a String-representation of this Statement that can be used for
+     * debugging.
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder(256);
+
+        sb.append("(");
+        sb.append(getSubject());
+        sb.append(", ");
+        sb.append(getPredicate());
+        sb.append(", ");
+        sb.append(getObject());
+        sb.append(")");
+
+        return sb.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/util/LdpWebServiceUtils.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/util/LdpWebServiceUtils.java b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/util/LdpWebServiceUtils.java
index f71dae3..a537538 100644
--- a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/util/LdpWebServiceUtils.java
+++ b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/util/LdpWebServiceUtils.java
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.apache.marmotta.platform.ldp.util;
 
 import info.aduna.iteration.CloseableIteration;

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/webservices/PATCH.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/webservices/PATCH.java b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/webservices/PATCH.java
index 0ccc099..d9b65b0 100644
--- a/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/webservices/PATCH.java
+++ b/platform/marmotta-ldp/src/main/java/org/apache/marmotta/platform/ldp/webservices/PATCH.java
@@ -1,3 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.apache.marmotta.platform.ldp.webservices;
 
 @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD})

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/main/javacc/rdf-patch.jj
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/main/javacc/rdf-patch.jj b/platform/marmotta-ldp/src/main/javacc/rdf-patch.jj
index a8a685f..93047cf 100644
--- a/platform/marmotta-ldp/src/main/javacc/rdf-patch.jj
+++ b/platform/marmotta-ldp/src/main/javacc/rdf-patch.jj
@@ -16,18 +16,18 @@
  options
 {
   STATIC=false;
-  LOOKAHEAD=150;
+  LOOKAHEAD=1;
   CACHE_TOKENS=true;
 //  FORCE_LA_CHECK=true;
 //  CHOICE_AMBIGUITY_CHECK=5;
-//  LOOKAHEAD=2147483647;
-//  DEBUG_PARSER=true;
-//  DEBUG_TOKEN_MANAGER=true;
-//  DEBUG_LOOKAHEAD=true;
+  //LOOKAHEAD=2147483647;
+  //DEBUG_PARSER=true;
+  //DEBUG_TOKEN_MANAGER=true;
+  //DEBUG_LOOKAHEAD=true;
 }
 
 PARSER_BEGIN(RdfPatchParser)
-package org.apache.marmotta.platform.ldp.patch;
+package org.apache.marmotta.platform.ldp.patch.parser;
 
 import org.openrdf.model.*;
 import org.openrdf.model.impl.*;
@@ -56,7 +56,7 @@ public class RdfPatchParser {
     }
 
     private Literal createLiteral(String value, String lang, String type) {
-        value = TurtleUtil.decodeString(value.substring(1, value.length() -2));
+        value = TurtleUtil.decodeString(value.substring(1, value.length() - 1));
         if (lang != null) {
             return new LiteralImpl(value, lang);
         } else if (type != null) {
@@ -67,7 +67,7 @@ public class RdfPatchParser {
     }
 
     private Literal createLongLiteral(String value, String lang, String type) {
-        value = value.substring(2, value.length() - 4);
+        value = value.substring(2, value.length() - 2);
         return createLiteral(value, lang, type);
     }
 
@@ -114,8 +114,7 @@ MORE: {
 }
 
 TOKEN : {
-  < ADD:       "A" >  |
-  < DEL:       "D" >  |
+  < OP:        ["A","D"] > |
   < REPEAT:    "R" >  |
   < UNDEFINED: "U" >  |
   < PREFIX:    "@prefix" > |
@@ -135,25 +134,25 @@ SPECIAL_TOKEN : {
 
 
 public List<PatchLine> parsePatch() : {
-    Token id, prefix;
+    Token id, prefix, op;
     Statement statement;
     LinkedList<PatchLine> diff = new LinkedList<PatchLine>();
     namespaces.clear();
 }
 {
-    ( <PREFIX> id = <IDENT> <COLON> prefix = <URI> <DOT> { namespaces.put(id.image, unwrapUri(prefix.image));} )* {}
+    ( <PREFIX> id = <IDENT> <COLON> prefix = <URI> <DOT> { namespaces.put(id.image, unwrapUri(prefix.image));} )*
     (
-      ( <ADD> statement = parseStatement() <DOT> { diff.add(new PatchLine(PatchLine.Operator.ADD, statement)); } ) |
-      ( <DEL> statement = parseStatement() <DOT> { diff.add(new PatchLine(PatchLine.Operator.DEL, statement)); } )
+      op = <OP> statement = parseStatement() <DOT> { diff.add(new PatchLine(PatchLine.Operator.fromCommand(op.image), statement)); }
     )*
     <EOF>
     {
-    return diff;
+        return diff;
     }
 }
 
 private Statement parseStatement() : {
     Token t1 = null, t2 = null, t3 = null;
+    Token lVal = null, lLang = null, lType = null;
     Resource subject;
     URI predicate;
     Value object;
@@ -165,17 +164,19 @@ private Statement parseStatement() : {
         <REPEAT> { subject = null; }
     )
     ( t1 = <URI> { predicate = createURI(t1.image); } |
+        t1 = <IDENT> <COLON> t2 = <IDENT> { predicate = createURI(t1.image, t2.image); } |
         <REPEAT> { predicate = null; }
     )
     ( t1 = <URI> { object = createURI(t1.image); } |
+        t1 = <IDENT> <COLON> t2 = <IDENT> { object = createURI(t1.image, t2.image); } |
         <BNODE> t1 = <IDENT> { object = createBNode(t1.image); } |
-        t1 = <STRLIT> (<LANG> t2 = <IDENT>)? (<TYPE> t3 = <URI>)? {
-            object = createLiteral(t1.image, t2!=null?t2.image:null, t3!=null?t3.image:null);
+        lVal = <STRLIT> (<LANG> lLang = <IDENT>)? (<TYPE> lType = <URI>)? {
+            object = createLiteral(lVal.image, lLang!=null?lLang.image:null, lType!=null?lType.image:null);
         } |
-        t1 = <STRLONGLIT> (<LANG> t2 = <IDENT>)? (<TYPE> t3 = <URI>)? {
-            object = createLongLiteral(t1.image, t2!=null?t2.image:null, t3!=null?t3.image:null);
+        lVal = <STRLONGLIT> (<LANG> lLang = <IDENT>)? (<TYPE> lType = <URI>)? {
+            object = createLongLiteral(lVal.image, lLang!=null?lLang.image:null, lType!=null?lType.image:null);
         } |
         <REPEAT> { object = null; }
     )
-    { return new StatementImpl(subject, predicate, object); }
+    { return new WildcardStatement(subject, predicate, object); }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/RdfPatchParserTest.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/RdfPatchParserTest.java b/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/RdfPatchParserTest.java
deleted file mode 100644
index 6c63013..0000000
--- a/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/RdfPatchParserTest.java
+++ /dev/null
@@ -1,89 +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.ldp.patch;
-
-import org.apache.marmotta.commons.vocabulary.FOAF;
-import org.apache.marmotta.platform.ldp.patch.model.PatchLine;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.openrdf.model.*;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Created by jakob on 2/24/14.
- */
-public class RdfPatchParserTest {
-
-
-    private RdfPatchParser parser;
-    private URI alice, bob, charlie;
-    private Literal lcBob, ucBob;
-
-    @Before
-    public void setUp() {
-        parser = new RdfPatchParser(this.getClass().getResourceAsStream("/illustrative.rdfp"));
-
-        alice = new URIImpl("http://example/alice");
-        bob = new URIImpl("http://example/bob");
-        charlie = new URIImpl("http://example/charlie");
-
-        lcBob = new LiteralImpl("bob");
-        ucBob = new LiteralImpl("Bob");
-    }
-
-    @After
-    public void tearDown() {
-        parser = null;
-    }
-
-
-    @Test
-    public void testParsing() throws ParseException {
-        List<PatchLine> patchLines = parser.parsePatch();
-
-        Iterator<PatchLine> it = patchLines.iterator();
-
-        Assert.assertTrue(it.hasNext());
-        checkPatchLine(it.next(), PatchLine.Operator.DEL, bob, FOAF.name, lcBob);
-
-        Assert.assertTrue(it.hasNext());
-        checkPatchLine(it.next(), PatchLine.Operator.ADD, null, FOAF.name, lcBob);
-
-        Assert.assertTrue(it.hasNext());
-        checkPatchLine(it.next(), PatchLine.Operator.ADD, null, FOAF.knows, alice);
-
-        Assert.assertTrue(it.hasNext());
-        checkPatchLine(it.next(), PatchLine.Operator.DEL, null, null, charlie);
-    }
-
-    private void checkPatchLine(PatchLine line, PatchLine.Operator operator, Resource subejct, URI predicate, Value object) {
-        Assert.assertEquals("Wrong patch operation", operator, line.getOperator());
-
-        Statement statement = line.getStatement();
-        Assert.assertEquals("Wrong subject", subejct, statement.getSubject());
-        Assert.assertEquals("Wrong predicate", predicate, statement.getPredicate());
-        Assert.assertEquals("Wrong object", object, statement.getObject());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/RdfPatchUtilTest.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/RdfPatchUtilTest.java b/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/RdfPatchUtilTest.java
new file mode 100644
index 0000000..ba55337
--- /dev/null
+++ b/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/RdfPatchUtilTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.ldp.patch;
+
+import org.apache.marmotta.commons.vocabulary.FOAF;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openrdf.model.Literal;
+import org.openrdf.model.URI;
+import org.openrdf.model.impl.LiteralImpl;
+import org.openrdf.model.impl.URIImpl;
+import org.openrdf.repository.Repository;
+import org.openrdf.repository.RepositoryConnection;
+import org.openrdf.repository.sail.SailRepository;
+import org.openrdf.rio.RDFFormat;
+import org.openrdf.sail.memory.MemoryStore;
+
+/**
+ * Created by jakob on 2/25/14.
+ */
+public class RdfPatchUtilTest {
+
+    public static final String BASE_URI = "http://example/";
+
+    private Repository repository;
+    private URI alice, bob, charlie;
+    private Literal lcBob, ucBob;
+
+    @Before
+    public void setUp() throws Exception {
+        repository = new SailRepository(new MemoryStore());
+        repository.initialize();
+
+        alice = repository.getValueFactory().createURI("http://example/alice");
+        bob = repository.getValueFactory().createURI("http://example/bob");
+        charlie = repository.getValueFactory().createURI("http://example/charlie");
+
+        lcBob = repository.getValueFactory().createLiteral("bob");
+        ucBob = repository.getValueFactory().createLiteral("Bob");
+
+        RepositoryConnection con = repository.getConnection();
+        try {
+            con.begin();
+            con.add(this.getClass().getResourceAsStream("/illustrative.in.ttl"), BASE_URI, RDFFormat.TURTLE);
+            con.commit();
+        } finally {
+            con.close();
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (repository != null) {
+            repository.shutDown();
+        }
+    }
+
+    @Test
+    public void testApplyPatch() throws Exception {
+        RepositoryConnection con = repository.getConnection();
+        try {
+            con.begin();
+
+            Assert.assertTrue(con.hasStatement(bob, FOAF.name, lcBob, false));
+            Assert.assertFalse(con.hasStatement(bob, FOAF.name, ucBob, false));
+            Assert.assertFalse(con.hasStatement(bob, FOAF.knows, alice, false));
+            Assert.assertTrue(con.hasStatement(bob, FOAF.knows, charlie, false));
+
+            RdfPatchUtil.applyPatch(con, this.getClass().getResourceAsStream("/illustrative.rdfp"));
+
+            Assert.assertFalse(con.hasStatement(bob, FOAF.name, lcBob, false));
+            Assert.assertTrue(con.hasStatement(bob, FOAF.name, ucBob, false));
+            Assert.assertTrue(con.hasStatement(bob, FOAF.knows, alice, false));
+            Assert.assertFalse(con.hasStatement(bob, FOAF.knows, charlie, false));
+
+            con.commit();
+        } finally {
+            con.close();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/parser/RdfPatchParserTest.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/parser/RdfPatchParserTest.java b/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/parser/RdfPatchParserTest.java
new file mode 100644
index 0000000..6ebcc58
--- /dev/null
+++ b/platform/marmotta-ldp/src/test/java/org/apache/marmotta/platform/ldp/patch/parser/RdfPatchParserTest.java
@@ -0,0 +1,89 @@
+/*
+ * 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.ldp.patch.parser;
+
+import org.apache.marmotta.commons.vocabulary.FOAF;
+import org.apache.marmotta.platform.ldp.patch.model.PatchLine;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openrdf.model.*;
+import org.openrdf.model.impl.LiteralImpl;
+import org.openrdf.model.impl.URIImpl;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by jakob on 2/24/14.
+ */
+public class RdfPatchParserTest {
+
+
+    private RdfPatchParser parser;
+    private URI alice, bob, charlie;
+    private Literal lcBob, ucBob;
+
+    @Before
+    public void setUp() {
+        parser = new RdfPatchParser(this.getClass().getResourceAsStream("/illustrative.rdfp"));
+
+        alice = new URIImpl("http://example/alice");
+        bob = new URIImpl("http://example/bob");
+        charlie = new URIImpl("http://example/charlie");
+
+        lcBob = new LiteralImpl("bob");
+        ucBob = new LiteralImpl("Bob");
+    }
+
+    @After
+    public void tearDown() {
+        parser = null;
+    }
+
+
+    @Test
+    public void testParsing() throws ParseException {
+        List<PatchLine> patchLines = parser.parsePatch();
+
+        Iterator<PatchLine> it = patchLines.iterator();
+
+        Assert.assertTrue(it.hasNext());
+        checkPatchLine(it.next(), PatchLine.Operator.DEL, bob, FOAF.name, lcBob);
+
+        Assert.assertTrue(it.hasNext());
+        checkPatchLine(it.next(), PatchLine.Operator.ADD, bob, FOAF.name, ucBob);
+
+        Assert.assertTrue(it.hasNext());
+        checkPatchLine(it.next(), PatchLine.Operator.ADD, null, FOAF.knows, alice);
+
+        Assert.assertTrue(it.hasNext());
+        checkPatchLine(it.next(), PatchLine.Operator.DEL, null, null, charlie);
+    }
+
+    private void checkPatchLine(PatchLine line, PatchLine.Operator operator, Resource subejct, URI predicate, Value object) {
+        Assert.assertEquals("Wrong patch operation", operator, line.getOperator());
+
+        Statement statement = line.getStatement();
+        Assert.assertEquals("Wrong subject", subejct, statement.getSubject());
+        Assert.assertEquals("Wrong predicate", predicate, statement.getPredicate());
+        Assert.assertEquals("Wrong object", object, statement.getObject());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/test/resources/illustrative.in.ttl
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/test/resources/illustrative.in.ttl b/platform/marmotta-ldp/src/test/resources/illustrative.in.ttl
index be04c27..d52213a 100644
--- a/platform/marmotta-ldp/src/test/resources/illustrative.in.ttl
+++ b/platform/marmotta-ldp/src/test/resources/illustrative.in.ttl
@@ -1,3 +1,20 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements. See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership. The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
 @prefix  foaf: <http://xmlns.com/foaf/0.1/> .
 
 <http://example/bob> a foaf:Person;

http://git-wip-us.apache.org/repos/asf/marmotta/blob/e66e59d7/platform/marmotta-ldp/src/test/resources/illustrative.rdfp
----------------------------------------------------------------------
diff --git a/platform/marmotta-ldp/src/test/resources/illustrative.rdfp b/platform/marmotta-ldp/src/test/resources/illustrative.rdfp
index 69ac715..e5c0ab9 100644
--- a/platform/marmotta-ldp/src/test/resources/illustrative.rdfp
+++ b/platform/marmotta-ldp/src/test/resources/illustrative.rdfp
@@ -1,6 +1,25 @@
+# 
+#  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.
+#
 @prefix  foaf: <http://xmlns.com/foaf/0.1/> .
-
+# Fix Bobs name
 D <http://example/bob> foaf:name "bob" .
 A <http://example/bob> foaf:name "Bob" .
+# At ApacheCon EU, Bob met Alice
 A R foaf:knows <http://example/alice> .
+# Bob and Charlie had a fight
 D R R <http://example/charlie> .