You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2015/09/16 12:07:01 UTC

svn commit: r1703377 - in /aries/trunk/jpa: examples/tasklist-blueprint/ examples/tasklist-blueprint/src/main/java/org/apache/aries/jpa/example/tasklist/blueprint/impl/ examples/tasklist-blueprint/src/main/resources/OSGI-INF/blueprint/ examples/tasklis...

Author: cschneider
Date: Wed Sep 16 10:07:01 2015
New Revision: 1703377

URL: http://svn.apache.org/r1703377
Log:
[ARIES-1405] Switch to ComponentDefinitionRegistryProcessor

Added:
    aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/AnnotationScanner.java
    aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaComponentProcessor.java
Removed:
    aries/trunk/jpa/examples/tasklist-blueprint/src/main/java/org/apache/aries/jpa/example/tasklist/blueprint/impl/TaskServiceWithSupplier.java
    aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaAnnotatedMemberHandler.java
    aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaBeanProcessor.java
Modified:
    aries/trunk/jpa/examples/tasklist-blueprint/pom.xml
    aries/trunk/jpa/examples/tasklist-blueprint/src/main/resources/OSGI-INF/blueprint/context.xml
    aries/trunk/jpa/examples/tasklist-model/osgi.bnd
    aries/trunk/jpa/examples/tasklist-model/src/main/resources/META-INF/persistence.xml
    aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaNsHandler.java

Modified: aries/trunk/jpa/examples/tasklist-blueprint/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/jpa/examples/tasklist-blueprint/pom.xml?rev=1703377&r1=1703376&r2=1703377&view=diff
==============================================================================
--- aries/trunk/jpa/examples/tasklist-blueprint/pom.xml (original)
+++ aries/trunk/jpa/examples/tasklist-blueprint/pom.xml Wed Sep 16 10:07:01 2015
@@ -48,11 +48,6 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.apache.aries.jpa</groupId>
-            <artifactId>org.apache.aries.jpa.api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
             <groupId>org.apache.aries.transaction</groupId>
             <artifactId>org.apache.aries.transaction.blueprint</artifactId>
             <version>1.0.2</version>
@@ -64,12 +59,6 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.aries.jpa</groupId>
-            <artifactId>org.apache.aries.jpa.support</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.11</version>

Modified: aries/trunk/jpa/examples/tasklist-blueprint/src/main/resources/OSGI-INF/blueprint/context.xml
URL: http://svn.apache.org/viewvc/aries/trunk/jpa/examples/tasklist-blueprint/src/main/resources/OSGI-INF/blueprint/context.xml?rev=1703377&r1=1703376&r2=1703377&view=diff
==============================================================================
--- aries/trunk/jpa/examples/tasklist-blueprint/src/main/resources/OSGI-INF/blueprint/context.xml (original)
+++ aries/trunk/jpa/examples/tasklist-blueprint/src/main/resources/OSGI-INF/blueprint/context.xml Wed Sep 16 10:07:01 2015
@@ -28,10 +28,9 @@
 
 	<service ref="taskService" interface="org.apache.aries.jpa.example.tasklist.model.TaskService">
 	</service>
-	<bean id="taskService" class="org.apache.aries.jpa.example.tasklist.blueprint.impl.TaskServiceWithSupplier">
+	<bean id="taskService" class="org.apache.aries.jpa.example.tasklist.blueprint.impl.TaskServiceImpl">
 		<tx:transaction method="*"/>
 	</bean>
-	<!-- <bean class="org.apache.aries.jpa.example.tasklist.blueprint.impl.TaskServiceImpl"/> -->
     
     <!-- 
         We use the task service directly here to make the example smaller.

Modified: aries/trunk/jpa/examples/tasklist-model/osgi.bnd
URL: http://svn.apache.org/viewvc/aries/trunk/jpa/examples/tasklist-model/osgi.bnd?rev=1703377&r1=1703376&r2=1703377&view=diff
==============================================================================
--- aries/trunk/jpa/examples/tasklist-model/osgi.bnd (original)
+++ aries/trunk/jpa/examples/tasklist-model/osgi.bnd Wed Sep 16 10:07:01 2015
@@ -1,5 +1,6 @@
 Meta-Persistence: \
     META-INF/persistence.xml
