You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by da...@apache.org on 2008/03/01 20:27:52 UTC

svn commit: r632648 - in /openejb/trunk/openejb3: container/openejb-core/src/main/java/org/apache/openejb/core/cmp/ container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/ container/openejb-core/src/main/java/org/apache/openejb/core/cmp/...

Author: dain
Date: Sat Mar  1 11:27:51 2008
New Revision: 632648

URL: http://svn.apache.org/viewvc?rev=632648&view=rev
Log:
OPENEJB-756 Allow CMP2 ejbSelect returning void for UPDATE and DELETE queries

Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Generator.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/EjbSelect.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/jpa/JpaCmpEngine.java
    openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/AllowedOperationsCmp2Bean.java
    openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/AllowedOperationsCmpBean.java
    openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmp2Bean.java
    openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmpBean.java
    openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmpHome.java
    openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml
    openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/entity/cmp/CmpAllowedOperationsTests.java
    openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/entity/cmp2/Cmp2EjbHomeTests.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java Sat Mar  1 11:27:51 2008
@@ -114,7 +114,7 @@
         ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
         if (classLoader == null) classLoader = getClass().getClassLoader();
 
-        CmpEngineFactory factory = null;
+        CmpEngineFactory factory;
         try {
             Class<?> cmpEngineFactoryClass = classLoader.loadClass(cmpEngineFactory);
             factory = (CmpEngineFactory) cmpEngineFactoryClass.newInstance();
@@ -540,7 +540,16 @@
 
                 Method runMethod = deploymentInfo.getMatchingBeanMethod(callMethod);
 
-                returnValue = runMethod.invoke(bean, args);
+                try {
+                    returnValue = runMethod.invoke(bean, args);
+                } catch (IllegalArgumentException e) {
+                    System.out.println("********************************************************");
+                    System.out.println("callMethod = " + callMethod);
+                    System.out.println("runMethod = " + runMethod);
+                    System.out.println("bean = " + bean.getClass().getName());
+
+                    throw e;
+                }
             } finally {
                 unsetEntityContext(bean);
             }
@@ -801,6 +810,15 @@
         } catch (RuntimeException e) {
             throw new EJBException(e);
         }
+    }
+
+    public int update(DeploymentInfo di, String methodSignature, Object... args) throws FinderException {
+        CoreDeploymentInfo deploymentInfo = (CoreDeploymentInfo) di;
+        String signature = deploymentInfo.getAbstractSchemaName() + "." + methodSignature;
+
+        // exectue the update query
+        int result = cmpEngine.executeUpdateQuery(deploymentInfo, signature, args);
+        return result;
     }
 
     private void removeEJBObject(Method callMethod, ThreadContext callContext) throws OpenEJBException {

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpEngine.java Sat Mar  1 11:27:51 2008
@@ -41,6 +41,8 @@
 
     List<Object> queryBeans(CoreDeploymentInfo deploymentInfo, String signature, Object[] args) throws FinderException;
 
+    int executeUpdateQuery(CoreDeploymentInfo deploymentInfo, String signature, Object[] args) throws FinderException;
+
     void deploy(CoreDeploymentInfo deploymentInfo) throws OpenEJBException;
 
     void undeploy(CoreDeploymentInfo deploymentInfo) throws OpenEJBException;

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Generator.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Generator.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Generator.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/Cmp2Generator.java Sat Mar  1 11:27:51 2008
@@ -696,11 +696,16 @@
                 EJB_SELECT_EXECUTE.getName(),
                 Type.getMethodDescriptor(EJB_SELECT_EXECUTE));
 
-        // convert return type
-        Convert.fromObjectTo(mv, selectMethod.getReturnType());
-
-        // return
-        mv.visitInsn(Type.getReturnType(selectMethod).getOpcode(IRETURN));
+        if (!Void.TYPE.equals(selectMethod.getReturnType())) {
+            // convert return type
+            Convert.fromObjectTo(mv, selectMethod.getReturnType());
+
+            // return value;
+            mv.visitInsn(Type.getReturnType(selectMethod).getOpcode(IRETURN));
+        } else {
+            // return; 
+            mv.visitInsn(RETURN);
+        }
 
         // close method
         mv.visitMaxs(0, 0);
