Don’t trigger if state was not successful.
[rhynodge.git] / src / main / java / net / pterodactylus / reactor / engine / Engine.java
index 123781f..4ba7887 100644 (file)
@@ -22,10 +22,12 @@ import java.util.Set;
 import java.util.SortedMap;
 import java.util.concurrent.TimeUnit;
 
+import net.pterodactylus.reactor.Filter;
 import net.pterodactylus.reactor.Query;
 import net.pterodactylus.reactor.Reaction;
 import net.pterodactylus.reactor.Trigger;
 import net.pterodactylus.reactor.states.AbstractState;
+import net.pterodactylus.reactor.states.FailedState;
 
 import org.apache.log4j.Logger;
 
@@ -121,6 +123,9 @@ public class Engine extends AbstractExecutionThreadService {
                        try {
                                logger.debug("Querying system...");
                                state = query.state();
+                               if (state == null) {
+                                       state = FailedState.INSTANCE;
+                               }
                                logger.debug("System queried.");
                        } catch (Throwable t1) {
                                logger.warn("Querying system failed!", t1);
@@ -129,12 +134,23 @@ public class Engine extends AbstractExecutionThreadService {
                                };
                        }
                        logger.debug(String.format("State is %s.", state));
-                       reactionExecution.addState(state);
+
+                       /* convert states. */
+                       for (Filter filter : nextReaction.filters()) {
+                               if (state.success()) {
+                                       net.pterodactylus.reactor.State newState = filter.filter(state);
+                                       logger.debug(String.format("Old state is %s, new state is %s.", state, newState));
+                                       state = newState;
+                               }
+                       }
+                       if (state.success()) {
+                               reactionExecution.addState(state);
+                       }
 
                        /* only run trigger if we have collected two states. */
+                       Trigger trigger = nextReaction.trigger();
                        boolean triggerHit = false;
-                       if (reactionExecution.previousState() != null) {
-                               Trigger trigger = nextReaction.trigger();
+                       if ((reactionExecution.previousState() != null) && state.success()) {
                                logger.debug("Checking Trigger for changes...");
                                triggerHit = trigger.triggers(reactionExecution.currentState(), reactionExecution.previousState());
                        }
@@ -143,8 +159,9 @@ public class Engine extends AbstractExecutionThreadService {
                        logger.debug(String.format("Trigger was hit: %s.", triggerHit));
                        if (triggerHit) {
                                logger.info("Executing Action...");
-                               nextReaction.action().execute(reactionExecution.currentState(), reactionExecution.previousState());
+                               nextReaction.action().execute(trigger.trigger());
                        }
+
                }
        }