Index: opennms-correlation/drools-correlation-engine/src/test/java/org/opennms/netmgt/correlation/drools/DroolsCorrelationEngineTest.java =================================================================== --- opennms-correlation/drools-correlation-engine/src/test/java/org/opennms/netmgt/correlation/drools/DroolsCorrelationEngineTest.java (revision 5579) +++ opennms-correlation/drools-correlation-engine/src/test/java/org/opennms/netmgt/correlation/drools/DroolsCorrelationEngineTest.java (working copy) @@ -166,9 +166,6 @@ Thread.sleep(1100); - // FIXME:This doesnt work unless we wait an extra secode for each flap. NOT GOOD - Thread.sleep(3000); - m_anticipatedMemorySize = 0; verify(); Index: opennms-correlation/drools-correlation-engine/src/main/java/org/opennms/netmgt/correlation/drools/Flap.java =================================================================== --- opennms-correlation/drools-correlation-engine/src/main/java/org/opennms/netmgt/correlation/drools/Flap.java (revision 5579) +++ opennms-correlation/drools-correlation-engine/src/main/java/org/opennms/netmgt/correlation/drools/Flap.java (working copy) @@ -3,13 +3,13 @@ import java.util.Date; public class Flap { - Long m_nodeid; - String m_ipAddr; - String m_svcName; - Date m_startTime; - Date m_endTime; - Integer m_locationMonitor; - boolean m_counted; + private Long m_nodeid; + private String m_ipAddr; + private String m_svcName; + private Date m_startTime; + private Date m_endTime; + private Integer m_locationMonitor; + private FlapCount m_flapCount = null; public Flap(Long nodeid, String ipAddr, String svcName, Integer locationMonitor) { m_nodeid = nodeid; @@ -17,7 +17,6 @@ m_svcName = svcName; m_locationMonitor = locationMonitor; m_startTime = new Date(); - m_counted = false; } public Date getEndTime() { @@ -58,12 +57,14 @@ } public boolean isCounted() { - return m_counted; + return m_flapCount != null; } - public void setCounted(boolean counted) { - m_counted = counted; + public void setFlapCount(FlapCount flapCount) { + m_flapCount = flapCount; } - + public void goByeBye() { + m_flapCount.decrement(); + } } Index: opennms-correlation/drools-correlation-engine/src/main/java/org/opennms/netmgt/correlation/drools/FlapCount.java =================================================================== --- opennms-correlation/drools-correlation-engine/src/main/java/org/opennms/netmgt/correlation/drools/FlapCount.java (revision 5579) +++ opennms-correlation/drools-correlation-engine/src/main/java/org/opennms/netmgt/correlation/drools/FlapCount.java (working copy) @@ -1,16 +1,22 @@ package org.opennms.netmgt.correlation.drools; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; + +import org.drools.spi.KnowledgeHelper; public class FlapCount { - Long m_nodeid; - String m_ipAddr; - String m_svcName; - Integer m_locationMonitor; + private final PropertyChangeSupport m_changes = new PropertyChangeSupport(this); + + private Long m_nodeid; + private String m_ipAddr; + private String m_svcName; + private Integer m_locationMonitor; boolean m_alerted; - Integer m_count; + private Integer m_count; - public FlapCount(Long nodeid, String ipAddr, String svcName, Integer locationMonitor) { + private FlapCount(Long nodeid, String ipAddr, String svcName, Integer locationMonitor) { m_nodeid = nodeid; m_ipAddr = ipAddr; m_svcName = svcName; @@ -19,12 +25,46 @@ m_alerted = false; } + private FlapCount(Flap flap) { + this(flap.getNodeid(), flap.getIpAddr(), flap.getSvcName(), flap.getLocationMonitor()); + flap.setFlapCount(this); + } + + private FlapCount(Flap flap, KnowledgeHelper helper) { + this(flap); + helper.assertObject(this, true); + } + + public static void createCountForFlap(Flap flap, KnowledgeHelper helper) { + new FlapCount(flap, helper); + } + + public void addPropertyChangeListener(final PropertyChangeListener l) { + m_changes.addPropertyChangeListener(l); + } + + public void removePropertyChangeListener(final PropertyChangeListener l) { + m_changes.removePropertyChangeListener(l); + } + + /* public void increment() { m_count += 1; } + */ + + public void add(Flap flap) { + Integer oldCount = m_count; + m_count += 1; + m_changes.firePropertyChange("count", oldCount, m_count); + + flap.setFlapCount(this); + } public void decrement() { + Integer oldCount = m_count; m_count -= 1; + m_changes.firePropertyChange("count", oldCount, m_count); } public Integer getCount() { Index: opennms-correlation/drools-correlation-engine/src/main/resources/org/opennms/netmgt/correlation/drools/Correlation.drl =================================================================== --- opennms-correlation/drools-correlation-engine/src/main/resources/org/opennms/netmgt/correlation/drools/Correlation.drl (revision 5579) +++ opennms-correlation/drools-correlation-engine/src/main/resources/org/opennms/netmgt/correlation/drools/Correlation.drl (working copy) @@ -72,8 +72,7 @@ $flap : Flap( $nodeid : nodeid, $ipAddr : ipAddr, $svcName : svcName, $locMon : locationMonitor, endTime != null, counted == false ) not FlapCount( nodeid == $nodeid, ipAddr == $ipAddr, svcName == $svcName, locationMonitor == $locMon) then - assert( new FlapCount( $nodeid, $ipAddr, $svcName, $locMon ) ); - $flap.setCounted( true ); + FlapCount.createCountForFlap($flap, drools); modify( $flap ); end @@ -82,9 +81,7 @@ $flap : Flap( $nodeid : nodeid, $ipAddr : ipAddr, $svcName : svcName, $locMon : locationMonitor, endTime != null, counted == false ) $flapCount : FlapCount( nodeid == $nodeid, ipAddr == $ipAddr, svcName == $svcName, locationMonitor == $locMon ) then - $flapCount.increment(); - modify( $flapCount ); - $flap.setCounted( true ); + $flapCount.add( $flap ); modify( $flap ); end @@ -93,18 +90,19 @@ rule "retract expired flaps" duration 1000 when - $flap : Flap( $nodeid : nodeid, $ipAddr : ipAddr, $svcName : svcName, $locMon : locationMonitor ) - $flapCount : FlapCount( nodeid == $nodeid, ipAddr == $ipAddr, svcName == $svcName, locationMonitor == $locMon ) + $flap : Flap() then - $flapCount.decrement(); - if ( $flapCount.getCount() == 0 ) { - retract( $flapCount ); - } else { - modify( $flapCount ); - } + $flap.goByeBye(); retract( $flap ); end +rule "flap count 0" + when + $flapCount : FlapCount( count == 0 ) + then + retract( $flapCount ); +end + rule "flap count exceeded" when $flapCount : FlapCount( $nodeid : nodeid, $ipAddr : ipAddr, $svcName : svcName, $locMon : locationMonitor, alerted == false, count >= ( flapCount ) )