@@ -775,6 +780,7 @@
                 mv.visitTypeInsn(CHECKCAST, Type.getInternalName(to));
             } else {
                 Convert conversion = getConversion(to);
+                if (conversion == null) throw new NullPointerException("unsupported conversion for EJB select return type " + to.getName());
                 conversion.objectToPrimitive(mv);
             }
         }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/EjbSelect.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/EjbSelect.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/EjbSelect.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/cmp2/EjbSelect.java Sat Mar  1 11:27:51 2008
@@ -34,6 +34,13 @@
             throw new FinderException("Deployment is not connected to a CmpContainer " + deploymentInfo.getDeploymentID());
         }
         CmpContainer cmpContainer = (CmpContainer) container;
+        
+        // if the return type is void, assume we have an update query
+        if ("void".equals(returnType)) {
+            int result = cmpContainer.update(deploymentInfo, methodSignature, args);
+            return result;
+        }
+
         Object result = cmpContainer.select(deploymentInfo, methodSignature, returnType, args);
         if (result instanceof Number) {
             Number number = (Number) result;

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/jpa/JpaCmpEngine.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/jpa/JpaCmpEngine.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/jpa/JpaCmpEngine.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/jpa/JpaCmpEngine.java Sat Mar  1 11:27:51 2008
@@ -237,7 +237,7 @@
                 throw new FinderException("No query defined for method " + fullName);
             }
         }
-        return executeQuery(query, args);
+        return executeSelectQuery(query, args);
     }
 
     public List<Object> queryBeans(CoreDeploymentInfo deploymentInfo, String signature, Object[] args) throws FinderException {
@@ -254,10 +254,10 @@
                 throw new FinderException("No query defined for method " + signature);
             }
         }
-        return executeQuery(query, args);
+        return executeSelectQuery(query, args);
     }
 
-    private List<Object> executeQuery(Query query, Object[] args) {
+    private List<Object> executeSelectQuery(Query query, Object[] args) {
         // process args
         if (args == null) {
             args = NO_ARGS;
@@ -287,6 +287,41 @@
         }
         //noinspection unchecked
         return results;
+    }
+
+    public int executeUpdateQuery(CoreDeploymentInfo deploymentInfo, String signature, Object[] args) throws FinderException {
+        EntityManager entityManager = getEntityManager(deploymentInfo);
+
+        Query query = createNamedQuery(entityManager, signature);
+        if (query == null) {
+            int parenIndex = signature.indexOf('(');
+            if (parenIndex > 0) {
+                String shortName = signature.substring(0, parenIndex);
+                query = createNamedQuery(entityManager, shortName);
+            }
+            if (query == null) {
+                throw new FinderException("No query defined for method " + signature);
+            }
+        }
+
+        // process args
+        if (args == null) {
+            args = NO_ARGS;
+        }
+        for (int i = 0; i < args.length; i++) {
+            Object arg = args[i];
+            // ejb proxies need to be swapped out for real instance classes
+            if (arg instanceof EJBObject) {
+                arg = Cmp2Util.getEntityBean(((EJBObject) arg));
+            }
+            if (arg instanceof EJBLocalObject) {
+                arg = Cmp2Util.getEntityBean(((EJBLocalObject) arg));
+            }
+            query.setParameter(i + 1, arg);
+        }
+
+        int result = query.executeUpdate();
+        return result;
     }
 
     private Query createNamedQuery(EntityManager entityManager, String name) {

Modified: openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/AllowedOperationsCmp2Bean.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/AllowedOperationsCmp2Bean.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/AllowedOperationsCmp2Bean.java (original)
+++ openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/AllowedOperationsCmp2Bean.java Sat Mar  1 11:27:51 2008
@@ -65,6 +65,9 @@
         return x + y;
     }
 
+    public void ejbHomeVoidSelect() {
+    }
+
     /**
      * Maps to BasicCmpHome.create
      */

Modified: openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/AllowedOperationsCmpBean.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/AllowedOperationsCmpBean.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/AllowedOperationsCmpBean.java (original)
+++ openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/AllowedOperationsCmpBean.java Sat Mar  1 11:27:51 2008
@@ -66,6 +66,9 @@
         return x+y;
     }
     
