/*
* Copyright (c) 2003, Intracom S.A. - www.intracom.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This package and its source code is available at www.jboss.org
**/
package org.jboss.jmx.adaptor.snmp.agent;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.management.Notification;
/**
* <tt>NotificationWrapperSupport</tt> provides a base
* NotificationWrapper implementation
*
* @version $Revision: 44604 $
*
* @author <a href="mailto:spol@intracom.gr">Spyros Pollatos</a>
* @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a>
**/
public class NotificationWrapperSupport
implements NotificationWrapper
{
/** Holds the notification payload keyed on the attibute name */
protected Map payload = new HashMap();
/** Provides uptime */
protected Clock clock;
/** Provides trap count */
protected Counter trapCount;
/**
* CTOR
**/
public NotificationWrapperSupport()
{
// empty
}
/**
* Loads the hashmap with the DCAs of interest. Note that the keys are used
* as attribute tags in the mapping resource file
**/
public void set(Clock uptime, Counter count)
{
this.clock = uptime;
this.trapCount = count;
this.payload.put(STARTTIME_TAG,
new Date(this.clock.instantiationTime()));
this.payload.put(UPTIME_TAG, // anonymous class
new DynamicContentAccessor() {
public Object get()
{
return new Long(NotificationWrapperSupport.this.clock.uptime());
}
});
this.payload.put(TRAPCOUNT_TAG, // anonymous class
new DynamicContentAccessor() {
public Object get()
{
return new Long(NotificationWrapperSupport.this.trapCount.peek());
}
});
}
/**
* Set the notification to be used as the data source. Load the hashmap
* with all of the notification contents. Note that the keys are used
* as attribute tags in the mapping resource file
*
* @param n the notification to be used as data source at subsequent calls
* of get()
**/
public void prime(Notification n)
{
// Get fixed event payload and general info
this.payload.put(MESSAGE_TAG, n.getMessage());
this.payload.put(SEQNO_TAG, new Long(n.getSequenceNumber()));
this.payload.put(TSTAMP_TAG, new Long(n.getTimeStamp()));
this.payload.put(TYPE_TAG, n.getType());
this.payload.put(ALL_TAG, n.toString());
this.payload.put(CLASS_TAG, n.getClass().getName());
// Check if event contains anything in the user field. If there is, an
// attempt is made to interpret it as a hash map and copy it. Note
// that previous content may be overwritten if the same keys as above
// are used
Object userData = n.getUserData();
if (userData instanceof HashMap) {
// Copy all of the user data in the payload
this.payload.putAll((HashMap)userData);
}
} // prime
/**
* Implements the communication protocol between the caller and the data
* source (notification and agent) based on tags. Implementations are
* expected to map the provided attribute name to some aspect of the
* notification payload. The later is defined by method prime.
*
* @param tagName the tag of the attribute the value of which is required
**/
public Object get(String tagName)
throws MappingFailedException
{
Object o = this.payload.get(tagName);
if (o == null)
throw new MappingFailedException("Tag \"" + tagName + "\" not found");
// Check whether value returned is a dynamic content accessor. If not
// return as is. If yes invoke the accessor and return that value
if (o instanceof DynamicContentAccessor) {
DynamicContentAccessor d = (DynamicContentAccessor)o;
return d.get();
}
else {
return o;
}
} //get
} // NotificationWrapperSupport