[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