getInheritance(Class> type) {
- requireNonNull(type, "entity is required");
- if (isInheritance(type)) {
- Class> parent = type.getSuperclass();
- String discriminatorColumn = getDiscriminatorColumn(parent);
- String discriminatorValue = getDiscriminatorValue(type);
- return Optional.of(new InheritanceMetadata(discriminatorValue, discriminatorColumn,
- parent, type));
- } else if (type.getAnnotation(Inheritance.class) != null) {
- String discriminatorColumn = getDiscriminatorColumn(type);
- String discriminatorValue = getDiscriminatorValue(type);
- return Optional.of(new InheritanceMetadata(discriminatorValue, discriminatorColumn,
- type, type));
- }
- return Optional.empty();
- }
-
- /**
- * Check if the entity has the {@link Inheritance} annotation
- *
- * @param entity the entity
- * @return true if it has the {@link Inheritance} annotation
- */
- boolean hasInheritanceAnnotation(Class> entity) {
- requireNonNull(entity, "entity is required");
- return entity.getAnnotation(Inheritance.class) != null;
- }
-
- /**
- * Retrieves the User-Defined Type (UDT) name associated with the given field.
- *
- *
- * This method retrieves the UDT name specified in the {@link Column} annotation of the provided field.
- * If the field is not annotated with {@link Column}, or if the UDT name is blank or not specified,
- * this method returns {@code null}.
- *
- *
- * @param field the field from which to retrieve the UDT name
- * @return the UDT name specified in the {@link Column} annotation of the field, or {@code null} if not specified
- * @throws NullPointerException if the field is null
- */
- public String getUDTName(Field field) {
- requireNonNull(field, "field is required");
- return Optional.ofNullable(field.getAnnotation(Column.class))
- .map(Column::udt)
- .filter(StringUtils::isNotBlank)
- .orElse(null);
- }
-
- /**
- * Attempts to locate the specific generic declaration of the desired type,
- * walking the interface and superclass hierarchy to locate it.
- *
- * @param type the type to scan, such as a field's generic type
- * @param parentType the type to search for, such as {@code Map}
- * @return an {@link Optional} describing the found declaration, or an
- * empty one if it cannot be found
- * @since 1.1.5
- */
- public static Optional findParameterizedType(Type type, Class> parentType) {
- if(type instanceof ParameterizedType parameterizedType && parameterizedType.getRawType() instanceof Class rawClass) {
- if(parentType.isAssignableFrom(rawClass)) {
- return Optional.of(parameterizedType);
- }
- }
- if(type instanceof Class classType) {
- Type superType = classType.getGenericSuperclass();
- if(superType != null) {
- Optional superResult = findParameterizedType(superType, parentType);
- if(superResult.isPresent()) {
- return superResult;
- }
- }
- for(Type superInterface : classType.getGenericInterfaces()) {
- Optional superResult = findParameterizedType(superInterface, parentType);
- if(superResult.isPresent()) {
- return superResult;
- }
- }
- }
-
- return Optional.empty();
- }
-
-
- private String getDiscriminatorColumn(Class> parent) {
- return Optional
- .ofNullable(parent.getAnnotation(DiscriminatorColumn.class))
- .map(DiscriminatorColumn::value)
- .orElse(DiscriminatorColumn.DEFAULT_DISCRIMINATOR_COLUMN);
- }
-
- private String getDiscriminatorValue(Class> entity) {
- return Optional
- .ofNullable(entity.getAnnotation(DiscriminatorValue.class))
- .map(DiscriminatorValue::value)
- .orElse(entity.getSimpleName());
- }
-
- private String readEntity(Class> entity) {
- return Optional.ofNullable(entity.getAnnotation(Entity.class))
- .map(Entity::value)
- .filter(StringUtils::isNotBlank)
- .orElse(entity.getSimpleName());
- }
-
- private boolean isInheritance(Class> entity) {
- Class> superclass = entity.getSuperclass();
- return superclass.getAnnotation(Inheritance.class) != null;
- }
-
-
-}
diff --git a/appserver/persistence/jnosql-integration/src/main/java/org/glassfish/main/jnosql/jakartapersistence/mapping/reflection/nosql/StringUtils.java b/appserver/persistence/jnosql-integration/src/main/java/org/glassfish/main/jnosql/jakartapersistence/mapping/reflection/nosql/StringUtils.java
deleted file mode 100644
index 1eff957bfb6..00000000000
--- a/appserver/persistence/jnosql-integration/src/main/java/org/glassfish/main/jnosql/jakartapersistence/mapping/reflection/nosql/StringUtils.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2023 Contributors to the Eclipse Foundation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Apache License v2.0 which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php.
- *
- * You may elect to redistribute this code under either of these licenses.
- *
- * Contributors:
- *
- * Otavio Santana
- * Maximillian Arruda
- */
-package org.glassfish.main.jnosql.jakartapersistence.mapping.reflection.nosql;
-
-/**
- * Utility class providing operations for working with strings and character sequences.
- * This class contains methods to check for blankness (presence of whitespace or being null)
- * and to perform various string-related operations.
- */
-final class StringUtils {
-
- private StringUtils() {
- // Private constructor to prevent instantiation of the utility class.
- }
-
- /**
- * Checks if the given character sequence is blank, which means it is either null or
- * consists only of whitespace characters.
- *
- * @param cs The character sequence to be checked for blankness.
- * @return {@code true} if the character sequence is blank, otherwise {@code false}.
- */
- public static boolean isBlank(final CharSequence cs) {
- if (cs == null || cs.isEmpty()) {
- return true;
- }
-
- for (int i = 0; i < cs.length(); i++) {
- if (!Character.isWhitespace(cs.charAt(i))) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Checks if the given character sequence is not blank, which means it is not null and
- * contains at least one non-whitespace character.
- *
- * @param cs The character sequence to be checked for non-blankness.
- * @return {@code true} if the character sequence is not blank, otherwise {@code false}.
- */
- public static boolean isNotBlank(final CharSequence cs) {
- return !isBlank(cs);
- }
-}
-
diff --git a/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.jakartapersistence.mapping.metadata.JakartaPersistenceClassScanner b/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.jakartapersistence.mapping.metadata.JakartaPersistenceClassScanner
new file mode 100644
index 00000000000..40efa7b673b
--- /dev/null
+++ b/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.jakartapersistence.mapping.metadata.JakartaPersistenceClassScanner
@@ -0,0 +1 @@
+org.glassfish.main.jnosql.jakartapersistence.mapping.glassfishcontext.GlassFishJakartaPersistenceClassScanner
\ No newline at end of file
diff --git a/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.mapping.metadata.ClassConverter b/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.mapping.metadata.ClassConverter
deleted file mode 100644
index 960c777c47c..00000000000
--- a/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.mapping.metadata.ClassConverter
+++ /dev/null
@@ -1,2 +0,0 @@
-# This is needed only for reflection classes. Should be removed once they are replaced by GlassFish-specific solution
-org.glassfish.main.jnosql.jakartapersistence.mapping.reflection.nosql.ReflectionClassConverter
diff --git a/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.mapping.metadata.ClassScanner b/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.mapping.metadata.ClassScanner
index 28ff8034744..ec2153139fa 100644
--- a/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.mapping.metadata.ClassScanner
+++ b/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.mapping.metadata.ClassScanner
@@ -1 +1 @@
-org.glassfish.main.jnosql.jakartapersistence.mapping.glassfishcontext.GlassFishClassScanner
\ No newline at end of file
+org.glassfish.main.jnosql.jakartapersistence.mapping.glassfishcontext.GlassFishNosqlClassScanner
\ No newline at end of file
diff --git a/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.mapping.metadata.CollectionSupplier b/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.mapping.metadata.CollectionSupplier
deleted file mode 100644
index 5727dd8db80..00000000000
--- a/appserver/persistence/jnosql-integration/src/main/resources/META-INF/services/org.eclipse.jnosql.mapping.metadata.CollectionSupplier
+++ /dev/null
@@ -1,5 +0,0 @@
-# This is needed only for reflection classes. Should be removed once they are replaced by GlassFish-specific solution
-org.eclipse.jnosql.mapping.reflection.collection.DequeSupplier
-org.eclipse.jnosql.mapping.reflection.collection.ListSupplier
-org.eclipse.jnosql.mapping.reflection.collection.SetSupplier
-org.eclipse.jnosql.mapping.reflection.collection.TreeSetSupplier
\ No newline at end of file
diff --git a/appserver/persistence/jnosql-integration/src/test/java/org/glassfish/main/jnosql/jakartapersistence/mapping/glassfishcontext/GlassFishClassScannerTest.java b/appserver/persistence/jnosql-integration/src/test/java/org/glassfish/main/jnosql/jakartapersistence/mapping/glassfishcontext/GlassFishJakartaPersistenceClassScannerTest.java
similarity index 97%
rename from appserver/persistence/jnosql-integration/src/test/java/org/glassfish/main/jnosql/jakartapersistence/mapping/glassfishcontext/GlassFishClassScannerTest.java
rename to appserver/persistence/jnosql-integration/src/test/java/org/glassfish/main/jnosql/jakartapersistence/mapping/glassfishcontext/GlassFishJakartaPersistenceClassScannerTest.java
index a14cff4ba29..6f0920ccc9b 100644
--- a/appserver/persistence/jnosql-integration/src/test/java/org/glassfish/main/jnosql/jakartapersistence/mapping/glassfishcontext/GlassFishClassScannerTest.java
+++ b/appserver/persistence/jnosql-integration/src/test/java/org/glassfish/main/jnosql/jakartapersistence/mapping/glassfishcontext/GlassFishJakartaPersistenceClassScannerTest.java
@@ -53,9 +53,9 @@
*
* @author Ondro Mihalyi
*/
-public class GlassFishClassScannerTest {
+public class GlassFishJakartaPersistenceClassScannerTest {
- public GlassFishClassScannerTest() {
+ public GlassFishJakartaPersistenceClassScannerTest() {
}
@Test
@@ -88,7 +88,7 @@ public void testVariousRepositories() throws URISyntaxException, IOException, In
Types types = parseClasses(allClasses);
configureCDI(types);
- final GlassFishClassScanner scanner = new GlassFishClassScanner();
+ final GlassFishJakartaPersistenceClassScanner scanner = new GlassFishJakartaPersistenceClassScanner();
final Set> repositoriesStandardResult = scanner.repositoriesStandard();
assertTrue(repositoriesStandardResult.equals(standardRepositories), "Standard repositories: " + repositoriesStandardResult);
diff --git a/appserver/pom.xml b/appserver/pom.xml
index cd96eb0b4e0..73747323f7f 100644
--- a/appserver/pom.xml
+++ b/appserver/pom.xml
@@ -81,6 +81,7 @@
11
+ 11.0.0
@@ -115,8 +116,10 @@
1.0.1
+ 1.0
1.0.1
- 1.1.10
+ 1.0.1
+ 1.1.11-SNAPSHOT
3.2.0
@@ -210,6 +213,12 @@
+
+ jakarta.platform
+ jakarta.jakartaee-api
+ ${jakarta.platform.version}
+
+
jakarta.faces
diff --git a/appserver/tests/application/pom.xml b/appserver/tests/application/pom.xml
index dc34b036015..0a6e776fb4d 100755
--- a/appserver/tests/application/pom.xml
+++ b/appserver/tests/application/pom.xml
@@ -68,53 +68,8 @@
- jakarta.ejb
- jakarta.ejb-api
- provided
-
-
- jakarta.annotation
- jakarta.annotation-api
- provided
-
-
- jakarta.enterprise
- jakarta.enterprise.cdi-api
- provided
-
-
- jakarta.enterprise.concurrent
- jakarta.enterprise.concurrent-api
- provided
-
-
- jakarta.servlet.jsp
- jakarta.servlet.jsp-api
- provided
-
-
- jakarta.servlet
- jakarta.servlet-api
- provided
-
-
- jakarta.ws.rs
- jakarta.ws.rs-api
- provided
-
-
- jakarta.persistence
- jakarta.persistence-api
- provided
-
-
- jakarta.authentication
- jakarta.authentication-api
- provided
-
-
- jakarta.security.enterprise
- jakarta.security.enterprise-api
+ jakarta.platform
+ jakarta.jakartaee-api
provided
@@ -122,16 +77,6 @@
jakarta.xml.ws-api
provided
-
- jakarta.websocket
- jakarta.websocket-api
- provided
-
-
- jakarta.websocket
- jakarta.websocket-client-api
- provided
-
jakarta.jws
diff --git a/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionApplication.java b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionApplication.java
new file mode 100644
index 00000000000..4628a3c0cc0
--- /dev/null
+++ b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionApplication.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2025 Contributors to the Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.main.test.app.data;
+
+import jakarta.ws.rs.ApplicationPath;
+import jakarta.ws.rs.core.Application;
+
+import java.util.Set;
+
+@ApplicationPath("")
+public class TransactionApplication extends Application {
+ @Override
+ public Set> getClasses() {
+ return Set.of(TransactionResource.class);
+ }
+}
diff --git a/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionEntity.java b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionEntity.java
new file mode 100644
index 00000000000..a31018a5fe3
--- /dev/null
+++ b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionEntity.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2025 Contributors to the Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.main.test.app.data;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.PostPersist;
+import jakarta.persistence.Transient;
+import jakarta.transaction.TransactionSynchronizationRegistry;
+
+import org.glassfish.main.test.app.helpers.JakartaEE;
+
+@Entity
+public class TransactionEntity {
+ @Id
+ private Long id;
+ @Transient
+ private String transactionKey;
+
+ public TransactionEntity() {
+ setCurrentTransactionKey();
+ }
+
+ public TransactionEntity(Long id) {
+ this.id = id;
+ setCurrentTransactionKey();
+ }
+
+ @PostPersist
+ public void setCurrentTransactionKey() {
+ try {
+ TransactionSynchronizationRegistry registry = JakartaEE.getDefaultTransactionSynchronizationRegistry();
+ this.transactionKey = String.valueOf(registry.getTransactionKey());
+ } catch (Exception e) {
+ }
+ }
+
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ public String getTransactionKey() { return transactionKey; }
+}
diff --git a/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionRepository.java b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionRepository.java
new file mode 100644
index 00000000000..41bfdaae407
--- /dev/null
+++ b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionRepository.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2025 Contributors to the Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.main.test.app.data;
+
+import jakarta.data.repository.CrudRepository;
+import jakarta.data.repository.Repository;
+import jakarta.data.repository.Save;
+import jakarta.transaction.Transactional;
+
+@Repository
+@Transactional(Transactional.TxType.REQUIRES_NEW)
+public interface TransactionRepository extends CrudRepository {
+ @Save
+ TransactionEntity save(TransactionEntity entity);
+}
diff --git a/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionResource.java b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionResource.java
new file mode 100644
index 00000000000..ba6f243cc89
--- /dev/null
+++ b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionResource.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2025 Contributors to the Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.glassfish.main.test.app.data;
+
+import jakarta.inject.Inject;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+
+@Path("/transaction")
+public class TransactionResource {
+
+ @Inject
+ private TransactionService service;
+
+ @GET
+ public String testTransaction() {
+ try {
+ return service.processTransaction();
+ } catch (Exception e) {
+ throw e;
+ }
+ }
+}
diff --git a/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionService.java b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionService.java
new file mode 100644
index 00000000000..7e1da180524
--- /dev/null
+++ b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/data/TransactionService.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2025 Contributors to the Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.main.test.app.data;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.transaction.TransactionSynchronizationRegistry;
+import jakarta.transaction.Transactional;
+
+import org.glassfish.main.test.app.helpers.JakartaEE;
+
+
+
+@ApplicationScoped
+@Transactional
+public class TransactionService {
+
+ @Inject
+ private TransactionRepository repository;
+
+ public String processTransaction() {
+ String serviceTransactionKey;
+ TransactionSynchronizationRegistry registry = JakartaEE.getDefaultTransactionSynchronizationRegistry();
+ serviceTransactionKey = String.valueOf(registry.getTransactionKey());
+
+ TransactionEntity entity = repository.save(new TransactionEntity(1L));
+ return serviceTransactionKey + SEPARATOR + entity.getTransactionKey();
+ }
+ public static final String SEPARATOR = "#####";
+
+}
diff --git a/appserver/tests/application/src/main/java/org/glassfish/main/test/app/helpers/JakartaEE.java b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/helpers/JakartaEE.java
new file mode 100644
index 00000000000..12cee21f64e
--- /dev/null
+++ b/appserver/tests/application/src/main/java/org/glassfish/main/test/app/helpers/JakartaEE.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2025 Contributors to the Eclipse Foundation
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.glassfish.main.test.app.helpers;
+
+import jakarta.transaction.TransactionSynchronizationRegistry;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+/**
+ *
+ * @author Ondro Mihalyi
+ */
+public class JakartaEE {
+
+ private JakartaEE() {
+ }
+
+ public static TransactionSynchronizationRegistry getDefaultTransactionSynchronizationRegistry() {
+ try {
+ return (TransactionSynchronizationRegistry) new InitialContext().lookup("java:comp/TransactionSynchronizationRegistry");
+ } catch (NamingException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+}
diff --git a/appserver/tests/application/src/main/resources/org/glassfish/main/test/app/data/persistence.xml b/appserver/tests/application/src/main/resources/org/glassfish/main/test/app/data/persistence.xml
new file mode 100644
index 00000000000..cd62d0a55fe
--- /dev/null
+++ b/appserver/tests/application/src/main/resources/org/glassfish/main/test/app/data/persistence.xml
@@ -0,0 +1,29 @@
+
+
+
+
+ org.glassfish.main.test.app.data.TransactionEntity
+
+
+
+
+
diff --git a/appserver/tests/application/src/test/java/org/glassfish/main/test/app/data/TransactionalAnnotationTest.java b/appserver/tests/application/src/test/java/org/glassfish/main/test/app/data/TransactionalAnnotationTest.java
new file mode 100644
index 00000000000..156ede03444
--- /dev/null
+++ b/appserver/tests/application/src/test/java/org/glassfish/main/test/app/data/TransactionalAnnotationTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2025 Contributors to the Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.main.test.app.data;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+
+import org.glassfish.common.util.HttpParser;
+import org.glassfish.main.itest.tools.GlassFishTestEnvironment;
+import org.glassfish.main.itest.tools.asadmin.Asadmin;
+import org.glassfish.main.itest.tools.asadmin.AsadminResult;
+import org.glassfish.main.itest.tools.asadmin.DomainPropertiesBackup;
+import org.glassfish.main.test.app.helpers.JakartaEE;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.exporter.ZipExporter;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import static java.lang.System.Logger.Level.INFO;
+import static org.glassfish.main.itest.tools.GlassFishTestEnvironment.openConnection;
+import static org.glassfish.main.itest.tools.asadmin.AsadminResultMatcher.asadminOK;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+
+public class TransactionalAnnotationTest {
+
+ private static final System.Logger LOG = System.getLogger(TransactionalAnnotationTest.class.getName());
+ private static final String WEBAPP_NAME = "transactionApp";
+ private static final String WEBAPP_WAR = "transactionApp.war";
+ private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+ private static final DomainPropertiesBackup DERBYPOOL_BACKUP = DomainPropertiesBackup.backupDerbyPool();
+
+ @TempDir
+ private static File webAppDir;
+
+ @BeforeAll
+ public static void deployAll() throws IOException {
+ GlassFishTestEnvironment.switchDerbyPoolToEmbededded();
+ File webApp = createWebApp();
+ AsadminResult result = ASADMIN.exec("deploy", "--contextroot", "/" + WEBAPP_NAME, "--name", WEBAPP_NAME, webApp.getAbsolutePath());
+ assertThat(result, asadminOK());
+ }
+
+ @AfterAll
+ public static void undeployAll() {
+ assertThat(ASADMIN.exec("undeploy", WEBAPP_NAME), asadminOK());
+ DERBYPOOL_BACKUP.restore();
+ }
+
+ @Test
+ public void testTransactionalRequiresNew() throws IOException {
+ String response = getResponse(WEBAPP_NAME, "transaction");
+ String[] transactionIds = response.split(TransactionService.SEPARATOR);
+
+ assertNotEquals(transactionIds[0], transactionIds[1],
+ "Transaction IDs should be different due to REQUIRES_NEW");
+ }
+
+ private String getResponse(String contextRoot, String endpoint) throws IOException {
+ HttpURLConnection connection = openConnection(8080, "/" + contextRoot + "/" + endpoint);
+ connection.setRequestMethod("GET");
+ try {
+ int responseCode = connection.getResponseCode();
+ String reason = "";
+ if (responseCode != 200) {
+ String errorResponse = HttpParser.readResponseErrorStream(connection);
+ reason = ("Received response code " + responseCode + " with an error: " + errorResponse);
+ }
+ assertThat(reason, responseCode, equalTo(200));
+ return HttpParser.readResponseInputStream(connection);
+ } finally {
+ connection.disconnect();
+ }
+ }
+
+ private static File createWebApp() {
+ WebArchive webArchive = ShrinkWrap.create(WebArchive.class)
+ .addClass(TransactionApplication.class)
+ .addClass(TransactionResource.class)
+ .addClass(TransactionService.class)
+ .addClass(TransactionRepository.class)
+ .addClass(TransactionEntity.class)
+ .addPackage(JakartaEE.class.getPackage())
+ .addAsResource(TransactionalAnnotationTest.class.getPackage(), "persistence.xml", "META-INF/persistence.xml");
+
+ LOG.log(INFO, webArchive.toString(true));
+
+ File webApp = new File(webAppDir, WEBAPP_WAR);
+ webArchive.as(ZipExporter.class).exportTo(webApp, true);
+ return webApp;
+ }
+}
diff --git a/appserver/tests/tck/data/pom.xml b/appserver/tests/tck/data/pom.xml
index 5e856b7be54..b32817d505f 100644
--- a/appserver/tests/tck/data/pom.xml
+++ b/appserver/tests/tck/data/pom.xml
@@ -1,21 +1,21 @@
+~ Copyright (c) 2022,2023 Contributors to the Eclipse Foundation
+~
+~ Licensed 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.
+~
+~ SPDX-License-Identifier: Apache-2.0
+-->
4.0.0
@@ -33,10 +33,10 @@
Jakarta Data TCK Web Runner for GlassFish
- ${glassfish.root}/glassfish${glassfish.version.main}
${project.build.directory}
+ ${glassfish.root}/glassfish${glassfish.version.main}
${glassfish.home}/glassfish/lib
- 8.0.0-M12
+ 8.0.0-SNAPSHOT
8
11.0.1
@@ -47,6 +47,7 @@
2.3
6.0.3.Final
+ 2.1.1
@@ -111,7 +112,7 @@
+ tests -->
org.jboss.shrinkwrap
shrinkwrap-api
@@ -184,7 +185,7 @@
+ use this to distinguish the results -->
core
@@ -223,6 +224,7 @@
ee.omnifish.arquillian
arquillian-glassfish-server-managed
+ 2.1.1
test
@@ -268,6 +270,7 @@
ee.omnifish.arquillian
arquillian-glassfish-server-managed
test
+ ${omnifish.arquillian.version}