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/07/22 12:56:10 UTC

[5/7] git commit: implement reverting of versions (MARMOTTA-19)

implement reverting of versions (MARMOTTA-19)


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

Branch: refs/heads/develop
Commit: c5e44113c329cc79f1d4e36af5f4ebedeeac6d2c
Parents: c550034
Author: Sebastian Schaffert <ss...@apache.org>
Authored: Mon Jul 22 11:42:08 2013 +0200
Committer: Sebastian Schaffert <ss...@apache.org>
Committed: Mon Jul 22 11:42:08 2013 +0200

----------------------------------------------------------------------
 .../versioning/sail/KiWiVersioningSail.java     | 28 ++++++
 .../test/VersioningRepositoryTest.java          | 90 ++++++++++++++++++++
 .../services/VersioningSailProvider.java        | 12 +++
 .../webservices/VersioningWebService.java       | 27 ++++++
 4 files changed, 157 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/c5e44113/libraries/kiwi/kiwi-versioning/src/main/java/org/apache/marmotta/kiwi/versioning/sail/KiWiVersioningSail.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-versioning/src/main/java/org/apache/marmotta/kiwi/versioning/sail/KiWiVersioningSail.java b/libraries/kiwi/kiwi-versioning/src/main/java/org/apache/marmotta/kiwi/versioning/sail/KiWiVersioningSail.java
index 7a96b7e..84f448b 100644
--- a/libraries/kiwi/kiwi-versioning/src/main/java/org/apache/marmotta/kiwi/versioning/sail/KiWiVersioningSail.java
+++ b/libraries/kiwi/kiwi-versioning/src/main/java/org/apache/marmotta/kiwi/versioning/sail/KiWiVersioningSail.java
@@ -34,6 +34,8 @@ import org.openrdf.model.Statement;
 import org.openrdf.model.URI;
 import org.openrdf.repository.RepositoryException;
 import org.openrdf.repository.RepositoryResult;
+import org.openrdf.repository.sail.SailRepositoryConnection;
+import org.openrdf.sail.SailConnection;
 import org.openrdf.sail.SailException;
 import org.openrdf.sail.StackableSail;
 import org.slf4j.Logger;
@@ -473,6 +475,32 @@ public class KiWiVersioningSail extends TransactionalSailWrapper implements Tran
         }
     }
 
+    /**
+     * Revert (undo) the version given as argument. This method creates a new transaction, adds all triples
+     * that were deleted in the old version, removes all triples that were added in the old version, and commits
+     * the transaction, effectively creating a new (reverted) version.
+     *
+     * @param version    the version to revert
+     * @throws SailException in case reverting the version failed
+     */
+    public void revertVersion(Version version) throws SailException {
+        SailConnection con = getConnection();
+        try {
+            con.begin();
+
+            for(Statement stmt : version.getAddedTriples()) {
+                con.removeStatements(stmt.getSubject(), stmt.getPredicate(), stmt.getObject(), stmt.getContext());
+            }
+
+            for(Statement stmt : version.getRemovedTriples()) {
+                con.addStatement(stmt.getSubject(), stmt.getPredicate(), stmt.getObject(), stmt.getContext());
+            }
+
+            con.commit();
+        } finally {
+            con.close();
+        }
+    }
 
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/c5e44113/libraries/kiwi/kiwi-versioning/src/test/java/org/apache/marmotta/kiwi/versioning/test/VersioningRepositoryTest.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-versioning/src/test/java/org/apache/marmotta/kiwi/versioning/test/VersioningRepositoryTest.java b/libraries/kiwi/kiwi-versioning/src/test/java/org/apache/marmotta/kiwi/versioning/test/VersioningRepositoryTest.java
index 6757a58..79f9415 100644
--- a/libraries/kiwi/kiwi-versioning/src/test/java/org/apache/marmotta/kiwi/versioning/test/VersioningRepositoryTest.java
+++ b/libraries/kiwi/kiwi-versioning/src/test/java/org/apache/marmotta/kiwi/versioning/test/VersioningRepositoryTest.java
@@ -36,6 +36,7 @@ import org.junit.rules.TestWatcher;
 import org.junit.runner.Description;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.openrdf.model.URI;
 import org.openrdf.repository.Repository;
 import org.openrdf.repository.RepositoryConnection;
 import org.openrdf.repository.RepositoryException;
