[Mulgara-svn] r128 - in branches/xafix-impl/src/jar: jrdf/java/org/mulgara/jrdf resolver/java/org/mulgara/resolver resolver-spi/java/org/mulgara/resolver/spi

andrae at mulgara.org andrae at mulgara.org
Tue Nov 7 05:35:53 UTC 2006


Author: andrae
Date: 2006-11-06 23:35:52 -0600 (Mon, 06 Nov 2006)
New Revision: 128

Added:
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/BootstrapOperation.java
Removed:
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/AnswerDatabaseSession.java
Modified:
   branches/xafix-impl/src/jar/jrdf/java/org/mulgara/jrdf/JRDFGraphElementFactory.java
   branches/xafix-impl/src/jar/resolver-spi/java/org/mulgara/resolver/spi/LocalSession.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/AnswerOperation.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/CreateModelOperation.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/DatabaseSession.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/ModifyModelOperation.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransaction.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionManager.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/OperationContext.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/QueryOperation.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/RemoveModelOperation.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SetModelOperation.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java
   branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswerUnitTest.java
Log:
This commit is untested - and probably does not work yet.

The goal of this commit is to implement automatic suspension/resumption of
transactions.  This also necessitates using the transaction objects to conduct
commit's and rollback's as well as removing all this functionality from
DatabaseSession which used to track it manually.

The basic case is simple, what complicates it is the need to track autocommit.

The code will also simplify as I can migrate more of the functionality into
MXAMgr and MXA.



