Author: jhickey Date: 2009-08-11 13:19:56 -0700 (Tue, 11 Aug 2009) New Revision: 13611 URL: http://svn.hyperic.org/?view=rev&root=Hyperic+HQ&revision=13611 Modified: trunk/src/org/hyperic/hq/bizapp/server/session/EventsBossEJBImpl.java trunk/src/org/hyperic/hq/events/ext/RegisterableTriggerRepository.java trunk/src/org/hyperic/hq/events/ext/RegisteredTriggers.java trunk/src/org/hyperic/hq/events/server/session/AlertDefinitionManagerEJBImpl.java trunk/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImpl.java trunk/src/org/hyperic/hq/events/server/session/TriggerDAO.java trunk/src/org/hyperic/hq/events/server/session/TriggerDAOInterface.java trunk/unittest/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImplTest.java Log: HHQ-3306 Modified: trunk/src/org/hyperic/hq/bizapp/server/session/EventsBossEJBImpl.java =================================================================== --- trunk/src/org/hyperic/hq/bizapp/server/session/EventsBossEJBImpl.java 2009-08-11 08:13:28 UTC (rev 13610) +++ trunk/src/org/hyperic/hq/bizapp/server/session/EventsBossEJBImpl.java 2009-08-11 20:19:56 UTC (rev 13611) @@ -196,8 +196,8 @@ .getMaintenanceEventManager(); } - + /* * How the Boss figures out which triggers to create based on conditions */ @@ -1215,23 +1215,9 @@ return iface.getConfigSchema(); } - - /** - * Get a collection of all triggers using the 'Registered Dispatcher' - * * @ejb:interface-method */ - public Collection getAllRegisteredTriggers(int sessionID) - throws SessionNotFoundException, SessionTimeoutException - { - manager.authenticate(sessionID); - return getRTM().getAllTriggers(); - } - - /** - * @ejb:interface-method - */ public void deleteEscalationByName(int sessionID, String name) throws SessionTimeoutException, SessionNotFoundException, PermissionException, ApplicationException Modified: trunk/src/org/hyperic/hq/events/ext/RegisterableTriggerRepository.java =================================================================== --- trunk/src/org/hyperic/hq/events/ext/RegisterableTriggerRepository.java 2009-08-11 08:13:28 UTC (rev 13610) +++ trunk/src/org/hyperic/hq/events/ext/RegisterableTriggerRepository.java 2009-08-11 20:19:56 UTC (rev 13611) @@ -10,6 +10,12 @@ /** * + * @param trigger The trigger to add to the repository + */ + void addTrigger(RegisterableTriggerInterface trigger); + + /** + * * @param eventClass The event class * @param instanceId The id of the source instance of the event * @return The {@link RegisterableTriggerInterface}s interested in the event @@ -18,9 +24,10 @@ /** * - * @param trigger The trigger to add to the repository + * @param triggerId The trigger ID + * @return The {@link RegisterableTriggerInterface} with the specified ID or null if none exists */ - void addTrigger(RegisterableTriggerInterface trigger); + RegisterableTriggerInterface getTriggerById(Integer triggerId); /** * Modified: trunk/src/org/hyperic/hq/events/ext/RegisteredTriggers.java =================================================================== --- trunk/src/org/hyperic/hq/events/ext/RegisteredTriggers.java 2009-08-11 08:13:28 UTC (rev 13610) +++ trunk/src/org/hyperic/hq/events/ext/RegisteredTriggers.java 2009-08-11 20:19:56 UTC (rev 13611) @@ -26,14 +26,15 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import org.hyperic.hq.events.AbstractEvent; import org.hyperic.hq.events.server.session.AlertRegulator; import org.hyperic.hq.events.server.session.RegisteredTriggerManagerEJBImpl; import org.hyperic.hq.events.shared.RegisteredTriggerManagerLocal; -import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap; + /** * Repository of in memory triggers for event processing * @author jhickey @@ -69,7 +70,7 @@ public Collection getInterestedTriggers(Class eventClass, Integer instanceId) { HashSet trigs = new HashSet(); - //All alerts are disabled, so no triggers should be processing events + // All alerts are disabled, so no triggers should be processing events if (!AlertRegulator.getInstance().alertsAllowed()) { return trigs; } @@ -78,10 +79,11 @@ if (triggersById != null) { trigs.addAll(triggersById.values()); } - //Remove disabled triggers from new set so don't have to synchronize retrieval around concurrent triggers map - for(Iterator iterator = trigs.iterator();iterator.hasNext();) { - RegisterableTriggerInterface trigger = (RegisterableTriggerInterface)iterator.next(); - if(! trigger.isEnabled()) { + // Remove disabled triggers from new set so don't have to synchronize + // retrieval around concurrent triggers map + for (Iterator iterator = trigs.iterator(); iterator.hasNext();) { + RegisterableTriggerInterface trigger = (RegisterableTriggerInterface) iterator.next(); + if (!trigger.isEnabled()) { iterator.remove(); } } @@ -132,21 +134,28 @@ } } - - public void setTriggersEnabled(Collection triggerIds, boolean enabled) { - Set triggersToProcess = new HashSet(); + public RegisterableTriggerInterface getTriggerById(Integer triggerId) { synchronized (triggerUpdateLock) { for (Iterator triggerMaps = triggers.values().iterator(); triggerMaps.hasNext();) { Map triggerIdsToTriggers = (Map) triggerMaps.next(); - for(Iterator idIterator = triggerIds.iterator(); idIterator.hasNext();) { - Integer triggerId = (Integer)idIterator.next(); - RegisterableTriggerInterface trigger = (RegisterableTriggerInterface)triggerIdsToTriggers.get(triggerId); - if(trigger != null) { - triggersToProcess.add(trigger); - } + RegisterableTriggerInterface trigger = (RegisterableTriggerInterface) triggerIdsToTriggers.get(triggerId); + if (trigger != null) { + return trigger; } } + return null; } + } + + public void setTriggersEnabled(Collection triggerIds, boolean enabled) { + Set triggersToProcess = new HashSet(); + for(Iterator idIterator = triggerIds.iterator(); idIterator.hasNext();) { + Integer triggerId = (Integer)idIterator.next(); + RegisterableTriggerInterface trigger = getTriggerById(triggerId); + if(trigger != null) { + triggersToProcess.add(trigger); + } + } //not concerned with thread-safety of "enabled" boolean - willing to deal with some being read with old value during update for(Iterator iterator = triggersToProcess.iterator();iterator.hasNext();) { RegisterableTriggerInterface trigger = (RegisterableTriggerInterface)iterator.next(); Modified: trunk/src/org/hyperic/hq/events/server/session/AlertDefinitionManagerEJBImpl.java =================================================================== --- trunk/src/org/hyperic/hq/events/server/session/AlertDefinitionManagerEJBImpl.java 2009-08-11 08:13:28 UTC (rev 13610) +++ trunk/src/org/hyperic/hq/events/server/session/AlertDefinitionManagerEJBImpl.java 2009-08-11 20:19:56 UTC (rev 13611) @@ -797,28 +797,8 @@ return ad.isResourceTypeDefinition(); } - /** - * Decide if a trigger should fire the alert - * - * @ejb:interface-method - * @param tid the trigger ID - * @return the ID of the alert definition - */ - public Integer getIdFromTrigger(Integer tid) { - RegisteredTrigger trigger = registeredTriggerManager.get(tid); - if (trigger == null) { - return null; - } - AlertDefinition def = trigger.getAlertDefinition(); - if (def != null && !def.isDeleted()) { - return def.getId(); - } else { - return null; - } - } - /** * @ejb:interface-method */ Modified: trunk/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImpl.java =================================================================== --- trunk/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImpl.java 2009-08-11 08:13:28 UTC (rev 13610) +++ trunk/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImpl.java 2009-08-11 20:19:56 UTC (rev 13611) @@ -46,6 +46,7 @@ import org.hyperic.hq.events.shared.RegisteredTriggerManagerLocal; import org.hyperic.hq.events.shared.RegisteredTriggerManagerUtil; import org.hyperic.hq.events.shared.RegisteredTriggerValue; +import org.hyperic.hq.zevents.ZeventEnqueuer; import org.hyperic.hq.zevents.ZeventManager; import org.hyperic.util.config.ConfigResponse; import org.hyperic.util.config.EncodingException; @@ -86,6 +87,8 @@ private TriggerDAOInterface triggerDAO; + private ZeventEnqueuer zeventEnqueuer; + /** * Processes {@link TriggerCreatedEvent}s that indicate that triggers should * be created @@ -109,7 +112,13 @@ log.debug("Initializing triggers"); long startTime = System.currentTimeMillis(); this.registeredTriggerRepository = registeredTriggerRepository; - Collection registeredTriggers = getTriggers(); + // Only initialize the enabled triggers. If disabled ones become enabled + // we will lazy init + log.debug("Fetching enabled triggers"); + Collection registeredTriggers = getTriggerDAO().findAllEnabledTriggers(); + if(log.isDebugEnabled()) { + log.debug("Found " + registeredTriggers.size() + " triggers"); + } registerTriggers(registeredTriggers); ConcurrentStatsCollector.getInstance().addStat(System.currentTimeMillis() - startTime, ConcurrentStatsCollector.TRIGGER_INIT_TIME); @@ -216,22 +225,21 @@ */ public void setAlertDefinitionTriggersEnabled(Integer alertDefId, boolean enabled) { Collection triggerIds = getTriggerIdsByAlertDefId(alertDefId); - addPostCommitSetEnabledListener(triggerIds, enabled); + addPostCommitSetEnabledListener(alertDefId, triggerIds, enabled); } - private void addPostCommitSetEnabledListener(final Collection triggerIds, final boolean enabled) { + private void addPostCommitSetEnabledListener(final Integer alertDefId, final Collection triggerIds, final boolean enabled) { try { HQApp.getInstance().addTransactionListener(new TransactionListener() { public void afterCommit(boolean success) { if (success) { try { - setTriggersEnabled(triggerIds, enabled); + setTriggersEnabled(alertDefId, triggerIds, enabled); } catch (Exception e) { log.error("Error setting triggers enabled to " + enabled, e); } } } - public void beforeCommit() { } }); @@ -240,9 +248,20 @@ } } - void setTriggersEnabled(final Collection triggerIds, final boolean enabled) { + void setTriggersEnabled(final Integer alertDefinitionId, final Collection triggerIds, final boolean enabled) { if (this.registeredTriggerRepository != null) { - registeredTriggerRepository.setTriggersEnabled(triggerIds, enabled); + if (enabled == true && !(triggerIds.isEmpty())) { + Integer triggerId = (Integer) triggerIds.iterator().next(); + if (registeredTriggerRepository.getTriggerById(triggerId) == null) { + try { + zeventEnqueuer.enqueueEvent(new TriggersCreatedZevent(alertDefinitionId)); + } catch (InterruptedException e) { + log.error("Error sending event to create newly enabled triggers for alert definition " + alertDefinitionId + ". These alerts will not fire",e); + } + } + } else { + registeredTriggerRepository.setTriggersEnabled(triggerIds, enabled); + } } } @@ -267,18 +286,6 @@ return getTriggerDAO().findById(id); } - /** - * Get a trigger by its ID - * @param id The trigger ID - * @return The trigger with the associated ID or null if the trigger does - * not exist - * - * @ejb:interface-method - */ - public RegisteredTrigger get(Integer id) { - return getTriggerDAO().get(id); - } - void unregisterTriggers(Collection triggers) { // No point unregistering if repository has not been intialized if (this.registeredTriggerRepository != null) { @@ -299,43 +306,13 @@ } /** - * Get a collection of all triggers - * - * @ejb:interface-method - */ - public Collection getAllTriggers() { - Collection triggers; - List triggerValues = new ArrayList(); - - triggers = getTriggers(); - - for (Iterator i = triggers.iterator(); i.hasNext();) { - RegisteredTrigger t = (RegisteredTrigger) i.next(); - - triggerValues.add(t.getRegisteredTriggerValue()); - } - - return triggerValues; - } - - /** - * Get a collection of all triggers - * - * @ejb:interface-method - */ - public Collection getTriggers() { - return getTriggerDAO().findAll(); - } - - /** * Get the registered trigger objects associated with a given alert * definition. * * @param id The alert def id. * @return The registered trigger objects. - * @ejb:interface-method */ - public Collection getAllTriggersByAlertDefId(Integer id) { + private Collection getAllTriggersByAlertDefId(Integer id) { return getTriggerDAO().findByAlertDefinitionId(id); } @@ -416,7 +393,7 @@ AlertDefinition alertDefinition = getDefinitionFromTrigger((RegisteredTrigger) triggers.iterator() .next()); if (alertDefinition != null) { - ZeventManager.getInstance() + zeventEnqueuer .enqueueEvent(new TriggersCreatedZevent(alertDefinition.getId())); } } @@ -474,17 +451,6 @@ } /** - * Update a trigger. - * - * @ejb:interface-method - */ - public void updateTrigger(RegisteredTriggerValue val) { - RegisteredTrigger t = getRegisteredTrigger(val.getId()); - - t.setRegisteredTriggerValue(val); - } - - /** * Delete all triggers for an alert definition. * * @ejb:interface-method @@ -517,6 +483,10 @@ this.registeredTriggerRepository = registeredTriggerRepository; } + void setZeventEnqueuer(ZeventEnqueuer zeventEnqueuer) { + this.zeventEnqueuer = zeventEnqueuer; + } + public static RegisteredTriggerManagerLocal getOne() { try { return RegisteredTriggerManagerUtil.getLocalHome().create(); @@ -526,7 +496,8 @@ } public void ejbCreate() { - this.alertConditionEvaluatorFactory = new AlertConditionEvaluatorFactoryImpl(ZeventManager.getInstance()); + this.zeventEnqueuer = ZeventManager.getInstance(); + this.alertConditionEvaluatorFactory = new AlertConditionEvaluatorFactoryImpl(zeventEnqueuer); this.triggerDAO = DAOFactory.getDAOFactory().getTriggerDAO(); } Modified: trunk/src/org/hyperic/hq/events/server/session/TriggerDAO.java =================================================================== --- trunk/src/org/hyperic/hq/events/server/session/TriggerDAO.java 2009-08-11 08:13:28 UTC (rev 13610) +++ trunk/src/org/hyperic/hq/events/server/session/TriggerDAO.java 2009-08-11 20:19:56 UTC (rev 13611) @@ -1,37 +1,34 @@ /* - * NOTE: This copyright does *not* cover user programs that use HQ - * program services by normal system calls through the application - * program interfaces provided as part of the Hyperic Plug-in Development - * Kit or the Hyperic Client Development Kit - this is merely considered - * normal use of the program, and does *not* fall under the heading of - * "derived work". - * - * Copyright (C) [2004-2008], Hyperic, Inc. - * This file is part of HQ. - * - * HQ is free software; you can redistribute it and/or modify - * it under the terms version 2 of the GNU General Public License as - * published by the Free Software Foundation. This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. + * NOTE: This copyright doesnot cover user programs that use HQ program services + * by normal system calls through the application program interfaces provided as + * part of the Hyperic Plug-in Development Kit or the Hyperic Client Development + * Kit - this is merely considered normal use of the program, and doesnot fall + * under the heading of "derived work". Copyright (C) [2004-2008], Hyperic, Inc. + * This file is part of HQ. HQ is free software; you can redistribute it and/or + * modify it under the terms version 2 of the GNU General Public License as + * published by the Free Software Foundation. This program 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 this program; if not, write + * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA. */ package org.hyperic.hq.events.server.session; -import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; +import org.hibernate.dialect.Dialect; import org.hyperic.dao.DAOFactory; +import org.hyperic.hibernate.Util; import org.hyperic.hq.dao.HibernateDAO; import org.hyperic.hq.events.shared.RegisteredTriggerValue; -public class TriggerDAO extends HibernateDAO implements TriggerDAOInterface{ +public class TriggerDAO + extends HibernateDAO implements TriggerDAOInterface +{ public TriggerDAO(DAOFactory f) { super(RegisteredTrigger.class, f); } @@ -40,17 +37,15 @@ RegisteredTrigger res = new RegisteredTrigger(createInfo); save(res); - // Set the new ID just in case someone wants to use it + // Set the new ID just in case someone wants to use it createInfo.setId(res.getId()); - return res; } public void removeTriggers(AlertDefinition def) { - String sql = "update AlertCondition set trigger = null " + - "where alertDefinition = :def"; + String sql = "update AlertCondition set trigger = null " + "where alertDefinition = :def"; getSession().createQuery(sql).setParameter("def", def).executeUpdate(); @@ -58,17 +53,14 @@ } public void deleteAlertDefinition(AlertDefinition def) { - String sql = "update AlertCondition c set trigger = null " + - "where alertDefinition = :def or " + - "exists (select d.id from AlertDefinition d where " + - "d.parent = :def and c.alertDefinition = d)"; + String sql = "update AlertCondition c set trigger = null " + "where alertDefinition = :def or " + + "exists (select d.id from AlertDefinition d where " + + "d.parent = :def and c.alertDefinition = d)"; getSession().createQuery(sql).setParameter("def", def).executeUpdate(); - sql = "delete from RegisteredTrigger r " + - "where alertDefinition = :def or " + - "exists (select d.id from AlertDefinition d where " + - "d.parent = :def and r.alertDefinition = d)"; + sql = "delete from RegisteredTrigger r " + "where alertDefinition = :def or " + + "exists (select d.id from AlertDefinition d where " + "d.parent = :def and r.alertDefinition = d)"; getSession().createQuery(sql).setParameter("def", def).executeUpdate(); } @@ -90,9 +82,16 @@ public List findByAlertDefinitionId(Integer id) { String sql = "from RegisteredTrigger rt where rt.alertDefinition.id = :defId"; - return getSession().createQuery(sql) - .setParameter("defId", id) - .list(); + return getSession().createQuery(sql).setParameter("defId", id).list(); } + + public Set findAllEnabledTriggers() { + Dialect dialect = Util.getDialect(); + String hql = new StringBuilder().append("from RegisteredTrigger rt inner join fetch rt.alertDefinition as ad inner join fetch ad.conditionsBag as c where rt.alertDefinition.enabled = ") + .append(dialect.toBooleanValueString(true)) + .toString(); + return new LinkedHashSet(getSession().createQuery(hql).list()); + } + } Modified: trunk/src/org/hyperic/hq/events/server/session/TriggerDAOInterface.java =================================================================== --- trunk/src/org/hyperic/hq/events/server/session/TriggerDAOInterface.java 2009-08-11 08:13:28 UTC (rev 13610) +++ trunk/src/org/hyperic/hq/events/server/session/TriggerDAOInterface.java 2009-08-11 20:19:56 UTC (rev 13611) @@ -1,6 +1,7 @@ package org.hyperic.hq.events.server.session; import java.util.List; +import java.util.Set; import org.hyperic.hq.events.shared.RegisteredTriggerValue; /** @@ -24,4 +25,5 @@ void removeTriggers(AlertDefinition def); + Set findAllEnabledTriggers(); } Modified: trunk/unittest/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImplTest.java =================================================================== --- trunk/unittest/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImplTest.java 2009-08-11 08:13:28 UTC (rev 13610) +++ trunk/unittest/src/org/hyperic/hq/events/server/session/RegisteredTriggerManagerEJBImplTest.java 2009-08-11 20:19:56 UTC (rev 13611) @@ -2,7 +2,9 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; import junit.framework.TestCase; @@ -11,6 +13,7 @@ import org.hyperic.hq.events.ext.MockTrigger; import org.hyperic.hq.events.ext.RegisterableTriggerRepository; import org.hyperic.hq.events.shared.RegisteredTriggerValue; +import org.hyperic.hq.zevents.ZeventEnqueuer; /** * Unit test of the {@link RegisteredTriggerManagerEJBImpl} @@ -26,12 +29,13 @@ private TriggerDAOInterface triggerDAO; private RegisteredTriggerManagerEJBImpl registeredTriggerManager; private RegisterableTriggerRepository registeredTriggerRepository; + private ZeventEnqueuer zEventEnqueuer; private void replay() { EasyMock.replay(alertConditionEvaluatorFactory, alertConditionEvaluator, triggerDAO, - registeredTriggerRepository); + registeredTriggerRepository, zEventEnqueuer); } public void setUp() throws Exception { @@ -40,9 +44,11 @@ this.alertConditionEvaluator = EasyMock.createMock(AlertConditionEvaluator.class); this.triggerDAO = EasyMock.createMock(TriggerDAOInterface.class); this.registeredTriggerRepository = EasyMock.createMock(RegisterableTriggerRepository.class); + this.zEventEnqueuer = EasyMock.createMock(ZeventEnqueuer.class); this.registeredTriggerManager = new RegisteredTriggerManagerEJBImpl(); registeredTriggerManager.setAlertConditionEvaluatorFactory(alertConditionEvaluatorFactory); registeredTriggerManager.setTriggerDAO(triggerDAO); + registeredTriggerManager.setZeventEnqueuer(zEventEnqueuer); MockTrigger.initialized = false; MockTrigger.enabled = false; } @@ -52,12 +58,13 @@ */ public void testDisableTriggers() { Integer triggerId = Integer.valueOf(987); + Integer alertDefinitionId = Integer.valueOf(5432); List triggerIds = new ArrayList(); triggerIds.add(triggerId); registeredTriggerRepository.setTriggersEnabled(triggerIds, false); replay(); registeredTriggerManager.setRegisteredTriggerRepository(registeredTriggerRepository); - registeredTriggerManager.setTriggersEnabled(triggerIds, false); + registeredTriggerManager.setTriggersEnabled(alertDefinitionId,triggerIds, false); verify(); } @@ -66,10 +73,11 @@ */ public void testDisableTriggersNotInitialized() { Integer triggerId = Integer.valueOf(987); + Integer alertDefinitionId = Integer.valueOf(5432); List triggerIds = new ArrayList(); triggerIds.add(triggerId); replay(); - registeredTriggerManager.setTriggersEnabled(triggerIds, false); + registeredTriggerManager.setTriggersEnabled(alertDefinitionId,triggerIds, false); verify(); } @@ -267,11 +275,11 @@ trigger2.setId(mockTrigger2.getId()); trigger2.setAlertDefinition(alertDef); - List triggers = new ArrayList(); + Set triggers = new HashSet(); triggers.add(trigger); triggers.add(trigger2); - EasyMock.expect(triggerDAO.findAll()).andReturn(triggers); + EasyMock.expect(triggerDAO.findAllEnabledTriggers()).andReturn(triggers); EasyMock.expect(alertConditionEvaluatorFactory.create(alertDef)).andReturn(alertConditionEvaluator); registeredTriggerRepository.addTrigger(EasyMock.isA(MockTrigger.class)); EasyMock.expectLastCall().times(2); @@ -309,11 +317,11 @@ trigger2.setId(mockTrigger2.getId()); trigger2.setAlertDefinition(alertDef); - List triggers = new ArrayList(); + Set triggers = new HashSet(); triggers.add(trigger); triggers.add(trigger2); - EasyMock.expect(triggerDAO.findAll()).andReturn(triggers); + EasyMock.expect(triggerDAO.findAllEnabledTriggers()).andReturn(triggers); EasyMock.expect(alertConditionEvaluatorFactory.create(alertDef)).andReturn(alertConditionEvaluator); registeredTriggerRepository.addTrigger(EasyMock.isA(MockTrigger.class)); replay(); @@ -350,11 +358,11 @@ trigger2.setId(mockTrigger2.getId()); trigger2.setAlertDefinition(alertDef); - List triggers = new ArrayList(); + Set triggers = new HashSet(); triggers.add(trigger); triggers.add(trigger2); - EasyMock.expect(triggerDAO.findAll()).andReturn(triggers); + EasyMock.expect(triggerDAO.findAllEnabledTriggers()).andReturn(triggers); EasyMock.expect(alertConditionEvaluatorFactory.create(alertDef)).andReturn(alertConditionEvaluator); registeredTriggerRepository.addTrigger(EasyMock.isA(MockTrigger.class)); registeredTriggerRepository.addTrigger(EasyMock.isA(MockTrigger.class)); @@ -397,11 +405,11 @@ trigger2.setId(mockTrigger2.getId()); trigger2.setAlertDefinition(alertDef2); - List triggers = new ArrayList(); + Set triggers = new HashSet(); triggers.add(trigger); triggers.add(trigger2); - EasyMock.expect(triggerDAO.findAll()).andReturn(triggers); + EasyMock.expect(triggerDAO.findAllEnabledTriggers()).andReturn(triggers); EasyMock.expect(alertConditionEvaluatorFactory.create(alertDef)).andReturn(alertConditionEvaluator); EasyMock.expect(alertConditionEvaluatorFactory.create(alertDef2)).andThrow(new RuntimeException("Yikes!")); registeredTriggerRepository.addTrigger(EasyMock.isA(MockTrigger.class)); @@ -438,10 +446,10 @@ trigger.setId(mockTrigger.getId()); trigger.setAlertDefinition(alertDef); - List triggers = new ArrayList(); + Set triggers = new HashSet(); triggers.add(trigger); - EasyMock.expect(triggerDAO.findAll()).andReturn(triggers); + EasyMock.expect(triggerDAO.findAllEnabledTriggers()).andReturn(triggers); EasyMock.expect(alertConditionEvaluatorFactory.create(alertDef)).andReturn(alertConditionEvaluator); replay(); registeredTriggerManager.initializeTriggers(registeredTriggerRepository); @@ -450,6 +458,41 @@ } /** + * Verifies that triggers that have not yet been intialized will be initialized on first enable + * @throws InterruptedException + */ + public void testSetTriggersEnabledLazyInit() throws InterruptedException { + Integer triggerId = Integer.valueOf(987); + Integer alertDefinitionId = Integer.valueOf(5432); + List triggerIds = new ArrayList(); + triggerIds.add(triggerId); + EasyMock.expect(registeredTriggerRepository.getTriggerById(triggerId)).andReturn(null); + zEventEnqueuer.enqueueEvent(EasyMock.isA(TriggersCreatedZevent.class)); + replay(); + registeredTriggerManager.setRegisteredTriggerRepository(registeredTriggerRepository); + registeredTriggerManager.setTriggersEnabled(alertDefinitionId, triggerIds, true); + verify(); + } + + /** + * Verifies that nothing blows up if an Exception occurs queuing a TriggersCreatedZEvent on first enable + * @throws InterruptedException + */ + public void testSetTriggersEnabledLazyInitException() throws InterruptedException { + Integer triggerId = Integer.valueOf(987); + Integer alertDefinitionId = Integer.valueOf(5432); + List triggerIds = new ArrayList(); + triggerIds.add(triggerId); + EasyMock.expect(registeredTriggerRepository.getTriggerById(triggerId)).andReturn(null); + zEventEnqueuer.enqueueEvent(EasyMock.isA(TriggersCreatedZevent.class)); + EasyMock.expectLastCall().andThrow(new InterruptedException()); + replay(); + registeredTriggerManager.setRegisteredTriggerRepository(registeredTriggerRepository); + registeredTriggerManager.setTriggersEnabled(alertDefinitionId, triggerIds, true); + verify(); + } + + /** * Verifies that triggers are successfully removed from the repository */ public void testUnregisterTriggers() { @@ -526,6 +569,6 @@ EasyMock.verify(alertConditionEvaluatorFactory, alertConditionEvaluator, triggerDAO, - registeredTriggerRepository); + registeredTriggerRepository, zEventEnqueuer); } } |