GERONIMO-4360 add HintsContextHander, fix a lot of small bugs with work contexts. changes api slightly, needs server code change too
git-svn-id: https://svn.apache.org/repos/asf/geronimo/components/txmanager/trunk@925908 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/GeronimoBootstrapContext.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/GeronimoBootstrapContext.java
index 8847a01..0687883 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/GeronimoBootstrapContext.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/GeronimoBootstrapContext.java
@@ -23,6 +23,7 @@
import javax.resource.spi.work.WorkManager;
import javax.resource.spi.work.WorkContext;
import javax.transaction.TransactionSynchronizationRegistry;
+import org.apache.geronimo.connector.work.GeronimoWorkManager;
/**
* GBean BootstrapContext implementation that refers to externally configured WorkManager
@@ -31,8 +32,9 @@
* @version $Rev$ $Date$
*/
public class GeronimoBootstrapContext implements javax.resource.spi.BootstrapContext {
- private final WorkManager workManager;
+ private final GeronimoWorkManager workManager;
private final XATerminator xATerminator;
+ private final TransactionSynchronizationRegistry transactionSynchronizationRegistry;
/**
* Default constructor for use as a GBean Endpoint.
@@ -40,16 +42,19 @@
public GeronimoBootstrapContext() {
workManager = null;
xATerminator = null;
+ transactionSynchronizationRegistry = null;
}
/**
* Normal constructor for use as a GBean.
* @param workManager
* @param xaTerminator
+ * @param transactionSynchronizationRegistry
*/
- public GeronimoBootstrapContext(WorkManager workManager, XATerminator xaTerminator) {
+ public GeronimoBootstrapContext(GeronimoWorkManager workManager, XATerminator xaTerminator, TransactionSynchronizationRegistry transactionSynchronizationRegistry) {
this.workManager = workManager;
this.xATerminator = xaTerminator;
+ this.transactionSynchronizationRegistry = transactionSynchronizationRegistry;
}
@@ -75,11 +80,11 @@
}
public TransactionSynchronizationRegistry getTransactionSynchronizationRegistry() {
- return null;
+ return transactionSynchronizationRegistry;
}
public boolean isContextSupported(Class<? extends WorkContext> aClass) {
- return false;
+ return workManager.isContextSupported(aClass);
}
}
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java
index ca53282..22f8449 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/GeronimoWorkManager.java
@@ -24,6 +24,7 @@
import javax.resource.spi.work.ExecutionContext;
import javax.resource.spi.work.Work;
import javax.resource.spi.work.WorkCompletedException;
+import javax.resource.spi.work.WorkContext;
import javax.resource.spi.work.WorkException;
import javax.resource.spi.work.WorkListener;
import javax.resource.spi.work.WorkManager;
@@ -207,4 +208,13 @@
}
}
+ public boolean isContextSupported(Class<? extends WorkContext> aClass) {
+ for (WorkContextHandler workContextHandler: workContextHandlers) {
+ if (workContextHandler.supports(aClass)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
}
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/HintsContextHandler.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/HintsContextHandler.java
new file mode 100644
index 0000000..0a314f1
--- /dev/null
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/HintsContextHandler.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package org.apache.geronimo.connector.work;
+
+import javax.resource.spi.work.HintsContext;
+import javax.resource.spi.work.WorkCompletedException;
+import javax.resource.spi.work.WorkContext;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class HintsContextHandler implements WorkContextHandler<HintsContext> {
+
+ public void before(HintsContext workContext) throws WorkCompletedException {
+ }
+
+ public void after(HintsContext workContext) throws WorkCompletedException {
+ }
+
+ public boolean supports(Class<? extends WorkContext> clazz) {
+ return HintsContext.class.isAssignableFrom(clazz);
+ }
+
+ public boolean required() {
+ return false;
+ }
+
+}
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionContextHandler.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionContextHandler.java
index 62ed49d..d7433d6 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionContextHandler.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/TransactionContextHandler.java
@@ -22,6 +22,7 @@
import javax.resource.spi.work.TransactionContext;
import javax.resource.spi.work.WorkCompletedException;
+import javax.resource.spi.work.WorkContext;
import javax.transaction.xa.XAException;
import javax.transaction.InvalidTransactionException;
import javax.transaction.SystemException;
@@ -70,8 +71,8 @@
}
}
- public Class<TransactionContext> getHandledClass() {
- return TransactionContext.class;
+ public boolean supports(Class<? extends WorkContext> clazz) {
+ return TransactionContext.class.isAssignableFrom(clazz);
}
public boolean required() {
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkContextHandler.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkContextHandler.java
index 431de6c..5ea8d18 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkContextHandler.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkContextHandler.java
@@ -32,7 +32,7 @@
void after(E workContext) throws WorkCompletedException;
- Class<E> getHandledClass();
+ boolean supports(Class<? extends WorkContext> clazz);
boolean required();
diff --git a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java
index e8c44bb..39f2026 100644
--- a/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java
+++ b/geronimo-connector/src/main/java/org/apache/geronimo/connector/work/WorkerContext.java
@@ -312,9 +312,11 @@
try {
txWorkContext.setTransactionTimeout(executionContext.getTransactionTimeout());
} catch (NotSupportedException e) {
- throw new WorkRejectedException("Could not read tx timeout");
+ //not set, continue to not set it.
}
+ txWorkContext.setXid(executionContext.getXid());
workContexts = Collections.<WorkContext>singletonList(txWorkContext);
+ log.info("Translated ExecutionContext to TransactionContext");
} else if (adaptee instanceof WorkContextProvider) {
workContexts = ((WorkContextProvider) adaptee).getWorkContexts();
}
@@ -323,21 +325,28 @@
boolean found = false;
for (Iterator<WorkContextHandler> it = workContextHandlers.iterator(); it.hasNext();) {
WorkContextHandler workContextHandler = it.next();
- //TODO is this the right way around?
- if (workContext.getClass().isAssignableFrom(workContextHandler.getHandledClass())) {
+ log.info("sorting WorkContextHandler: " + workContextHandler + " for work context: " + workContext);
+ if (workContextHandler.supports(workContext.getClass())) {
it.remove();
+ log.info("adding sorted WorkContextHandler: " + workContextHandler);
sortedHandlers.add(workContextHandler);
found = true;
break;
}
}
if (!found) {
- throw new WorkCompletedException("Duplicate or unhandled WorkContext: " + workContext, WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE);
+ for (WorkContextHandler workContextHandler: sortedHandlers) {
+ if (workContextHandler.supports(workContext.getClass())) {
+ throw new WorkCompletedException("Duplicate WorkContext: " + workContext, WorkContextErrorCodes.DUPLICATE_CONTEXTS);
+ }
+ }
+ throw new WorkCompletedException("Unhandled WorkContext: " + workContext, WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE);
}
}
for (Iterator<WorkContextHandler> it = workContextHandlers.iterator(); it.hasNext();) {
WorkContextHandler workContextHandler = it.next();
if (!workContextHandler.required()) {
+ log.info("Removing non-required WorkContextHandler with no context: " + workContextHandler);
it.remove();
}
}
@@ -345,9 +354,12 @@
int i = 0;
for (WorkContext workContext : workContexts) {
- sortedHandlers.get(i++).before(workContext);
+ WorkContextHandler contextHandler = sortedHandlers.get(i++);
+ log.info("calling before on WorkContextHandler: " + contextHandler + " with workContext: " + workContext);
+ contextHandler.before(workContext);
}
for (WorkContextHandler workContextHandler: workContextHandlers) {
+ log.info("calling before on WorkContextHandler: " + workContextHandler + " with null workContext");
workContextHandler.before(null);
}
try {
@@ -355,9 +367,12 @@
} finally {
int j = 0;
for (WorkContext workContext : workContexts) {
- sortedHandlers.get(j++).after(workContext);
+ WorkContextHandler contextHandler = sortedHandlers.get(j++);
+ log.info("calling after on WorkContextHandler: " + contextHandler + " with workContext: " + workContext);
+ contextHandler.after(workContext);
}
for (WorkContextHandler workContextHandler: workContextHandlers) {
+ log.info("calling after on WorkContextHandler: " + workContextHandler + " with null workContext");
workContextHandler.after(null);
}
}
diff --git a/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java b/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java
index 084f26e..e7bd1a2 100644
--- a/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java
+++ b/geronimo-connector/src/test/java/org/apache/geronimo/connector/BootstrapContextTest.java
@@ -99,7 +99,7 @@
GeronimoTransactionManager transactionManager = new GeronimoTransactionManager();
TransactionContextHandler txWorkContextHandler = new TransactionContextHandler(transactionManager);
GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, Collections.<WorkContextHandler>singletonList(txWorkContextHandler));
- GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager);
+ GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager, transactionManager);
WorkManager wm = context.getWorkManager();
assertSame("Make sure it is the same object", manager, wm);
@@ -112,7 +112,7 @@
GeronimoTransactionManager transactionManager = new GeronimoTransactionManager();
TransactionContextHandler txWorkContextHandler = new TransactionContextHandler(transactionManager);
GeronimoWorkManager manager = new GeronimoWorkManager(pool, pool, pool, Collections.<WorkContextHandler>singletonList(txWorkContextHandler));
- GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager);
+ GeronimoBootstrapContext context = new GeronimoBootstrapContext(manager, transactionManager, transactionManager);
XATerminator xat = context.getXATerminator();
assertSame("Make sure it is the same object", transactionManager, xat);
@@ -122,7 +122,7 @@
* Tests getTimer
*/
public void testGetTimer() throws Exception {
- GeronimoBootstrapContext context = new GeronimoBootstrapContext(null, null);
+ GeronimoBootstrapContext context = new GeronimoBootstrapContext(null, null, null);
Timer t = context.createTimer();
assertNotNull("Object is not null", t);
}