You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2007/01/19 13:43:15 UTC

svn commit: r497793 - in /incubator/openejb/trunk/openejb3/container: openejb-core/src/main/java/org/apache/openejb/alt/config/ openejb-core/src/main/java/org/apache/openejb/assembler/classic/ openejb-jee/src/main/java/org/apache/openejb/jee/ openejb-p...

Author: jlaskowski
Date: Fri Jan 19 04:43:14 2007
New Revision: 497793

URL: http://svn.apache.org/viewvc?view=rev&rev=497793
Log:
OPENEJB-107 Injection of Persistence Context References

Submitted by: Manu T George

Modified:
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AnnotationDeployer.java   (contents, props changed)
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.java   (props changed)
    incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
    incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextRef.java
    incubator/openejb/trunk/openejb3/container/openejb-persistence/pom.xml

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AnnotationDeployer.java?view=diff&rev=497793&r1=497792&r2=497793
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AnnotationDeployer.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AnnotationDeployer.java Fri Jan 19 04:43:14 2007
@@ -33,7 +33,10 @@
 import org.apache.openejb.jee.MessageDrivenBean;
 import org.apache.openejb.jee.MethodParams;
 import org.apache.openejb.jee.MethodTransaction;
+import org.apache.openejb.jee.PersistenceContextRef;
+import org.apache.openejb.jee.PersistenceContextType;
 import org.apache.openejb.jee.PersistenceUnitRef;
+import org.apache.openejb.jee.Property;
 import org.apache.openejb.jee.RemoteBean;
 import org.apache.openejb.jee.SessionBean;
 import org.apache.openejb.jee.StatefulBean;
@@ -64,6 +67,9 @@
 import javax.ejb.TransactionAttributeType;
 import javax.ejb.TransactionManagement;
 import javax.ejb.TransactionManagementType;
+import javax.persistence.PersistenceContext;
+import javax.persistence.PersistenceContexts;
+import javax.persistence.PersistenceProperty;
 import javax.persistence.PersistenceUnit;
 import javax.persistence.PersistenceUnits;
 import java.io.File;
@@ -116,6 +122,7 @@
             return clientModule;
         }
 
+        @SuppressWarnings("unchecked")
         public EjbModule deploy(EjbModule ejbModule) throws OpenEJBException {
             ClassFinder finder;
             if (ejbModule.getJarURI() != null) {
@@ -131,14 +138,14 @@
                     }
                     finder = new ClassFinder(ejbModule.getClassLoader(), url);
                 } catch (MalformedURLException e) {
-                    DeploymentLoader.logger.warning("Unable to scrape for @Stateful, @Stateless or @MessageDriven annotations.  EjbModule URL not valid: " + ejbModule.getJarURI(), e);
+                    DeploymentLoader.logger.warning("Unable to scrape for @Stateful, @Stateless or @MessageDriven annotations. EjbModule URL not valid: " + ejbModule.getJarURI(), e);
                     return ejbModule;
                 }
             } else {
                 try {
                     finder = new ClassFinder(ejbModule.getClassLoader());
                 } catch (Exception e) {
-                    DeploymentLoader.logger.warning("Unable to scrape for @Stateful, @Stateless or @MessageDriven annotations.  ClassFinder failed.", e);
+                    DeploymentLoader.logger.warning("Unable to scrape for @Stateful, @Stateless or @MessageDriven annotations. ClassFinder failed.", e);
                     return ejbModule;
                 }
             }
@@ -146,8 +153,9 @@
             /* 19.2:  ejb-name: Default is the unqualified name of the bean class */
 
             EjbJar ejbJar = ejbModule.getEjbJar();
+            // TODO: Anyone know how to avoid SuppressWarnings just for the below line
             List<Class> classes = finder.findAnnotatedClasses(Stateless.class);
