diff --git a/src/main/java/org/fenixedu/bennu/signals/Signal.java b/src/main/java/org/fenixedu/bennu/signals/Signal.java index 4ae649d..4cb3ba2 100644 --- a/src/main/java/org/fenixedu/bennu/signals/Signal.java +++ b/src/main/java/org/fenixedu/bennu/signals/Signal.java @@ -233,25 +233,28 @@ public static void emit(String key, Object event) { private static void fireAllInCacheOutsideTransaction(Transaction transaction) { Map> cache = transaction.getFromContext("signals"); - if (cache != null) { + /* allowing signal emiting within a signal */ + while (cache != null) { + transaction.putInContext("signals", null); for (String key : cache.keySet()) { for (Object event : cache.get(key)) { withoutTransaction.get(key).emit(event); } } - transaction.putInContext("signals", null); + cache = transaction.getFromContext("signals"); } } private static void fireAllInCacheWithinTransaction(Transaction transaction) { Map> cache = transaction.getFromContext("signalsWithTransaction"); - if (cache != null) { + while (cache != null) { + transaction.putInContext("signalsWithTransaction", null); for (String key : cache.keySet()) { for (Object event : cache.get(key)) { withTransaction.get(key).emit(event); } } - transaction.putInContext("signalsWithTransaction", null); + cache = transaction.getFromContext("signalsWithTransaction"); } } diff --git a/src/test/java/org/fenixedu/bennu/signals/SignalsTest.java b/src/test/java/org/fenixedu/bennu/signals/SignalsTest.java index d0bade2..3b33b30 100644 --- a/src/test/java/org/fenixedu/bennu/signals/SignalsTest.java +++ b/src/test/java/org/fenixedu/bennu/signals/SignalsTest.java @@ -156,7 +156,7 @@ public void testMultipleExceptionHandling() { } Assert.assertTrue("Exception not thrown", caught); } - + @Test public void testSilentExceptionHandling() { AtomicBoolean bool = new AtomicBoolean(false); @@ -198,7 +198,39 @@ public void testMultipleSilentExceptionHandling() { Assert.fail("Thrown exception"); e.printStackTrace(); } - } + @Test + public void testSignalEmitingWithinSignal() throws Exception { + AtomicBoolean bool = new AtomicBoolean(false); + Signal.register("signal1", (DomainObjectEvent event) -> { + Signal.emit("signal2", event); + }); + Signal.register("signal2", (DomainObjectEvent event) -> { + bool.set(true); + }); + + TransactionManager manager = FenixFramework.getTransactionManager(); + manager.begin(); + Signal.emit("signal1", new DomainObjectEvent<>(FenixFramework.getDomainRoot())); + manager.commit(); + Assert.assertTrue("Second signal wasn't emited", bool.get()); + } + + @Test + public void testSignalEmitingWithinSignalWithoutTransaction() throws Exception { + AtomicBoolean bool = new AtomicBoolean(false); + Signal.registerWithoutTransaction("signal1", (DomainObjectEvent event) -> { + Signal.emit("signal2", event); + }); + Signal.registerWithoutTransaction("signal2", (DomainObjectEvent event) -> { + bool.set(true); + }); + + TransactionManager manager = FenixFramework.getTransactionManager(); + manager.begin(); + Signal.emit("signal1", new DomainObjectEvent<>(FenixFramework.getDomainRoot())); + manager.commit(); + Assert.assertTrue("Second signal wasn't emited", bool.get()); + } }