[Mulgara-svn] r583 - in branches/mgr-73/src/jar: query/java/org/mulgara/server server-beep/java/org/mulgara/server/beep server-rmi/java/org/mulgara/server/rmi

andrae at mulgara.org andrae at mulgara.org
Wed Nov 28 06:26:56 UTC 2007


Author: andrae
Date: 2007-11-28 00:26:56 -0600 (Wed, 28 Nov 2007)
New Revision: 583

Added:
   branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteXAResource.java
   branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteXAResourceWrapperXAResource.java
   branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/XAResourceWrapperRemoteXAResource.java
Modified:
   branches/mgr-73/src/jar/query/java/org/mulgara/server/Session.java
   branches/mgr-73/src/jar/server-beep/java/org/mulgara/server/beep/BEEPSession.java
   branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteSession.java
   branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteSessionWrapperSession.java
   branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/SessionWrapperRemoteSession.java
Log:
This is completely untested - but it does compile.

A first cut at RMI support for mulgara as a JTA Resource Manager.



Modified: branches/mgr-73/src/jar/query/java/org/mulgara/server/Session.java
===================================================================
--- branches/mgr-73/src/jar/query/java/org/mulgara/server/Session.java	2007-11-28 03:43:42 UTC (rev 582)
+++ branches/mgr-73/src/jar/query/java/org/mulgara/server/Session.java	2007-11-28 06:26:56 UTC (rev 583)
@@ -32,6 +32,7 @@
 import java.net.*;
 import java.util.*;
 import java.io.*;
+import javax.transaction.xa.XAResource;
 
 // Locally written packages
 import org.mulgara.query.Answer;
@@ -304,6 +305,14 @@
   public void login(URI securityDomain, String username, char[] password);
 
   /**
+   * Obtain an XAResource for this Session.
+   *
+   * Use of this method is incompatible with any use of implicit or internally
+   * mediated transactions with this Session.
+   */
+  public XAResource getXAResource() throws QueryException;
+
+  /**
    * This class is just a devious way to get static initialization for the
    * {@link Session} interface.
    */

Modified: branches/mgr-73/src/jar/server-beep/java/org/mulgara/server/beep/BEEPSession.java
===================================================================
--- branches/mgr-73/src/jar/server-beep/java/org/mulgara/server/beep/BEEPSession.java	2007-11-28 03:43:42 UTC (rev 582)
+++ branches/mgr-73/src/jar/server-beep/java/org/mulgara/server/beep/BEEPSession.java	2007-11-28 06:26:56 UTC (rev 583)
@@ -32,6 +32,7 @@
 import java.net.*;
 import java.rmi.RemoteException;
 import java.util.*;
+import javax.transaction.xa.XAResource;
 
 // Third party packages
 import org.apache.log4j.Category; // Apache Log4J
@@ -538,4 +539,7 @@
    throw new UnsupportedOperationException("This operation is only supported on local sessions.");
  }
 
+ public XAResource getXAResource() throws QueryException {
+   throw new QueryException("External transactions not implemented under Beep");
+ }
 }

Modified: branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteSession.java
===================================================================
--- branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteSession.java	2007-11-28 03:43:42 UTC (rev 582)
+++ branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteSession.java	2007-11-28 06:26:56 UTC (rev 583)
@@ -308,4 +308,8 @@
   public void login(URI securityDomain, String username,
       char[] password) throws RemoteException;
 
+  /**
+   * Obtain an XAResource for this session.
+   */
+  public RemoteXAResource getXAResource() throws QueryException, RemoteException;
 }

Modified: branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteSessionWrapperSession.java
===================================================================
--- branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteSessionWrapperSession.java	2007-11-28 03:43:42 UTC (rev 582)
+++ branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteSessionWrapperSession.java	2007-11-28 06:26:56 UTC (rev 583)
@@ -34,6 +34,7 @@
 import java.rmi.RemoteException;
 import java.util.*;
 import java.io.*;
+import javax.transaction.xa.XAResource;
 
 // Third party packages
 import org.apache.log4j.Logger;
@@ -669,4 +670,11 @@
     }
   }
 
+  public XAResource getXAResource() throws QueryException {
+    try {
+      return new RemoteXAResourceWrapperXAResource(remoteSession.getXAResource());
+    } catch (RemoteException re){
+      throw new QueryException("Java RMI failure", re);
+    }
+  }
 }