-Dynamic-Import-Package: \
+Import-Package: \
     org.hibernate.proxy, \
-    javassist.util.proxy
+    javassist.util.proxy, \
+    *

Modified: aries/trunk/jpa/examples/tasklist-model/src/main/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/aries/trunk/jpa/examples/tasklist-model/src/main/resources/META-INF/persistence.xml?rev=1703377&r1=1703376&r2=1703377&view=diff
==============================================================================
--- aries/trunk/jpa/examples/tasklist-model/src/main/resources/META-INF/persistence.xml (original)
+++ aries/trunk/jpa/examples/tasklist-model/src/main/resources/META-INF/persistence.xml Wed Sep 16 10:07:01 2015
@@ -24,11 +24,13 @@
     <persistence-unit name="tasklist" transaction-type="JTA">
         <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
         
+        
         <!-- Only used when transaction-type=JTA -->
         <jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=tasklist)</jta-data-source>
         
         <!-- Only used when transaction-type=RESOURCE_LOCAL -->
         <non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=tasklist)</non-jta-data-source>
+        <class>org.apache.aries.jpa.example.tasklist.model.Task</class>
         <properties>
             <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
             <property name="hibernate.hbm2ddl.auto" value="create-drop"/>

Added: aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/AnnotationScanner.java
URL: http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/AnnotationScanner.java?rev=1703377&view=auto
==============================================================================
--- aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/AnnotationScanner.java (added)
+++ aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/AnnotationScanner.java Wed Sep 16 10:07:01 2015
@@ -0,0 +1,55 @@
+package org.apache.aries.jpa.blueprint.impl;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceContext;
+import javax.persistence.PersistenceUnit;
+
+import org.apache.aries.jpa.supplier.EmSupplier;
+
+public class AnnotationScanner {
+    private final List<Class<?>> managedJpaClasses;
+    
+    public AnnotationScanner() {
+        managedJpaClasses = Arrays.asList(EntityManagerFactory.class, EntityManager.class, EmSupplier.class);
+    }
+    
+    public List<AccessibleObject> getJpaAnnotatedMembers(Class<?> c) {
+        final List<AccessibleObject> jpaAnnotated = new ArrayList<AccessibleObject>();
+
+        Class<?> cl = c;
+        if (c != Object.class) {
+            while (cl != Object.class) {
+                for (Field field : cl.getDeclaredFields()) {
+                    if (field.getAnnotation(PersistenceContext.class) != null
+                        || field.getAnnotation(PersistenceUnit.class) != null) {
+                        jpaAnnotated.add(field);
+                    }
+                }
+
+                for (Method method : cl.getDeclaredMethods()) {
+                    if (method.getAnnotation(PersistenceContext.class) != null
+                        || method.getAnnotation(PersistenceUnit.class) != null) {
+
+                        Class<?>[] pType = method.getParameterTypes();
+                        if (method.getName().startsWith("set") && pType.length == 1
+                            && managedJpaClasses.contains(pType[0])) {
+                            jpaAnnotated.add(method);
+                        }
+                    }
+                }
+
+                cl = cl.getSuperclass();
+            }
+        }
+
+        return jpaAnnotated;
+    }
+}

