Author: ggerla
Date: Fri Jul  3 21:00:49 2015
New Revision: 1689090

URL: http://svn.apache.org/r1689090
Log:
- Implemented ARIES-1344 scanning all jpa annotated fields
- Add integration test to verify new functionality

Added:
    
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithMultiAnnotationTest.java
    
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithSingleAnnotationTest.java
      - copied, changed from r1688844, 
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithSupplierTest.java
Removed:
    
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithEmTest.java
    
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithEmfTest.java
    
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithSupplierTest.java
Modified:
    
aries/trunk/jpa/itests/jpa-container-blueprint-testbundle/src/main/resources/OSGI-INF/blueprint/config.xml
    
aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaBeanProcessor.java

Modified: 
aries/trunk/jpa/itests/jpa-container-blueprint-testbundle/src/main/resources/OSGI-INF/blueprint/config.xml
URL: 
http://svn.apache.org/viewvc/aries/trunk/jpa/itests/jpa-container-blueprint-testbundle/src/main/resources/OSGI-INF/blueprint/config.xml?rev=1689090&r1=1689089&r2=1689090&view=diff
==============================================================================
--- 
aries/trunk/jpa/itests/jpa-container-blueprint-testbundle/src/main/resources/OSGI-INF/blueprint/config.xml
 (original)
+++ 
aries/trunk/jpa/itests/jpa-container-blueprint-testbundle/src/main/resources/OSGI-INF/blueprint/config.xml
 Fri Jul  3 21:00:49 2015
@@ -42,6 +42,18 @@
                
class="org.apache.aries.jpa.itest.testbundle.service.impl.CarServiceWithSupplierImpl">
                <tx:transaction method="*" value="Required" />
        </bean>
+       
+       <service ref="carServiceMulti"
+               
interface="org.apache.aries.jpa.itest.testbundle.service.CarService">
+               <service-properties>
+                       <entry key="type" value="multiannotation" />
+               </service-properties>
+       </service>
+       
+       <bean id="carServiceMulti"
+               
class="org.apache.aries.jpa.itest.testbundle.service.impl.CarServiceWithMultiAnnotationImpl">
+               <tx:transaction method="*" value="Required" />
+       </bean>
     
 </blueprint>
 

Added: 
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithMultiAnnotationTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithMultiAnnotationTest.java?rev=1689090&view=auto
==============================================================================
--- 
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithMultiAnnotationTest.java
 (added)
+++ 
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithMultiAnnotationTest.java
 Fri Jul  3 21:00:49 2015
