This is an automated email from the ASF dual-hosted git repository.

alien11689 pushed a commit to branch 
ARIES-2172-support-jakarta-transactional-and-persistence-in-blueprint-maven-plugin
in repository https://gitbox.apache.org/repos/asf/aries.git

commit 2baba6c5db997d8729e4a5ea86d9695b0e76616d
Author: Dominik Przybysz <[email protected]>
AuthorDate: Wed Mar 12 22:31:52 2025 +0100

    ARIES-2172: Support jakarta transactional and persistence in 
blueprint-maven-plugin
---
 .github/dependabot.yaml                            |  3 +
 .../blueprint-maven-plugin/pom.xml                 | 13 ++++
 .../AbstractPersistenceContextHandler.java}        | 14 ++--
 .../AbstractPersistenceUnitHandler.java}           | 20 ++---
 .../AbstractTransactionFactory.java                | 15 ++--
 .../handlers/{javax => common}/Namespaces.java     | 18 ++---
 .../JakartaTransactionFactory.java}                | 21 ++---
 .../jakarta/PersistenceContextHandler.java         | 37 +++++++++
 .../handlers/jakarta/PersistenceUnitHandler.java   | 37 +++++++++
 .../handlers/javax/CdiTransactionFactory.java      | 17 +---
 .../handlers/javax/JavaxTransactionFactory.java    | 15 +---
 .../handlers/javax/PersistenceContextHandler.java  | 39 +---------
 .../handlers/javax/PersistenceUnitHandler.java     | 43 +----------
 .../aries/blueprint/plugin/model/Argument.java     |  4 -
 .../aries/blueprint/plugin/model/BeanRefStore.java |  1 -
 .../aries/blueprint/plugin/model/Introspector.java |  2 -
 .../aries/blueprint/plugin/model/Property.java     |  4 -
 ...ries.blueprint.plugin.spi.BeanAnnotationHandler |  1 +
 ...ies.blueprint.plugin.spi.FieldAnnotationHandler |  2 +
 ...es.blueprint.plugin.spi.MethodAnnotationHandler |  1 +
 .../blueprint/plugin/BlueprintFileWriterTest.java  | 90 +++++++++++++++-------
 .../plugin/jakarta/JakartaParentBean.java          | 55 +++++++++++++
 .../plugin/jakarta/JakartaTransactionalBean.java   | 63 +++++++++++++++
 23 files changed, 322 insertions(+), 193 deletions(-)

diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml
index 96cc1c328..4dc64073f 100644
--- a/.github/dependabot.yaml
+++ b/.github/dependabot.yaml
@@ -37,6 +37,9 @@ updates:
       - dependency-name: "jakarta.enterprise:jakarta.enterprise.cdi-api"
         versions:
           - ">=4.0.0" # does not support java 8
+      - dependency-name: "jakarta.persistence:jakarta.persistence-api"
+        versions:
+          - ">3.0.0" # does not support java 8
       - dependency-name: "javax.enterprise:cdi-api"
         versions:
           - ">2.0.SP1" # 2.0-PFD2 is considered as newer, but is older
diff --git a/blueprint-maven-plugin/blueprint-maven-plugin/pom.xml 
b/blueprint-maven-plugin/blueprint-maven-plugin/pom.xml
index b379d498e..6a28a328f 100644
--- a/blueprint-maven-plugin/blueprint-maven-plugin/pom.xml
+++ b/blueprint-maven-plugin/blueprint-maven-plugin/pom.xml
@@ -45,6 +45,8 @@
         <jakarta.annotation-api.version>2.1.1</jakarta.annotation-api.version>
         
<jakarta.enterprise.cdi-api.version>3.0.1</jakarta.enterprise.cdi-api.version>
         <jakarta.inject.version>2.0.1.MR</jakarta.inject.version>
+        
<jakarta.persistence-api.version>3.0.0</jakarta.persistence-api.version>
+        
<jakarta.transaction-api.version>2.0.1</jakarta.transaction-api.version>
         <javax.annotation-api.version>1.3.2</javax.annotation-api.version>
         
<javax.enterprise.cdi-api.version>2.0.SP1</javax.enterprise.cdi-api.version>
         <javax.inject.version>1</javax.inject.version>
@@ -152,6 +154,11 @@
             <artifactId>javax.transaction-api</artifactId>
             <version>${javax.transaction-api.version}</version>
         </dependency>
+        <dependency>
+            <groupId>jakarta.transaction</groupId>
+            <artifactId>jakarta.transaction-api</artifactId>
+            <version>${jakarta.transaction-api.version}</version>
+        </dependency>
         <dependency>
             <groupId>javax.enterprise</groupId>
             <artifactId>cdi-api</artifactId>