Added: aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaComponentProcessor.java
URL: http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaComponentProcessor.java?rev=1703377&view=auto
==============================================================================
--- aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaComponentProcessor.java (added)
+++ aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaComponentProcessor.java Wed Sep 16 10:07:01 2015
@@ -0,0 +1,178 @@
+package org.apache.aries.jpa.blueprint.impl;
+
+import static org.osgi.service.jpa.EntityManagerFactoryBuilder.JPA_UNIT_NAME;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceContext;
+import javax.persistence.PersistenceUnit;
+
+import org.apache.aries.blueprint.ComponentDefinitionRegistry;
+import org.apache.aries.blueprint.ComponentDefinitionRegistryProcessor;
+import org.apache.aries.blueprint.Interceptor;
+import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.PassThroughMetadata;
+import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
+import org.apache.aries.blueprint.mutable.MutableRefMetadata;
+import org.apache.aries.blueprint.mutable.MutableReferenceMetadata;
+import org.apache.aries.jpa.blueprint.supplier.impl.ServiceProxy;
+import org.apache.aries.jpa.supplier.EmSupplier;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
+import org.osgi.service.blueprint.reflect.ReferenceMetadata;
+import org.osgi.service.coordinator.Coordinator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JpaComponentProcessor implements ComponentDefinitionRegistryProcessor {
+    private static final Logger LOGGER = LoggerFactory.getLogger(JpaComponentProcessor.class);
+    private AnnotationScanner annotationScanner;
+    private ParserContext pc;
+
+    public JpaComponentProcessor() {
+        annotationScanner = new AnnotationScanner();
+    }
+    
+    public void setPc(ParserContext pc) {
+        this.pc = pc;
+    }
+
+    @Override
+    public void process(ComponentDefinitionRegistry cdr) {
+        PassThroughMetadata bundleMeta = (PassThroughMetadata)cdr.getComponentDefinition("blueprintBundle");
+        Bundle bundle = (Bundle)bundleMeta.getObject();
+        
+        Set<String> components = new HashSet<>(cdr.getComponentDefinitionNames());
+        for (String component : components) {
+            ComponentMetadata compDef = cdr.getComponentDefinition(component);
+            if (compDef instanceof MutableBeanMetadata && !((MutableBeanMetadata)compDef).isProcessor()) {
+                handleComponent((MutableBeanMetadata)compDef, bundle, cdr);
+            }
+        }
+        System.out.println(cdr.getComponentDefinitionNames());
+    }
+
+    private void handleComponent(MutableBeanMetadata compDef, Bundle bundle, ComponentDefinitionRegistry cdr) {
+        if (compDef.getClassName() == null) {
+            LOGGER.warn("No classname for " + compDef.getId());
+            return;
+        }
+        String compName = compDef.getId();
+        Class<?> compClass;
+        try {
+            compClass = bundle.loadClass(compDef.getClassName());
+        } catch (ClassNotFoundException e) {
+            throw new IllegalArgumentException("Bean class not found " + compDef.getClassName());
+        }
+        BundleContext context = bundle.getBundleContext();
+        compDef.setFieldInjection(true);
+        List<AccessibleObject> jpaAnnotatedMembers = annotationScanner.getJpaAnnotatedMembers(compClass);
+        for (AccessibleObject member : jpaAnnotatedMembers) {
+            member.setAccessible(true);
+            String propName = getName(member);
+
+            PersistenceContext pcAnn = member.getAnnotation(PersistenceContext.class);
+            if (pcAnn != null) {
+                LOGGER.info("Adding jpa interceptor for bean {}, prop {} with class {}", compName, propName, compClass);
+                Class<?> iface = getType(member);
+                if (iface != null) {
+                    MutableRefMetadata emRef = getServiceRef(cdr, pcAnn.unitName(), iface);
+                    compDef.addProperty(propName, emRef);
+
+                    Interceptor interceptor = createInterceptor(context, pcAnn);
+                    cdr.registerInterceptorWithComponent(compDef, interceptor);
+
+                }
+            }
+
+            PersistenceUnit puAnn = member.getAnnotation(PersistenceUnit.class);
+            if (puAnn != null) {
+                LOGGER.info("Adding emf proxy for bean {}, prop {} with class {}", compName, propName, compClass);
+                MutableRefMetadata emfRef = getServiceRef(cdr, puAnn.unitName(), EntityManagerFactory.class);
+                compDef.addProperty(propName, emfRef);
+            }
+            
+        }
+    }
+
+    private MutableRefMetadata getServiceRef(ComponentDefinitionRegistry cdr, String unitName, Class<?> iface) {
+        ComponentMetadata serviceRef = cdr.getComponentDefinition(getId(unitName, iface));
+        if (serviceRef == null)  {
+            serviceRef = createServiceRef(unitName, iface);
+            cdr.registerComponentDefinition(serviceRef);
+        } else {
+            LOGGER.info("Using already registered ref " + serviceRef.getId());
+        }
+        MutableRefMetadata ref = pc.createMetadata(MutableRefMetadata.class);
+        ref.setComponentId(serviceRef.getId());
+        return ref;
+    }
+
+
+
+    private Interceptor createInterceptor(BundleContext context, PersistenceContext pcAnn) {
+        String filter = getFilter(EmSupplier.class, pcAnn.unitName());
+        EmSupplier supplierProxy = ServiceProxy.create(context, EmSupplier.class, filter);
+        Coordinator coordinator = ServiceProxy.create(context, Coordinator.class);
+        Interceptor interceptor = new JpaInterceptor(supplierProxy, coordinator);
+        return interceptor;
+    }
+
+    private String getName(AccessibleObject member) {
+        if (member instanceof Field) {
+            return ((Field)member).getName();
+        } else if (member instanceof Method) {
+            Method method = (Method)member;
+            String name = method.getName();
+            if (!name.startsWith("set")) {
+                return null;
+            }
+            return name. substring(3, 4).toLowerCase() + name.substring(4);
+        }
+        return null;
+    }
+    
+    private Class<?> getType(AccessibleObject member) {
+        if (member instanceof Field) {
+            return ((Field)member).getType();
+        } else if (member instanceof Method) {
+            Method method = (Method)member;
+            return method.getParameterTypes()[0];
+        }
+        return null;
+    }
+
+    @SuppressWarnings("unchecked")
+    ComponentMetadata createServiceRef(String unitName, Class<?> iface) {
+        final MutableReferenceMetadata refMeta = pc.createMetadata(MutableReferenceMetadata.class);
+        refMeta.setActivation(getDefaultActivation(pc));
+        refMeta.setAvailability(ReferenceMetadata.AVAILABILITY_MANDATORY);
+        refMeta.setRuntimeInterface(iface);
+        refMeta.setFilter(String.format("(%s=%s)", JPA_UNIT_NAME, unitName));
+        refMeta.setTimeout(Integer.parseInt(pc.getDefaultTimeout()));
+        refMeta.setDependsOn((List<String>)Collections.EMPTY_LIST);
+        refMeta.setId(getId(unitName, iface));
+        return refMeta;
+    }
+    
+    public String getId(String unitName, Class<?> iface) {
+        return unitName + "_" + iface.getSimpleName();
+    }
+    
+    private int getDefaultActivation(ParserContext ctx) {
+        return "ACTIVATION_EAGER".equalsIgnoreCase(ctx.getDefaultActivation())
+            ? ReferenceMetadata.ACTIVATION_EAGER : ReferenceMetadata.ACTIVATION_LAZY;
+    }
+    
+    private String getFilter(Class<?> clazz, String unitName) {
+        return String.format("(&(objectClass=%s)(%s=%s))", clazz.getName(), JPA_UNIT_NAME, unitName);
+    }
+}

