Author: cschneider
Date: Mon Feb 23 15:46:30 2015
New Revision: 1661704

URL: http://svn.apache.org/r1661704
Log:
[ARIES-1299] Correct support for PersistenceContext and PersistenceUnit

Added:
    
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/Namespaces.java
      - copied, changed from r1661703, 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java
Modified:
    
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/Generator.java
    
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
    
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java
    
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java
    
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java

Modified: 
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/Generator.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/Generator.java?rev=1661704&r1=1661703&r2=1661704&view=diff
==============================================================================
--- 
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/Generator.java
 (original)
+++ 
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/Generator.java
 Mon Feb 23 15:46:30 2015
@@ -21,6 +21,7 @@ package org.apache.aries.blueprint.plugi
 import java.io.OutputStream;
 import java.lang.reflect.Field;
 
+import javax.persistence.PersistenceContext;
 import javax.persistence.PersistenceUnit;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
@@ -97,9 +98,7 @@ public class Generator implements Proper
         writer.writeCharacters("\n");
         writeTransactional(bean.transactionDef);
 
-        if (bean.persistenceUnitField != null) {
-            writePersistenceUnit(bean.persistenceUnitField);
-        }
+        writePersistenceFields(bean.persistenceFields);
     }
     
     private void writeTransactional(TransactionalDef transactionDef)
@@ -113,17 +112,32 @@ public class Generator implements Proper
         }
     }
 
