Transactions Example

// TransactionsExample.java
//
// o Gets a the root collection of the Sedna XML Database.
// o Creates a collection called myCollection.
// o Starts a Transaction (gets out of auto-commit mode).
// o Inserts 50 random XML Documents in collection myCollection.
// o Randomly performs either commit or rollback.
// o Optionally shows the list of resources in the collection.
// o Deletes the collection myCollection.
// o Closes the root collection.

import org.xmldb.api.*;
import org.xmldb.api.base.*;
import org.xmldb.api.modules.*;

public class TransactionsExample
{
// --------------------
// Change these details
// --------------------
private String databaseURI      = "xmldb:sedna://localhost/db";
private String databaseUsername = "SYSTEM";
private String databasePassword = "MANAGER";
// --------------------

public static void main(String[] args)
{
  TransactionsExample te = new TransactionsExample();
  te.execute();
}

public void execute()
{
  try
  {
    registerXMLDBDriver();

    Collection rootCollection =
      DatabaseManager.getCollection(databaseURI,
				databaseUsername, databasePassword);

    Collection myCollection =
      createChildCollection(rootCollection, "myCollection");

    TransactionService transactionService =
      (TransactionService)myCollection.getService(
				"TransactionService","1.0");

    transactionService.begin(); // begin acid transction

    for(int i=0;i<50;i++)
    {
      String xmlDocument = "<myDoc>\n" +
      "<id>" + i + "</id>\n" +
      "<data>" + (Math.random()*1000000) + "</data>\n" +
      "</myDoc>";

      XMLResource resource =
			(XMLResource)myCollection.createResource(null,
        XMLResource.RESOURCE_TYPE);

      resource.setContent(xmlDocument);

      myCollection.storeResource(resource);
    }

    boolean willCommit = Math.round((float)Math.random()) == 1;

    if(willCommit)
    {
      transactionService.commit();
      // Performed a "Commit" on the Transaction this time.
    }
    else
    {
      transactionService.rollback();
      // Performed a "Rollback" on the Transaction this time.
    }

    // Now back in auto-commit mode.

    int numberOfDocuments = myCollection.getResourceCount();
    if(numberOfDocuments == 0)
    {
      System.out.println(
      "Collection is empty. Looks like rollback was successful.");
    }
    else
    {
      String[] resources = myCollection.listResources();
      System.out.println(
      "50 XML documents exist within collection 'myCollection':");

      for(int x=0;x<resources.length;x++)
        System.out.println("doc["+x+"] = \""+resources[x]+"\".");
    }

    deleteCollection(rootCollection, "myCollection");

    rootCollection.close();
  }
  catch(XMLDBException e)
  {
    e.printStackTrace();
  }
}


public void registerXMLDBDriver() throws XMLDBException
{
  try
  {
    Database dbDriver =
    (Database)Class.forName(
			"net.cfoster.sedna.DatabaseImpl").newInstance();
    DatabaseManager.registerDatabase(dbDriver);
  }
  catch(ClassNotFoundException e) {
    System.err.println("ClassNotFoundException: "+
      e.getMessage());
  }
  catch(InstantiationException e) {
    System.err.println("InstantiationException: "+
      e.getMessage());
  }
  catch(IllegalAccessException e) {
    System.err.println("IllegalAccessException: "+
      e.getMessage());
  }
}

public Collection createChildCollection(Collection collection,
  String collectionName) throws XMLDBException {
  CollectionManagementService cms =
  (CollectionManagementService)collection.getService(
    "CollectionManagementService","1.0");

  return cms.createCollection(collectionName);
}

public void deleteCollection(Collection collection,
    String collectionName) throws XMLDBException
  CollectionManagementService cms =
  (CollectionManagementService)collection.getService(
    "CollectionManagementService","1.0");

  cms.removeCollection(collectionName);
}

}