@@ -250,6 +251,95 @@ public class VersioningRepositoryTest {
 
 
     /**
+     * This test imports three small RDF files in sequence and checks afterwards that the number of versions
+     * is correct and they contain the correct information
+     * @throws Exception
+     */
+    @Test
+    public void testRevertVersions() throws Exception {
+        // import three files in sequence and check if the versions are created properly
+
+        Date date1 = new Date();
+
+        mysqlSleep();
+
+        // base data
+        InputStream baseData = this.getClass().getResourceAsStream("version-base.rdf");
+        assumeThat("Could not load test-data: version-base.rdf", baseData, notNullValue(InputStream.class));
+
+        RepositoryConnection connectionBase = repository.getConnection();
+        try {
+            connectionBase.add(baseData, "http://marmotta.incubator.apache.org/testing/ns1/", RDFFormat.RDFXML);
+            connectionBase.commit();
+        } finally {
+            connectionBase.close();
+        }
+
+        mysqlSleep();
+
+        Date date2 = new Date();
+
+        mysqlSleep();
+
+        // update 1
+        InputStream update1Data = this.getClass().getResourceAsStream("version-update1.rdf");
+        assumeThat("Could not load test-data: version-update1.rdf", update1Data, notNullValue(InputStream.class));
+
+        RepositoryConnection connectionUpdate1 = repository.getConnection();
+        try {
+            connectionUpdate1.add(update1Data, "http://marmotta.incubator.apache.org/testing/ns1/", RDFFormat.RDFXML);
+            connectionUpdate1.commit();
+        } finally {
+            connectionUpdate1.close();
+        }
+
+        // update 2
+        InputStream update2Data = this.getClass().getResourceAsStream("version-update2.rdf");
+        assumeThat("Could not load test-data: version-update2.rdf", update2Data, notNullValue(InputStream.class));
+
+        RepositoryConnection connectionUpdate2 = repository.getConnection();
+        try {
+            connectionUpdate2.add(update2Data, "http://marmotta.incubator.apache.org/testing/ns1/", RDFFormat.RDFXML);
+            connectionUpdate2.commit();
+        } finally {
+            connectionUpdate2.close();
+        }
+
+        // list all versions
+        List<Version> versions = asList(vsail.listVersions());
+        Assert.assertEquals("expected 3 versions!", 3, versions.size());
+        Assert.assertEquals(1, (long)versions.get(0).getId());
+
+        URI subject = repository.getValueFactory().createURI("http://marmotta.incubator.apache.org/testing/ns1/R1");
+        URI predicate = repository.getValueFactory().createURI("http://marmotta.incubator.apache.org/testing/ns1/P2");
+
+        RepositoryConnection connectionBeforeRevert = repository.getConnection();
+        try {
+            Assert.assertTrue(connectionBeforeRevert.hasStatement(subject,predicate,null,true));
+        } finally {
+            connectionBeforeRevert.close();
+        }
+
+        // revert version; afterwards we expect there to be 4 versions
+        vsail.revertVersion(versions.get(0));
+
+        List<Version> versions2 = asList(vsail.listVersions());
+        Assert.assertEquals("expected 4 versions!", 4, versions2.size());
+
+        // the repository should now lo longer contain any P2 property for ns1:C
+        RepositoryConnection connectionAfterRevert = repository.getConnection();
+        try {
+            Assert.assertFalse(connectionAfterRevert.hasStatement(subject, predicate, null, true));
+        } finally {
+            connectionAfterRevert.close();
+        }
+
+
+
+    }
+
+
+    /**
      * MYSQL rounds timestamps to the second, so it is sometimes necessary to sleep before doing a test
      */
     private  void mysqlSleep() {

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/c5e44113/platform/marmotta-versioning/src/main/java/org/apache/marmotta/platform/versioning/services/VersioningSailProvider.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-versioning/src/main/java/org/apache/marmotta/platform/versioning/services/VersioningSailProvider.java b/platform/marmotta-versioning/src/main/java/org/apache/marmotta/platform/versioning/services/VersioningSailProvider.java
index 13ebe79..f470c6c 100644
--- a/platform/marmotta-versioning/src/main/java/org/apache/marmotta/platform/versioning/services/VersioningSailProvider.java
+++ b/platform/marmotta-versioning/src/main/java/org/apache/marmotta/platform/versioning/services/VersioningSailProvider.java
@@ -256,4 +256,16 @@ public class VersioningSailProvider implements TransactionalSailProvider {
     public void removeVersions(Date until) throws SailException {
         sail.removeVersions(until);
     }
+
+    /**
+     * Revert (undo) the version given as argument. This method creates a new transaction, adds all triples
+     * that were deleted in the old version, removes all triples that were added in the old version, and commits
+     * the transaction, effectively creating a new (reverted) version.
+     *
+     * @param version    the version to revert
+     * @throws org.openrdf.sail.SailException in case reverting the version failed
+     */
+    public void revertVersion(Version version) throws SailException {
+        sail.revertVersion(version);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/c5e44113/platform/marmotta-versioning/src/main/java/org/apache/marmotta/platform/versioning/webservices/VersioningWebService.java
----------------------------------------------------------------------
diff --git a/platform/marmotta-versioning/src/main/java/org/apache/marmotta/platform/versioning/webservices/VersioningWebService.java b/platform/marmotta-versioning/src/main/java/org/apache/marmotta/platform/versioning/webservices/VersioningWebService.java
index a71d624..22aa6bd 100644
--- a/platform/marmotta-versioning/src/main/java/org/apache/marmotta/platform/versioning/webservices/VersioningWebService.java
+++ b/platform/marmotta-versioning/src/main/java/org/apache/marmotta/platform/versioning/webservices/VersioningWebService.java
@@ -226,4 +226,31 @@ public class VersioningWebService {
     }
 
 
+    /**
+     * Revert (undo) the version with the given ID. Calling this service will add all removed triples and remove all
+     * added triples of the old version. If versioning is active, this will create a new version as well.
+     *
+     * @param id
+     * @return
+     */
+    @POST
+    @Path("/versions/{id:[0-9]+}")
+    public Response revertVersion(@PathParam("id") Long id) {
+        try {
+            Version version = versioningService.getVersion(id);
+
+            if(version != null) {
+                versioningService.removeVersion(id);
+
+                return Response.ok().entity("success").build();
+
+            } else {
+                return Response.status(Response.Status.NOT_FOUND).entity("version with id "+id+" does not exist").build();
+            }
+
+        } catch (SailException e) {
+            return Response.serverError().entity("error deleting version "+id+": "+e.getMessage()).build();
+        }
+    }
+
 }