package jadex.bdi.runtime.interpreter;
import jadex.bridge.IMessageAdapter;
import jadex.bridge.MessageType;
import jadex.commons.SUtil;
import jadex.rules.state.IOAVState;
/**
* Fetcher for raw messages.
*/
public class MessageEventFetcher extends OAVBDIFetcher
{
//-------- attributes --------
/** The raw message. */
protected IMessageAdapter rawmsg;
//-------- constructors --------
/**
* Create a new fetcher.
*/
public MessageEventFetcher(IOAVState state, Object rcapa, IMessageAdapter rawmsg)
{
super(state, rcapa);
this.rawmsg = rawmsg;
}
//-------- IValueFetcher methods --------
/**
* Fetch a value via its name.
* @param name The name.
* @return The value.
*/
public Object fetchValue(String name)
{
Object ret = null;
if(name==null)
throw new RuntimeException("Name must not be null.");
String shortname = name;
if(name.startsWith("$"))
shortname = name.substring(1);
if(isMessageParameter(rawmsg.getMessageType(), shortname))
ret = MessageEventRules.getValue(rawmsg, shortname, rcapa);
else if(name.equals("$message"))
ret = rawmsg;
else
ret = super.fetchValue(name);
return ret;
}
//-------- additional methods --------
/**
* Test if a name is a message parameter.
* @param mt The message template.
* @param name The parameter name.
*/
protected boolean isMessageParameter(MessageType mt, String name)
{
// todo: index for speed?!
String[] pnames = mt.getParameterNames();
String[] psnames = mt.getParameterSetNames();
return SUtil.arrayContains(pnames, name) || SUtil.arrayContains(psnames, name);
}
}