public static Condition fromJson(final Object obj) throws Exception { if (checkerLoader == null) { throw new Exception("Condition Checker loader not initialized!"); } final Map<String, Object> jsonObj = (HashMap<String, Object>) obj; Condition cond = null; try { final Map<String, ConditionChecker> checkers = new HashMap<>(); final List<Object> checkersJson = (List<Object>) jsonObj.get("checkers"); for (final Object oneCheckerJson : checkersJson) { final Map<String, Object> oneChecker = (HashMap<String, Object>) oneCheckerJson; final String type = (String) oneChecker.get("type"); final ConditionChecker ck = checkerLoader.createCheckerFromJson(type, oneChecker.get("checkerJson")); checkers.put(ck.getId(), ck); } final String expr = (String) jsonObj.get("expression"); final Long nextCheckTime = Long.valueOf((String) jsonObj.get("nextCheckTime")); cond = new Condition(checkers, expr, nextCheckTime); } catch (final Exception e) { e.printStackTrace(); logger.error("Failed to recreate condition from json.", e); throw new Exception("Failed to recreate condition from json.", e); } return cond; }
try { logger.info("Decoding for " + JSONUtils.toJSON(obj)); final Condition triggerCond = Condition.fromJson(jsonObj.get("triggerCondition")); final Condition expireCond = Condition.fromJson(jsonObj.get("expireCondition")); final List<TriggerAction> actions = new ArrayList<>(); final List<Object> actionsJson = (List<Object>) jsonObj.get("actions"); context = new HashMap<>(); for (final ConditionChecker checker : triggerCond.getCheckers().values()) { checker.setContext(context); for (final ConditionChecker checker : expireCond.getCheckers().values()) { checker.setContext(context);
private BasicTimeChecker getEndTimeChecker(final Trigger t) { if (t.getExpireCondition().getExpression().contains("EndTimeChecker")) { return getBasicTimeChecker(t.getExpireCondition().getCheckers()); } return null; }
public Condition(final Map<String, ConditionChecker> checkers, final String expr) { setCheckers(checkers); this.expression = jexl.createExpression(expr); updateNextCheckTime(); }
Condition.setCheckerLoader(checkerTypeLoader); final String expr = timeChecker.getId() + ".eval()"; final Condition cond = new Condition(checkers, expr); final Object obj = cond.toJson(); JSONUtils.toJSON(obj, temp); final Condition cond2 = Condition.fromJson(JSONUtils.parseJSONFromFile(temp)); final Map<String, ConditionChecker> checkers2 = cond2.getCheckers(); assertTrue(cond.getExpression().equals(cond2.getExpression())); System.out.println("cond1: " + cond.getExpression()); System.out.println("cond2: " + cond2.getExpression()); assertTrue(checkers2.size() == 1); final ConditionChecker checker2 = checkers2.get(timeChecker.getId());
@Test public void conditionTest() { final Map<String, ConditionChecker> checkers = new HashMap<>(); final ThresholdChecker fake1 = new ThresholdChecker("thresholdchecker1", 10); final ThresholdChecker fake2 = new ThresholdChecker("thresholdchecker2", 20); ThresholdChecker.setVal(15); checkers.put(fake1.getId(), fake1); checkers.put(fake2.getId(), fake2); final String expr1 = "( " + fake1.getId() + ".eval()" + " && " + fake2.getId() + ".eval()" + " )" + " || " + "( " + fake1.getId() + ".eval()" + " && " + "!" + fake2.getId() + ".eval()" + " )"; final String expr2 = "( " + fake1.getId() + ".eval()" + " && " + fake2.getId() + ".eval()" + " )" + " || " + "( " + fake1.getId() + ".eval()" + " && " + fake2.getId() + ".eval()" + " )"; final Condition cond = new Condition(checkers, expr1); System.out.println("Setting expression " + expr1); assertTrue(cond.isMet()); cond.setExpression(expr2); System.out.println("Setting expression " + expr2); assertFalse(cond.isMet()); }
public void updateNextCheckTime() { this.nextCheckTime = Math.min(this.triggerCondition.getNextCheckTime(), this.expireCondition.getNextCheckTime()); }
public void stopCheckers() { for (final ConditionChecker checker : this.triggerCondition.getCheckers().values()) { checker.stopChecker(); } for (final ConditionChecker checker : this.expireCondition.getCheckers().values()) { checker.stopChecker(); } }
/** * This test manipulates global states (time) in org.joda.time.DateTimeUtils . Thus this test can * run in parallel with tests that do the same. */ @Test public void periodTimerTest() { // get a new timechecker, start from now, repeat every minute. should // evaluate to false now, and true a minute later. final long baseTimeInMilliSeconds = 1000; final ReadablePeriod period = Utils.parsePeriodString("10s"); DateTimeUtils.setCurrentMillisFixed(baseTimeInMilliSeconds); final BasicTimeChecker timeChecker = new BasicTimeChecker("BasicTimeChecket_1", baseTimeInMilliSeconds, DateTimeZone.UTC, true, true, period, null); final Condition cond = getCondition(timeChecker); assertFalse(cond.isMet()); DateTimeUtils.setCurrentMillisFixed(baseTimeInMilliSeconds + 11 * 1000); assertTrue(cond.isMet()); cond.resetCheckers(); assertFalse(cond.isMet()); DateTimeUtils.setCurrentMillisFixed(baseTimeInMilliSeconds + 22 * 1000); assertTrue(cond.isMet()); DateTimeUtils.setCurrentMillisSystem(); }
public void resetExpireCondition() { this.expireCondition.resetCheckers(); updateNextCheckTime(); }
public boolean expireConditionMet() { return this.expireCondition.isMet(); }
public String getDescription() { final StringBuffer actionsString = new StringBuffer(); for (final TriggerAction act : this.actions) { actionsString.append(", "); actionsString.append(act.getDescription()); } return "Trigger from " + getSource() + " with trigger condition of " + this.triggerCondition.getExpression() + " and expire condition of " + this.expireCondition.getExpression() + actionsString; }
@Inject public TriggerManager(final Props props, final TriggerLoader triggerLoader, final ExecutorManagerAdapter executorManagerAdapter) throws TriggerManagerException { requireNonNull(props); requireNonNull(executorManagerAdapter); this.triggerLoader = requireNonNull(triggerLoader); final long scannerInterval = props.getLong("trigger.scan.interval", DEFAULT_SCANNER_INTERVAL_MS); this.runnerThread = new TriggerScannerThread(scannerInterval); this.checkerTypeLoader = new CheckerTypeLoader(); this.actionTypeLoader = new ActionTypeLoader(); try { this.checkerTypeLoader.init(props); this.actionTypeLoader.init(props); } catch (final Exception e) { throw new TriggerManagerException(e); } Condition.setCheckerLoader(this.checkerTypeLoader); Trigger.setActionTypeLoader(this.actionTypeLoader); logger.info("TriggerManager loaded."); }
public Map<String, Object> toJson() { final Map<String, Object> jsonObj = new HashMap<>(); jsonObj.put("triggerCondition", this.triggerCondition.toJson()); jsonObj.put("expireCondition", this.expireCondition.toJson()); final List<Object> actionsJson = new ArrayList<>(); for (final TriggerAction action : this.actions) {
public Condition(final Map<String, ConditionChecker> checkers, final String expr, final long nextCheckTime) { this.nextCheckTime = nextCheckTime; setCheckers(checkers); this.expression = jexl.createExpression(expr); }
/** * Test when PST-->PDT happens in 2020. -8:00 -> -7:00 See details why confusion happens during * this change: https://en.wikipedia.org/wiki/Pacific_Time_Zone * * This test demonstrates that if the cron is under UTC settings, When daylight saving change * occurs, 2:30 will be changed to 3:30 at that day. */ @Test public void testPSTtoPDTunderUTC() { final DateTime now = DateTime.now(); // 10:30 UTC == 2:30 PST final String cronExpression = "0 30 10 8 3 ? 2020"; final BasicTimeChecker timeChecker = new BasicTimeChecker("BasicTimeChecket_1", now.getMillis(), DateTimeZone.UTC, true, true, null, cronExpression); System.out.println("getNextCheckTime = " + timeChecker.getNextCheckTime()); final Condition cond = getCondition(timeChecker); final DateTime spring2020UTC = new DateTime(2020, 3, 8, 10, 30, 0, DateTimeZone.UTC); final DateTime spring2020PDT = new DateTime(2020, 3, 8, 3, 30, 0, DateTimeZone.forID("America/Los_Angeles")); assertTrue(cond.getNextCheckTime() == spring2020UTC.getMillis()); assertTrue(cond.getNextCheckTime() == spring2020PDT.getMillis()); }
@Test public void neverExpireTriggerTest() throws TriggerManagerException { final Trigger t1 = createNeverExpireTrigger("triggerLoader", 10); this.triggerManager.insertTrigger(t1); t1.setResetOnTrigger(false); final ThresholdChecker triggerChecker = (ThresholdChecker) t1.getTriggerCondition().getCheckers().values() .toArray()[0]; final BasicTimeChecker expireChecker = (BasicTimeChecker) t1.getExpireCondition().getCheckers().values() .toArray()[0]; ThresholdChecker.setVal(15); sleep(300); sleep(300); assertTrue(triggerChecker.isCheckerMet() == true); assertTrue(expireChecker.eval() == false); ThresholdChecker.setVal(25); sleep(300); assertTrue(triggerChecker.isCheckerMet() == true); assertTrue(expireChecker.eval() == false); }
public Condition(final Map<String, ConditionChecker> checkers, final String expr) { setCheckers(checkers); this.expression = jexl.createExpression(expr); updateNextCheckTime(); }
public void resetTriggerConditions() { this.triggerCondition.resetCheckers(); updateNextCheckTime(); }
public boolean triggerConditionMet() { return this.triggerCondition.isMet(); }