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() {
}