Modified: aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaNsHandler.java
URL: http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaNsHandler.java?rev=1703377&r1=1703376&r2=1703377&view=diff
==============================================================================
--- aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaNsHandler.java (original)
+++ aries/trunk/jpa/jpa-blueprint/src/main/java/org/apache/aries/jpa/blueprint/impl/JpaNsHandler.java Wed Sep 16 10:07:01 2015
@@ -18,43 +18,34 @@
  */
 package org.apache.aries.jpa.blueprint.impl;
 
-import static org.osgi.service.jpa.EntityManagerFactoryBuilder.JPA_UNIT_NAME;
-
 import java.net.URL;
-import java.util.Collections;
-import java.util.List;
 import java.util.Set;
 
-import javax.transaction.TransactionManager;
-
 import org.apache.aries.blueprint.ComponentDefinitionRegistry;
 import org.apache.aries.blueprint.NamespaceHandler;
 import org.apache.aries.blueprint.ParserContext;
 import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
 import org.apache.aries.blueprint.mutable.MutablePassThroughMetadata;
-import org.apache.aries.blueprint.mutable.MutableReferenceMetadata;
-import org.apache.aries.jpa.supplier.EmSupplier;
 import org.osgi.service.blueprint.reflect.ComponentMetadata;
 import org.osgi.service.blueprint.reflect.Metadata;
