/*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and Cambridge Semantics Incorporated.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* File: $Source: /cvsroot/slrp/boca/com.ibm.adtech.boca.test/src/com/ibm/adtech/boca/test/server/TestBocaReplication.java,v $
* Created by: Matthew Roy ( <a href="mailto:mroy@us.ibm.com">mroy@us.ibm.com </a>)
* Created on: 2/25/2005
* Revision: $Id: TestReplication.java 171 2007-07-31 14:11:17Z mroy $
*
* Contributors:
* IBM Corporation - initial API and implementation
* Cambridge Semantics Incorporated - Fork to Anzo
*******************************************************************************/
package org.openanzo.test.client;
import java.util.ArrayList;
import java.util.Iterator;
import org.openanzo.client.AnzoClient;
import org.openanzo.client.AnzoClientDatasource;
import org.openanzo.exceptions.AnzoException;
import org.openanzo.rdf.AnzoGraph;
import org.openanzo.rdf.Constants;
import org.openanzo.rdf.MemQuadStore;
import org.openanzo.rdf.Resource;
import org.openanzo.rdf.Statement;
import org.openanzo.rdf.URI;
import org.openanzo.rdf.Value;
import org.openanzo.rdf.utils.UriGenerator;
import org.openanzo.services.IOperationContext;
import org.openanzo.services.impl.BaseOperationContext;
import org.openanzo.services.serialization.IReplicationHandler;
import org.openanzo.test.AbstractTest;
/**
* Test replication service
*
*/
public class TestReplication extends AbstractTest {
static final URI defaultUser = Constants.valueFactory.createURI("http://openanzo.org/users/default");
static final URI namedGraphUri = createTestUri("namedGraph1");
static final URI namedGraphUri2 = createTestUri("namedGraph2");
static final URI metaNamedGraphUri = UriGenerator.generateMetadataGraphUri(namedGraphUri);
static final URI metaNamedGraphUri2 = UriGenerator.generateMetadataGraphUri(namedGraphUri2);
static final URI acl = Constants.valueFactory.createURI("http://openanzo.org/ACL/1");
static final URI defaultRole = Constants.valueFactory.createURI("ldap://cn=users,ou=groups,dc=openanzo,dc=org");
static final URI defaultSysAdminRole = Constants.valueFactory.createURI("ldap://cn=sysadmins,ou=groups,dc=openanzo,dc=org");
class SimpleReplicaUpdater implements IReplicationHandler {
MemQuadStore additions = new MemQuadStore();
MemQuadStore removals = new MemQuadStore();
SimpleReplicaUpdater() {
}
SimpleReplicaUpdater clear() {
additions.clear();
removals.clear();
return this;
}
public void start(int totalSize) throws AnzoException {
}
public void end() throws AnzoException {
}
public boolean handleNamedGraph(URI namedGraphUri, URI uuid, long revision) throws AnzoException {
return false;
}
public boolean handleStatement(boolean metadata, boolean addition, Resource subject, URI predicate, Value object, URI namedGraphURI) throws AnzoException {
if (addition) {
additions.add(subject, predicate, object, namedGraphURI);
} else {
removals.add(subject, predicate, object, namedGraphURI);
}
return true;
}
public MemQuadStore getAdditions() {
return additions;
}
public MemQuadStore getDeletions() {
return removals;
}
}
/**
* Test simple adds and removes
*
* @throws Throwable
*/
public void testAddRemoveStatements() throws Throwable {
// it works if we use the sysadmin role, but we don't want to do that.
// ModelServiceProperties.setUser(props,
// "http://openanzo.org/users/sysadmin");
// ModelServiceProperties.setPassword(props, "123");
AnzoClient anzoClient = null;
AnzoClient containerClient = null;
org.openanzo.client.AnzoClientDatasource container = null;
try {
anzoClient = new AnzoClient(getDefaultClientConfiguration());
anzoClient.connect();
anzoClient.reset(loadStatements("initialize.trig"), null);
Statement stmt1 = Constants.valueFactory.createStatement(createTestUri("subject1"), createTestUri("predicate1"), createTestUri("object1"), namedGraphUri);
Statement stmt2 = Constants.valueFactory.createStatement(createTestUri("subject1"), createTestUri("predicate1"), createTestUri("object2"), namedGraphUri);
Statement stmt3 = Constants.valueFactory.createStatement(createTestUri("subject3"), createTestUri("predicate3"), createTestUri("object3"), namedGraphUri);
Statement stmt6 = Constants.valueFactory.createStatement(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.canBeAddedToByProperty, defaultRole, namedGraphUri);
Statement stmt7 = Constants.valueFactory.createStatement(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.canBeReadByProperty, defaultRole, namedGraphUri);
Statement stmt8 = Constants.valueFactory.createStatement(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.canBeRemovedFromByProperty, defaultRole, namedGraphUri);
Statement stmt9 = Constants.valueFactory.createStatement(namedGraphUri2, org.openanzo.ontologies.openanzo.NamedGraph.canBeAddedToByProperty, defaultRole, namedGraphUri2);
Statement stmt10 = Constants.valueFactory.createStatement(namedGraphUri2, org.openanzo.ontologies.openanzo.NamedGraph.canBeReadByProperty, defaultRole, namedGraphUri2);
Statement stmt11 = Constants.valueFactory.createStatement(namedGraphUri2, org.openanzo.ontologies.openanzo.NamedGraph.canBeRemovedFromByProperty, defaultRole, namedGraphUri2);
anzoClient.begin();
AnzoGraph serverModel1 = anzoClient.getServerGraph(namedGraphUri);
serverModel1.getMetadataGraph().add(stmt6);
serverModel1.getMetadataGraph().add(stmt7);
serverModel1.getMetadataGraph().add(stmt8);
serverModel1.add(stmt1);
serverModel1.add(stmt2);
anzoClient.commit();
anzoClient.updateRepository();
anzoClient.begin();
AnzoGraph serverModel2 = anzoClient.getServerGraph(namedGraphUri2);
serverModel2.getMetadataGraph().add(stmt9);
serverModel2.getMetadataGraph().add(stmt10);
serverModel2.getMetadataGraph().add(stmt11);
anzoClient.commit();
anzoClient.updateRepository();
containerClient = new AnzoClient(getDefaultClientConfiguration());
container = containerClient.getAnzoClientDatasource();
containerClient.connect();
ArrayList<Statement> trackers = new ArrayList<Statement>();
Long revision = Long.valueOf(-1);
trackers.add(Constants.valueFactory.createStatement(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, Constants.valueFactory.createTypedLiteral(revision), metaNamedGraphUri));
SimpleReplicaUpdater results = new SimpleReplicaUpdater();
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size() == 0);
assertTrue(results.getAdditions().contains(stmt1));
assertTrue(results.getAdditions().contains(stmt2));
assertFalse(results.getAdditions().contains(stmt3));
anzoClient.begin();
serverModel1.add(stmt3);
anzoClient.commit();
anzoClient.updateRepository();
trackers.clear();
Iterator<Statement> statements = results.getAdditions().find(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, null, metaNamedGraphUri).iterator();
if (statements.hasNext()) {
Statement stmt = statements.next();
trackers.add(stmt);
}
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertFalse(results.getAdditions().contains(stmt1));
assertFalse(results.getAdditions().contains(stmt2));
assertTrue(results.getAdditions().contains(stmt3));
anzoClient.begin();
serverModel1.remove(stmt3);
anzoClient.commit();
anzoClient.updateRepository();
trackers.clear();
statements = results.getAdditions().find(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, null, metaNamedGraphUri).iterator();
if (statements.hasNext()) {
Statement stmt = statements.next();
trackers.add(stmt);
}
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getAdditions().size(namedGraphUri) == 0);
assertTrue(results.getDeletions().size(namedGraphUri) > 0);
assertFalse(results.getDeletions().contains(stmt1));
assertFalse(results.getDeletions().contains(stmt2));
assertTrue(results.getDeletions().contains(stmt3));
anzoClient.begin();
serverModel1.remove(stmt2);
serverModel1.remove(stmt1);
anzoClient.commit();
anzoClient.updateRepository();
trackers.clear();
statements = results.getAdditions().find(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, null, metaNamedGraphUri).iterator();
if (statements.hasNext()) {
Statement stmt = statements.next();
trackers.add(stmt);
}
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getAdditions().size(namedGraphUri) == 0);
assertTrue(results.getDeletions().contains(stmt1));
assertTrue(results.getDeletions().contains(stmt2));
assertFalse(results.getDeletions().contains(stmt3));
trackers.clear();
statements = results.getAdditions().find(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, null, metaNamedGraphUri).iterator();
if (statements.hasNext()) {
Statement stmt = statements.next();
trackers.add(stmt);
}
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getAdditions().size(namedGraphUri) == 0);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
anzoClient.begin();
serverModel2.add(stmt3);
anzoClient.commit();
anzoClient.updateRepository();
trackers.clear();
statements = results.getAdditions().find(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, null, metaNamedGraphUri).iterator();
if (statements.hasNext()) {
Statement stmt = statements.next();
trackers.add(stmt);
}
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertTrue(results.getAdditions().size(namedGraphUri) == 0);
} finally {
if (anzoClient != null)
anzoClient.close();
if (containerClient != null) {
containerClient.close();
}
}
}
/**
* Test simple adds and removes
*
* @throws Throwable
*/
public void testNewNamedGraphTracker() throws Throwable {
// it works if we use the sysadmin role, but we don't want to do that.
// ModelServiceProperties.setUser(props,
// "http://openanzo.org/users/sysadmin");
// ModelServiceProperties.setPassword(props, "123");
AnzoClient anzoClient = null;
AnzoClient containerClient = null;
AnzoClientDatasource container = null;
try {
anzoClient = new AnzoClient(getDefaultClientConfiguration());
anzoClient.connect();
anzoClient.reset(loadStatements("initialize.trig"), null);
Statement stmt1 = Constants.valueFactory.createStatement(createTestUri("subject1"), createTestUri("predicate1"), createTestUri("object1"), namedGraphUri);
Statement stmt2 = Constants.valueFactory.createStatement(createTestUri("subject1"), createTestUri("predicate1"), createTestUri("object2"), namedGraphUri);
Statement stmt3 = Constants.valueFactory.createStatement(createTestUri("subject3"), createTestUri("predicate3"), createTestUri("object3"), namedGraphUri);
Statement stmt4 = Constants.valueFactory.createStatement(createTestUri("subject4"), createTestUri("predicate4"), createTestUri("object4"), namedGraphUri2);
anzoClient.begin();
AnzoGraph serverModel1 = anzoClient.getServerGraph(namedGraphUri);
anzoClient.commit();
anzoClient.updateRepository();
anzoClient.begin();
AnzoGraph serverModel2 = anzoClient.getServerGraph(namedGraphUri2);
anzoClient.commit();
anzoClient.updateRepository();
containerClient = new AnzoClient(getDefaultClientConfiguration());
container = containerClient.getAnzoClientDatasource();
containerClient.connect();
SimpleReplicaUpdater results = new SimpleReplicaUpdater();
ArrayList<Statement> trackers = new ArrayList<Statement>();
Long revision = Long.valueOf(-1);
trackers.add(Constants.valueFactory.createStatement(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, Constants.valueFactory.createTypedLiteral(revision), metaNamedGraphUri));
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertTrue(results.getAdditions().size(namedGraphUri) == 0);
assertTrue(results.getDeletions().size(namedGraphUri2) == 0);
assertTrue(results.getAdditions().size(namedGraphUri2) == 0);
anzoClient.begin();
serverModel1.add(stmt1);
serverModel1.add(stmt2);
anzoClient.commit();
anzoClient.updateRepository();
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertNotNull(results.getAdditions());
assertTrue(results.getAdditions().contains(stmt1));
assertTrue(results.getAdditions().contains(stmt2));
assertFalse(results.getAdditions().contains(stmt3));
if (results.getAdditions() != null) {
trackers.clear();
Iterator<Statement> statements = results.getAdditions().find(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, null, metaNamedGraphUri).iterator();
if (statements.hasNext()) {
trackers.add(statements.next());
}
}
assertTrue(results.getDeletions().size(namedGraphUri2) == 0);
assertTrue(results.getAdditions().size(namedGraphUri2) == 0);
anzoClient.begin();
serverModel1.add(stmt3);
anzoClient.commit();
anzoClient.updateRepository();
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertFalse(results.getAdditions().contains(stmt1));
assertFalse(results.getAdditions().contains(stmt2));
assertTrue(results.getAdditions().contains(stmt3));
if (results.getAdditions() != null) {
trackers.clear();
Iterator<Statement> statements = results.getAdditions().find(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, null, metaNamedGraphUri).iterator();
if (statements.hasNext()) {
trackers.add(statements.next());
}
}
assertTrue(results.getDeletions().size(namedGraphUri2) == 0);
assertTrue(results.getAdditions().size(namedGraphUri2) == 0);
anzoClient.begin();
serverModel2.add(stmt4);
anzoClient.commit();
anzoClient.updateRepository();
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri2) == 0);
assertTrue(results.getAdditions().size(namedGraphUri2) == 0);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertTrue(results.getAdditions().size(namedGraphUri) == 0);
trackers.add(Constants.valueFactory.createStatement(namedGraphUri2, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, Constants.valueFactory.createTypedLiteral(Long.valueOf(-1)), metaNamedGraphUri2));
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri2) == 0);
assertTrue(results.getAdditions().size(namedGraphUri2) > 0);
assertTrue(results.getAdditions().contains(stmt4));
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertTrue(results.getAdditions().size(namedGraphUri) == 0);
} finally {
if (anzoClient != null)
anzoClient.close();
if (containerClient != null) {
containerClient.close();
}
}
}
/**
* Test simple adds and removes
*
* @throws Throwable
*/
public void testUsesCache() throws Throwable {
AnzoClient anzoClient = null;
AnzoClient containerClient = null;
AnzoClientDatasource container = null;
try {
anzoClient = new AnzoClient(getDefaultClientConfiguration());
anzoClient.connect();
anzoClient.reset(loadStatements("initialize.trig"), null);
Statement stmt1 = Constants.valueFactory.createStatement(createTestUri("subject1"), createTestUri("predicate1"), createTestUri("object1"), namedGraphUri);
Statement stmt2 = Constants.valueFactory.createStatement(createTestUri("subject1"), createTestUri("predicate1"), createTestUri("object2"), namedGraphUri);
Statement stmt3 = Constants.valueFactory.createStatement(createTestUri("subject3"), createTestUri("predicate3"), createTestUri("object3"), namedGraphUri);
anzoClient.begin();
AnzoGraph serverModel1 = anzoClient.getServerGraph(namedGraphUri);
anzoClient.commit();
anzoClient.updateRepository();
containerClient = new AnzoClient(getDefaultClientConfiguration());
container = containerClient.getAnzoClientDatasource();
containerClient.connect();
SimpleReplicaUpdater results = new SimpleReplicaUpdater();
ArrayList<Statement> trackers = new ArrayList<Statement>();
Long revision = Long.valueOf(-1);
trackers.add(Constants.valueFactory.createStatement(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, Constants.valueFactory.createTypedLiteral(revision), metaNamedGraphUri));
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertTrue(results.getAdditions().size(namedGraphUri) == 0);
assertTrue(results.getDeletions().size(namedGraphUri2) == 0);
assertTrue(results.getAdditions().size(namedGraphUri2) == 0);
anzoClient.begin();
serverModel1.add(stmt1);
serverModel1.add(stmt2);
anzoClient.commit();
anzoClient.updateRepository();
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertNotNull(results.getAdditions());
assertTrue(results.getAdditions().contains(stmt1));
assertTrue(results.getAdditions().contains(stmt2));
assertFalse(results.getAdditions().contains(stmt3));
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertNotNull(results.getAdditions());
assertTrue(results.getAdditions().contains(stmt1));
assertTrue(results.getAdditions().contains(stmt2));
assertFalse(results.getAdditions().contains(stmt3));
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertNotNull(results.getAdditions());
assertTrue(results.getAdditions().contains(stmt1));
assertTrue(results.getAdditions().contains(stmt2));
assertFalse(results.getAdditions().contains(stmt3));
anzoClient.begin();
serverModel1.remove(stmt1);
serverModel1.remove(stmt2);
anzoClient.commit();
anzoClient.updateRepository();
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertNotNull(results.getAdditions());
assertFalse(results.getAdditions().contains(stmt1));
assertFalse(results.getAdditions().contains(stmt2));
assertFalse(results.getAdditions().contains(stmt3));
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 200);
assertTrue(results.getDeletions().size(namedGraphUri) == 0);
assertNotNull(results.getAdditions());
assertFalse(results.getAdditions().contains(stmt1));
assertFalse(results.getAdditions().contains(stmt2));
assertFalse(results.getAdditions().contains(stmt3));
} finally {
if (anzoClient != null)
anzoClient.close();
if (containerClient != null) {
containerClient.close();
}
}
}
/**
* Test simple adds and removes
*
* @throws Throwable
*/
public void testLargeNumberOfStatements() throws Throwable {
// it works if we use the sysadmin role, but we don't want to do that.
// ModelServiceProperties.setUser(props,
// "http://openanzo.org/users/sysadmin");
// ModelServiceProperties.setPassword(props, "123");
AnzoClient anzoClient = null;
AnzoClient containerClient = null;
org.openanzo.client.AnzoClientDatasource container = null;
try {
anzoClient = new AnzoClient(getDefaultClientConfiguration());
anzoClient.connect();
anzoClient.reset(loadStatements("initialize.trig"), null);
AnzoGraph serverModel1 = anzoClient.getServerGraph(namedGraphUri);
for (int j = 0; j < 10; j++) {
anzoClient.begin();
for (int i = 0; i < 500; i++) {
serverModel1.add(createTestUri("subject1"), createTestUri("predicate1"), createTestUri("object" + j + ":" + i));
serverModel1.add(createTestUri("subject1"), createTestUri("predicate1"), createTestUri("obj" + j + ":" + i));
}
anzoClient.commit();
anzoClient.updateRepository();
}
containerClient = new AnzoClient(getDefaultClientConfiguration());
container = containerClient.getAnzoClientDatasource();
containerClient.connect();
ArrayList<Statement> trackers = new ArrayList<Statement>();
Long revision = Long.valueOf(-1);
trackers.add(Constants.valueFactory.createStatement(namedGraphUri, org.openanzo.ontologies.openanzo.NamedGraph.revisionProperty, Constants.valueFactory.createTypedLiteral(revision), metaNamedGraphUri));
SimpleReplicaUpdater results = new SimpleReplicaUpdater();
container.getReplicationService().replicate(createContext("execReplicate", anzoClient), trackers, results.clear(), 500);
assertTrue(results.getAdditions().size() > 10000);
} finally {
if (anzoClient != null)
anzoClient.close();
if (containerClient != null) {
containerClient.close();
}
}
}
protected IOperationContext createContext(String name, AnzoClient client) throws AnzoException {
return new BaseOperationContext(name, BaseOperationContext.generateOperationId(), client.getServicePrincipal());
}
}