package jadex.bdi.runtime.impl.flyweights; import jadex.bdi.model.IMElement; import jadex.bdi.model.impl.flyweights.MInternalEventFlyweight; import jadex.bdi.runtime.IInternalEvent; import jadex.bdi.runtime.interpreter.BDIInterpreter; import jadex.bdi.runtime.interpreter.OAVBDIRuntimeModel; import jadex.commons.Tuple; import jadex.rules.state.IOAVState; /** * Flyweight for an internal event. */ public class InternalEventFlyweight extends ProcessableElementFlyweight implements IInternalEvent { //-------- constructors -------- /** * Create a new internal event flyweight. * @param state The state. * @param scope The scope handle. */ private InternalEventFlyweight(IOAVState state, Object scope, Object handle) { super(state, scope, handle); } /** * Get or create a flyweight. * @return The flyweight. */ public static InternalEventFlyweight getInternalEventFlyweight(IOAVState state, Object scope, Object handle) { BDIInterpreter ip = BDIInterpreter.getInterpreter(state); InternalEventFlyweight ret = (InternalEventFlyweight)ip.getFlyweightCache(IInternalEvent.class, new Tuple(IInternalEvent.class, handle)); if(ret==null) { ret = new InternalEventFlyweight(state, scope, handle); ip.putFlyweightCache(IInternalEvent.class, new Tuple(IInternalEvent.class, handle), ret); } return ret; } //-------- event flags -------- /** * Get the goal type. * @return The goal type. * / public String getType() { throw new UnsupportedOperationException(); }*/ //-------- listeners -------- /** * Add an internal event listener. * @param listener The internal event listener. * / public void addInternalEventListener(final IInternalEventListener listener) { if(getInterpreter().isExternalThread()) { new AgentInvocation() { public void run() { getInterpreter().getEventDispatcher().addInternalEventListener(getHandle(), listener); } }; } else { getInterpreter().getEventDispatcher().addInternalEventListener(getHandle(), listener); } }*/ /** * Remove a internal event listener. * @param listener The internal event listener. * / public void removeInternalEventListener(final IInternalEventListener listener) { if(getInterpreter().isExternalThread()) { new AgentInvocation() { public void run() { getInterpreter().getEventDispatcher().removeInternalEventListener(getHandle(), listener); } }; } else { getInterpreter().getEventDispatcher().removeInternalEventListener(getHandle(), listener); } }*/ //-------- element interface -------- /** * Get the model element. * @return The model element. */ public IMElement getModelElement() { if(getInterpreter().isExternalThread()) { AgentInvocation invoc = new AgentInvocation() { public void run() { Object me = getState().getAttributeValue(getHandle(), OAVBDIRuntimeModel.element_has_model); Object mscope = getState().getAttributeValue(getScope(), OAVBDIRuntimeModel.element_has_model); object = new MInternalEventFlyweight(getState(), mscope, me); } }; return (IMElement)invoc.object; } else { Object me = getState().getAttributeValue(getHandle(), OAVBDIRuntimeModel.element_has_model); Object mscope = getState().getAttributeValue(getScope(), OAVBDIRuntimeModel.element_has_model); return new MInternalEventFlyweight(getState(), mscope, me); } } }