@@ -0,0 +1,60 @@
+/*  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.aries.jpa.blueprint.aries.itest;
+
+import org.apache.aries.jpa.itest.AbstractJPAItest;
+import org.apache.aries.jpa.itest.testbundle.entities.Car;
+import org.apache.aries.jpa.itest.testbundle.service.CarService;
+import org.junit.Assert;
+import org.junit.Test;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+
+public class BlueprintWithMultiAnnotationTest extends AbstractJPAItest {
+    
+       @Test
+    public void testMultiAnnotationQuery() throws Exception {
+               CarService carService = getService(CarService.class, 
"(type=multiannotation)");
+               
+               resolveBundles();
+        Car c = new Car();
+        c.setColour("Blue");
+        c.setNumberPlate("AB11EMF");
+        c.setNumberOfSeats(7);
+        c.setEngineSize(1900);
+
+        carService.addCar(c);
+
+        Car car2 = carService.getCar("AB11EMF");
+        Assert.assertEquals(c.getNumberPlate(), car2.getNumberPlate());
+        
+        carService.deleteCar("AB11EMF");
+        car2 = carService.getCar("AB11EMF");
+        Assert.assertNull(car2);
+    }
+
+       @Configuration
+    public Option[] configuration() {
+        return new Option[] {
+            baseOptions(), //
+            ariesJpa20(), //
+            hibernate(), //
+            derbyDSF(), //
+            testBundleBlueprint(),
+            //debug()
+        };
+    }
+}

Copied: 
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithSingleAnnotationTest.java
 (from r1688844, 
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithSupplierTest.java)
URL: 
http://svn.apache.org/viewvc/aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithSingleAnnotationTest.java?p2=aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithSingleAnnotationTest.java&p1=aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithSupplierTest.java&r1=1688844&r2=1689090&rev=1689090&view=diff
==============================================================================
--- 
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithSupplierTest.java
 (original)
+++ 
aries/trunk/jpa/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/BlueprintWithSingleAnnotationTest.java
 Fri Jul  3 21:00:49 2015
@@ -23,11 +23,11 @@ import org.junit.Test;
 import org.ops4j.pax.exam.Configuration;
 import org.ops4j.pax.exam.Option;
 
-public class BlueprintWithSupplierTest extends AbstractJPAItest {
+public class BlueprintWithSingleAnnotationTest extends AbstractJPAItest {
 
        @Test
     public void testEmfAddQuery() throws Exception {
-               CarService carService = getService(CarService.class, 
"(type=supplier)");
+               CarService carService = getService(CarService.class, 
"(type=emf)");
                
                resolveBundles();
         Car c = new Car();

Modified: 
aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaBeanProcessor.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaBeanProcessor.java?rev=1689090&r1=1689089&r2=1689090&view=diff
==============================================================================
--- 
aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaBeanProcessor.java
 (original)
+++ 
aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaBeanProcessor.java
 Fri Jul  3 21:00:49 2015
@@ -19,6 +19,8 @@
 package org.apache.aries.jpa.blueprint.impl;
 
 import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -41,110 +43,125 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class JpaBeanProcessor implements BeanProcessor {
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(JpaInterceptor.class);
-    public static final String JPA_PROCESSOR_BEAN_NAME = 
"org_apache_aries_jpan";
-    private Map<Object, EmSupplierProxy> emProxies;
-    private Map<Object, EntityManagerFactory> emfProxies;
-    private ComponentDefinitionRegistry cdr;
-
-    public JpaBeanProcessor() {
-        emProxies = new ConcurrentHashMap<Object, EmSupplierProxy>();
-        emfProxies = new ConcurrentHashMap<Object, EntityManagerFactory>();
-    }
-
-    public void setCdr(ComponentDefinitionRegistry cdr) {
-        this.cdr = cdr;
-    }
-
-    public void afterDestroy(Object bean, String beanName) {
-        EmSupplierProxy emProxy = emProxies.get(bean);
-        if (emProxy != null) {
-            emProxy.close();
-        }
-        EntityManagerFactory emfProxy = emfProxies.get(bean);
-        if (emfProxy != null) {
-               emfProxy.close();
-        }
-    }
-
-    public Object afterInit(Object bean, String beanName, BeanCreator 
beanCreator, BeanMetadata beanData) {
-        return bean;
-    }
-
-    public void beforeDestroy(Object bean, String beanName) {
-    }
-
-    public Object beforeInit(Object bean, String beanName, BeanCreator 
beanCreator, BeanMetadata beanData) {
-        Class<?> c = bean.getClass();
-        Field field = getPersistenceField(c);
-        if (field == null) {
-            return bean;
-        }
-        BundleContext context = FrameworkUtil.getBundle(c).getBundleContext();
-        field.setAccessible(true);
-
-        PersistenceContext pcAnn = 
field.getAnnotation(PersistenceContext.class);
-        if (pcAnn != null) {
-        LOGGER.debug("Adding jpa/jta interceptor bean {} with class {}", 
beanName, c);
-
-        EmSupplierProxy supplierProxy = new EmSupplierProxy(context, 
pcAnn.unitName());
-               emProxies.put(bean, supplierProxy);
-        try {
-                   field.set(bean, getEmProxy(field, supplierProxy));
-        } catch (Exception e) {
-            throw new IllegalStateException("Error setting field " + field, e);
-        }
-        Interceptor interceptor = new JpaInterceptor(supplierProxy);
-        cdr.registerInterceptorWithComponent(beanData, interceptor);
-        } else {
-               PersistenceUnit puAnn = 
field.getAnnotation(PersistenceUnit.class);
-               if(puAnn != null) {
-                       LOGGER.debug("Adding emf proxy");
-                       
-               EntityManagerFactory emfProxy = EmfProxyFactory.create(context, 
puAnn.unitName()); 
-               emfProxies.put(bean, emfProxy);
-               try {
-                   field.set(bean, getEmfProxy(field, emfProxy));
-               } catch (Exception e) {
-                   throw new IllegalStateException("Error setting field " + 
field, e);
-               }       
-               }
-        }
-        return bean;
-    }
-
-    private Object getEmfProxy(Field field, EntityManagerFactory 
supplierProxy) {
-        if (field.getType() == EntityManagerFactory.class) {
-            return supplierProxy;
-        } else {
-            throw new IllegalStateException(
-                                            "Field with @PersistenceUnit is 
not of type EntityManagerFactory "
-                                                + field);
-        }
-    }
-
-    private Object getEmProxy(Field field, EmSupplierProxy supplierProxy) {
-        if (field.getType() == EmSupplier.class) {
-            return supplierProxy;
-        } else if (field.getType() == EntityManager.class) {
-            return EmProxyFactory.create(supplierProxy);
-        } else {
-            throw new IllegalStateException(
-                                            "Field with @PersistenceContext is 
not of type EntityManager or EmSupplier "
-                                                + field);
-        }
-    }
-
-    private Field getPersistenceField(Class<?> c) {
-        for (Field field : c.getDeclaredFields()) {
-            if (field.getAnnotation(PersistenceContext.class) != null) {
-                return field;
-            }
-            if (field.getAnnotation(PersistenceUnit.class) != null) {
-                return field;
-            }
-        }
-        return null;
-    }
+       private static final Logger LOGGER = LoggerFactory
+                       .getLogger(JpaInterceptor.class);
+       public static final String JPA_PROCESSOR_BEAN_NAME = 
"org_apache_aries_jpan";
+       private Map<Object, EmSupplierProxy> emProxies;
+       private Map<Object, EntityManagerFactory> emfProxies;
+       private ComponentDefinitionRegistry cdr;
+
+       public JpaBeanProcessor() {
+               emProxies = new ConcurrentHashMap<Object, EmSupplierProxy>();
+               emfProxies = new ConcurrentHashMap<Object, 
EntityManagerFactory>();
+       }
+
+       public void setCdr(ComponentDefinitionRegistry cdr) {
+               this.cdr = cdr;
+       }
+
+       public void afterDestroy(Object bean, String beanName) {
+               EmSupplierProxy emProxy = emProxies.get(bean);
+               if (emProxy != null) {
+                       emProxy.close();
+               }
+               EntityManagerFactory emfProxy = emfProxies.get(bean);
+               if (emfProxy != null) {
+                       emfProxy.close();
+               }
+       }
+
+       public Object afterInit(Object bean, String beanName,
+                       BeanCreator beanCreator, BeanMetadata beanData) {
+               return bean;
+       }
+
+       public void beforeDestroy(Object bean, String beanName) {
+       }
+
+       public Object beforeInit(Object bean, String beanName,
+                       BeanCreator beanCreator, BeanMetadata beanData) {
+               Class<?> c = bean.getClass();
+               List<Field> jpaAnnotated = new ArrayList<Field>();
+               getPersistenceFields(c, jpaAnnotated);
+
+               for (Field field : jpaAnnotated) {
+                       if (field == null) {
+                               return bean;
+                       }
+                       BundleContext context = FrameworkUtil.getBundle(c)
+                                       .getBundleContext();
+                       field.setAccessible(true);
+
+                       PersistenceContext pcAnn = field
+                                       
.getAnnotation(PersistenceContext.class);
+                       if (pcAnn != null) {
+                               LOGGER.debug(
+                                               "Adding jpa/jta interceptor 
bean {} with class {}",
+                                               beanName, c);
+
+                               EmSupplierProxy supplierProxy = new 
EmSupplierProxy(context,
+                                               pcAnn.unitName());
+                               emProxies.put(bean, supplierProxy);
+                               try {
+                                       field.set(bean, getEmProxy(field, 
supplierProxy));
+                               } catch (Exception e) {
+                                       throw new IllegalStateException("Error 
setting field "
+                                                       + field, e);
+                               }
+                               Interceptor interceptor = new 
JpaInterceptor(supplierProxy);
+                               cdr.registerInterceptorWithComponent(beanData, 
interceptor);
+                       } else {
+                               PersistenceUnit puAnn = field
+                                               
.getAnnotation(PersistenceUnit.class);
+                               if (puAnn != null) {
+                                       LOGGER.debug("Adding emf proxy");
+
+                                       EntityManagerFactory emfProxy = 
EmfProxyFactory.create(
+                                                       context, 
puAnn.unitName());
+                                       emfProxies.put(bean, emfProxy);
+                                       try {
+                                               field.set(bean, 
getEmfProxy(field, emfProxy));
+                                       } catch (Exception e) {
+                                               throw new 
IllegalStateException("Error setting field "
+                                                               + field, e);
+                                       }
+                               }
+                       }
+               }
+               return bean;
+       }
+
+       private Object getEmfProxy(Field field, EntityManagerFactory 
supplierProxy) {
+               if (field.getType() == EntityManagerFactory.class) {
+                       return supplierProxy;
+               } else {
+                       throw new IllegalStateException(
+                                       "Field with @PersistenceUnit is not of 
type EntityManagerFactory "
+                                                       + field);
+               }
+       }
+
+       private Object getEmProxy(Field field, EmSupplierProxy supplierProxy) {
+               if (field.getType() == EmSupplier.class) {
+                       return supplierProxy;
+               } else if (field.getType() == EntityManager.class) {
+                       return EmProxyFactory.create(supplierProxy);
+               } else {
+                       throw new IllegalStateException(
+                                       "Field with @PersistenceContext is not 
of type EntityManager or EmSupplier "
+                                                       + field);
+               }
+       }
+
+       private void getPersistenceFields(Class<?> c, List<Field> jpaAnnotated) 
{
+               for (Field field : c.getDeclaredFields()) {
+                       if (field.getAnnotation(PersistenceContext.class) != 
null
+                                       || 
field.getAnnotation(PersistenceUnit.class) != null) {
+                               if (jpaAnnotated != null) {
+                                       jpaAnnotated.add(field);
+                               }
+                       }
+               }
+       }
 
 }


Reply via email to