@@ -167,6 +174,12 @@
             <artifactId>persistence-api</artifactId>
             <version>${persistence-api.version}</version>
         </dependency>
+        <dependency>
+            <groupId>jakarta.persistence</groupId>
+            <artifactId>jakarta.persistence-api</artifactId>
+            <version>${jakarta.persistence-api.version}</version>
+        </dependency>
+
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>osgi.cmpn</artifactId>
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceContextHandler.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/AbstractPersistenceContextHandler.java
similarity index 83%
copy from 
blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceContextHandler.java
copy to 
blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/AbstractPersistenceContextHandler.java
index 76f5ad731..e169b40cb 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceContextHandler.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/AbstractPersistenceContextHandler.java
@@ -16,25 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.blueprint.plugin.handlers.javax;
+package org.apache.aries.blueprint.plugin.handlers.common;
 
 import org.apache.aries.blueprint.plugin.spi.BeanEnricher;
 import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
 import org.apache.aries.blueprint.plugin.spi.FieldAnnotationHandler;
 import org.apache.aries.blueprint.plugin.spi.XmlWriter;
 
-import javax.persistence.PersistenceContext;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.util.List;
 
-public class PersistenceContextHandler implements 
FieldAnnotationHandler<PersistenceContext> {
+public abstract class AbstractPersistenceContextHandler<T extends Annotation> 
implements FieldAnnotationHandler<T> {
 
-    @Override
-    public Class<PersistenceContext> getAnnotation() {
-        return PersistenceContext.class;
-    }
+    protected abstract String getUnitName(Field field);
 
     @Override
     public void handleFieldAnnotation(Class<?> clazz, List<Field> fields, 
ContextEnricher contextEnricher, BeanEnricher beanEnricher) {
@@ -42,13 +39,12 @@ public class PersistenceContextHandler implements 
FieldAnnotationHandler<Persist
         if (nsJpa1 != null) {
             for (final Field field : fields) {
                 final String name = field.getName();
-                final PersistenceContext persistenceContext = 
field.getAnnotation(PersistenceContext.class);
                 
beanEnricher.addBeanContentWriter("javax.persistence.field.context/" + name, 
new XmlWriter() {
                     @Override
                     public void write(XMLStreamWriter writer) throws 
XMLStreamException {
                         writer.writeEmptyElement("context");
                         writer.writeDefaultNamespace(nsJpa1);
-                        writer.writeAttribute("unitname", 
persistenceContext.unitName());
+                        writer.writeAttribute("unitname", getUnitName(field));
                         writer.writeAttribute("property", name);
                     }
                 });
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceUnitHandler.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/AbstractPersistenceUnitHandler.java
similarity index 77%
copy from 
blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceUnitHandler.java
copy to 
blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/AbstractPersistenceUnitHandler.java
index d6907aea2..2b25c5a9b 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceUnitHandler.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/AbstractPersistenceUnitHandler.java
@@ -16,29 +16,26 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.blueprint.plugin.handlers.javax;
+package org.apache.aries.blueprint.plugin.handlers.common;
 
 import org.apache.aries.blueprint.plugin.spi.BeanEnricher;
 import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
 import org.apache.aries.blueprint.plugin.spi.FieldAnnotationHandler;
 import org.apache.aries.blueprint.plugin.spi.XmlWriter;
 
-import javax.persistence.PersistenceUnit;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.util.List;
 
-import static 
org.apache.aries.blueprint.plugin.handlers.javax.Namespaces.PATTERN_NS_JPA1;
-import static 
org.apache.aries.blueprint.plugin.handlers.javax.Namespaces.PATTERN_NS_JPA2;
-import static 
org.apache.aries.blueprint.plugin.handlers.javax.Namespaces.getNamespaceByPattern;
+import static 
org.apache.aries.blueprint.plugin.handlers.common.Namespaces.PATTERN_NS_JPA1;
+import static 
org.apache.aries.blueprint.plugin.handlers.common.Namespaces.PATTERN_NS_JPA2;
+import static 
org.apache.aries.blueprint.plugin.handlers.common.Namespaces.getNamespaceByPattern;
 
-public class PersistenceUnitHandler implements 
FieldAnnotationHandler<PersistenceUnit> {
+public abstract class AbstractPersistenceUnitHandler<T extends Annotation> 
implements FieldAnnotationHandler<T> {
 
-    @Override
-    public Class<PersistenceUnit> getAnnotation() {
-        return PersistenceUnit.class;
-    }
+    protected abstract String getUnitName(Field field);
 
     @Override
     public void handleFieldAnnotation(Class<?> clazz, List<Field> fields, 
ContextEnricher contextEnricher, BeanEnricher beanEnricher) {
@@ -46,13 +43,12 @@ public class PersistenceUnitHandler implements 
FieldAnnotationHandler<Persistenc
         if (nsJpa1 != null) {
             for (final Field field : fields) {
                 final String name = field.getName();
-                final PersistenceUnit persistenceUnit = 
field.getAnnotation(PersistenceUnit.class);
                 
beanEnricher.addBeanContentWriter("javax.persistence.field.unit/" + name, new 
XmlWriter() {
                     @Override
                     public void write(XMLStreamWriter writer) throws 
XMLStreamException {
                         writer.writeEmptyElement("unit");
                         writer.writeDefaultNamespace(nsJpa1);
-                        writer.writeAttribute("unitname", 
persistenceUnit.unitName());
+                        writer.writeAttribute("unitname", getUnitName(field));
                         writer.writeAttribute("property", name);
                     }
                 });
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/AbstractTransactionFactory.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/AbstractTransactionFactory.java
similarity index 88%
rename from 
blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/AbstractTransactionFactory.java
rename to 
blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/AbstractTransactionFactory.java
index 009120a09..bbe2c705a 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/AbstractTransactionFactory.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/AbstractTransactionFactory.java
@@ -16,11 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.blueprint.plugin.handlers.javax;
+package org.apache.aries.blueprint.plugin.handlers.common;
 
-import org.apache.aries.blueprint.plugin.spi.*;
+import org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler;
+import org.apache.aries.blueprint.plugin.spi.BeanEnricher;
+import org.apache.aries.blueprint.plugin.spi.BlueprintConfiguration;
+import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
+import org.apache.aries.blueprint.plugin.spi.MethodAnnotationHandler;
+import org.apache.aries.blueprint.plugin.spi.XmlWriter;
 
-import javax.transaction.Transactional;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 import java.lang.annotation.Annotation;
@@ -28,10 +32,11 @@ import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
 import java.util.List;
 
-abstract class AbstractTransactionFactory<T extends Annotation> implements 
BeanAnnotationHandler<T>, MethodAnnotationHandler<T> {
-    abstract String getTransactionTypeName(AnnotatedElement annotatedElement);
+public abstract class AbstractTransactionFactory<T extends Annotation> 
implements BeanAnnotationHandler<T>, MethodAnnotationHandler<T> {
+    protected abstract String getTransactionTypeName(AnnotatedElement 
annotatedElement);
 
     private static final String ENABLE_ANNOTATION = 
"transaction.enableAnnotation";
+
     @Override
     public void handleMethodAnnotation(Class<?> clazz, List<Method> methods, 
ContextEnricher contextEnricher, BeanEnricher beanEnricher) {
         final String nsTx1 = 
Namespaces.getNamespaceByPattern(contextEnricher.getBlueprintConfiguration().getNamespaces(),
 Namespaces.PATTERN_NS_TX1);
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/Namespaces.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/Namespaces.java
similarity index 62%
rename from 
blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/Namespaces.java
rename to 
blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/Namespaces.java
index 7dafb70c3..4dd5d75d2 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/Namespaces.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/common/Namespaces.java
@@ -16,18 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.blueprint.plugin.handlers.javax;
+package org.apache.aries.blueprint.plugin.handlers.common;
 
 import java.util.Set;
 
-class Namespaces {
-    static final String PATTERN_NS_JPA1 = 
"http\\:\\/\\/aries\\.apache\\.org\\/xmlns\\/jpa\\/v1\\.(.)\\.(.)";
-    static final String PATTERN_NS_JPA2 = 
"http\\:\\/\\/aries\\.apache\\.org\\/xmlns\\/jpa\\/v2\\.(.)\\.(.)";
-    static final String PATTERN_NS_TX1 = 
"http\\:\\/\\/aries\\.apache\\.org\\/xmlns\\/transactions\\/v1\\.(.)\\.(.)";
-    static final String PATTERN_NS_TX2 = 
"http\\:\\/\\/aries\\.apache\\.org\\/xmlns\\/transactions\\/v2\\.(.)\\.(.)";
+public class Namespaces {
+    public static final String PATTERN_NS_JPA1 = 
"http\\:\\/\\/aries\\.apache\\.org\\/xmlns\\/jpa\\/v1\\.(.)\\.(.)";
+    public static final String PATTERN_NS_JPA2 = 
"http\\:\\/\\/aries\\.apache\\.org\\/xmlns\\/jpa\\/v2\\.(.)\\.(.)";
+    public static final String PATTERN_NS_TX1 = 
"http\\:\\/\\/aries\\.apache\\.org\\/xmlns\\/transactions\\/v1\\.(.)\\.(.)";
+    public static final String PATTERN_NS_TX2 = 
"http\\:\\/\\/aries\\.apache\\.org\\/xmlns\\/transactions\\/v2\\.(.)\\.(.)";
     private static final String NS_TX_1_2_0 = 
"http://aries.apache.org/xmlns/transactions/v1.2.0";;
 
-    static String getNamespaceByPattern(Set<String> namespaces, String 
pattern) {
+    public static String getNamespaceByPattern(Set<String> namespaces, String 
pattern) {
         for (String namespace : namespaces) {
             if (namespace.matches(pattern)) {
                 return namespace;
@@ -35,8 +35,8 @@ class Namespaces {
         }
         return null;
     }
-    
-    static boolean isTX12(String namespace) {
+
+    public static boolean isTX12(String namespace) {
         return NS_TX_1_2_0.equals(namespace);
     }
 }
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/JavaxTransactionFactory.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/jakarta/JakartaTransactionFactory.java
similarity index 60%
copy from 
blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/JavaxTransactionFactory.java
copy to 
blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/jakarta/JakartaTransactionFactory.java
index c338ec2e3..afb75cce4 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/JavaxTransactionFactory.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/jakarta/JakartaTransactionFactory.java
@@ -16,28 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.aries.blueprint.plugin.handlers.javax;
+package org.apache.aries.blueprint.plugin.handlers.jakarta;
 
 import com.google.common.base.CaseFormat;
-
-import org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler;
-import org.apache.aries.blueprint.plugin.spi.BeanEnricher;
-import org.apache.aries.blueprint.plugin.spi.BlueprintConfiguration;
-import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
-import org.apache.aries.blueprint.plugin.spi.MethodAnnotationHandler;
-import org.apache.aries.blueprint.plugin.spi.XmlWriter;
-
-import javax.transaction.Transactional;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
+import jakarta.transaction.Transactional;
+import 
org.apache.aries.blueprint.plugin.handlers.common.AbstractTransactionFactory;
 
 import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Method;
-import java.util.List;
 
-public class JavaxTransactionFactory extends 
AbstractTransactionFactory<Transactional> {
+public class JakartaTransactionFactory extends 
AbstractTransactionFactory<Transactional> {
 
-    String getTransactionTypeName(AnnotatedElement annotatedElement) {
+    protected String getTransactionTypeName(AnnotatedElement annotatedElement) 
{
         Transactional transactional = 
annotatedElement.getAnnotation(Transactional.class);
         return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, 
transactional.value().name());
     }
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/jakarta/PersistenceContextHandler.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/jakarta/PersistenceContextHandler.java
new file mode 100644
index 000000000..6a09ca4e3
--- /dev/null
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/jakarta/PersistenceContextHandler.java
@@ -0,0 +1,37 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.blueprint.plugin.handlers.jakarta;
+
+import jakarta.persistence.PersistenceContext;
+import 
org.apache.aries.blueprint.plugin.handlers.common.AbstractPersistenceContextHandler;
+
+import java.lang.reflect.Field;
+
+public class PersistenceContextHandler extends 
AbstractPersistenceContextHandler<PersistenceContext> {
+
+    @Override
+    public Class<PersistenceContext> getAnnotation() {
+        return PersistenceContext.class;
+    }
+
+    @Override
+    protected String getUnitName(Field field) {
+        return field.getAnnotation(PersistenceContext.class).unitName();
+    }
+}
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/jakarta/PersistenceUnitHandler.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/jakarta/PersistenceUnitHandler.java
new file mode 100644
index 000000000..15e92c34c
--- /dev/null
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/jakarta/PersistenceUnitHandler.java
@@ -0,0 +1,37 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.blueprint.plugin.handlers.jakarta;
+
+import jakarta.persistence.PersistenceUnit;
+import 
org.apache.aries.blueprint.plugin.handlers.common.AbstractPersistenceUnitHandler;
+
+import java.lang.reflect.Field;
+
+public class PersistenceUnitHandler extends 
AbstractPersistenceUnitHandler<PersistenceUnit> {
+
+    @Override
+    public Class<PersistenceUnit> getAnnotation() {
+        return PersistenceUnit.class;
+    }
+
+    @Override
+    protected String getUnitName(Field field) {
+        return field.getAnnotation(PersistenceUnit.class).unitName();
+    }
+}
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/CdiTransactionFactory.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/CdiTransactionFactory.java
index 8dcfe804b..b5bb1a435 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/CdiTransactionFactory.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/CdiTransactionFactory.java
@@ -19,27 +19,14 @@
 package org.apache.aries.blueprint.plugin.handlers.javax;
 
 import com.google.common.base.CaseFormat;
-
-import 
org.apache.aries.blueprint.plugin.handlers.javax.AbstractTransactionFactory;
-import org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler;
-import org.apache.aries.blueprint.plugin.spi.BeanEnricher;
-import org.apache.aries.blueprint.plugin.spi.BlueprintConfiguration;
-import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
-import org.apache.aries.blueprint.plugin.spi.MethodAnnotationHandler;
-import org.apache.aries.blueprint.plugin.spi.XmlWriter;
+import 
org.apache.aries.blueprint.plugin.handlers.common.AbstractTransactionFactory;
 
 import javax.transaction.cdi.Transactional;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-
 import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.Set;
 
 public class CdiTransactionFactory extends 
AbstractTransactionFactory<Transactional> {
 
-    String getTransactionTypeName(AnnotatedElement annotatedElement) {
+    protected String getTransactionTypeName(AnnotatedElement annotatedElement) 
{
         final Transactional transactional = 
annotatedElement.getAnnotation(Transactional.class);
         return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, 
transactional.value().name());
     }
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/JavaxTransactionFactory.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/JavaxTransactionFactory.java
index c338ec2e3..7839f4cb1 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/JavaxTransactionFactory.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/JavaxTransactionFactory.java
@@ -19,25 +19,14 @@
 package org.apache.aries.blueprint.plugin.handlers.javax;
 
 import com.google.common.base.CaseFormat;
-
-import org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler;
-import org.apache.aries.blueprint.plugin.spi.BeanEnricher;
-import org.apache.aries.blueprint.plugin.spi.BlueprintConfiguration;
-import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
-import org.apache.aries.blueprint.plugin.spi.MethodAnnotationHandler;
-import org.apache.aries.blueprint.plugin.spi.XmlWriter;
+import 
org.apache.aries.blueprint.plugin.handlers.common.AbstractTransactionFactory;
 
 import javax.transaction.Transactional;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-
 import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Method;
-import java.util.List;
 
 public class JavaxTransactionFactory extends 
AbstractTransactionFactory<Transactional> {
 
-    String getTransactionTypeName(AnnotatedElement annotatedElement) {
+    protected String getTransactionTypeName(AnnotatedElement annotatedElement) 
{
         Transactional transactional = 
annotatedElement.getAnnotation(Transactional.class);
         return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, 
transactional.value().name());
     }
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceContextHandler.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceContextHandler.java
index 76f5ad731..531b5f217 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceContextHandler.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceContextHandler.java
@@ -18,18 +18,12 @@
  */
 package org.apache.aries.blueprint.plugin.handlers.javax;
 
-import org.apache.aries.blueprint.plugin.spi.BeanEnricher;
-import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
-import org.apache.aries.blueprint.plugin.spi.FieldAnnotationHandler;
-import org.apache.aries.blueprint.plugin.spi.XmlWriter;
+import 
org.apache.aries.blueprint.plugin.handlers.common.AbstractPersistenceContextHandler;
 
 import javax.persistence.PersistenceContext;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
 import java.lang.reflect.Field;
-import java.util.List;
 
-public class PersistenceContextHandler implements 
FieldAnnotationHandler<PersistenceContext> {
+public class PersistenceContextHandler extends 
AbstractPersistenceContextHandler<PersistenceContext> {
 
     @Override
     public Class<PersistenceContext> getAnnotation() {
@@ -37,32 +31,7 @@ public class PersistenceContextHandler implements 
FieldAnnotationHandler<Persist
     }
 
     @Override
-    public void handleFieldAnnotation(Class<?> clazz, List<Field> fields, 
ContextEnricher contextEnricher, BeanEnricher beanEnricher) {
-        final String nsJpa1 = 
Namespaces.getNamespaceByPattern(contextEnricher.getBlueprintConfiguration().getNamespaces(),
 Namespaces.PATTERN_NS_JPA1);
-        if (nsJpa1 != null) {
-            for (final Field field : fields) {
-                final String name = field.getName();
-                final PersistenceContext persistenceContext = 
field.getAnnotation(PersistenceContext.class);
-                
beanEnricher.addBeanContentWriter("javax.persistence.field.context/" + name, 
new XmlWriter() {
-                    @Override
-                    public void write(XMLStreamWriter writer) throws 
XMLStreamException {
-                        writer.writeEmptyElement("context");
-                        writer.writeDefaultNamespace(nsJpa1);
-                        writer.writeAttribute("unitname", 
persistenceContext.unitName());
-                        writer.writeAttribute("property", name);
-                    }
-                });
-            }
-        }
-        final String nsJpa2 = 
Namespaces.getNamespaceByPattern(contextEnricher.getBlueprintConfiguration().getNamespaces(),
 Namespaces.PATTERN_NS_JPA2);
-        if (nsJpa2 != null) {
-            
contextEnricher.addBlueprintContentWriter("javax.persistence.enableJpa2", new 
XmlWriter() {
-                @Override
-                public void write(XMLStreamWriter writer) throws 
XMLStreamException {
-                    writer.writeEmptyElement("enable");
-                    writer.writeDefaultNamespace(nsJpa2);
-                }
-            });
-        }
+    protected String getUnitName(Field field) {
+        return field.getAnnotation(PersistenceContext.class).unitName();
     }
 }
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceUnitHandler.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceUnitHandler.java
index d6907aea2..bb89137c9 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceUnitHandler.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/handlers/javax/PersistenceUnitHandler.java
@@ -18,22 +18,12 @@
  */
 package org.apache.aries.blueprint.plugin.handlers.javax;
 
-import org.apache.aries.blueprint.plugin.spi.BeanEnricher;
-import org.apache.aries.blueprint.plugin.spi.ContextEnricher;
-import org.apache.aries.blueprint.plugin.spi.FieldAnnotationHandler;
-import org.apache.aries.blueprint.plugin.spi.XmlWriter;
+import 
org.apache.aries.blueprint.plugin.handlers.common.AbstractPersistenceUnitHandler;
 
 import javax.persistence.PersistenceUnit;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
 import java.lang.reflect.Field;
-import java.util.List;
 
-import static 
org.apache.aries.blueprint.plugin.handlers.javax.Namespaces.PATTERN_NS_JPA1;
-import static 
org.apache.aries.blueprint.plugin.handlers.javax.Namespaces.PATTERN_NS_JPA2;
-import static 
org.apache.aries.blueprint.plugin.handlers.javax.Namespaces.getNamespaceByPattern;
-
-public class PersistenceUnitHandler implements 
FieldAnnotationHandler<PersistenceUnit> {
+public class PersistenceUnitHandler extends 
AbstractPersistenceUnitHandler<PersistenceUnit> {
 
     @Override
     public Class<PersistenceUnit> getAnnotation() {
@@ -41,32 +31,7 @@ public class PersistenceUnitHandler implements 
FieldAnnotationHandler<Persistenc
     }
 
     @Override
-    public void handleFieldAnnotation(Class<?> clazz, List<Field> fields, 
ContextEnricher contextEnricher, BeanEnricher beanEnricher) {
-        final String nsJpa1 = 
getNamespaceByPattern(contextEnricher.getBlueprintConfiguration().getNamespaces(),
 PATTERN_NS_JPA1);
-        if (nsJpa1 != null) {
-            for (final Field field : fields) {
-                final String name = field.getName();
-                final PersistenceUnit persistenceUnit = 
field.getAnnotation(PersistenceUnit.class);
-                
beanEnricher.addBeanContentWriter("javax.persistence.field.unit/" + name, new 
XmlWriter() {
-                    @Override
-                    public void write(XMLStreamWriter writer) throws 
XMLStreamException {
-                        writer.writeEmptyElement("unit");
-                        writer.writeDefaultNamespace(nsJpa1);
-                        writer.writeAttribute("unitname", 
persistenceUnit.unitName());
-                        writer.writeAttribute("property", name);
-                    }
-                });
-            }
-        }
-        final String nsJpa2 = 
getNamespaceByPattern(contextEnricher.getBlueprintConfiguration().getNamespaces(),
 PATTERN_NS_JPA2);
-        if (nsJpa2 != null) {
-            
contextEnricher.addBlueprintContentWriter("javax.persistence.enableJpa2", new 
XmlWriter() {
-                @Override
-                public void write(XMLStreamWriter writer) throws 
XMLStreamException {
-                    writer.writeEmptyElement("enable");
-                    writer.writeDefaultNamespace(nsJpa2);
-                }
-            });
-        }
+    protected String getUnitName(Field field) {
+        return field.getAnnotation(PersistenceUnit.class).unitName();
     }
 }
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Argument.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Argument.java
index 1d8438cc2..a7af80c0d 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Argument.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Argument.java
@@ -19,16 +19,12 @@
 package org.apache.aries.blueprint.plugin.model;
 
 import org.apache.aries.blueprint.plugin.handlers.Handlers;
-import 
org.apache.aries.blueprint.plugin.spi.CollectionDependencyAnnotationHandler;
 import org.apache.aries.blueprint.plugin.spi.CustomDependencyAnnotationHandler;
 import org.apache.aries.blueprint.plugin.spi.XmlWriter;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 import java.lang.annotation.Annotation;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
 
 import static 
org.apache.aries.blueprint.plugin.model.AnnotationHelper.findName;
 import static 
org.apache.aries.blueprint.plugin.model.AnnotationHelper.findValue;
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/BeanRefStore.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/BeanRefStore.java
index 514be8eb5..d40e8a859 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/BeanRefStore.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/BeanRefStore.java
@@ -19,7 +19,6 @@
 package org.apache.aries.blueprint.plugin.model;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.SortedSet;
 import java.util.TreeSet;
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Introspector.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Introspector.java
index 359559c99..9cbf1fe13 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Introspector.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Introspector.java
@@ -18,9 +18,7 @@
  */
 package org.apache.aries.blueprint.plugin.model;
 
-import com.google.common.base.Preconditions;
 import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Property.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Property.java
index bf993981c..907e472c7 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Property.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Property.java
@@ -19,7 +19,6 @@
 package org.apache.aries.blueprint.plugin.model;
 
 import org.apache.aries.blueprint.plugin.handlers.Handlers;
-import 
org.apache.aries.blueprint.plugin.spi.CollectionDependencyAnnotationHandler;
 import org.apache.aries.blueprint.plugin.spi.CustomDependencyAnnotationHandler;
 import org.apache.aries.blueprint.plugin.spi.NamedLikeHandler;
 import org.apache.aries.blueprint.plugin.spi.XmlWriter;
@@ -30,9 +29,6 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
 
 import static 
org.apache.aries.blueprint.plugin.model.AnnotationHelper.findName;
 import static org.apache.aries.blueprint.plugin.model.NamingHelper.getBeanName;
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler
index 03e72caf8..cf6b93b0d 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.BeanAnnotationHandler
@@ -15,6 +15,7 @@
 # limitations under the License.
 #
 
+org.apache.aries.blueprint.plugin.handlers.jakarta.JakartaTransactionFactory
 org.apache.aries.blueprint.plugin.handlers.javax.JavaxTransactionFactory
 org.apache.aries.blueprint.plugin.handlers.javax.CdiTransactionFactory
 
org.apache.aries.blueprint.plugin.handlers.blueprint.config.ConfigAnnotationHandler
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.FieldAnnotationHandler
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.FieldAnnotationHandler
index 53d4b55fe..94a2afd2b 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.FieldAnnotationHandler
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.FieldAnnotationHandler
@@ -15,5 +15,7 @@
 # limitations under the License.
 #
 
+org.apache.aries.blueprint.plugin.handlers.jakarta.PersistenceContextHandler
+org.apache.aries.blueprint.plugin.handlers.jakarta.PersistenceUnitHandler
 org.apache.aries.blueprint.plugin.handlers.javax.PersistenceContextHandler
 org.apache.aries.blueprint.plugin.handlers.javax.PersistenceUnitHandler
\ No newline at end of file
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.MethodAnnotationHandler
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.MethodAnnotationHandler
index 3f1677c4f..734f539a0 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.MethodAnnotationHandler
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/main/resources/META-INF/services/org.apache.aries.blueprint.plugin.spi.MethodAnnotationHandler
@@ -15,6 +15,7 @@
 # limitations under the License.
 #
 
+org.apache.aries.blueprint.plugin.handlers.jakarta.JakartaTransactionFactory
 org.apache.aries.blueprint.plugin.handlers.jakarta.PostConstructHandler
 org.apache.aries.blueprint.plugin.handlers.jakarta.PreDestroyHandler
 org.apache.aries.blueprint.plugin.handlers.javax.PostConstructHandler
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java
index 6ab1fb4bd..8a5b88b04 100644
--- 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/BlueprintFileWriterTest.java
@@ -18,37 +18,9 @@
  */
 package org.apache.aries.blueprint.plugin;
 
-import javax.xml.XMLConstants;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Source;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static 
org.apache.aries.blueprint.plugin.FilteredClassFinder.findClasses;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
 import com.google.common.collect.Sets;
 import org.apache.aries.blueprint.plugin.jakarta.JakartaFactoryBean;
+import org.apache.aries.blueprint.plugin.jakarta.JakartaTransactionalBean;
 import org.apache.aries.blueprint.plugin.jakarta.NamedJakartaBean;
 import org.apache.aries.blueprint.plugin.jakarta.ProducedBean;
 import org.apache.aries.blueprint.plugin.jakarta.SimpleJakartaBean;
@@ -84,6 +56,35 @@ import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
+import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import javax.xml.validation.Validator;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static 
org.apache.aries.blueprint.plugin.FilteredClassFinder.findClasses;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 public class BlueprintFileWriterTest {
 
     private static final String NS_JPA = 
"http://aries.apache.org/xmlns/jpa/v1.1.0";;
@@ -152,6 +153,37 @@ public class BlueprintFileWriterTest {
         assertEquals(expectedDefs, defs);
     }
 
+    @Test
+    public void testGenerateJakartaTransactionalAndPersistence() throws 
Exception {
+        Node bean = getBeanById("jakartaTransactionalBean");
+
+        assertXpathEquals(bean, "@class", 
JakartaTransactionalBean.class.getName());
+        assertXpathEquals(bean, "@init-method", "init");
+        assertXpathEquals(bean, "@destroy-method", "destroy");
+        assertXpathDoesNotExist(bean, "@scope");
+
+        NodeList txs = (NodeList) xpath.evaluate("transaction", bean, 
XPathConstants.NODESET);
+        Set<TransactionalDef> defs = new HashSet<TransactionalDef>();
+        for (int i = 0; i < txs.getLength(); ++i) {
+            Node tx = txs.item(i);
+            defs.add(new TransactionalDef(xpath.evaluate("@method", tx), 
xpath.evaluate("@value", tx)));
+        }
+        Set<TransactionalDef> expectedDefs = Sets.newHashSet(new 
TransactionalDef("*", "RequiresNew"),
+                new TransactionalDef("txNotSupported", "NotSupported"),
+                new TransactionalDef("txMandatory", "Mandatory"),
+                new TransactionalDef("txNever", "Never"),
+                new TransactionalDef("txRequired", "Required"),
+                new TransactionalDef("txOverridenWithRequiresNew", 
"RequiresNew"),
+                new TransactionalDef("txSupports", "Supports"));
+        assertEquals(expectedDefs, defs);
+
+        assertXpathEquals(bean, "context/@unitname", "person");
+        assertXpathEquals(bean, "context/@property", "em");
+
+        assertXpathEquals(bean, "unit/@unitname", "person");
+        assertXpathEquals(bean, "unit/@property", "emf");
+    }
+
     @Test
     public void testGenerateCDITransactional() throws Exception {
         Node bean1 = getBeanById("cdiTransactionalAnnotatedBean");
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/jakarta/JakartaParentBean.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/jakarta/JakartaParentBean.java
new file mode 100644
index 000000000..24dbfcec6
--- /dev/null
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/jakarta/JakartaParentBean.java
@@ -0,0 +1,55 @@
+/**
+ * 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.blueprint.plugin.jakarta;
+
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.PreDestroy;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.PersistenceUnit;
+import jakarta.transaction.Transactional;
+
+public class JakartaParentBean {
+
+    @PersistenceContext(unitName="person")
+    EntityManager em;
+
+    @PersistenceUnit(unitName="person")
+    EntityManager emf;
+
+    @PostConstruct
+    public void overridenInit() {
+    }
+
+    @PreDestroy
+    public void destroy() {
+    }
+
+    @Transactional(Transactional.TxType.REQUIRES_NEW)
+    public void txOverridenWithoutTransactional() {
+    }
+
+    @Transactional(Transactional.TxType.SUPPORTS)
+    public void txSupports() {
+    }
+
+    @Transactional(Transactional.TxType.NEVER)
+    public void txOverridenWithRequiresNew() {
+    }
+}
diff --git 
a/blueprint-maven-plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/jakarta/JakartaTransactionalBean.java
 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/jakarta/JakartaTransactionalBean.java
new file mode 100644
index 000000000..c87176bef
--- /dev/null
+++ 
b/blueprint-maven-plugin/blueprint-maven-plugin/src/test/java/org/apache/aries/blueprint/plugin/jakarta/JakartaTransactionalBean.java
@@ -0,0 +1,63 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.blueprint.plugin.jakarta;
+
+import jakarta.annotation.PostConstruct;
+import jakarta.inject.Singleton;
+import jakarta.transaction.Transactional;
+import jakarta.transaction.Transactional.TxType;
+
+@Singleton
+@Transactional(value = TxType.REQUIRES_NEW)
+public class JakartaTransactionalBean extends JakartaParentBean {
+
+    public void overridenInit() {
+        // By overriding the method and removing the annotation, this method 
has lost its
+        // @PostConstruct method because it isn't @Inherited
+    }
+
+    @PostConstruct
+    public void init() {
+
+    }
+
+    @Transactional(TxType.NOT_SUPPORTED)
+    public void txNotSupported() {
+    }
+
+    @Transactional(TxType.MANDATORY)
+    public void txMandatory() {
+    }
+
+    @Transactional(TxType.NEVER)
+    public void txNever() {
+    }
+
+    @Transactional(TxType.REQUIRED)
+    public void txRequired() {
+    }
+
+    @Override
+    public void txOverridenWithoutTransactional() {
+    }
+
+    @Transactional(TxType.REQUIRES_NEW)
+    public void txOverridenWithRequiresNew() {
+    }
+}

Reply via email to