Skip to content

Commit

Permalink
Merge pull request #2 from nurv/develop
Browse files Browse the repository at this point in the history
Support for emiting signals within signals
  • Loading branch information
jcarvalho committed Feb 27, 2015
2 parents d97449e + b758998 commit ed598e2
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 6 deletions.
11 changes: 7 additions & 4 deletions src/main/java/org/fenixedu/bennu/signals/Signal.java
Expand Up @@ -233,25 +233,28 @@ public static void emit(String key, Object event) {

private static void fireAllInCacheOutsideTransaction(Transaction transaction) {
Map<String, ArrayList<Object>> 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<String, ArrayList<Object>> 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");
}
}

Expand Down
36 changes: 34 additions & 2 deletions src/test/java/org/fenixedu/bennu/signals/SignalsTest.java
Expand Up @@ -156,7 +156,7 @@ public void testMultipleExceptionHandling() {
}
Assert.assertTrue("Exception not thrown", caught);
}

@Test
public void testSilentExceptionHandling() {
AtomicBoolean bool = new AtomicBoolean(false);
Expand Down Expand Up @@ -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<DomainRoot> event) -> {
Signal.emit("signal2", event);
});
Signal.register("signal2", (DomainObjectEvent<DomainRoot> 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<DomainRoot> event) -> {
Signal.emit("signal2", event);
});
Signal.registerWithoutTransaction("signal2", (DomainObjectEvent<DomainRoot> 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());
}
}

0 comments on commit ed598e2

Please sign in to comment.