/* * Copyright 2014 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.workbench.screens.testscenario.backend.server; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.kie.api.definition.rule.Rule; import org.kie.api.event.process.ProcessCompletedEvent; import org.kie.api.event.process.ProcessEventListener; import org.kie.api.event.process.ProcessNodeLeftEvent; import org.kie.api.event.process.ProcessNodeTriggeredEvent; import org.kie.api.event.process.ProcessStartedEvent; import org.kie.api.event.process.ProcessVariableChangedEvent; import org.kie.api.event.rule.AfterMatchFiredEvent; import org.kie.api.event.rule.AgendaEventListener; import org.kie.api.event.rule.AgendaGroupPoppedEvent; import org.kie.api.event.rule.AgendaGroupPushedEvent; import org.kie.api.event.rule.BeforeMatchFiredEvent; import org.kie.api.event.rule.MatchCancelledEvent; import org.kie.api.event.rule.MatchCreatedEvent; import org.kie.api.event.rule.ObjectDeletedEvent; import org.kie.api.event.rule.ObjectInsertedEvent; import org.kie.api.event.rule.ObjectUpdatedEvent; import org.kie.api.event.rule.RuleFlowGroupActivatedEvent; import org.kie.api.event.rule.RuleFlowGroupDeactivatedEvent; import org.kie.api.event.rule.RuleRuntimeEventListener; import org.kie.api.runtime.KieSession; public class AuditLogger { private final Set<String> logs = new HashSet<String>(); private final Map<String, KieSession> ksessions; public AuditLogger(Map<String, KieSession> ksessions) { this.ksessions = ksessions; for (KieSession ksession : ksessions.values()) { if (ksession != null) { addRuleRuntimeEventListener(ksession); addAgendaEventListener(ksession); addProcessEventListener(ksession); } } } public Set<String> getLog() { return logs; } private void addProcessEventListener(KieSession ksession) { ksession.addEventListener(new ProcessEventListener() { @Override public void beforeProcessStarted(ProcessStartedEvent processStartedEvent) { log(processStartedEvent); } @Override public void afterProcessStarted(ProcessStartedEvent processStartedEvent) { log(processStartedEvent); } @Override public void beforeProcessCompleted(ProcessCompletedEvent processCompletedEvent) { log(processCompletedEvent); } @Override public void afterProcessCompleted(ProcessCompletedEvent processCompletedEvent) { log(processCompletedEvent); } @Override public void beforeNodeTriggered(ProcessNodeTriggeredEvent processNodeTriggeredEvent) { log(processNodeTriggeredEvent); } @Override public void afterNodeTriggered(ProcessNodeTriggeredEvent processNodeTriggeredEvent) { log(processNodeTriggeredEvent); } @Override public void beforeNodeLeft(ProcessNodeLeftEvent processNodeLeftEvent) { log(processNodeLeftEvent); } @Override public void afterNodeLeft(ProcessNodeLeftEvent processNodeLeftEvent) { log(processNodeLeftEvent); } @Override public void beforeVariableChanged(ProcessVariableChangedEvent processVariableChangedEvent) { log(processVariableChangedEvent); } @Override public void afterVariableChanged(ProcessVariableChangedEvent processVariableChangedEvent) { log(processVariableChangedEvent); } }); } private void addAgendaEventListener(KieSession ksession) { ksession.addEventListener(new AgendaEventListener() { @Override public void matchCreated(MatchCreatedEvent matchCreatedEvent) { log(matchCreatedEvent); } @Override public void matchCancelled(MatchCancelledEvent matchCancelledEvent) { log(matchCancelledEvent); } @Override public void beforeMatchFired(BeforeMatchFiredEvent beforeMatchFiredEvent) { // log(beforeMatchFiredEvent); } @Override public void afterMatchFired(AfterMatchFiredEvent afterMatchFiredEvent) { logs.add("Rule " + afterMatchFiredEvent.getMatch().getRule() + " fired."); } @Override public void agendaGroupPopped(AgendaGroupPoppedEvent agendaGroupPoppedEvent) { log(agendaGroupPoppedEvent); } @Override public void agendaGroupPushed(AgendaGroupPushedEvent agendaGroupPushedEvent) { log(agendaGroupPushedEvent); } @Override public void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent ruleFlowGroupActivatedEvent) { log(ruleFlowGroupActivatedEvent); } @Override public void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent ruleFlowGroupActivatedEvent) { log(ruleFlowGroupActivatedEvent); } @Override public void beforeRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent ruleFlowGroupDeactivatedEvent) { log(ruleFlowGroupDeactivatedEvent); } @Override public void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent ruleFlowGroupDeactivatedEvent) { log(ruleFlowGroupDeactivatedEvent); } }); } private void addRuleRuntimeEventListener(KieSession ksession) { ksession.addEventListener(new RuleRuntimeEventListener() { @Override public void objectInserted(ObjectInsertedEvent objectInsertedEvent) { Object object = objectInsertedEvent.getObject(); Rule rule = objectInsertedEvent.getRule(); if (rule == null) { logs.add("Fact " + object.getClass().getName() + " inserted."); } else { logs.add("Fact " + object.getClass().getName() + " inserted in rule " + rule.getName() + ". Fact[ " + object.toString() + " ]."); } } @Override public void objectUpdated(ObjectUpdatedEvent objectUpdatedEvent) { Object object = objectUpdatedEvent.getObject(); Rule rule = objectUpdatedEvent.getRule(); Object oldObject = objectUpdatedEvent.getOldObject(); if (rule == null) { logs.add("Object " + object.getClass().getName() + " updated. Old fact[ " + oldObject.toString() + " ]. New fact[ " + object.toString() + " ]."); } else { logs.add("Object " + object.getClass().getName() + " updated in rule " + rule.getName() + ". Old fact[ " + oldObject.toString() + " ]. New fact[ " + object.toString() + " ]."); } } @Override public void objectDeleted(ObjectDeletedEvent objectDeletedEvent) { Object oldObject = objectDeletedEvent.getOldObject(); Rule rule = objectDeletedEvent.getRule(); if (rule == null) { logs.add("Object " + oldObject.getClass().getName() + " deleted. Fact[ " + oldObject.toString() + " ]."); } else { logs.add("Object " + oldObject.getClass().getName() + " deleted in rule " + rule.getName() + ". Fact[ " + oldObject.toString() + " ]."); } } }); } private void log(Object o) { logs.add(o.toString()); } }