Author: xuhaihong
Date: Thu Sep  9 02:46:08 2010
New Revision: 995296

URL: http://svn.apache.org/viewvc?rev=995296&view=rev
Log:
OPENEJB-1165 Asynchronous support, add a missing class in the last commit

Added:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAsynchronous.java
   (with props)

Added: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAsynchronous.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAsynchronous.java?rev=995296&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAsynchronous.java
 (added)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAsynchronous.java
 Thu Sep  9 02:46:08 2010
@@ -0,0 +1,157 @@
+/**
+ *  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.openejb.config.rules;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.Future;
+
+import javax.ejb.Asynchronous;
+
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.jee.ApplicationException;
+import org.apache.openejb.jee.AsyncMethod;
+import org.apache.openejb.jee.EnterpriseBean;
+import org.apache.openejb.jee.MethodParams;
+import org.apache.openejb.jee.SessionBean;
+import org.apache.xbean.finder.ClassFinder;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class CheckAsynchronous extends ValidationBase {
+
+    public void validate(EjbModule module) {
+        Set<String> applicationExceptions = new HashSet<String>();
+        for (ApplicationException applicationException : 
module.getEjbJar().getAssemblyDescriptor().getApplicationException()) {
+            
applicationExceptions.add(applicationException.getExceptionClass());
+        }
+        for (EnterpriseBean bean : module.getEjbJar().getEnterpriseBeans()) {
+            Class<?> ejbClass = null;
+            try {
+                ejbClass = loadClass(bean.getEjbClass());
+            } catch (OpenEJBException e) {
+                continue;
+            }
+            if (bean instanceof SessionBean) {
+                SessionBean session = (SessionBean) bean;
+                for (AsyncMethod asyncMethod : session.getAsyncMethod()) {
+                    Method method = getMethod(ejbClass, asyncMethod);
+                    if (method == null) {
+                        fail(bean, "asynchronous.missing", 
asyncMethod.getMethodName(), ejbClass.getName(), 
getParameters(asyncMethod.getMethodParams()));
+                    } else {
+                        checkAsynchronousMethod(session, ejbClass, method, 
applicationExceptions);
+                    }
+                }
+
+                for (String className : session.getAsynchronousClasses()) {
+                    try {
+                        Class<?> cls = loadClass(className);
+                        for (Method method : cls.getDeclaredMethods()) {
+                            if (Modifier.isPublic(method.getModifiers())) {
+                                checkAsynchronousMethod(session, ejbClass, 
method, applicationExceptions);
+                            } else {
+                                //warn(session, "asynchronous.methodignored", 
ejbClass.getName(), method.getName());
+                            }
+                        }
+                    } catch (OpenEJBException e) {
+                        //ignore ?
+                    }
+                }
+            } else {
+                ClassFinder classFinder = new ClassFinder(ejbClass);
+                for (Method method : 
classFinder.findAnnotatedMethods(Asynchronous.class)) {
+                    ignoredMethodAnnotation("Asynchronous", bean, 
bean.getEjbClass(), method.getName(), bean.getClass().getSimpleName());
+                }
+                if (ejbClass.getAnnotation(Asynchronous.class) != null) {
+                    ignoredClassAnnotation("Asynchronous", bean, 
bean.getEjbClass(), bean.getClass().getSimpleName());
+                }
+            }
+        }
+    }
+
+    private void checkAsynchronousMethod(SessionBean bean, Class<?> ejbClass, 
Method method, Set<String> applicationExceptions) {
+        Class<?> retType = method.getReturnType();
+        if (retType != void.class && retType != Future.class) {
+            fail(bean, "asynchronous.badReturnType", method.getName(), 
retType.getName(), ejbClass.getName());
+        }
+        if (retType == void.class) {
+            String invalidThrowCauses = 
checkThrowCauses(method.getExceptionTypes(), applicationExceptions);
+            if (invalidThrowCauses != null) {
+                fail(bean, "asynchronous.badExceptionType", method.getName(), 
ejbClass.getName(), invalidThrowCauses);
+            }
+        }
+    }
+
+    /**
+     *  If the return value of the target method is void, it is not allowed to 
throw any application exception
+     * @param exceptionTypes
+     * @param applicationExceptions
+     * @return
+     */
+    private String checkThrowCauses(Class<?>[] exceptionTypes, Set<String> 
applicationExceptions) {
+        StringBuilder buffer = null;
+        for (Class<?> exceptionType : exceptionTypes) {
+            if (applicationExceptions.contains(exceptionType.getName()) || 
!Exception.class.isAssignableFrom(exceptionType) || 
RuntimeException.class.isAssignableFrom(exceptionType)) {
+                continue;
+            }
+            if (buffer == null) {
+                buffer = new StringBuilder(exceptionType.getName());
+            } else {
+                buffer.append(",").append(exceptionType.getName());
+            }
+        }
+        return buffer == null ? null : buffer.toString();
+    }
+
+    private String generateThrowCauses(Class<?>[] exceptionTypes) {
+        StringBuilder buffer = null;
+        for (Class<?> exceptionType : exceptionTypes) {
+            if (buffer == null) {
+                buffer = new StringBuilder(exceptionType.getName());
+            } else {
+                buffer.append(",").append(exceptionType.getName());
+            }
+        }
+        return buffer.toString();
+    }
+
+    private Method getMethod(Class<?> clazz, AsyncMethod asyncMethod) {
+        try {
+            MethodParams methodParams = asyncMethod.getMethodParams();
+            Class<?>[] parameterTypes;
+            if (methodParams != null) {
+                parameterTypes = new 
Class[methodParams.getMethodParam().size()];
+                int arrayIndex = 0;
+                for (String parameterType : methodParams.getMethodParam()) {
+                    parameterTypes[arrayIndex] = loadClass(parameterType);
+                }
+            } else {
+                parameterTypes = new Class[0];
+            }
+            return clazz.getMethod(asyncMethod.getMethodName(), 
parameterTypes);
+        } catch (NoSuchMethodException e) {
+            return null;
+        } catch (OpenEJBException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

Propchange: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAsynchronous.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAsynchronous.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckAsynchronous.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to