Modified: branches/xafix-impl/src/jar/jrdf/java/org/mulgara/jrdf/JRDFGraphElementFactory.java
===================================================================
--- branches/xafix-impl/src/jar/jrdf/java/org/mulgara/jrdf/JRDFGraphElementFactory.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/jrdf/java/org/mulgara/jrdf/JRDFGraphElementFactory.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -63,6 +63,7 @@
  * @licence <a href="{@docRoot}/../../LICENCE">Mozilla Public License v1.1</a>
  */
 public class JRDFGraphElementFactory implements GraphElementFactory {
+  public static int bnsuffix = 0;
 
   /**
    * Logger. This is named after the class.
@@ -88,65 +89,18 @@
    * Returns a new BlankNode.
    *
    * @return BlankNode
-   * @throws GraphElementFactoryException
    */
-  public BlankNode createResource() throws GraphElementFactoryException {
-    try {
-
-      // Check to see if we're in a transaction.  If not create a new
-      // transaction and perform the operation.
-      try {
-        jrdfSession.resumeTransactionalBlock();
-      }
-      catch (IllegalStateException ise) {
-        jrdfSession.startTransactionalOperation(true);
-
-        try {
-          return createBlankNode();
-        }
-        catch (Throwable e) {
-          jrdfSession.rollbackTransactionalBlock(e);
-        }
-        finally {
-          jrdfSession.finishTransactionalOperation("Could not commit insert");
-        }
-      }
-
-      // If no exception was thrown then we have resumed the transaction.
-      try {
-        return createBlankNode();
-      }
-      catch (Throwable e) {
-        jrdfSession.rollbackTransactionalBlock(e);
-      }
-      finally {
-        try {
-          jrdfSession.suspendTransactionalBlock();
-        }
-        catch (Throwable e) {
-          jrdfSession.rollbackTransactionalBlock(e);
-        }
-      }
-    }
-    catch (QueryException e) {
-      throw new GraphElementFactoryException(e);
-    }
-    // This should never happen
-    throw new GraphElementFactoryException("Failed to create blank node");
+  public BlankNode createResource() {
+    return createBlankNode();
   }
 
   /**
-   * Create a new blank node - assume current transaction and valid
-   * ResolverSession.
+   * Create a new blank node .
    *
    * @return a newly minted blank node.
-   * @throws LocalizeException if there was a failure in localizing the blank
-   *   node.
    */
-  public BlankNode createBlankNode() throws LocalizeException {
-    BlankNode tmpBlankNode = new BlankNodeImpl();
-    jrdfSession.getResolverSession().localizePersistent(tmpBlankNode);
-    return tmpBlankNode;
+  public synchronized BlankNode createBlankNode() {
+    return new VariableNodeImpl("JRDF-BN" + (bnsuffix++));
   }
 
   /**

Deleted: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/AnswerDatabaseSession.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/AnswerDatabaseSession.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/AnswerDatabaseSession.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -1,77 +0,0 @@
-/*
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.1 (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.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- * the License for the specific language governing rights and limitations
- * under the License.
- *
- * The Original Code is the Kowari Metadata Store.
- *
- * The Initial Developer of the Original Code is Plugged In Software Pty
- * Ltd (http://www.pisoftware.com, mailto:info at pisoftware.com). Portions
- * created by Plugged In Software Pty Ltd are Copyright (C) 2001,2002
- * Plugged In Software Pty Ltd. All Rights Reserved.
- *
- * Contributor(s): N/A.
- *
- * [NOTE: The text of this Exhibit A may differ slightly from the text
- * of the notices in the Source Code files of the Original Code. You
- * should use the text of this Exhibit A rather than the text found in the
- * Original Code Source Code for Your Modifications.]
- *
- */
-
-package org.mulgara.resolver;
-
-// Local packages
-import org.mulgara.query.*;
-
-/**
- * Defines the extra requirements of {@link Answer}s upon
- * {@link DatabaseSession}.
- *
- * @created 2004-10-02
- *
- * @author Andrew Newman
- *
- * @version $Revision: 1.8 $
- *
- * @modified $Date: 2005/01/05 04:58:23 $ by $Author: newmana $
- *
- * @maintenanceAuthor $Author: newmana $
- *
- * @copyright &copy;2004 <a href="http://www.tucanatech.com/">Tucana
- *   Technology, Inc</a>
- *
- * @licence <a href="{@docRoot}/../../LICENCE">Mozilla Public License v1.1</a>
- */
-public interface AnswerDatabaseSession {
-
-  /**
-   * Performs a query within an existing transaction.
-   *
-   * @param query the query to perform.
-   * @return a non-<code>null</code> answer to the <var>query</var>
-   * @throws QueryException if <var>query</var> can't be answered
-   */
-  public Answer innerQuery(Query query) throws QueryException;
-
-  /**
-   * Answers are registered so that the session can ensure that they are closed.
-   *
-   * @param answer the answer to register with this session.
-   */
-  public void registerAnswer(SubqueryAnswer answer);
-
-  /**
-   * Answers are deregistered to indicate that they have closed themselves.
-   *
-   * @param answer the answer to deregister.
-   * @throws QueryException if the transactional block for this answer fails.
-   */
-  public void deregisterAnswer(SubqueryAnswer answer) throws QueryException;
-}

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/AnswerOperation.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/AnswerOperation.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/AnswerOperation.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -21,12 +21,13 @@
 
 public abstract class AnswerOperation {
   // Should use enum here.
+  public static final int VOID = 0;
   public static final int OBJECT = 1;
   public static final int INT = 2;
   public static final int LONG = 3;
   public static final int BOOLEAN = 3;
 
-  protected int returnType;
+  protected int returnType = VOID;
 
   protected Object object;
   protected int integer;

Added: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/BootstrapOperation.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/BootstrapOperation.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/BootstrapOperation.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -0,0 +1,96 @@
+package org.mulgara.resolver;
+
+// Java 2 standard packages
+
+// Java 2 enterprise packages
+
+// Third party packages
+import org.apache.log4j.Logger;
+
+// Local packages
+import org.mulgara.query.rdf.URIReferenceImpl;
+import org.mulgara.resolver.spi.DatabaseMetadata;
+import org.mulgara.resolver.spi.ResolverSessionFactory;
+import org.mulgara.resolver.spi.SingletonStatements;
+import org.mulgara.resolver.spi.SystemResolver;
+
+class BootstrapOperation implements Operation
+{
+  /** Logger */
+  private static final Logger logger =
+    Logger.getLogger(BootstrapOperation.class.getName());
+
+  /**
+   * The URI of the model to be created.
+   */
+  private final DatabaseMetadataImpl databaseMetadata;
+
+  private long result;
+
+  BootstrapOperation(DatabaseMetadataImpl databaseMetadata) {
+    if (databaseMetadata == null) {
+      throw new IllegalArgumentException("BootstrapSystemModel - databaseMetadata null ");
+    }
+
+    this.databaseMetadata = databaseMetadata;
+    this.result = -1; // Return invalid node by default.
+  }
+
+  public void execute(OperationContext       operationContext,
+                      SystemResolver         systemResolver,
+                      ResolverSessionFactory resolverSessionFactory,
+                      DatabaseMetadata       metadata) throws Exception {
+    // Find the local node identifying the model
+    long model = systemResolver.localizePersistent(
+        new URIReferenceImpl(databaseMetadata.getSystemModelURI()));
+    long rdfType = systemResolver.localizePersistent(
+        new URIReferenceImpl(databaseMetadata.getRdfTypeURI()));
+    long modelType = systemResolver.localizePersistent(
+        new URIReferenceImpl(databaseMetadata.getSystemModelTypeURI()));
+
+    // Use the session to create the model
+    systemResolver.modifyModel(model, new SingletonStatements(model, rdfType,
+        modelType), true);
+    databaseMetadata.initializeSystemNodes(model, rdfType, modelType);
+
+    long preSubject = systemResolver.localizePersistent(
+        new URIReferenceImpl(databaseMetadata.getPreallocationSubjectURI()));
+    long prePredicate = systemResolver.localizePersistent(
+        new URIReferenceImpl(databaseMetadata.getPreallocationPredicateURI()));
+    long preModel = systemResolver.localizePersistent(
+        new URIReferenceImpl(databaseMetadata.getPreallocationModelURI()));
+
+    // Every node cached by DatabaseMetadata must be preallocated
+    systemResolver.modifyModel(preModel,
+        new SingletonStatements(preSubject, prePredicate, model),
+        true);
+    systemResolver.modifyModel(preModel,
+        new SingletonStatements(preSubject, prePredicate, rdfType),
+        true);
+    systemResolver.modifyModel(preModel,
+        new SingletonStatements(preSubject, prePredicate, modelType),
+        true);
+    systemResolver.modifyModel(preModel,
+        new SingletonStatements(preSubject, prePredicate, preSubject),
+        true);
+    systemResolver.modifyModel(preModel,
+        new SingletonStatements(preSubject, prePredicate, prePredicate),
+        true);
+    systemResolver.modifyModel(preModel,
+        new SingletonStatements(preSubject, prePredicate, preModel),
+        true);
+
+    databaseMetadata.initializePreallocationNodes(preSubject, prePredicate, preModel);
+
+    result = model;
+  }
+
+  public boolean isWriteOperation()
+  {
+    return true;
+  }
+
+  public long getResult() {
+    return result;
+  }
+}

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/CreateModelOperation.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/CreateModelOperation.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/CreateModelOperation.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -212,8 +212,7 @@
     // PREVIOUSLY WITHIN TRANSACTION
 
     // Obtain an appropriate resolver bound to this session
-    Resolver resolver =
-      operationContext.obtainResolver(resolverFactory, systemResolver);
+    Resolver resolver = operationContext.obtainResolver(resolverFactory);
     assert resolver != null;
 
     // Find the local node identifying the model

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/DatabaseOperationContext.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -86,8 +86,7 @@
  *   Technology, Inc</a>
  * @licence <a href="{@docRoot}/../../LICENCE">Mozilla Public License v1.1</a>
  */
-class DatabaseOperationContext implements OperationContext, SessionView,
-AnswerDatabaseSession, SymbolicTransformationContext
+class DatabaseOperationContext implements OperationContext, SessionView, SymbolicTransformationContext
 {
   /**
    * Logger.
@@ -128,6 +127,9 @@
    */
   private final Map systemModelCacheMap = new WeakHashMap();
 
+  /** Resolver used for accessing the system model (<code>#</code>).  */
+  protected SystemResolver systemResolver;
+
   // Immutable properties of the containing DatabaseSession
   private final Set                cachedResolverFactorySet;
   private final DatabaseSession    databaseSession;
@@ -229,7 +231,7 @@
       else {
         // This might be an external model or an aliased internal model.
         // get the model URI
-        Node modelNode = databaseSession.getSystemResolver().globalize(model);
+        Node modelNode = systemResolver.globalize(model);
         if (!(modelNode instanceof URIReference)) {
           throw new QueryException(modelNode.toString() + " is not a valid Model");
         }
@@ -238,7 +240,7 @@
         // check if this is really a reference to a local model, using a different server name
         Node aliasedNode = getCanonicalAlias(modelURI);
         if (aliasedNode != null) {
-          long aliasedModel = databaseSession.getSystemResolver().localize(aliasedNode);
+          long aliasedModel = systemResolver.localize(aliasedNode);
           return findModelResolverFactory(aliasedModel);
         }
 
@@ -327,8 +329,7 @@
     return securityAdapterList;
   }
 
-  public Resolver obtainResolver(ResolverFactory resolverFactory,
-                                 SystemResolver  systemResolver)
+  public Resolver obtainResolver(ResolverFactory resolverFactory)
     throws QueryException
   {
     ResolverSession session;
@@ -373,7 +374,7 @@
   public long getCanonicalModel(long model) {
     // globalize to a URI
     try {
-      Node modelNode = databaseSession.getSystemResolver().globalize(model);
+      Node modelNode = systemResolver.globalize(model);
       if (!(modelNode instanceof URIReference)) {
         logger.warn(modelNode.toString() + " is not a valid Model");
         return model;
@@ -383,7 +384,7 @@
       // check if this is really a reference to a local model, using a different server name
       Node aliasedNode = getCanonicalAlias(modelURI);
       if (aliasedNode != null) {
-        return databaseSession.getSystemResolver().localize(aliasedNode);
+        return systemResolver.localize(aliasedNode);
       }
     } catch (Exception e) {
       // unable to get a canonical form, so leave this model alone
@@ -401,7 +402,7 @@
       if (logger.isDebugEnabled()) {
         logger.debug("Finding modelTypeURI for " + modelURI);
       }
-      long rawModel = databaseSession.getSystemResolver().localize(new URIReferenceImpl(modelURI));
+      long rawModel = systemResolver.localize(new URIReferenceImpl(modelURI));
       long canModel = getCanonicalModel(rawModel);
 
       URI modelTypeURI = findModelTypeURI(canModel);
@@ -509,7 +510,7 @@
                          new LocalNode(metadata.getRdfTypeNode()),
                          modelTypeVariable,
                          new LocalNode(metadata.getSystemModelNode()));
-    Resolution resolution = databaseSession.getSystemResolver().resolve(modelConstraint);
+    Resolution resolution = systemResolver.resolve(modelConstraint);
     assert resolution != null;
 
     // Check the solution and extract the model type (if any) from it
@@ -523,7 +524,7 @@
           throw new QueryException("Model " + model +
               " has more than one type!");
         }
-        Node modelNode = databaseSession.getSystemResolver().globalize(modelType);
+        Node modelNode = systemResolver.globalize(modelType);
         assert modelNode instanceof URIReferenceImpl;
         modelTypeURI = ((URIReferenceImpl) modelNode).getURI();
         systemModelCacheMap.put(modelLocalNode, modelTypeURI);
@@ -558,7 +559,7 @@
   {
     try {
       // Globalize the node
-      Node node = (Node) databaseSession.getSystemResolver().globalize(n);
+      Node node = (Node) systemResolver.globalize(n);
       if (!(node instanceof URIReference)) {
         throw new QueryException(node + " is not a URI reference");
       }
@@ -663,8 +664,6 @@
       throw new IllegalArgumentException("Null \"constraint\" parameter");
     }
 
-    SystemResolver systemResolver = databaseSession.getSystemResolver();
-
     ConstraintElement modelElem = constraint.getModel();
     if (modelElem instanceof Variable) {
       return resolveVariableModel(constraint);
@@ -703,8 +702,7 @@
       }
 
       // Evaluate the constraint
-      Tuples result = obtainResolver(
-          findModelResolverFactory(realModel), systemResolver).resolve(constraint);
+      Tuples result = obtainResolver(findModelResolverFactory(realModel)).resolve(constraint);
       assert result != null;
 
       return result;
@@ -733,8 +731,6 @@
     assert constraint != null;
     assert constraint.getElement(3) instanceof Variable;
 
-    SystemResolver systemResolver = databaseSession.getSystemResolver();
-
     Tuples tuples = TuplesOperations.empty();
 
     // This is the alternate code we'd use if we were to consult external
@@ -749,7 +745,7 @@
       assert resolverFactory != null;
 
       // Resolve the constraint
-      Resolver resolver = obtainResolver(resolverFactory, systemResolver);
+      Resolver resolver = obtainResolver(resolverFactory);
       if (logger.isDebugEnabled()) {
         logger.debug("Resolving " + constraint + " against " + resolver);
       }
@@ -788,72 +784,6 @@
     return tuples;
   }
 
-  public Answer innerQuery(Query query) throws QueryException {
-    // Validate "query" parameter
-    if (query == null) {
-      throw new IllegalArgumentException("Null \"query\" parameter");
-    }
-
-    if (logger.isInfoEnabled()) {
-      logger.info("Query: " + query);
-    }
-
-    boolean resumed = databaseSession.ensureTransactionResumed();
-    SystemResolver systemResolver = databaseSession.getSystemResolver();
-
-    Answer result = null;
-    try {
-      result = doQuery(systemResolver, query);
-    } catch (Throwable th) {
-      try {
-        logger.warn("Inner Query failed", th);
-        databaseSession.rollbackTransactionalBlock(th);
-      } finally {
-        databaseSession.endPreviousQueryTransaction();
-        logger.error("Inner Query should have thrown exception", th);
-        throw new IllegalStateException(
-            "Inner Query should have thrown exception");
-      }
-    }
-
-    try {
-      if (resumed) {
-        databaseSession.suspendTransactionalBlock();
-      }
-
-      return result;
-    } catch (Throwable th) {
-      databaseSession.endPreviousQueryTransaction();
-      logger.error("Failed to suspend Transaction", th);
-      throw new QueryException("Failed to suspend Transaction");
-    }
-  }
-
-  public void registerAnswer(SubqueryAnswer answer) {
-    if (logger.isDebugEnabled()) {
-      logger.debug("registering Answer: " + System.identityHashCode(answer));
-    }
-    outstandingAnswers.add(answer);
-  }
-
-  public void deregisterAnswer(SubqueryAnswer answer) throws QueryException {
-    if (logger.isDebugEnabled()) {
-      logger.debug("deregistering Answer: " + System.identityHashCode(answer));
-    }
-
-    if (!outstandingAnswers.contains(answer)) {
-      logger.info("Stale answer being closed");
-    } else {
-      outstandingAnswers.remove(answer);
-      if (databaseSession.autoCommit && outstandingAnswers.isEmpty()) {
-        if (databaseSession.getTransaction().isSuspended()) {
-          databaseSession.resumeTransactionalBlock();
-        }
-        databaseSession.endTransactionalBlock("Could not commit query");
-      }
-    }
-  }
-
   Tuples innerCount(LocalQuery localQuery) throws QueryException {
     // Validate "query" parameter
     if (localQuery == null) {
@@ -863,43 +793,21 @@
     if (logger.isInfoEnabled()) {
       logger.info("Inner Count: " + localQuery);
     }
-
-    boolean resumed = databaseSession.ensureTransactionResumed();
-    SystemResolver systemResolver = databaseSession.getSystemResolver();
-
-    Tuples result = null;
     try {
       LocalQuery lq = (LocalQuery)localQuery.clone();
       transform(lq);
-      result = lq.resolve();
+      Tuples result = lq.resolve();
       lq.close();
-    } catch (Throwable th) {
-      try {
-        logger.warn("Inner Query failed", th);
-        databaseSession.rollbackTransactionalBlock(th);
-      } finally {
-        databaseSession.endPreviousQueryTransaction();
-        logger.error("Inner Query should have thrown exception", th);
-        throw new IllegalStateException(
-            "Inner Query should have thrown exception");
-      }
-    }
 
-    try {
-      if (resumed) {
-        databaseSession.suspendTransactionalBlock();
-      }
-
       return result;
-    } catch (Throwable th) {
-      databaseSession.endPreviousQueryTransaction();
-      logger.error("Failed to suspend Transaction", th);
-      throw new QueryException("Failed to suspend Transaction");
+    } catch (QueryException eq) {
+      throw eq;
+    } catch (Exception e) {
+      throw new QueryException("Failed to evaluate count", e);
     }
   }
 
-  protected void doModify(SystemResolver systemResolver, URI modelURI,
-      Statements statements, boolean insert) throws Throwable {
+  protected void doModify(URI modelURI, Statements statements, boolean insert) throws Throwable {
     long model = systemResolver.localize(new URIReferenceImpl(modelURI));
     model = getCanonicalModel(model);
 
@@ -919,7 +827,7 @@
     }
 
     // Obtain a resolver for the destination model type
-    Resolver resolver = obtainResolver(findModelResolverFactory(model), systemResolver);
+    Resolver resolver = obtainResolver(findModelResolverFactory(model));
     assert resolver != null;
 
     if (logger.isDebugEnabled()) {
@@ -933,7 +841,7 @@
     }
   }
 
-  public Answer doQuery(SystemResolver systemResolver, Query query) throws Exception
+  public Answer doQuery(Query query) throws Exception
   {
     Answer result;
 
@@ -988,14 +896,23 @@
     mutableLocalQueryImpl.close();
   }
 
-  void close() throws QueryException {
+  void clear() throws QueryException {
     try {
       Iterator i = answers.keySet().iterator();
       while (i.hasNext()) {
         ((TransactionalAnswer)i.next()).sessionClose();
       }
+      answers.clear();
     } catch (TuplesException et) {
       throw new QueryException("Error force-closing answers", et);
     }
   }
+
+  public SystemResolver getSystemResolver() {
+    return systemResolver;
+  }
+
+  void setSystemResolver(SystemResolver systemResolver) {
+    this.systemResolver = systemResolver;
+  }
 }

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/DatabaseSession.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/DatabaseSession.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/DatabaseSession.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -144,9 +144,6 @@
   /** Factory used to obtain the SystemResolver */
   private final SystemResolverFactory systemResolverFactory;
 
-  /** Resolver used for accessing the system model (<code>#</code>).  */
-  protected SystemResolver systemResolver;
-
   /** Factory used to obtain the SystemResolver */
   private final ResolverFactory temporaryResolverFactory;
 
@@ -371,68 +368,15 @@
   /**
    * Used by Database *only* to bootstrap the system model on DB startup.
    */
-  long bootstrapSystemModel(DatabaseMetadataImpl metadata) throws
-      QueryException {
+  long bootstrapSystemModel(DatabaseMetadataImpl metadata) throws QueryException {
     logger.info("Bootstrapping System Model");
-    // Validate parameters
-    if (metadata == null) {
-      throw new IllegalArgumentException("metadata null");
-    }
 
-    // Create the model
-    systemResolver = beginTransactionalBlock(true);
-    try {
-      // Find the local node identifying the model
-      long model = systemResolver.localizePersistent(
-          new URIReferenceImpl(metadata.getSystemModelURI()));
-      long rdfType = systemResolver.localizePersistent(
-          new URIReferenceImpl(metadata.getRdfTypeURI()));
-      long modelType = systemResolver.localizePersistent(
-          new URIReferenceImpl(metadata.getSystemModelTypeURI()));
+    BootstrapOperation operation = new BootstrapOperation(metadata);
+    execute(operation, "Failed to bootstrap system-model");
 
-      // Use the session to create the model
-      systemResolver.modifyModel(model, new SingletonStatements(model, rdfType,
-          modelType), true);
-      metadata.initializeSystemNodes(model, rdfType, modelType);
+    systemResolverFactory.setDatabaseMetadata(metadata);
 
-      long preSubject = systemResolver.localizePersistent(
-          new URIReferenceImpl(metadata.getPreallocationSubjectURI()));
-      long prePredicate = systemResolver.localizePersistent(
-          new URIReferenceImpl(metadata.getPreallocationPredicateURI()));
-      long preModel = systemResolver.localizePersistent(
-          new URIReferenceImpl(metadata.getPreallocationModelURI()));
-
-      // Every node cached by DatabaseMetadata must be preallocated
-      systemResolver.modifyModel(preModel,
-          new SingletonStatements(preSubject, prePredicate, model),
-          true);
-      systemResolver.modifyModel(preModel,
-          new SingletonStatements(preSubject, prePredicate, rdfType),
-          true);
-      systemResolver.modifyModel(preModel,
-          new SingletonStatements(preSubject, prePredicate, modelType),
-          true);
-      systemResolver.modifyModel(preModel,
-          new SingletonStatements(preSubject, prePredicate, preSubject),
-          true);
-      systemResolver.modifyModel(preModel,
-          new SingletonStatements(preSubject, prePredicate, prePredicate),
-          true);
-      systemResolver.modifyModel(preModel,
-          new SingletonStatements(preSubject, prePredicate, preModel),
-          true);
-
-      metadata.initializePreallocationNodes(preSubject, prePredicate, preModel);
-
-      systemResolverFactory.setDatabaseMetadata(metadata);
-
-      return model;
-    } catch (Throwable e) {
-      rollbackTransactionalBlock(e);
-      return -1; // Should be discarded by exception in endTransactionalBlock.
-    } finally {
-      endTransactionalBlock("Could not commit system model bootstrap");
-    }
+    return operation.getResult();
   }
 
   /**
@@ -534,7 +478,7 @@
 
     // Evaluate the query
     QueryOperation queryOperation = new QueryOperation(query, this);
-    executeQuery(queryOperation);
+    execute(queryOperation, "Failed query");
     return queryOperation.getAnswer();
   }
 
@@ -549,7 +493,7 @@
     }
 
     QueryOperation queryOperation = new QueryOperation(queryList, this);
-    executeQuery(queryOperation);
+    execute(queryOperation, "Failed list query");
     return queryOperation.getAnswerList();
   }
 
@@ -679,26 +623,40 @@
 
     if (!this.autoCommit && autoCommit) { // Turning autoCommit on
       try {
-        resumeTransactionalBlock();
+        transaction.execute(new AnswerOperation() {
+          public void execute() {
+            try {
+              transaction.dereference();
+            } catch (MulgaraTransactionException em) {
+              logger.error("Dereference Failed", em);
+              throw new IllegalStateException("dereferenced failed");
+            }
+          }
+        });
+      } catch (TuplesException et) {
+        throw new QueryException("Failed to dereference transaction", et);
       } finally {
         this.autoCommit = true;
         this.inFailedTransaction = false;
+        // FIXME: This is a problem
         endTransactionalBlock("Extended transaction failed");
+        // Guarentee transaction ends here.
       }
     } else if (this.autoCommit && !autoCommit) { // Turning autoCommit off
-      if (transaction != null && transaction.isSuspended()) {
-        resumeTransactionalBlock();
-        endPreviousQueryTransaction();
-      }
-      systemResolver = beginTransactionalBlock(true);
+      transaction = beginTransactionalBlock(true);
       try {
-        suspendTransactionalBlock();
-      } catch (Throwable th) {
-        logger.error("Failed to suspend transaction", th);
-        rollbackTransactionalBlock(th);
-        endTransactionalBlock("Could set auto Commit off");
+        transaction.reference();
+        operationContext.setSystemResolver(systemResolverFactory.newResolver(true));
+        operationContext.enlistResolver(operationContext.getSystemResolver());
+        transaction.tempDeactivate();
+        this.autoCommit = false;
+      } catch (QueryException eq) {
+        throw eq;
+      } catch (Throwable t) {
+        this.autoCommit = true;
+        logger.error("Failed to set autocommit off", t);
+        throw new QueryException("Failed to set autocommit off", t);
       }
-      this.autoCommit = false;
     } else if (this.inFailedTransaction) { // Reset after failed autoCommit off based transaction.
       this.inFailedTransaction = false;
     } else { // Leaving autoCommit the same
@@ -729,16 +687,25 @@
     logger.info("Rollback transaction");
     if (autoCommit) {
       throw new QueryException(
-          "Attempt to rollback transaction outside transaction");
+          "Attempt to rollback transaction outside user-transaction");
+    } else if (transaction == null) {
+      throw new QueryException("Didn't find transaction");
     }
-    resumeTransactionalBlock();
+
     try {
+      transaction.execute(new AnswerOperation() {
+        public void execute() {
+          try {
+            transaction.explicitRollback();
+          } catch (MulgaraTransactionException em) {
+            logger.error("Explicit Rollback failed");
+            throw new IllegalStateException("Explicit Rollback failed");
+          }
+        }
+      });
       explicitRollback = true;
-      rollbackTransactionalBlock(new QueryException(
-          "Explicit rollback requested on session"));
-    } catch (Throwable th) {
-      logger.error("Failed to rollback transaction", th);
-      throw new QueryException("Rollback failed", th);
+    } catch (TuplesException et) {
+      throw new QueryException("Rollback failed", et);
     } finally {
       synchronized (DatabaseSession.class) {
         try {
@@ -757,27 +724,28 @@
       if (!autoCommit) {
         logger.warn("Closing session while holding write-lock");
 
-        try {
-          resumeTransactionalBlock();
-        } catch (Throwable th) {
-          releaseWriteLock();
-          throw new QueryException("Error while resuming transaction in close", th);
+        if (transaction != null) {
+          transaction.execute(new AnswerOperation() {
+            public void execute() {
+              try {
+                transaction.setRollbackOnly();
+                transaction.dereference();
+              } catch (Exception e) {
+                logger.error("Close failed", e);
+                throw new IllegalStateException("Close failed", e);
+              }
+            }
+          });
         }
-
-        try {
-          rollbackTransactionalBlock(
-              new QueryException("Attempt to close session whilst in transaction"));
-        } finally {
-          endTransactionalBlock("Failed to release write-lock in close");
-        }
-      } else {
-        if (transaction != null && transaction.isSuspended()) {
-          resumeTransactionalBlock();
-          endPreviousQueryTransaction();
-        }
       }
+    } catch (TuplesException et) {
+      throw new QueryException ("Close failed", et);
     } finally {
-      operationContext.close();
+      try {
+        operationContext.clear();
+      } finally {
+        releaseWriteLock();
+      }
     }
   }
 
@@ -807,35 +775,6 @@
   //
 
   /**
-   * Start's or resumes a transaction for an operation.
-   *
-   * Using start/finish TransactionalOperation ensures properly matched pairs of
-   * begin/end and suspend/resume.
-   */
-  public void startTransactionalOperation(boolean needsWrite) throws
-      QueryException {
-    logger.info("Starting Transactional Operation");
-    if (opState != FINISH) {
-      throw new IllegalArgumentException(
-          "Attempt to start transactional operation during: " +
-          opStates[opState]);
-    }
-    if (autoCommit) {
-      if (transaction != null && transaction.isSuspended()) {
-        resumeTransactionalBlock();
-        endPreviousQueryTransaction();
-      }
-      beginTransactionalBlock(needsWrite);
-      logger.info("BEGIN new transaction.");
-      opState = BEGIN;
-    } else {
-      resumeTransactionalBlock();
-      logger.info("RESUME old transaction.");
-      opState = RESUME;
-    }
-  }
-
-  /**
    * Mark the current transaction for rollback due to an exception.
    *
    * This records the exception which caused the rollback in the
@@ -861,47 +800,6 @@
   }
 
   /**
-   * Ends's or suspends a transaction for an operation.
-   *
-   * Using start/finish TransactionalOperation ensures properly matched pairs of
-   * begin/end and suspend/resume.
-   */
-  public void finishTransactionalOperation(String errorString) throws
-      QueryException {
-    logger.info("Finishing Transactional Operation");
-    if (logger.isDebugEnabled()) {
-      logger.debug("opState = " + opStates[opState]);
-      logger.debug("autoCommit = " + autoCommit);
-    }
-    if (opState == FINISH) {
-      throw new IllegalArgumentException(
-          "Attempt to finish transactional operation during: " + opStates[opState]);
-    }
-    if (autoCommit) {
-      try {
-        endTransactionalBlock(errorString);
-      } finally {
-        logger.info("FINISH(end) implicit transaction.");
-        opState = FINISH;
-      }
-    } else {
-      try {
-        suspendTransactionalBlock();
-      } catch (Throwable th) {
-        logger.error("Failed to suspend transaction", th);
-        try {
-          rollbackTransactionalBlock(new QueryException("Failed to suspend transaction"));
-        } finally {
-          endTransactionalBlock("Failed to suspend transaction at end of operation");
-        }
-      } finally {
-        logger.info("FINISH(suspend) explicit transaction.");
-        opState = FINISH;
-      }
-    }
-  }
-
-  /**
    * Resumes the previously suspended transaction from the current session.
    *
    * @throws QueryException Must be called outside the try/catch(Throwable) block
@@ -960,7 +858,7 @@
   }
 
   public ResolverSession getResolverSession() {
-    return systemResolver;
+    return operationContext.getSystemResolver();
   }
 
   //
@@ -974,7 +872,7 @@
    *
    * @throws QueryException if a transaction needed to be begun and couldn't be
    */
-  private SystemResolver beginTransactionalBlock(boolean allowWrites) throws
+  private MulgaraTransaction beginTransactionalBlock(boolean allowWrites) throws
       QueryException {
     if (logger.isInfoEnabled()) {
       logger.info("Beginning transactional block: autocommit = " + autoCommit);
@@ -1001,11 +899,10 @@
 
     try {
       transaction = new MulgaraTransaction(transactionManager, operationContext);
-      if (systemResolver != null) {
-        throw new QueryException("beginning nested transaction");
-      }
-      systemResolver = systemResolverFactory.newResolver(allowWrites);
-      return (SystemResolver) operationContext.enlistResolver(systemResolver);
+      operationContext.setSystemResolver(systemResolverFactory.newResolver(allowWrites));
+      operationContext.enlistResolver(operationContext.getSystemResolver());
+
+      return transaction;
     } catch (Exception e) {
       throw new QueryException("Unable to begin transaction", e);
     }
@@ -1059,61 +956,12 @@
       clearCache();
       operationContext.clearSystemModelCache();
 
-      systemResolver = null;
+      operationContext.setSystemResolver(null);
       explicitRollback = false;
       autoCommit = true;
     }
   }
 
-  void endPreviousQueryTransaction() throws QueryException {
-    logger.debug("Clearing previous transaction");
-
-    // Save the exception.
-    Throwable tmpThrowable = rollbackCause;
-
-    Set answers = new HashSet(outstandingAnswers);
-    Iterator i = answers.iterator();
-    while (i.hasNext()) {
-      try {
-        SubqueryAnswer s = (SubqueryAnswer) i.next();
-        operationContext.deregisterAnswer(s);
-        //Do not close tuples - for Jena and JRDF.
-        //s.close();
-      } catch (Throwable th) {
-        logger.debug("Failed to close preexisting answer", th);
-      }
-    }
-
-    // If by closing the answer we have called endTransactionalBlock then
-    // throw the saved exception.
-    if ((rollbackCause == null) && (tmpThrowable != null) &&
-        (systemResolver == null)) {
-      throw new QueryException("Failure ending previous query", tmpThrowable);
-    }
-
-    try {
-      if (!outstandingAnswers.isEmpty()) {
-        logger.error("Failed to clear preexisting transaction");
-        throw new QueryException("Failed to clear preexisting transaction");
-      }
-      if (transaction != null && transaction.isSuspended()) {
-        logger.error("Failed to void suspended transaction");
-        throw new QueryException("Failed to void suspended transaction");
-      }
-      if (transactionManager.getTransaction() != null) {
-        logger.error("Failed to end transaction");
-        throw new QueryException("Failed to end transaction");
-      }
-    } catch (QueryException eq) {
-      endTransactionalBlock("Error ending previous query");
-      throw eq;
-    } catch (Throwable th) {
-      logger.error("Threw exception in endPreviousQuery", th);
-      endTransactionalBlock("Error ending previous query");
-      throw new QueryException("Failure ending previous query", th);
-    }
-  }
-
   private void obtainWriteLock() throws InterruptedException {
     logger.info("Trying to obtain write lock. ");
     synchronized (DatabaseSession.class) {
@@ -1154,8 +1002,8 @@
       try {
         Resolver temporaryResolver =
           temporaryResolverFactory.newResolver(true,
-                                               systemResolver,
-                                               systemResolver);
+                                               operationContext.getSystemResolver(),
+                                               operationContext.getSystemResolver());
         for (Iterator i = cachedModelSet.iterator(); i.hasNext();) {
           LocalNode modelLocalNode = (LocalNode) i.next();
           long model = modelLocalNode.getValue();
@@ -1165,8 +1013,8 @@
             try {
               Resolver resolver =
                 findResolverFactory(model).newResolver(true,
-                                                       systemResolver,
-                                                       systemResolver);
+                                                       operationContext.getSystemResolver(),
+                                                       operationContext.getSystemResolver());
               Variable s = new Variable("s"),
                        p = new Variable("p"),
                        o = new Variable("o");
@@ -1222,7 +1070,7 @@
 
     try {
       // get the model URI
-      Node modelNode = systemResolver.globalize(model);
+      Node modelNode = operationContext.getSystemResolver().globalize(model);
       if (!(modelNode instanceof URIReference)) {
         throw new QueryException(modelNode.toString() + " is not a valid Model");
       }
@@ -1269,10 +1117,6 @@
   // Private accessors intended only for DatabaseOperationContext
   //
 
-  SystemResolver getSystemResolver() {
-    return systemResolver;
-  }
-
   MulgaraTransaction getTransaction() {
     return transaction;
   }
@@ -1341,72 +1185,28 @@
    * Execute an {@link Operation}.
    *
    * @param operation  the {@link Operation} to execute
-   * @param failureMessage  text to appear as the exception message if the
-   *   <var>operation</var> fails
    * @throws QueryException if the <var>operation</var> fails
    */
-  private void execute(Operation operation, String failureMessage)
-    throws QueryException
+  private void execute(Operation operation, String errorString) throws QueryException
   {
-    assert operation != null;
-
-    startTransactionalOperation(operation.isWriteOperation());
-
-    assert systemResolver != null;
-    try {
-      operation.execute(operationContext, systemResolver, resolverSessionFactory, metadata);
-    } catch (Throwable e) {
-      rollbackTransactionalBlock(e);
-    } finally {
-      finishTransactionalOperation(failureMessage);
-    }
-  }
-
-  /**
-   * Execute an {@link Operation}.
-   *
-   * @param operation  the {@link Operation} to execute
-   * @throws QueryException if the <var>operation</var> fails
-   */
-  private void executeQuery(Operation operation) throws QueryException
-  {
-    /*
-     * Transaction semantics:
-     * AC && Suspended  -> R clr E B . S
-     * AC && !Suspended -> B . S
-     * !AC              -> R clr . S
-     */
+    // Clear previous transaction.  FIXME: This won't be necessary once we
+    // support overlapping transactions.
     if (autoCommit) {
-      if (transaction != null && transaction.isSuspended()) {
-        resumeTransactionalBlock();
-        endPreviousQueryTransaction();
-      }
-      beginTransactionalBlock(operation.isWriteOperation());
-    } else {
-      resumeTransactionalBlock();
+      operationContext.clear();
+      transaction = null;
     }
-
-    try {
-      operation.execute(operationContext,
-                        systemResolver,
-                        resolverSessionFactory,
-                        metadata);
-    } catch (Throwable th) {
-      try {
-        logger.warn("Query failed", th);
-        rollbackTransactionalBlock(th);
-      } finally {
-        endPreviousQueryTransaction();
-        throw new QueryException("Failed to rollback failed transaction", th);
-      }
+    // FIXME: This currently always initiates transaction - eventually manager
+    // will handle begin vs. resume.
+    if (transaction == null) {
+      transaction = beginTransactionalBlock(operation.isWriteOperation());
     }
-
+    //
+    // activate needs to worry about resume here.
+    //
     try {
-      suspendTransactionalBlock();
-    } catch (Throwable th) {
-      endPreviousQueryTransaction();
-      logger.error("Query should have thrown exception", th);
-      throw new IllegalStateException("Query should have thrown exception");
+      transaction.execute(operation, resolverSessionFactory, metadata);
+    } catch (MulgaraTransactionException em) {
+      throw new QueryException(errorString, em);
     }
   }
 

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/ModifyModelOperation.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/ModifyModelOperation.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/ModifyModelOperation.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -199,7 +199,7 @@
     else {
       assert query != null;
 
-      Answer answer = operationContext.doQuery(systemResolver, query);
+      Answer answer = operationContext.doQuery(query);
       Variable[] vars = answer.getVariables();
       assert vars.length == 3;
       statements = new TuplesWrapperStatements(
@@ -211,6 +211,7 @@
     doModify(operationContext, systemResolver, modelURI, statements, insert);
   }
 
+
   protected void doModify(OperationContext operationContext,
                           SystemResolver   systemResolver,
                           URI              modelURI,
@@ -239,9 +240,7 @@
 
     // Obtain a resolver for the destination model type
     Resolver resolver = operationContext.obtainResolver(
-                          operationContext.findModelResolverFactory(model),
-                          systemResolver
-                        );
+                          operationContext.findModelResolverFactory(model));
     assert resolver != null;
 
     if (logger.isDebugEnabled()) {

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransaction.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransaction.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransaction.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -212,11 +212,10 @@
                DatabaseMetadata metadata) throws MulgaraTransactionException {
     activate();
     try {
-//      FIXME: Need to migrate systemResolver to context for this to work.
-//      operation.execute(context,
-//                        context.getSystemResolver(),
-//                        resolverSessionFactory,
-//                        metadata);
+      operation.execute(context,
+                        context.getSystemResolver(),
+                        resolverSessionFactory,
+                        metadata);
     } catch (Throwable th) {
       throw implicitRollback(th);
     } finally {

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionManager.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionManager.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionManager.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -101,14 +101,18 @@
    * </ul>
    */
   public synchronized MulgaraTransaction getTransaction(DatabaseSession session, boolean write) throws MulgaraTransactionException {
-    if (session == currentWritingSession) {
-      return userTransaction;
-    } 
+//
+//      FIXME: When we migrate autocommit and the writelock into the manager
+//      uncomment this.
+//
+//    if (session == currentWritingSession) {
+//      return userTransaction;
+//    } 
+//
+//    if (write) {
+//      obtainWriteLock(session);
+//    }
 
-    if (write) {
-      obtainWriteLock(session);
-    }
-
 //    FIXME: Need to finish 1-N DS-OC and provide this method - should really be newOperationContext.
     try {
       return new MulgaraTransaction(this, session.getOperationContext());

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/OperationContext.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/OperationContext.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/OperationContext.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -103,8 +103,7 @@
    * @throws QueryException if the {@link Resolver} couldn't be obtained, bound
    *   and enlisted
    */
-  public Resolver obtainResolver(ResolverFactory resolverFactory,
-                                 SystemResolver  systemResolver)
+  public Resolver obtainResolver(ResolverFactory resolverFactory)
     throws QueryException;
 
 
@@ -121,5 +120,7 @@
    * Oct 2006 - if it's still here after Dec 2006 let someone know it's been
    * forgotten.
    */
-  public Answer doQuery(SystemResolver systemResolver, Query query) throws Exception;
+  public Answer doQuery(Query query) throws Exception;
+
+  public SystemResolver getSystemResolver(); // FIXME: Scaffolding for transactions.
 }

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/QueryOperation.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/QueryOperation.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/QueryOperation.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -153,14 +153,14 @@
     if (query != null) {
       assert queryList == null;
 
-      answer = operationContext.doQuery(systemResolver, query);
+      answer = operationContext.doQuery(query);
     }
     else {
       assert queryList != null;
 
       answerList = new ArrayList(queryList.size());
       for (Iterator i = queryList.iterator(); i.hasNext();) {
-        answerList.add(operationContext.doQuery(systemResolver, (Query) i.next()));
+        answerList.add(operationContext.doQuery((Query) i.next()));
       }
     }
   }

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/RemoveModelOperation.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/RemoveModelOperation.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/RemoveModelOperation.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -155,8 +155,7 @@
     }
 
     // Obtain an appropriate resolver bound to this session
-    Resolver resolver =
-      operationContext.obtainResolver(resolverFactory, systemResolver);
+    Resolver resolver = operationContext.obtainResolver(resolverFactory);
     assert resolver != null;
 
     // Use the resolver to remove the model

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SetModelOperation.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SetModelOperation.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SetModelOperation.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -152,9 +152,7 @@
 
     // Obtain a resolver for the destination model type
     Resolver destinationResolver = operationContext.obtainResolver(
-      operationContext.findModelResolverFactory(destinationModel),
-      systemResolver
-    );
+      operationContext.findModelResolverFactory(destinationModel));
     assert destinationResolver != null;
 
     ContentHandler contentHandler = contentHandlers.getContentHandler(content);

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswer.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -76,7 +76,7 @@
   private Variable[] variables;
 
   /** The current database session for this query. */
-  protected AnswerDatabaseSession databaseSession;
+  protected OperationContext operationContext;
 
   /**
    * Assignment property.
@@ -115,12 +115,11 @@
    * @throws TuplesException if it fails to get the row cardinality of the
    *   given tuples.
    */
-  SubqueryAnswer(AnswerDatabaseSession session, ResolverSession resolverSession,
+  SubqueryAnswer(OperationContext operationContext, ResolverSession resolverSession,
       Tuples tuples, List variableList) throws TuplesException {
     super(tuples, resolverSession);
 
-    this.databaseSession = session;
-    this.databaseSession.registerAnswer(this);
+    this.operationContext = operationContext;
     assignVariables(tuples, variableList);
   }
 
@@ -185,7 +184,6 @@
     cloned.variables = new Variable[this.variables.length];
     System.arraycopy(this.variables, 0, cloned.variables, 0,
         this.variables.length);
-    databaseSession.registerAnswer(cloned);
     return cloned;
   }
 
@@ -194,16 +192,6 @@
   //
 
 
-  public void close() throws TuplesException {
-    super.close();
-    try {
-      databaseSession.deregisterAnswer(this);
-    }
-    catch (QueryException eq) {
-      logger.info("Failed to deregister answer from session", eq);
-    }
-  }
-
   public int getColumnIndex(Variable variable) throws TuplesException {
     if (variable == null) {
       throw new IllegalArgumentException("Null \"variable\" parameter");
@@ -313,7 +301,7 @@
         logger.debug("Generated subquery: " + query);
       }
 
-      return databaseSession.innerQuery(query);
+      return operationContext.doQuery(query);
     }
     catch (Exception e) {
       throw new QueryException("Failed to resolve subquery", e);

Modified: branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswerUnitTest.java
===================================================================
--- branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswerUnitTest.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver/java/org/mulgara/resolver/SubqueryAnswerUnitTest.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -160,7 +160,7 @@
    */
   public void testVariableMappings() throws Exception {
     ResolverSession testResolver = new TestResolverSession();
-    AnswerDatabaseSession testDbSession = new TestAnswerDatabaseSession();
+    OperationContext testContext = new TestOperationContext();
 
     Variable varX = new Variable("x");
     Variable varY = new Variable("y");
@@ -177,7 +177,7 @@
     variableList.add(varY);
 
     // Create subquery.
-    SubqueryAnswer answer = new SubqueryAnswer(testDbSession, testResolver,
+    SubqueryAnswer answer = new SubqueryAnswer(testContext, testResolver,
         tuples, variableList);
 
     // Get column index of Z.
@@ -188,19 +188,23 @@
     assertEquals("Based on variable list Z should be", 1, columnIndexZ);
   }
 
-  private class TestAnswerDatabaseSession implements AnswerDatabaseSession {
+  private class TestOperationContext implements OperationContext {
+    public ResolverFactory findModelResolverFactory(long model)
+      throws QueryException { return null; }
 
-    public TestAnswerDatabaseSession() {
-    }
+    public ResolverFactory findModelTypeResolverFactory(URI modelTypeURI)
+      throws QueryException { return null; }
 
-    public Answer innerQuery(Query query) throws QueryException {
-      return null;
-    }
+    public List getSecurityAdapterList() { return null; }
 
-    public void registerAnswer(SubqueryAnswer answer) {
-    }
+    public Resolver obtainResolver(ResolverFactory resolverFactory)
+      throws QueryException { return null; }
 
-    public void deregisterAnswer(SubqueryAnswer answer) throws QueryException {
-    }
+    public long getCanonicalModel(long model) { return 0; }
+
+    public Answer doQuery(Query query)
+    throws Exception { return null; }
+
+    public SystemResolver getSystemResolver() { return null; } // FIXME: Scaffolding for transactions.
   }
 }

Modified: branches/xafix-impl/src/jar/resolver-spi/java/org/mulgara/resolver/spi/LocalSession.java
===================================================================
--- branches/xafix-impl/src/jar/resolver-spi/java/org/mulgara/resolver/spi/LocalSession.java	2006-11-04 21:21:02 UTC (rev 127)
+++ branches/xafix-impl/src/jar/resolver-spi/java/org/mulgara/resolver/spi/LocalSession.java	2006-11-07 05:35:52 UTC (rev 128)
@@ -56,55 +56,5 @@
  * @licence <a href="{@docRoot}/../../LICENCE">Mozilla Public License v1.1</a>
  */
 public interface LocalSession extends Session {
-
-  /**
-   * Start's or resumes a transaction for an operation.
-   *
-   * Using start/finish TransactionalOperation ensures properly matched pairs of
-   * begin/end and suspend/resume.
-   *
-   */
-  public void startTransactionalOperation(boolean needsWrite)
-      throws QueryException;
-
-  /**
-   * Mark the current transaction for rollback due to an exception.
-   *
-   * @param throwable  the exception which caused the rollback
-   */
-  public void rollbackTransactionalBlock(Throwable throwable)
-      throws QueryException;
-
-  /**
-   * Ends's or suspends a transaction for an operation.
-   *
-   * Using start/finish TransactionalOperation ensures properly matched pairs of
-   * begin/end and suspend/resume.
-   *
-   */
-  public void finishTransactionalOperation(String errorString)
-      throws QueryException;
-
-  /**
-   * Resumes the previously suspended transaction from the current session.
-   *
-   * @throws QueryException Must be called outside the try/catch(Throwable) block
-   * protecting the transaction.
-   */
-  public void resumeTransactionalBlock() throws QueryException;
-
-  /**
-   * Suspends current transaction, storing it in session for latter resumption.
-   *
-   * @throws Throwable Must be called inside the try/catch(Throwable) block
-   * protecting the transaction.
-   */
-  public void suspendTransactionalBlock() throws Throwable;
-
-  /**
-   * Returns the current Resolver Session.
-   *
-   * @return the current resolver session.
-   */
   public ResolverSession getResolverSession();
 }




More information about the Mulgara-svn mailing list