-            for (Class beanClass : classes) {
+            for (Class<?> beanClass : classes) {
                 Stateless stateless = (Stateless) beanClass.getAnnotation(Stateless.class);
                 String ejbName = stateless.name().length() == 0 ? beanClass.getSimpleName() : stateless.name();
                 EnterpriseBean enterpriseBean = ejbJar.getEnterpriseBean(ejbName);
@@ -159,7 +167,7 @@
             }
 
             classes = finder.findAnnotatedClasses(Stateful.class);
-            for (Class beanClass : classes) {
+            for (Class<?> beanClass : classes) {
                 Stateful stateful = (Stateful) beanClass.getAnnotation(Stateful.class);
                 String ejbName = stateful.name().length() == 0 ? beanClass.getSimpleName() : stateful.name();
                 EnterpriseBean enterpriseBean = ejbJar.getEnterpriseBean(ejbName);
@@ -171,13 +179,13 @@
             }
 
             classes = finder.findAnnotatedClasses(MessageDriven.class);
-            for (Class beanClass : classes) {
+            for (Class<?> beanClass : classes) {
                 MessageDriven mdb = (MessageDriven) beanClass.getAnnotation(MessageDriven.class);
                 String ejbName = mdb.name().length() == 0 ? beanClass.getSimpleName() : mdb.name();
                 EnterpriseBean enterpriseBean = ejbJar.getEnterpriseBean(ejbName);
                 if (enterpriseBean == null) {
                     MessageDrivenBean messageBean = new MessageDrivenBean(ejbName);
-                    Class interfce = mdb.messageListenerInterface();
+                    Class<?> interfce = mdb.messageListenerInterface();
                     if (interfce != null) {
                         messageBean.setMessagingType(interfce.getName());
                     }
@@ -205,7 +213,7 @@
 
         public ClientModule deploy(ClientModule clientModule) throws OpenEJBException {
             ClassLoader classLoader = clientModule.getClassLoader();
-            Class clazz = null;
+            Class<?> clazz = null;
             try {
                 clazz = classLoader.loadClass(clientModule.getMainClass());
             } catch (ClassNotFoundException e) {
@@ -225,7 +233,7 @@
             for (EnterpriseBean bean : enterpriseBeans) {
                 final String ejbName = bean.getEjbName();
 
-                Class clazz = null;
+                Class<?> clazz = null;
                 try {
                     clazz = classLoader.loadClass(bean.getEjbClass());
                 } catch (ClassNotFoundException e) {
@@ -344,10 +352,10 @@
                     if (remoteBean.getHome() == null) {
                         RemoteHome remoteHome = (RemoteHome) clazz.getAnnotation(RemoteHome.class);
                         if (remoteHome != null) {
-                            Class homeClass = remoteHome.value();
+                            Class<?> homeClass = remoteHome.value();
                             try {
                                 Method create = homeClass.getMethod("create");
-                                Class remoteClass = create.getReturnType();
+                                Class<?> remoteClass = create.getReturnType();
                                 remoteBean.setHome(homeClass.getName());
                                 remoteBean.setRemote(remoteClass.getName());
                             } catch (NoSuchMethodException e) {
@@ -359,10 +367,10 @@
                     if (remoteBean.getLocalHome() == null) {
                         LocalHome localHome = (LocalHome) clazz.getAnnotation(LocalHome.class);
                         if (localHome != null) {
-                            Class homeClass = localHome.value();
+                            Class<?> homeClass = localHome.value();
                             try {
                                 Method create = homeClass.getMethod("create");
-                                Class remoteClass = create.getReturnType();
+                                Class<?> remoteClass = create.getReturnType();
                                 remoteBean.setHome(homeClass.getName());
                                 remoteBean.setRemote(remoteClass.getName());
                             } catch (NoSuchMethodException e) {
@@ -374,11 +382,11 @@
                     if (remoteBean instanceof SessionBean) {
                         SessionBean sessionBean = (SessionBean) remoteBean;
 
-                        List<Class> interfaces = new ArrayList();
+                        List<Class> interfaces = new ArrayList<Class>();
                         interfaces.addAll(Arrays.asList(clazz.getInterfaces()));
 
                         // Remove anything not eligable to be a remote or local interface
-                        for (Class interfce : copy(interfaces)) {
+                        for (Class<?> interfce : copy(interfaces)) {
                             String name = interfce.getName();
                             if (name.equals("java.io.Serializable") || name.equals("java.io.Externalizable") || name.startsWith("javax.ejb."))
                             {
@@ -396,7 +404,7 @@
                         declared.add(sessionBean.getLocal());
                         declared.add(sessionBean.getServiceEndpoint());
 
-                        for (Class interfce : copy(interfaces)) {
+                        for (Class<?> interfce : copy(interfaces)) {
                             if (declared.contains(interfce.getName())) {
                                 // Interface type was declared in xml
                                 interfaces.remove(interfce);
@@ -495,7 +503,6 @@
             }
 
             for (EJB ejb : ejbList) {
-
                 buildEjbRef(consumer, ejb, null);
             }
 
@@ -571,6 +578,30 @@
                 Member member = new MethodMember(method);
                 buildPersistenceUnit(consumer, pUnit, member);
             }
+
+            List<PersistenceContext> persistenceContextList = new ArrayList<PersistenceContext>();
+            PersistenceContexts persistenceContexts = (PersistenceContexts) clazz.getAnnotation(PersistenceContexts.class);
+            if(persistenceContexts != null){
+                persistenceContextList.addAll(Arrays.asList(persistenceContexts.value()));
+            }
+            PersistenceContext persistenceContext = (PersistenceContext) clazz.getAnnotation(PersistenceContext.class);
+            if (persistenceContext != null){
+                persistenceContextList.add(persistenceContext);
+            }
+            for (PersistenceContext pCtx : persistenceContextList) {
+                buildPersistenceContext(consumer, pCtx, null);
+            }
+            for (Field field : finder.findAnnotatedFields(PersistenceContext.class)) {
+                PersistenceContext pCtx = field.getAnnotation(PersistenceContext.class);
+                Member member = new FieldMember(field);
+                buildPersistenceContext(consumer, pCtx, member);
+            }
+            for (Method method : finder.findAnnotatedMethods(PersistenceContext.class)) {
+                PersistenceContext pCtx = method.getAnnotation(PersistenceContext.class);
+                Member member = new MethodMember(method);
+                buildPersistenceContext(consumer, pCtx, member);
+            }
+
         }
 
         private void buildPersistenceUnit(JndiConsumer consumer, PersistenceUnit persistenceUnit, Member member) throws OpenEJBException {
@@ -650,6 +681,89 @@
 
         }
 
+        /**
+         * Refer 16.11.2.1 Overriding Rules of EJB Core Spec for overriding rules
+         * @param consumer
+         * @param persistenceContext
+         * @param member
+         * @throws OpenEJBException
+         */
+        private void buildPersistenceContext(JndiConsumer consumer, PersistenceContext persistenceContext, Member member) throws OpenEJBException {
+            String refName = persistenceContext.name();
+            
+            if(refName.equals("")) {
+                refName = (member == null) ? null : member.getDeclaringClass().getName() + "/" + member.getName();
+            }
+            
+            if(refName == null) {
+                throw new OpenEJBException("The name attribute is not specified for the class level annotation @PersistenceContext with unitName="
+                     + persistenceContext.unitName() + ". It is mandatory for all class level PersistenceContext annotations.");
+            }
+            PersistenceContextRef persistenceContextRef = null;
+            
+            List<PersistenceContextRef> persistenceContextRefs = consumer.getPersistenceContextRef();
+            for (PersistenceContextRef pcRef : persistenceContextRefs) {
+                if (pcRef.getPersistenceContextRefName().equals(refName)) {
+                    persistenceContextRef = pcRef;
+                    break;
+                }
+            }
+            
+            if (persistenceContextRef == null) {
+                persistenceContextRef = new PersistenceContextRef();
+                persistenceContextRef.setPersistenceUnitName(persistenceContext.unitName());
+                persistenceContextRef.setPersistenceContextRefName(refName);
+                if(persistenceContext.type() == javax.persistence.PersistenceContextType.EXTENDED) {
+                    persistenceContextRef.setPersistenceContextType(PersistenceContextType.EXTENDED);
+                } else {
+                    persistenceContextRef.setPersistenceContextType(PersistenceContextType.TRANSACTION);
+                }                
+                persistenceContextRefs.add(persistenceContextRef);
+            } else {
+                if (persistenceContextRef.getPersistenceUnitName() == null || ("").equals(persistenceContextRef.getPersistenceUnitName())) {
+                    persistenceContextRef.setPersistenceUnitName(persistenceContext.unitName());
+                }
+                if (persistenceContextRef.getPersistenceContextType() == null || ("").equals(persistenceContextRef.getPersistenceContextType())) {
+                    if(persistenceContext.type() == javax.persistence.PersistenceContextType.EXTENDED) {
+                        persistenceContextRef.setPersistenceContextType(PersistenceContextType.EXTENDED);
+                    } else {
+                        persistenceContextRef.setPersistenceContextType(PersistenceContextType.TRANSACTION);
+                    }                
+                }                
+            }
+            
+            List<Property> persistenceProperties = persistenceContextRef.getPersistenceProperty();
+            if (persistenceProperties == null) {
+                persistenceProperties = new ArrayList<Property>();
+                persistenceContextRef.setPersistenceProperty(persistenceProperties);
+            }
+            
+            Property property = null;
+            for(PersistenceProperty persistenceProperty : persistenceContext.properties()) {
+                boolean flag = true;
+                for(Property prpty : persistenceProperties) {
+                    if(prpty.getName().equals(persistenceProperty.name())) {
+                        flag = false;
+                        break;
+                    } 
+                }
+                if(flag) {
+                    property = new Property();
+                    property.setName(persistenceProperty.name());
+                    property.setValue(persistenceProperty.value());
+                    persistenceProperties.add(property);
+                }
+            }
+                        
+            if (member != null) {
+                // Set the member name where this will be injected
+                InjectionTarget target = new InjectionTarget();
+                target.setInjectionTargetClass(member.getDeclaringClass().getName());
+                target.setInjectionTargetName(member.getName());
+                persistenceContextRef.getInjectionTarget().add(target);
+            }                        
+        }
+        
         private void buildEjbRef(JndiConsumer consumer, EJB ejb, Member member) {
             EjbRef ejbRef = new EjbRef();
 

Propchange: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/AnnotationDeployer.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author Id Revision HeadURL

Propchange: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/JndiEncInfoBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Date Rev Author Id Revision HeadURL

Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java?view=diff&rev=497793&r1=497792&r2=497793
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java Fri Jan 19 04:43:14 2007
@@ -379,8 +379,8 @@
 
     public EntityManagerFactory findEntityManagerFactory(String persistenceName) throws OpenEJBException {
         EntityManagerFactory factory;
-        if (persistenceName != null) {
-            if (persistenceName.indexOf("#") == -1 && !"".equals(persistenceName)) {
+        if (persistenceName != null && !"".equals(persistenceName)) {
+            if (persistenceName.indexOf("#") == -1 ) {
                 factory = entityManagerFactories.get(persistenceName);
             } else {
                 factory = findEntityManagerFactory(allFactories, jarPath, persistenceName);

Modified: incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextRef.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextRef.java?view=diff&rev=497793&r1=497792&r2=497793
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextRef.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/PersistenceContextRef.java Fri Jan 19 04:43:14 2007
@@ -168,4 +168,8 @@
         this.id = value;
     }
 
+    public void setPersistenceProperty(List<Property> persistenceProperty) {
+        this.persistenceProperty = persistenceProperty;
+    }
+
 }

Modified: incubator/openejb/trunk/openejb3/container/openejb-persistence/pom.xml
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-persistence/pom.xml?view=diff&rev=497793&r1=497792&r2=497793
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-persistence/pom.xml (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-persistence/pom.xml Fri Jan 19 04:43:14 2007
@@ -69,6 +69,11 @@
     </plugins>
   </build>
   <dependencies>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>openejb-core</artifactId>
+      <version>${pom.version}</version>
+    </dependency>
     <dependency>
       <groupId>asm</groupId>
       <artifactId>asm</artifactId>