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;
- }
}