+    public void ejbHomeVoidSelect() {
+    }
+
     /**
      * Maps to BasicCmpHome.create
      */

Modified: openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmp2Bean.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmp2Bean.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmp2Bean.java (original)
+++ openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmp2Bean.java Sat Mar  1 11:27:51 2008
@@ -22,6 +22,7 @@
 import javax.ejb.CreateException;
 import javax.ejb.EntityBean;
 import javax.ejb.EntityContext;
+import javax.ejb.FinderException;
 import java.util.Properties;
 import java.util.StringTokenizer;
 import java.util.Map;
@@ -44,7 +45,8 @@
 
     public abstract void setLastName(String lastName);
     
-
+    public abstract void ejbSelectRemoveById(Integer someId) throws FinderException;
+    
     //=============================
     // Home interface methods
     //
@@ -57,6 +59,10 @@
     public int ejbHomeSum(int x, int y) {
         testAllowedOperations("ejbHome");
         return x + y;
+    }
+
+    public void ejbHomeVoidSelect() throws FinderException {
+        ejbSelectRemoveById(999999);
     }
 
     /**

Modified: openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmpBean.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmpBean.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmpBean.java (original)
+++ openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmpBean.java Sat Mar  1 11:27:51 2008
@@ -61,6 +61,9 @@
         return x+y;
     }
     
+    public void ejbHomeVoidSelect() {
+    }
+
     /**
      * Maps to BasicCmpHome.create
      * 

Modified: openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmpHome.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmpHome.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmpHome.java (original)
+++ openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/java/org/apache/openejb/test/entity/cmp/BasicCmpHome.java Sat Mar  1 11:27:51 2008
@@ -36,4 +36,6 @@
     Collection findByLastName(String lastName) throws FinderException, RemoteException;
     
     int sum(int x, int y) throws RemoteException;
+
+    void voidSelect() throws FinderException, RemoteException;
 }

Modified: openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml (original)
+++ openejb/trunk/openejb3/itests/openejb-itests-beans/src/main/resources/META-INF/ejb-jar.xml Sat Mar  1 11:27:51 2008
@@ -176,6 +176,15 @@
         <role-name>TheMan</role-name>
         <role-link>Executive</role-link>
       </security-role-ref>
+      <query>
+        <query-method>
+          <method-name>ejbSelectRemoveById</method-name>
+          <method-params>
+            <method-param>java.lang.Integer</method-param>
+          </method-params>
+        </query-method>
+        <ejb-ql>DELETE FROM BasicCmp2Bean o WHERE o.id = ?1</ejb-ql>
+      </query>
     </entity>
 
     <entity>

Modified: openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/entity/cmp/CmpAllowedOperationsTests.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/entity/cmp/CmpAllowedOperationsTests.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/entity/cmp/CmpAllowedOperationsTests.java (original)
+++ openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/entity/cmp/CmpAllowedOperationsTests.java Sat Mar  1 11:27:51 2008
@@ -180,7 +180,9 @@
       ejbObject.remove();
 
       ejbObject = ejbHome.createObject("Fourth Bean");
-      ejbHome.findEmptyCollection(); 
+      ejbHome.findEmptyCollection();
+
+      ejbHome.voidSelect();  
     } 
 
     //=====================================

Modified: openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/entity/cmp2/Cmp2EjbHomeTests.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/entity/cmp2/Cmp2EjbHomeTests.java?rev=632648&r1=632647&r2=632648&view=diff
==============================================================================
--- openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/entity/cmp2/Cmp2EjbHomeTests.java (original)
+++ openejb/trunk/openejb3/itests/openejb-itests-client/src/main/java/org/apache/openejb/test/entity/cmp2/Cmp2EjbHomeTests.java Sat Mar  1 11:27:51 2008
@@ -122,6 +122,15 @@
             fail("Received Exception " + e.getClass() + " : " + e.getMessage());
         }
     }
+
+    public void test06_voidEjbSelect() {
+        try {
+            ejbHome.voidSelect();
+        } catch (Throwable e) {
+            e.printStackTrace();
+            fail("Received Exception " + e.getClass() + " : " + e.getMessage());
+        }
+    }
     //
     // Test ejb home methods
     //===============================