Added: branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteXAResource.java
===================================================================
--- branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteXAResource.java	2007-11-28 03:43:42 UTC (rev 582)
+++ branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteXAResource.java	2007-11-28 06:26:56 UTC (rev 583)
@@ -0,0 +1,43 @@
+package org.mulgara.server.rmi;
+
+// Java 2 standard packages
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+// Third party packages
+import org.apache.log4j.Category;
+
+// Local packages
+
+/**
+ * Remote XAResource.
+ *
+ */
+public interface RemoteXAResource extends Remote
+{
+  public void commit(Xid xid, boolean onePhase) throws XAException, RemoteException;
+
+  public void end(Xid xid, int flags) throws XAException, RemoteException;
+
+  public void forget(Xid xid) throws XAException, RemoteException;
+
+  public int getTransactionTimeout() throws XAException, RemoteException;
+
+  // I suspect I need to call getRMUUID here so I can do my own comparison on
+  // the client side - not sure how I penetrate the required wrappers to do it
+  // as a pure server-side operation.
+  public boolean isSameRM(XAResource xares) throws XAException, RemoteException;
+
+  public int prepare(Xid xid) throws XAException, RemoteException;
+
+  public Xid[] recover(int flag) throws XAException, RemoteException;
+
+  public void rollback(Xid xid) throws XAException, RemoteException;
+
+  public boolean setTransactionTimeout(int seconds) throws XAException, RemoteException;
+
+  public void start(Xid xid, int flags) throws XAException, RemoteException;
+}

Added: branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteXAResourceWrapperXAResource.java
===================================================================
--- branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteXAResourceWrapperXAResource.java	2007-11-28 03:43:42 UTC (rev 582)
+++ branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/RemoteXAResourceWrapperXAResource.java	2007-11-28 06:26:56 UTC (rev 583)
@@ -0,0 +1,137 @@
+package org.mulgara.server.rmi;
+
+// Java 2 standard packages
+import java.rmi.RemoteException;
+import java.rmi.server.UnicastRemoteObject;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+// Third party packages
+import org.apache.log4j.*;
+
+// Local packages
+
+/**
+ * Wrap a {@link RemoteXAResource} to make it into an {@link XAResource}.
+ *
+ */
+class RemoteXAResourceWrapperXAResource implements XAResource {
+  /** logger */
+  private static Logger logger =
+      Logger.getLogger(RemoteXAResourceWrapperXAResource.class.getName());
+
+  /**
+   * The wrapped instance.
+   */
+  private RemoteXAResource remoteResource;
+
+  /**
+   * Wrap a {@link RemoteAnswer} to make it into an {@link Answer}.
+   *
+   * @param remoteAnswer  the instance to wrap
+   * @throws IllegalArgumentException  if <var>remoteAnswer</var> is
+   *   <code>null</code>
+   */
+  RemoteXAResourceWrapperXAResource(RemoteXAResource remoteResource) throws RemoteException {
+    if (remoteResource == null) {
+      throw new IllegalArgumentException("Null 'remoteResource' parameter");
+    }
+
+    this.remoteResource = remoteResource;
+  }
+
+  //
+  // Methods implementing XAResource
+  //
+
+  public void commit(Xid xid, boolean onePhase) throws XAException {
+    try {
+      remoteResource.commit(xid, onePhase);
+    } catch (RemoteException re) {
+      logger.warn("RMI Error in XAResource", re);
+      throw new XAException(XAException.XAER_RMFAIL);
+    }
+  }
+
+  public void end(Xid xid, int flags) throws XAException {
+    try {
+      remoteResource.end(xid, flags);
+    } catch (RemoteException re) {
+      logger.warn("RMI Error in XAResource", re);
+      throw new XAException(XAException.XAER_RMFAIL);
+    }
+  }
+
+  public void forget(Xid xid) throws XAException {
+    try {
+      remoteResource.forget(xid);
+    } catch (RemoteException re) {
+      logger.warn("RMI Error in XAResource", re);
+      throw new XAException(XAException.XAER_RMFAIL);
+    }
+  }
+
+  public int getTransactionTimeout() throws XAException {
+    try {
+      return remoteResource.getTransactionTimeout();
+    } catch (RemoteException re) {
+      logger.warn("RMI Error in XAResource", re);
+      throw new XAException(XAException.XAER_RMFAIL);
+    }
+  }
+
+  public boolean isSameRM(XAResource xares) throws XAException {
+    try {
+      return remoteResource.isSameRM(xares);
+    } catch (RemoteException re) {
+      logger.warn("RMI Error in XAResource", re);
+      throw new XAException(XAException.XAER_RMFAIL);
+    }
+  }
+
+  public int prepare(Xid xid) throws XAException {
+    try {
+      return remoteResource.prepare(xid);
+    } catch (RemoteException re) {
+      logger.warn("RMI Error in XAResource", re);
+      throw new XAException(XAException.XAER_RMFAIL);
+    }
+  }
+
+  public Xid[] recover(int flag) throws XAException {
+    try {
+      return remoteResource.recover(flag);
+    } catch (RemoteException re) {
+      logger.warn("RMI Error in XAResource", re);
+      throw new XAException(XAException.XAER_RMFAIL);
+    }
+  }
+
+  public void rollback(Xid xid) throws XAException {
+    try {
+      remoteResource.rollback(xid);
+    } catch (RemoteException re) {
+      logger.warn("RMI Error in XAResource", re);
+      throw new XAException(XAException.XAER_RMFAIL);
+    }
+  }
+
+  public boolean setTransactionTimeout(int seconds) throws XAException {
+    try {
+      return remoteResource.setTransactionTimeout(seconds);
+    } catch (RemoteException re) {
+      logger.warn("RMI Error in XAResource", re);
+      throw new XAException(XAException.XAER_RMFAIL);
+    }
+  }
+
+  public void start(Xid xid, int flags) throws XAException {
+    try {
+      remoteResource.start(xid, flags);
+    } catch (RemoteException re) {
+      logger.warn("RMI Error in XAResource", re);
+      throw new XAException(XAException.XAER_RMFAIL);
+    }
+  }
+}