-import org.osgi.service.blueprint.reflect.ReferenceMetadata;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
 public class JpaNsHandler implements NamespaceHandler {
 
-    public static final String NAMESPACE_JPA_20 = "http://aries.apache.org/xmlns/jpan/v2.0.0";
+    public static final String NAMESPACE_JPA_20 = "http://aries.apache.org/xmlns/jpa/v2.0.0";
     public static final String NAMESPACE_JPAN_10 = "http://aries.apache.org/xmlns/jpan/v1.0.0";
 
     private void parseElement(Element elt, ComponentMetadata cm, ParserContext pc) {
         ComponentDefinitionRegistry cdr = pc.getComponentDefinitionRegistry();
 
         if ("enable".equals(elt.getLocalName())) {
-            if (!cdr.containsComponentDefinition(JpaBeanProcessor.JPA_PROCESSOR_BEAN_NAME)) {
+            if (!cdr.containsComponentDefinition(JpaComponentProcessor.class.getSimpleName())) {
                 MutableBeanMetadata meta = pc.createMetadata(MutableBeanMetadata.class);
-                meta.setId(JpaBeanProcessor.JPA_PROCESSOR_BEAN_NAME);
-                meta.setRuntimeClass(JpaBeanProcessor.class);
+                meta.setId(JpaComponentProcessor.class.getSimpleName());
+                meta.setRuntimeClass(JpaComponentProcessor.class);
                 meta.setProcessor(true);
-                meta.addProperty("cdr", passThrough(pc, cdr));
+                meta.addProperty("pc", passThrough(pc, pc));
                 cdr.registerComponentDefinition(meta);
             }
         }
@@ -67,7 +58,6 @@ public class JpaNsHandler implements Nam
     }
 
     public ComponentMetadata decorate(Node node, ComponentMetadata cm, ParserContext pc) {
-        System.out.println(cm.getId());
         if (node instanceof Element) {
             Element elt = (Element)node;
             parseElement(elt, cm, pc);
@@ -96,35 +86,4 @@ public class JpaNsHandler implements Nam
         return null;
     }
 
-    @SuppressWarnings("unchecked")
-    ComponentMetadata createEmSupplierRef(ParserContext pc, String unitName) {
-        final MutableReferenceMetadata refMetadata = pc.createMetadata(MutableReferenceMetadata.class);
-        refMetadata.setActivation(getDefaultActivation(pc));
-        refMetadata.setAvailability(ReferenceMetadata.AVAILABILITY_MANDATORY);
-        refMetadata.setRuntimeInterface(EmSupplier.class);
-        refMetadata.setInterface(EmSupplier.class.getName());
-        refMetadata.setFilter(String.format("(%s=%s)", JPA_UNIT_NAME, unitName));
-        refMetadata.setTimeout(Integer.parseInt(pc.getDefaultTimeout()));
-        refMetadata.setDependsOn((List<String>)Collections.EMPTY_LIST);
-        refMetadata.setId(pc.generateId());
-        return refMetadata;
-    }
-    
-    @SuppressWarnings("unchecked")
-    ComponentMetadata createTransactionManagerRef(ParserContext pc) {
-        final MutableReferenceMetadata refMetadata = pc.createMetadata(MutableReferenceMetadata.class);
-        refMetadata.setActivation(getDefaultActivation(pc));
-        refMetadata.setAvailability(ReferenceMetadata.AVAILABILITY_MANDATORY);
-        refMetadata.setRuntimeInterface(TransactionManager.class);
-        refMetadata.setInterface(TransactionManager.class.getName());
-        refMetadata.setTimeout(Integer.parseInt(pc.getDefaultTimeout()));
-        refMetadata.setDependsOn((List<String>)Collections.EMPTY_LIST);
-        refMetadata.setId(pc.generateId());
-        return refMetadata;
-    }
-
-    private int getDefaultActivation(ParserContext ctx) {
-        return "ACTIVATION_EAGER".equalsIgnoreCase(ctx.getDefaultActivation())
-            ? ReferenceMetadata.ACTIVATION_EAGER : ReferenceMetadata.ACTIVATION_LAZY;
-    }
 }