From 3c77e33547e88471b5bed65b5f5a5635a8f59cc3 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Tue, 9 Jun 2026 14:54:43 +0200 Subject: [PATCH] Add configuration methods for entity agent factory Co-authored-by: Matej Novotny --- .../weld/junit/AbstractWeldInitiator.java | 29 +- .../weld/junit/MockJpaInjectionServices.java | 25 +- .../weld/junit/jupiter/WeldInitiator.java | 7 +- .../weld/junit/jupiter/resources/FooJpa.java | 5 + .../resources/InjectResourcesTest.java | 500 +++++++++++++++++- .../org/jboss/weld/junit4/WeldInitiator.java | 7 +- .../jboss/weld/junit4/resources/FooJpa.java | 5 + .../junit4/resources/InjectResourcesTest.java | 499 ++++++++++++++++- pom.xml | 2 +- .../org/jboss/weld/spock/WeldInitiator.java | 7 +- 10 files changed, 1024 insertions(+), 62 deletions(-) diff --git a/junit-common/src/main/java/org/jboss/weld/junit/AbstractWeldInitiator.java b/junit-common/src/main/java/org/jboss/weld/junit/AbstractWeldInitiator.java index 7a813223..3407c1c0 100644 --- a/junit-common/src/main/java/org/jboss/weld/junit/AbstractWeldInitiator.java +++ b/junit-common/src/main/java/org/jboss/weld/junit/AbstractWeldInitiator.java @@ -91,13 +91,16 @@ public static Weld createDefaultWeld() { private final Function persistenceContextFactory; + private final Function persistenceAgentFactory; + protected volatile WeldContainer container; protected AbstractWeldInitiator(Weld weld, List instancesToInject, Set> scopesToActivate, Set> beans, Map resources, Function ejbFactory, Function persistenceUnitFactory, - Function persistenceContextFactory) { + Function persistenceContextFactory, + Function persistenceAgentFactory) { this.instancesToInject = new ArrayList<>(); for (Object instance : instancesToInject) { this.instancesToInject.add(createToInject(instance)); @@ -137,6 +140,7 @@ protected AbstractWeldInitiator(Weld weld, List instancesToInject, this.ejbFactory = ejbFactory; this.persistenceContextFactory = persistenceContextFactory; this.persistenceUnitFactory = persistenceUnitFactory; + this.persistenceAgentFactory = persistenceAgentFactory; } protected ToInject createToInject(Object instanceToInject) { @@ -359,6 +363,8 @@ protected static abstract class AbstractBuilder persistenceContextFactory; + private Function persistenceAgentFactory; + public AbstractBuilder(Weld weld) { this.weld = weld; this.instancesToInject = new ArrayList<>(); @@ -404,6 +410,10 @@ protected Function getPersistenceUnitFactory() { return persistenceUnitFactory; } + protected Function getPersistenceAgentFactory() { + return persistenceAgentFactory; + } + /** * Instructs the initiator to inject the given non-contextual instance once the container is started, i.e. during test * execution. @@ -519,6 +529,18 @@ public T setPersistenceContextFactory(Function persisten return self(); } + /** + * Makes it possible to mock {@code PersistenceAgent} injection points. + * + * @param persistenceAgentFactory + * @return self + * @since 6.0 + */ + public T setPersistenceAgentFactory(Function persistenceAgentFactory) { + this.persistenceAgentFactory = persistenceAgentFactory; + return self(); + } + protected abstract T self(); protected abstract I build(Weld weld, List instancesToInject, Set> scopesToActivate, @@ -545,8 +567,9 @@ protected WeldContainer initWeldContainer(Weld weld) { if (ejbFactory != null) { weld.addServices(new MockEjbInjectionServices(ejbFactory)); } - if (persistenceContextFactory != null || persistenceUnitFactory != null) { - weld.addServices(new MockJpaInjectionServices(persistenceUnitFactory, persistenceContextFactory)); + if (persistenceContextFactory != null || persistenceUnitFactory != null || persistenceAgentFactory != null) { + weld.addServices( + new MockJpaInjectionServices(persistenceUnitFactory, persistenceContextFactory, persistenceAgentFactory)); } // Init the container container = weld.initialize(); diff --git a/junit-common/src/main/java/org/jboss/weld/junit/MockJpaInjectionServices.java b/junit-common/src/main/java/org/jboss/weld/junit/MockJpaInjectionServices.java index f660f5d9..2cbdf6e2 100644 --- a/junit-common/src/main/java/org/jboss/weld/junit/MockJpaInjectionServices.java +++ b/junit-common/src/main/java/org/jboss/weld/junit/MockJpaInjectionServices.java @@ -19,6 +19,7 @@ import java.util.function.Function; import jakarta.enterprise.inject.spi.InjectionPoint; +import jakarta.persistence.EntityAgent; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; @@ -39,10 +40,14 @@ public class MockJpaInjectionServices implements JpaInjectionServices { private final Function persistenceContextFactory; + private final Function persistenceAgentFactory; + public MockJpaInjectionServices(Function persistenceUnitFactory, - Function persistenceContextFactory) { + Function persistenceContextFactory, + Function persistenceAgentFactory) { this.persistenceUnitFactory = persistenceUnitFactory; this.persistenceContextFactory = persistenceContextFactory; + this.persistenceAgentFactory = persistenceAgentFactory; } @Override @@ -81,6 +86,24 @@ public ResourceReference createResource() { }; } + @Override + public ResourceReferenceFactory registerPersistenceAgentInjectionPoint(InjectionPoint injectionPoint) { + return new ResourceReferenceFactory() { + @Override + public ResourceReference createResource() { + if (persistenceAgentFactory == null) { + throw new IllegalStateException( + "Persistence agent factory not set, cannot resolve injection point: " + injectionPoint); + } + Object agent = persistenceAgentFactory.apply(injectionPoint); + if (agent == null || agent instanceof EntityAgent) { + return new SimpleResourceReference((EntityAgent) agent); + } + throw new IllegalStateException("Not an EntityAgent instance: " + agent); + } + }; + } + @Override public void cleanup() { } diff --git a/junit-jupiter/src/main/java/org/jboss/weld/junit/jupiter/WeldInitiator.java b/junit-jupiter/src/main/java/org/jboss/weld/junit/jupiter/WeldInitiator.java index d64d6c15..9eff1a07 100644 --- a/junit-jupiter/src/main/java/org/jboss/weld/junit/jupiter/WeldInitiator.java +++ b/junit-jupiter/src/main/java/org/jboss/weld/junit/jupiter/WeldInitiator.java @@ -182,7 +182,7 @@ protected Builder self() { protected WeldInitiator build(Weld weld, List instancesToInject, Set> scopesToActivate, Set> beans) { return new WeldInitiator(weld, instancesToInject, scopesToActivate, beans, resources, getEjbFactory(), - getPersistenceUnitFactory(), getPersistenceContextFactory()); + getPersistenceUnitFactory(), getPersistenceContextFactory(), getPersistenceAgentFactory()); } } @@ -191,9 +191,10 @@ private WeldInitiator(Weld weld, List instancesToInject, Set> beans, Map resources, Function ejbFactory, Function persistenceUnitFactory, - Function persistenceContextFactory) { + Function persistenceContextFactory, + Function persistenceAgentFactory) { super(weld, instancesToInject, scopesToActivate, beans, resources, ejbFactory, persistenceUnitFactory, - persistenceContextFactory); + persistenceContextFactory, persistenceAgentFactory); } void shutdownWeld() { diff --git a/junit-jupiter/src/test/java/org/jboss/weld/junit/jupiter/resources/FooJpa.java b/junit-jupiter/src/test/java/org/jboss/weld/junit/jupiter/resources/FooJpa.java index 0cde78d8..a97d68c2 100644 --- a/junit-jupiter/src/test/java/org/jboss/weld/junit/jupiter/resources/FooJpa.java +++ b/junit-jupiter/src/test/java/org/jboss/weld/junit/jupiter/resources/FooJpa.java @@ -17,8 +17,10 @@ package org.jboss.weld.junit.jupiter.resources; import jakarta.enterprise.context.Dependent; +import jakarta.persistence.EntityAgent; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.PersistenceAgent; import jakarta.persistence.PersistenceContext; import jakarta.persistence.PersistenceUnit; @@ -31,4 +33,7 @@ public class FooJpa { @PersistenceUnit EntityManagerFactory entityManagerFactory; + @PersistenceAgent + EntityAgent entityAgent; + } diff --git a/junit-jupiter/src/test/java/org/jboss/weld/junit/jupiter/resources/InjectResourcesTest.java b/junit-jupiter/src/test/java/org/jboss/weld/junit/jupiter/resources/InjectResourcesTest.java index 27311342..6ceb4cc2 100644 --- a/junit-jupiter/src/test/java/org/jboss/weld/junit/jupiter/resources/InjectResourcesTest.java +++ b/junit-jupiter/src/test/java/org/jboss/weld/junit/jupiter/resources/InjectResourcesTest.java @@ -20,8 +20,10 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import java.lang.annotation.Annotation; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; @@ -31,7 +33,10 @@ import jakarta.persistence.CacheStoreMode; import jakarta.persistence.ConnectionConsumer; import jakarta.persistence.ConnectionFunction; +import jakarta.persistence.EntityAgent; import jakarta.persistence.EntityGraph; +import jakarta.persistence.EntityHandler; +import jakarta.persistence.EntityListenerRegistration; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityTransaction; @@ -44,22 +49,26 @@ import jakarta.persistence.Query; import jakarta.persistence.RefreshOption; import jakarta.persistence.SchemaManager; +import jakarta.persistence.Statement; +import jakarta.persistence.StatementOrTypedQuery; +import jakarta.persistence.StatementReference; import jakarta.persistence.StoredProcedureQuery; import jakarta.persistence.SynchronizationType; import jakarta.persistence.TypedQuery; import jakarta.persistence.TypedQueryReference; import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaDelete; -import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.CriteriaSelect; -import jakarta.persistence.criteria.CriteriaUpdate; +import jakarta.persistence.criteria.CriteriaStatement; import jakarta.persistence.metamodel.Metamodel; +import jakarta.persistence.sql.ResultSetMapping; import org.jboss.weld.junit.jupiter.EnableWeld; import org.jboss.weld.junit.jupiter.WeldInitiator; import org.jboss.weld.junit.jupiter.WeldSetup; import org.junit.jupiter.api.Test; +import edu.umd.cs.findbugs.annotations.Nullable; + /** * * @author Martin Kouba @@ -74,7 +83,9 @@ public class InjectResourcesTest { .bindResource("java:comp/env/baz", "hello2") .setEjbFactory(ip -> new DummySessionBean("ping")) .setPersistenceUnitFactory(getPUFactory()) - .setPersistenceContextFactory(getPCFactory()).build(); + .setPersistenceContextFactory(getPCFactory()) + .setPersistenceAgentFactory(getPAFactory()) + .build(); @Test public void testResourceInjection() { @@ -96,6 +107,8 @@ public void testJpaInjection() { assertFalse(foo.entityManagerFactory.isOpen()); assertNotNull(foo.entityManager); assertFalse(foo.entityManager.isOpen()); + assertNotNull(foo.entityAgent); + assertEquals("MockEntityAgent", foo.entityAgent.toString()); } // Mock objects @@ -124,10 +137,6 @@ public void remove(Object entity) { public void refresh(Object entity, LockModeType lockMode, Map properties) { } - @Override - public void refresh(Object entity, LockModeType lockMode) { - } - @Override public void refresh(Object entity, Map properties) { } @@ -167,6 +176,12 @@ public boolean isJoinedToTransaction() { return false; } + @Deprecated(since = "4.0", forRemoval = true) + @Override + public Statement createQuery(CriteriaStatement statement) { + return null; + } + @Override public EntityTransaction getTransaction() { return null; @@ -182,6 +197,11 @@ public Map getProperties() { return null; } + @Override + public Statement createStatement(String qlString) { + return null; + } + @Override public Metamodel getMetamodel() { return null; @@ -212,11 +232,26 @@ public EntityGraph getEntityGraph(String graphName) { return null; } + @Override + public EntityGraph getEntityGraph(Class rootType, String graphName) { + return null; + } + @Override public Object getDelegate() { return null; } + @Override + public void addOption(Option option) { + + } + + @Override + public Set