-    private void writePersistenceUnit(Field field) throws XMLStreamException {
-        PersistenceUnit persistenceUnit = 
field.getAnnotation(PersistenceUnit.class);
-        if (persistenceUnit !=null) {
+    
+    private void writePersistenceFields(Field[] fields) throws 
XMLStreamException {
+        for (Field field : fields) {
+            writePersistenceField(field);
+        }
+    }
+
+    private void writePersistenceField(Field field) throws XMLStreamException {
+        PersistenceContext persistenceContext = 
field.getAnnotation(PersistenceContext.class);
+        if (persistenceContext != null) {
             writer.writeCharacters("    ");
             writer.writeEmptyElement("jpa", "context", NS_JPA);
+            writer.writeAttribute("unitname", persistenceContext.unitName());
+            writer.writeAttribute("property", field.getName());
+            writer.writeCharacters("\n");
+        }
+        PersistenceUnit persistenceUnit = 
field.getAnnotation(PersistenceUnit.class);
+        if (persistenceUnit != null) {
+            writer.writeCharacters("    ");
+            writer.writeEmptyElement("jpa", "unit", NS_JPA);
             writer.writeAttribute("unitname", persistenceUnit.unitName());
             writer.writeAttribute("property", field.getName());
             writer.writeCharacters("\n");
         }
     }
-    
+
     private void writeServiceRefs() throws XMLStreamException {
         for (OsgiServiceBean serviceBean : context.getServiceRefs()) {
             writeServiceRef(serviceBean);

Modified: 
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java?rev=1661704&r1=1661703&r2=1661704&view=diff
==============================================================================
--- 
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
 (original)
+++ 
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
 Mon Feb 23 15:46:30 2015
@@ -21,12 +21,15 @@ package org.apache.aries.blueprint.plugi
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Named;
+import javax.persistence.PersistenceContext;
 import javax.persistence.PersistenceUnit;
 
 import org.springframework.stereotype.Component;
@@ -37,7 +40,7 @@ public class Bean implements Comparable<
     public String initMethod;
     public String destroyMethod;
     public SortedSet<Property> properties;
-    public Field persistenceUnitField;
+    public Field[] persistenceFields;
     public TransactionalDef transactionDef; 
     
     public Bean(Class<?> clazz) {
@@ -53,7 +56,7 @@ public class Bean implements Comparable<
                 this.destroyMethod = method.getName();
             }
         }
-        this.persistenceUnitField = getPersistenceUnit();
+        this.persistenceFields = getPersistenceFields();
         this.transactionDef = new JavaxTransactionFactory().create(clazz);
         if (this.transactionDef == null) {
             this.transactionDef = new SpringTransactionFactory().create(clazz);
@@ -61,15 +64,17 @@ public class Bean implements Comparable<
         properties = new TreeSet<Property>();
     }
 
-    private Field getPersistenceUnit() {
+    private Field[] getPersistenceFields() {
+        List<Field> persistenceFields = new ArrayList<Field>();
         Field[] fields = clazz.getDeclaredFields();
         for (Field field : fields) {
+            PersistenceContext persistenceContext = 
field.getAnnotation(PersistenceContext.class);
             PersistenceUnit persistenceUnit = 
field.getAnnotation(PersistenceUnit.class);
-            if (persistenceUnit !=null) {
-                 return field;
+            if (persistenceContext !=null || persistenceUnit != null) {
+                 persistenceFields.add(field);
             }
         }
-        return null;
+        return persistenceFields.toArray(new Field[]{});
     }
     
     public void resolve(Matcher matcher) {

Modified: 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java?rev=1661704&r1=1661703&r2=1661704&view=diff
==============================================================================
--- 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java
 (original)
+++ 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/GeneratorTest.java
 Mon Feb 23 15:46:30 2015
@@ -21,16 +21,33 @@ package org.apache.aries.blueprint.plugi
 import static java.util.Arrays.asList;
 import static 
org.apache.aries.blueprint.plugin.FilteredClassFinder.findClasses;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Set;
 
-import org.apache.aries.blueprint.plugin.Generator;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathFactory;
+
 import org.apache.aries.blueprint.plugin.model.Context;
 import org.apache.aries.blueprint.plugin.test.MyBean1;
+import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.xbean.finder.ClassFinder;
+import org.junit.Assert;
 import org.junit.Test;
-
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
 
 public class GeneratorTest {
+
+    private XPath xpath;
+    private Document document;
+
     @Test
     public void testGenerate() throws Exception {
         ClassFinder classFinder = new 
ClassFinder(this.getClass().getClassLoader());
@@ -38,7 +55,45 @@ public class GeneratorTest {
         Set<Class<?>> beanClasses = findClasses(classFinder, 
asList(packageName));
         Context context = new Context(beanClasses);
         context.resolve();
-        new Generator(context, System.out).generate();
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        new Generator(context, os).generate();
+        System.out.println(os.toString("UTF-8"));
+
+        document = readToDocument(os);
+        xpath = XPathFactory.newInstance().newXPath();
+        //xpath.setNamespaceContext(new NameSpaces(document));
+        Node bean1 = (Node) xpath.evaluate("/blueprint/bean[@id='myBean1']", 
document, XPathConstants.NODE);
+
+        // Bean
+        Assert.assertEquals(MyBean1.class.getName(), xpath.evaluate("@class", 
bean1));
+        Assert.assertEquals("init", xpath.evaluate("@init-method", bean1));
+        Assert.assertEquals("destroy", xpath.evaluate("@destroy-method", 
bean1));
+        Assert.assertEquals("true", xpath.evaluate("@field-injection", bean1));
+        
+        // @Transactional
+        Assert.assertEquals("*", xpath.evaluate("transaction/@method", bean1));
+        Assert.assertEquals("Required", xpath.evaluate("transaction/@value", 
bean1));
+
+        // @PersistenceContext
+        Assert.assertEquals("person", xpath.evaluate("context/@unitname", 
bean1));
+        Assert.assertEquals("em", xpath.evaluate("context/@property", bean1));
+        
+        // @PersistenceUnit
+        Assert.assertEquals("person", xpath.evaluate("unit/@unitname", bean1));
+        Assert.assertEquals("emf", xpath.evaluate("unit/@property", bean1));
+        
+        // @Autowired
+        Assert.assertEquals("my1", 
xpath.evaluate("property[@name='bean2']/@ref", bean1));
+
+
     }
-    
+
+    private Document readToDocument(ByteArrayOutputStream os) throws 
ParserConfigurationException,
+        SAXException, IOException {
+        InputStream is = new ByteArrayInputStream(os.toByteArray());
+        DocumentBuilderFactory builderFactory = 
DocumentBuilderFactory.newInstance();
+        DocumentBuilder builder = builderFactory.newDocumentBuilder();
+        return builder.parse(is);
+    }
+
 }

Copied: 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/Namespaces.java
 (from r1661703, 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java)
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/Namespaces.java?p2=aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/Namespaces.java&p1=aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java&r1=1661703&r2=1661704&rev=1661704&view=diff
==============================================================================
--- 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java
 (original)
+++ 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/Namespaces.java
 Mon Feb 23 15:46:30 2015
@@ -16,33 +16,39 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.blueprint.plugin.test;
+package org.apache.aries.blueprint.plugin;
 
-import javax.inject.Singleton;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceUnit;
-import javax.transaction.Transactional;
-import javax.transaction.Transactional.TxType;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-@Singleton
-@Transactional(value=TxType.REQUIRED)
-public class MyBean1 extends ParentBean {
-
-    @Autowired
-    ServiceA bean2;
-    
-    @PersistenceUnit(unitName="person")
-    EntityManager em;
-    
-    public void init() {
+import java.util.Iterator;
+
+import javax.xml.XMLConstants;
+import javax.xml.namespace.NamespaceContext;
+
+import org.w3c.dom.Document;
+
+
+public class Namespaces implements NamespaceContext {
+    private Document doc;
+
+    public Namespaces(Document doc) {
+        this.doc = doc;
+    }
+
+    @Override
+    public String getNamespaceURI(String prefix) {
+        if (prefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) {
+            return doc.lookupNamespaceURI(null);
+        } else {
+            return doc.lookupNamespaceURI(prefix);
+        }
     }
-    
-    public void destroy() {
+
+    @Override
+    public String getPrefix(String namespaceURI) {
+        return doc.lookupPrefix(namespaceURI);
     }
 
-    public void saveData() {
-        
+    @Override
+    public Iterator<String> getPrefixes(String namespaceURI) {
+        return null;
     }
-}
+}
\ No newline at end of file

Modified: 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java?rev=1661704&r1=1661703&r2=1661704&view=diff
==============================================================================
--- 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java
 (original)
+++ 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/model/BeanTest.java
 Mon Feb 23 15:46:30 2015
@@ -26,6 +26,7 @@ import javax.inject.Named;
 import org.apache.aries.blueprint.plugin.test.MyBean1;
 import org.apache.aries.blueprint.plugin.test.MyBean3;
 import org.apache.aries.blueprint.plugin.test.ServiceAImpl1;
+import org.junit.Assert;
 import org.junit.Test;
 
 
@@ -39,7 +40,9 @@ public class BeanTest {
         assertEquals("myBean1", bean.id); // Name derived from class name
         assertEquals("init", bean.initMethod);
         assertEquals("destroy", bean.destroyMethod);
-        assertEquals("em", bean.persistenceUnitField.getName());
+        Assert.assertEquals(2, bean.persistenceFields.length);
+        assertEquals("em", bean.persistenceFields[0].getName());
+        assertEquals("emf", bean.persistenceFields[1].getName());
         assertEquals("*", bean.transactionDef.getMethod());
         assertEquals("Required", bean.transactionDef.getType());
         assertEquals(1, bean.properties.size());
@@ -56,7 +59,7 @@ public class BeanTest {
         assertEquals("myBean3", bean.id); // Name derived from class name
         assertNull("There should be no initMethod", bean.initMethod);
         assertNull("There should be no destroyMethod", bean.destroyMethod);
-        assertNull("There should be no persistenceUnit", 
bean.persistenceUnitField);
+        assertEquals("There should be no persistence fields", 0, 
bean.persistenceFields.length);
         assertEquals("*", bean.transactionDef.getMethod());
         assertEquals("RequiresNew", bean.transactionDef.getType());
         assertEquals(3, bean.properties.size());
@@ -71,7 +74,7 @@ public class BeanTest {
         assertEquals("Name should be defined using @Named", definedName, 
bean.id);
         assertNull("There should be no initMethod", bean.initMethod);
         assertNull("There should be no destroyMethod", bean.destroyMethod);
-        assertNull("There should be no persistenceUnit", 
bean.persistenceUnitField);
+        assertEquals("There should be no persistence fields", 0, 
bean.persistenceFields.length);
         assertNull("There should be no transaction definition", 
bean.transactionDef);
         assertEquals("There should be no properties", 0, 
bean.properties.size());
     }

Modified: 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java?rev=1661704&r1=1661703&r2=1661704&view=diff
==============================================================================
--- 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java
 (original)
+++ 
aries/trunk/blueprint/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/test/MyBean1.java
 Mon Feb 23 15:46:30 2015
@@ -20,6 +20,7 @@ package org.apache.aries.blueprint.plugi
 
 import javax.inject.Singleton;
 import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
 import javax.persistence.PersistenceUnit;
 import javax.transaction.Transactional;
 import javax.transaction.Transactional.TxType;
@@ -33,9 +34,12 @@ public class MyBean1 extends ParentBean
     @Autowired
     ServiceA bean2;
     
-    @PersistenceUnit(unitName="person")
+    @PersistenceContext(unitName="person")
     EntityManager em;
     
+    @PersistenceUnit(unitName="person")
+    EntityManager emf;
+    
     public void init() {
     }
     


Reply via email to