Author: dain
Date: Thu May 31 19:26:25 2007
New Revision: 543360

URL: http://svn.apache.org/viewvc?view=rev&rev=543360
Log:
Enable container managed transaction attributes for ejbTimeout
Enable timer for message driven beans

Modified:
    
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
    
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
    
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
    
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
    
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java

Modified: 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: 
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
--- 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 (original)
+++ 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 Thu May 31 19:26:25 2007
@@ -25,6 +25,7 @@
 import org.apache.openejb.OpenEJB;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.UndeployException;
+import org.apache.openejb.BeanType;
 import org.apache.openejb.resource.jdbc.JdbcManagedConnectionFactory;
 import org.apache.openejb.resource.GeronimoConnectionManagerFactory;
 import org.apache.openejb.core.ConnectorReference;
@@ -32,6 +33,8 @@
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.SimpleTransactionSynchronizationRegistry;
 import org.apache.openejb.core.TemporaryClassLoader;
+import org.apache.openejb.core.timer.EjbTimerServiceImpl;
+import org.apache.openejb.core.timer.NullEjbTimerServiceImpl;
 import org.apache.openejb.core.ivm.naming.IvmContext;
 import org.apache.openejb.javaagent.Agent;
 import org.apache.openejb.loader.SystemInstance;
@@ -68,6 +71,7 @@
 import java.io.IOException;
 import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.Instrumentation;
+import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
@@ -408,6 +412,7 @@
                     jaccPermissionsBuilder.install(policyContext);
                 }
 
+                // process transaction attributes
                 for (DeploymentInfo deploymentInfo : deployments.values()) {
                     applyTransactionAttributes((CoreDeploymentInfo) 
deploymentInfo, ejbJar.methodTransactions);
                     containerSystem.addDeployment(deploymentInfo);
@@ -415,6 +420,25 @@
 
                 }
 
