public void handleEvent()

in alerting/service/src/main/java/org/apache/karaf/decanter/alerting/service/event/Handler.java [76:128]


    public void handleEvent(Event event) {
        try {
            String uuid = store.store(event);
            for (Rule rule : rules) {
                if (rule.getPeriod() != null) {
                    long timestamp = System.currentTimeMillis() - PeriodParser.parse(rule.getPeriod());
                    List<Alert> known = store.query("(" + rule.getCondition() + ") AND NOT alertUUID:" + uuid);
                    if (known.size() == 1) {
                        List<Alert> recover = store.query("alertUUID:" + uuid + " AND NOT (" + rule.getCondition() + ")");
                        if (recover.size() != 1 && (((Long) known.get(0).get("alertTimestamp")) < timestamp)) {
                            // not recover during the period
                            dispatcher.postEvent(prepareEvent(known.get(0), rule, false));
                            store.delete(rule.getCondition());
                        }
                        store.delete("alertUUID:" + uuid);
                    } else {
                        // flag
                        List<Alert> toFlag = store.query("alertUUID:" + uuid + " AND (" + rule.getCondition() + ")");
                        if (toFlag.size() == 1) {
                            store.flag("alertUUID:" + uuid, rule.getName());
                        }
                    }
                } else {
                    if (!rule.isRecoverable()) {
                        List<Alert> alerts = store.query(rule.getCondition());
                        for (Alert alert : alerts) {
                            dispatcher.postEvent(prepareEvent(alert, rule, false));
                            store.delete("alertUUID:" + alert.get("alertUUID"));
                        }
                    } else {
                        List<Alert> known = store.query("(" + rule.getCondition() + ") AND NOT alertUUID:" + uuid);
                        if (known.size() == 1) {
                            List<Alert> recover = store.query("alertUUID:" + uuid + " AND NOT (" + rule.getCondition() + ")");
                            if (recover.size() == 1) {
                                dispatcher.postEvent(prepareEvent(recover.get(0), rule, true));
                                store.delete(rule.getCondition());
                            }
                            store.delete("alertUUID:" + uuid);
                        } else {
                            List<Alert> toSend = store.query("alertUUID:" + uuid + " AND (" + rule.getCondition() + ")");
                            if (toSend.size() == 1) {
                                store.flag("alertUUID:" + uuid, rule.getName());
                                dispatcher.postEvent(prepareEvent(toSend.get(0), rule, false));
                            }
                        }
                    }
                }
            }
            store.eviction();
        } catch (Exception e) {
            LOGGER.error("Can't process alerting for event", e);
        }
    }