Modified: branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/SessionWrapperRemoteSession.java
===================================================================
--- branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/SessionWrapperRemoteSession.java	2007-11-28 03:43:42 UTC (rev 582)
+++ branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/SessionWrapperRemoteSession.java	2007-11-28 06:26:56 UTC (rev 583)
@@ -515,6 +515,16 @@
     session.login(securityDomain, username, password);
   }
 
+
+  public RemoteXAResource getXAResource() throws QueryException, RemoteException {
+    try {
+      return new XAResourceWrapperRemoteXAResource(session.getXAResource());
+    } catch (Throwable t) {
+      throw convertToQueryException(t);
+    }
+  }
+
+
   // Construct an exception chain that will pass over RMI.
   protected Throwable mapThrowable(Throwable t) {
     Throwable cause = t.getCause();

Added: branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/XAResourceWrapperRemoteXAResource.java
===================================================================
--- branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/XAResourceWrapperRemoteXAResource.java	2007-11-28 03:43:42 UTC (rev 582)
+++ branches/mgr-73/src/jar/server-rmi/java/org/mulgara/server/rmi/XAResourceWrapperRemoteXAResource.java	2007-11-28 06:26:56 UTC (rev 583)
@@ -0,0 +1,72 @@
+package org.mulgara.server.rmi;
+
+// Java 2 standard packages
+import java.rmi.RemoteException;
+import java.rmi.server.UnicastRemoteObject;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+// Third party packages
+import org.apache.log4j.*;
+
+/**
+ * Remote XAResource.
+ */
+public class XAResourceWrapperRemoteXAResource
+    extends UnicastRemoteObject implements RemoteXAResource {
+  /** logger */
+  private static Logger logger =
+      Logger.getLogger(XAResourceWrapperRemoteXAResource.class.getName());
+
+  protected final XAResource resource;
+
+  public XAResourceWrapperRemoteXAResource(XAResource resource) throws RemoteException {
+    if (resource == null) {
+      throw new IllegalArgumentException("Null 'resource' parameter");
+    }
+
+    this.resource = resource;
+  }
+
+  public void commit(Xid xid, boolean onePhase) throws XAException, RemoteException {
+    resource.commit(xid, onePhase);
+  }
+
+  public void end(Xid xid, int flags) throws XAException, RemoteException {
+    resource.end(xid, flags);
+  }
+
+  public void forget(Xid xid) throws XAException, RemoteException {
+    resource.forget(xid);
+  }
+
+  public int getTransactionTimeout() throws XAException, RemoteException {
+    return resource.getTransactionTimeout();
+  }
+
+  public boolean isSameRM(XAResource xares) throws XAException, RemoteException
+  {
+    return resource.isSameRM(xares);
+  }
+
+  public int prepare(Xid xid) throws XAException, RemoteException {
+    return resource.prepare(xid);
+  }
+
+  public Xid[] recover(int flag) throws XAException, RemoteException {
+    return resource.recover(flag);
+  }
+
+  public void rollback(Xid xid) throws XAException, RemoteException {
+    resource.rollback(xid);
+  }
+
+  public boolean setTransactionTimeout(int seconds) throws XAException, RemoteException {
+    return resource.setTransactionTimeout(seconds);
+  }
+
+  public void start(Xid xid, int flags) throws XAException, RemoteException {
+    resource.start(xid, flags);
+  }
+}




More information about the Mulgara-svn mailing list