/*
* 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, 2005, 2006], 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.galerts.processor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperic.hq.authz.server.session.ResourceGroup;
import org.hyperic.hq.galerts.server.session.ExecutionReason;
import org.hyperic.hq.galerts.server.session.ExecutionStrategy;
import org.hyperic.hq.galerts.server.session.ExecutionStrategyInfo;
import org.hyperic.hq.galerts.server.session.GalertDef;
import org.hyperic.hq.galerts.server.session.GtriggerInfo;
/**
* Represents an in-memory alert definition. Different than the persisted
* objects such as {@link GalertDef}
*/
class MemGalertDef {
private final Log _log = LogFactory.getLog(MemGalertDef.class);
private final Log _triggerFiredLog =
LogFactory.getLog(MemGalertDef.class.getName()+".Fired");
private Integer _id;
private String _name;
private Set _strategies = new HashSet();
private Map _interestedEvents = new HashMap();
MemGalertDef(GalertDef def) {
_id = def.getId();
_name = def.getName();
for (Iterator i=def.getStrategies().iterator(); i.hasNext(); ) {
ExecutionStrategyInfo sInfo = (ExecutionStrategyInfo)i.next();
initializeStrategy(sInfo, def.getGroup());
}
}
Integer getId() {
return _id;
}
void setName(String name) {
_name = name;
synchronized (_strategies) {
for (Iterator i=_strategies.iterator(); i.hasNext(); ) {
ExecutionStrategy strat = (ExecutionStrategy)i.next();
strat.setDefinitionName(name);
}
}
}
private void initializeStrategy(ExecutionStrategyInfo sInfo,
ResourceGroup group)
{
ExecutionStrategy strat = sInfo.getStrategy();
List triggers = new ArrayList();
for (Iterator i=sInfo.getTriggers().iterator(); i.hasNext(); ) {
GtriggerInfo tInfo = (GtriggerInfo)i.next();
Gtrigger trigger = tInfo.getTrigger();
Set eventIds;
triggers.add(trigger);
trigger.setAlertDef(this);
trigger.setStrategy(strat);
trigger.setGroup(group);
eventIds = trigger.getInterestedEvents();
if (eventIds == null) {
throw new IllegalStateException("Triggers must define a " +
"non-null set of eventIds");
}
_interestedEvents.put(trigger,
new HashSet(trigger.getInterestedEvents()));
}
strat.configure(sInfo.getPartition(), _name, triggers);
_strategies.add(strat);
}
String getName() {
return _name;
}
/**
* Get a Map of {@link Gtrigger}s onto {@link Set}s of
* {@link ZeventResourceId}s which the triggers are interested in.
*/
Map getInterestedEvents() {
return Collections.unmodifiableMap(_interestedEvents);
}
void triggerFired(Gtrigger trigger, FireReason reason) {
ExecutionStrategy strat = trigger.getStrategy();
_log.debug("Trigger[" + _name + "," + trigger + "] fired");
strat.triggerFired(trigger, reason);
fireWhenReady(strat);
}
void triggerNotFired(Gtrigger trigger) {
ExecutionStrategy strat = trigger.getStrategy();
_log.debug("Trigger[" + _name + ", " + trigger + "] no longer fired");
strat.triggerNotFired(trigger);
fireWhenReady(strat);
}
private void fireWhenReady(ExecutionStrategy strat) {
ExecutionReason execReason = strat.shouldFire();
if (execReason == null)
return;
if (_triggerFiredLog.isDebugEnabled()) {
_triggerFiredLog.debug("Alert def [" + _name + "] with id="+
_id+" firing");
}
_log.debug(execReason);
strat.getPartition().execute(_id, execReason);
strat.reset();
}
}