/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2007-2011 The OpenNMS Group, Inc. * OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc. * * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. * * OpenNMS(R) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * OpenNMS(R) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenNMS(R). If not, see: * http://www.gnu.org/licenses/ * * For more information contact: * OpenNMS(R) Licensing <license@opennms.org> * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ package org.opennms.netmgt.correlation.drools; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Scanner; import org.apache.commons.lang.builder.ToStringBuilder; import org.drools.RuleBase; import org.drools.RuleBaseFactory; import org.drools.WorkingMemory; import org.drools.audit.WorkingMemoryFileLogger; import org.drools.compiler.PackageBuilder; /** * <p>CorrelationExample class.</p> * * @author <a href="mailto:brozow@opennms.org">Mathew Brozowski</a> * @version $Id: $ */ public class CorrelationExample { /** * <p>main</p> * * @param args an array of {@link java.lang.String} objects. * @throws java.lang.Exception if any. */ public static void main(final String[] args) throws Exception { final PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( new InputStreamReader( CorrelationExample.class.getResourceAsStream( "CorrelationExample.drl" ), "UTF-8" ) ); final RuleBase ruleBase = RuleBaseFactory.newRuleBase(); ruleBase.addPackage( builder.getPackage() ); final WorkingMemory workingMemory = ruleBase.newStatefulSession(); final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( workingMemory ); logger.setFileName( "log/correlation" ); final InputStream in = CorrelationExample.class.getResourceAsStream("simulation"); try { final Simulation simulation = new Simulation(); System.out.println("Loading Simulation"); simulation.load(in); System.out.println("Executing Simulation"); simulation.simulate(workingMemory); } finally { if (in != null) in.close(); } logger.writeToDisk(); } private static void sleep(final int delay) { try { Thread.sleep(delay); } catch (InterruptedException e) {} } public static class Simulation { public static class SimItem { final int m_delay; final EventBean m_event; public SimItem(final int delay, final EventBean event) { m_delay = delay; m_event = event; } public void simulate(final WorkingMemory memory) { sleep(m_delay); System.out.println("Start simulation of "+this); memory.insert(m_event); memory.fireAllRules(); System.out.println("End simulation of "+this); } } final Map<Integer, Node> m_nodes = new HashMap<Integer, Node>(); final List<SimItem> m_eventSequence = new LinkedList<SimItem>(); public void load(final InputStream in) { final Scanner scanner = new Scanner(in); while(scanner.hasNext()) { final String lineType = scanner.next(); if ("#".equals(lineType)) { scanner.nextLine(); } else if ("node".equals(lineType)) { /* expect line to be * node <nodeLabel> <nodeid> (<parentnodeid>?) * * Note: parent nodes need to be defined before their children * If the parentnodeid is missing then we assume that it has no parent */ final String nodeLabel = scanner.next(); final Integer nodeId = scanner.nextInt(); assert m_nodes.get(nodeId) == null : "Already have a node with id "+nodeId; Integer parentId = null; if (scanner.hasNextInt()) { parentId = scanner.nextInt(); } assert (parentId == null || m_nodes.containsKey(parentId)) : "Reference to parentId "+parentId+" that is not yet defined"; final Node parent = (parentId == null ? null : m_nodes.get(parentId)); final Node node = new Node(nodeId, nodeLabel, parent); m_nodes.put(nodeId, node); } else if ("event".equals(lineType)) { /* * expect line to be * event delay uei nodeid */ final int delay = scanner.nextInt(); final String uei = scanner.next(); final Integer nodeId = scanner.nextInt(); assert m_nodes.containsKey(nodeId) : "Invalid nodeId "+nodeId; final EventBean e = new EventBean(uei, m_nodes.get(nodeId)); final SimItem item = new SimItem(delay, e); m_eventSequence.add(item); } } } public void simulate(final WorkingMemory memory) { for (final SimItem item : m_eventSequence) { item.simulate(memory); System.out.println("Memory Size = " + getObjectCount(memory) ); } } } public static class Outage { private EventBean m_problem; private EventBean m_resolution; private Node m_cause; private Node m_node; public Outage(final Node node, final EventBean problem) { m_node = node; m_problem = problem; } public Node getNode() { return m_node; } public EventBean getProblem() { return m_problem; } public EventBean getResolution() { return m_resolution; } public void setResolution(final EventBean resolution) { m_resolution = resolution; } public Node getCause() { return m_cause; } public void setCause(final Node cause) { m_cause = cause; } public String toString() { return new ToStringBuilder(this) .append("problem", m_problem) .append("cause", m_cause) .append("resolution", m_resolution) .toString(); } } public static class Node { private Integer m_id; private Node m_parent; private String m_label; public Node(final Integer id, final String label, final Node parent) { m_id = id; m_label = label; m_parent = parent; } public Integer getId() { return m_id; } public Node getParent() { return m_parent; } public String getLabel() { return m_label; } @Override public String toString() { return new ToStringBuilder(this) .append("id", m_id) .append("label", m_label) .toString(); } } public static class EventBean { private String m_uei; private Node m_node; public EventBean(final String uei, final Node node) { m_uei = uei; m_node = node; } public String getUei() { return m_uei; } public Node getNode() { return m_node; } public String toString() { return new ToStringBuilder(this) .append("uei", m_uei) .append("node", m_node) .toString(); } } public static class PossibleCause { private Node m_node; private Outage m_outage; private boolean m_verified; public PossibleCause(final Node node, final Outage outage) { this(node, outage, false); } public PossibleCause(final Node node, final Outage outage, final boolean verified) { m_node = node; m_outage = outage; m_verified = verified; } public Node getNode() { return m_node; } public Outage getOutage() { return m_outage; } public boolean isVerified() { return m_verified; } public void setVerified(final boolean verified) { m_verified = verified; } public String toString() { return new ToStringBuilder(this) .append("node", m_node) .append("outage", m_outage) .toString(); } } /** * <p>getObjectCount</p> * * @param memory a {@link org.drools.WorkingMemory} object. * @return a int. */ public static int getObjectCount(final WorkingMemory memory) { int count = 0; for(final Iterator<?> it = memory.iterateObjects(); it.hasNext(); it.next()) { count++; } return count; } }