+                // setup timers - must be after transaction attibutes are set
+                for (DeploymentInfo deploymentInfo : deployments.values()) {
+                    CoreDeploymentInfo coreDeploymentInfo = 
(CoreDeploymentInfo) deploymentInfo;
+                    if (coreDeploymentInfo.getComponentType() != 
BeanType.STATEFUL) {
+                        Method ejbTimeout = coreDeploymentInfo.getEjbTimeout();
+                        if (ejbTimeout != null) {
+                            // If user set the tx attribute to RequiresNew 
change it to Required so a new transaction is not started
+                            if 
(coreDeploymentInfo.getTransactionAttribute(ejbTimeout) == 
CoreDeploymentInfo.TX_REQUIRES_NEW) {
+                                
coreDeploymentInfo.setMethodTransactionAttribute(ejbTimeout, "Required");
+                            }
+
+                            // Create the timer
+                            EjbTimerServiceImpl timerService = new 
EjbTimerServiceImpl(coreDeploymentInfo);
+                            
coreDeploymentInfo.setEjbTimerService(timerService);
+                        } else {
+                            coreDeploymentInfo.setEjbTimerService(new 
NullEjbTimerServiceImpl());
+                        }
+                    }
+                }
                 // process application exceptions
                 for (ApplicationExceptionInfo exceptionInfo : 
ejbJar.applicationException) {
                     try {

Modified: 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
URL: 
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
--- 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
 (original)
+++ 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
 Thu May 31 19:26:25 2007
@@ -66,6 +66,7 @@
                         List<Method> methods = new ArrayList<Method>();
 
                         if (methodInfo.methodIntf == null) {
+                            resolveMethods(methods, 
deploymentInfo.getBeanClass(), methodInfo);
                             if (deploymentInfo.getRemoteInterface() != null) {
                                 resolveMethods(methods, 
deploymentInfo.getRemoteInterface(), methodInfo);
                             }

Modified: 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
URL: 
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
--- 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
 (original)
+++ 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
 Thu May 31 19:26:25 2007
@@ -211,18 +211,8 @@
             }
         }
 
-        // Timer
+        // ejbTimeout
         deployment.setEjbTimeout(getTimeout(ejbClass, bean.timeoutMethod));
-        
-        // This is a change in behavor from OpenEJB 2.x, which required an 
ejbTimeout method
-        if (!(bean instanceof StatefulBeanInfo)) {
-            if (deployment.getEjbTimeout() != null) {
-                EjbTimerServiceImpl timerService = new 
EjbTimerServiceImpl(deployment);
-                deployment.setEjbTimerService(timerService);
-            } else {
-                deployment.setEjbTimerService(new NullEjbTimerServiceImpl());
-            }
-        }
 
         if (bean instanceof StatefulBeanInfo) {
             StatefulBeanInfo statefulBeanInfo = (StatefulBeanInfo) bean;
@@ -367,7 +357,7 @@
         Method timeout = null;
         try {
             if (TimedObject.class.isAssignableFrom(ejbClass)) {
-                timeout = TimedObject.class.getMethod("ejbTimeout", 
Timer.class);
+                timeout = ejbClass.getMethod("ejbTimeout", Timer.class);
             } else if (info.methodParams != null) {
                 timeout = toMethod(ejbClass, info);
             }

Modified: 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
URL: 
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
--- 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
 (original)
+++ 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
 Thu May 31 19:26:25 2007
@@ -27,6 +27,7 @@
 import org.apache.openejb.core.CoreDeploymentInfo;
 import org.apache.openejb.core.Operation;
 import org.apache.openejb.core.ThreadContext;
+import org.apache.openejb.core.timer.EjbTimerService;
 import org.apache.openejb.core.interceptor.InterceptorData;
 import org.apache.openejb.core.interceptor.InterceptorStack;
 import org.apache.openejb.core.transaction.TransactionContainer;
@@ -127,6 +128,12 @@
 
             throw new OpenEJBException(e);
         }
+
+        // start the timer service
+        EjbTimerService timerService = deploymentInfo.getEjbTimerService();
+        if (timerService != null) {
+            timerService.start();
+        }
     }
 
     private ActivationSpec createActivationSpec(DeploymentInfo 
deploymentInfo)throws OpenEJBException {
@@ -196,7 +203,25 @@
     }
 
     public Object invoke(Object deploymentId, Class callInterface, Method 
method, Object[] args, Object primKey) throws OpenEJBException {
-        throw new OpenEJBException("This MdbContainer.invoke should not be 
used!");
+        CoreDeploymentInfo deploymentInfo = (CoreDeploymentInfo) 
getDeploymentInfo(deploymentId);
+
+        EndpointFactory endpointFactory = (EndpointFactory) 
deploymentInfo.getContainerData();
+        MdbInstanceFactory instanceFactory = 
endpointFactory.getInstanceFactory();
+        Instance instance = null;
+        try {
+            instance = (Instance) instanceFactory.createInstance(true);
+        } catch (UnavailableException e) {
+            throw new SystemException("Unable to create instance for 
invocation", e);
+        }
+
+        try {
+            beforeDelivery(deploymentInfo, instance, method, null);
+            Object value = invoke(instance, method, args);
+            afterDelivery(instance);
+            return value;
+        } finally {
+            instanceFactory.freeInstance(instance, true);
+        }
     }
 
     public void beforeDelivery(CoreDeploymentInfo deployInfo, Object instance, 
Method method, XAResource xaResource) throws SystemException {

Modified: 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
--- 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
 (original)
+++ 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
 Thu May 31 19:26:25 2007
@@ -130,7 +130,7 @@
      * Frees an instance no longer needed by the resource adapter.  This 
method makes all the necessary lifecycle
      * callbacks and decrements the instance count.  This method should not be 
used to disposed of beans that have
      * thrown a system exception.  Instead the discardInstance method should 
be called.
-     * @param bean the bean instance to free
+     * @param instance the bean instance to free
      * @param ignoredInstanceCount
      */
     public void freeInstance(Instance instance, boolean ignoredInstanceCount) {

Modified: 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
--- 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
 (original)
+++ 
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
 Thu May 31 19:26:25 2007
@@ -265,7 +265,7 @@
                 return;
             }
 
-            for (int tries = 0; tries < retryAttempts; tries++) {
+            for (int tries = 0; tries < (1 + retryAttempts); tries++) {
                 // if transacted, begin the transaction
                 if (transacted) {
                     try {


Reply via email to