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();
+ }
+ }
+
}