From: <pn...@hy...> - 2009-12-18 05:13:11
|
Author: pnguyen Date: 2009-12-17 21:12:55 -0800 (Thu, 17 Dec 2009) New Revision: 14104 URL: http://svn.hyperic.org/?view=rev&root=Hyperic+HQ&revision=14104 Modified: trunk/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImpl.java trunk/unittest/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImplTest.java Log: [HQ-1903] When creating a recovery alert definition, it's initial state should be reconstituted from the db (similar to the startup process) so that it is aware that the problem alert definition has fired but has not been fixed. Modified: trunk/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImpl.java =================================================================== --- trunk/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImpl.java 2009-12-17 08:58:26 UTC (rev 14103) +++ trunk/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImpl.java 2009-12-18 05:12:55 UTC (rev 14104) @@ -47,6 +47,9 @@ import org.hyperic.hq.application.ShutdownCallback; import org.hyperic.hq.application.TransactionListener; import org.hyperic.hq.authz.server.session.AuthzSubject; +import org.hyperic.hq.authz.server.session.AuthzSubjectManagerEJBImpl; +import org.hyperic.hq.authz.shared.AuthzConstants; +import org.hyperic.hq.authz.shared.AuthzSubjectManagerLocal; import org.hyperic.hq.bizapp.server.trigger.conditional.ConditionalTriggerInterface; import org.hyperic.hq.common.SystemException; import org.hyperic.hq.events.AlertFiredEvent; @@ -56,9 +59,11 @@ import org.hyperic.hq.events.ext.RegisterableTriggerInterface; import org.hyperic.hq.events.ext.RegisterableTriggerRepository; import org.hyperic.hq.events.ext.RegisteredTriggers; +import org.hyperic.hq.events.server.session.AlertManagerEJBImpl; import org.hyperic.hq.events.server.session.EventLogManagerEJBImpl; import org.hyperic.hq.events.shared.AlertConditionValue; import org.hyperic.hq.events.shared.AlertDefinitionValue; +import org.hyperic.hq.events.shared.AlertManagerLocal; import org.hyperic.hq.events.shared.EventLogManagerLocal; import org.hyperic.hq.events.shared.RegisteredTriggerManagerLocal; import org.hyperic.hq.events.shared.RegisteredTriggerManagerUtil; @@ -102,6 +107,10 @@ private TriggerDAOInterface triggerDAO; + private AlertManagerLocal alertManager; + + private AuthzSubjectManagerLocal authzSubjectManager; + private EventLogManagerLocal eventLogManager; private ZeventEnqueuer zeventEnqueuer; @@ -163,8 +172,11 @@ log.warn("Unable to find AlertDefinition with id: " + alertDefId + ". These alerts will not fire."); return; } + AlertConditionEvaluator alertConditionEvaluator = alertConditionEvaluatorFactory.create(alertDefinition); + initializeAlertConditionEvaluatorState(alertConditionEvaluator); alertConditionEvaluatorRepository.addAlertConditionEvaluator(alertConditionEvaluator); + for (Iterator i = registeredTriggers.iterator(); i.hasNext();) { // Try to register each trigger, if exception, then move on RegisteredTrigger tv = (RegisteredTrigger) i.next(); @@ -179,6 +191,36 @@ } } + private void initializeAlertConditionEvaluatorState(AlertConditionEvaluator ace) { + Serializable initialState = null; + + if (ace instanceof RecoveryConditionEvaluator) { + // HQ-1903: The initial state of a recovery alert definition + // should be reconstituted from the db so that it is aware of + // the current state of the problem alert definition. + RecoveryConditionEvaluator rce = (RecoveryConditionEvaluator) ace; + Integer alertDefId = rce.getRecoveringFromAlertDefinitionId(); + AuthzSubject hqadmin = getAuthzSubjectManager() + .getSubjectById(AuthzConstants.rootSubjectId); + Alert alert = getAlertManager() + .findLastUnfixedByDefinition(hqadmin, alertDefId); + if (alert != null) { + AlertDefinition ad = alert.getAlertDefinition(); + initialState = + new AlertFiredEvent(alert.getId(), + ad.getId(), + new AppdefEntityID(ad.getResource()), + ad.getName(), + alert.getTimestamp(), + null); + } + } + + if (initialState != null) { + ace.initialize(initialState); + } + } + private void initializeTriggers(Collection registeredTriggers) { final boolean debug = log.isDebugEnabled(); StopWatch watch = new StopWatch(); @@ -320,7 +362,7 @@ } } - Map results = getEventLogManagerLocal() + Map results = getEventLogManager() .findLastUnfixedAlertFiredEvents(new ArrayList(alertDefinitionIds)); if (debug) { @@ -736,14 +778,34 @@ void setTriggerDAO(TriggerDAOInterface triggerDAO) { this.triggerDAO = triggerDAO; } + + AlertManagerLocal getAlertManager() { + return (this.alertManager == null) + ? AlertManagerEJBImpl.getOne() + : this.alertManager; + } - EventLogManagerLocal getEventLogManagerLocal() { + void setAlertManager(AlertManagerLocal alertManagerLocal) { + this.alertManager = alertManagerLocal; + } + + AuthzSubjectManagerLocal getAuthzSubjectManager() { + return (this.authzSubjectManager == null) + ? AuthzSubjectManagerEJBImpl.getOne() + : this.authzSubjectManager; + } + + void setAuthzSubjectManager(AuthzSubjectManagerLocal authzSubjectManagerLocal) { + this.authzSubjectManager = authzSubjectManagerLocal; + } + + EventLogManagerLocal getEventLogManager() { return (this.eventLogManager == null) ? EventLogManagerEJBImpl.getOne() : this.eventLogManager; } - void setEventLogManagerLocal(EventLogManagerLocal eventLogManagerLocal) { + void setEventLogManager(EventLogManagerLocal eventLogManagerLocal) { this.eventLogManager = eventLogManagerLocal; } Modified: trunk/unittest/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImplTest.java =================================================================== --- trunk/unittest/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImplTest.java 2009-12-17 08:58:26 UTC (rev 14103) +++ trunk/unittest/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImplTest.java 2009-12-18 05:12:55 UTC (rev 14104) @@ -12,10 +12,12 @@ import junit.framework.TestCase; import org.easymock.EasyMock; +import org.hyperic.hq.authz.shared.AuthzSubjectManagerLocal; import org.hyperic.hq.events.InvalidTriggerDataException; import org.hyperic.hq.events.ext.MockTrigger; import org.hyperic.hq.events.ext.RegisterableTriggerInterface; import org.hyperic.hq.events.ext.RegisterableTriggerRepository; +import org.hyperic.hq.events.shared.AlertManagerLocal; import org.hyperic.hq.events.shared.EventLogManagerLocal; import org.hyperic.hq.events.shared.RegisteredTriggerValue; import org.hyperic.hq.zevents.ZeventEnqueuer; @@ -32,6 +34,8 @@ private AlertConditionEvaluatorFactory alertConditionEvaluatorFactory; private AlertConditionEvaluator alertConditionEvaluator; private TriggerDAOInterface triggerDAO; + private AlertManagerLocal alertManagerLocal; + private AuthzSubjectManagerLocal authzSubjectManagerLocal; private EventLogManagerLocal eventLogManagerLocal; private RegisteredTriggerManagerEJBImpl registeredTriggerManager; private RegisterableTriggerRepository registeredTriggerRepository; @@ -53,6 +57,8 @@ this.alertConditionEvaluatorFactory = EasyMock.createMock(AlertConditionEvaluatorFactory.class); this.alertConditionEvaluator = EasyMock.createMock(AlertConditionEvaluator.class); this.triggerDAO = EasyMock.createMock(TriggerDAOInterface.class); + this.alertManagerLocal = EasyMock.createMock(AlertManagerLocal.class); + this.authzSubjectManagerLocal = EasyMock.createMock(AuthzSubjectManagerLocal.class); this.eventLogManagerLocal = EasyMock.createMock(EventLogManagerLocal.class); this.registeredTriggerRepository = EasyMock.createMock(RegisterableTriggerRepository.class); this.zEventEnqueuer = EasyMock.createMock(ZeventEnqueuer.class); @@ -62,7 +68,9 @@ this.registeredTriggerManager = new RegisteredTriggerManagerEJBImpl(); registeredTriggerManager.setAlertConditionEvaluatorFactory(alertConditionEvaluatorFactory); registeredTriggerManager.setTriggerDAO(triggerDAO); - registeredTriggerManager.setEventLogManagerLocal(eventLogManagerLocal); + registeredTriggerManager.setAlertManager(alertManagerLocal); + registeredTriggerManager.setAuthzSubjectManager(authzSubjectManagerLocal); + registeredTriggerManager.setEventLogManager(eventLogManagerLocal); registeredTriggerManager.setZeventEnqueuer(zEventEnqueuer); registeredTriggerManager.setAlertConditionEvaluatorRepository(alertConditionEvaluatorRepository); MockTrigger.initialized = false; |