public class EventDrivenWorldView extends AbstractWorldView
EventDrivenWorldView
assumes that everything is driven by the events that are received
through IWorldChangeEventInput
- those events surely must contains "new object appears event",
"object update event", "object disappear event". Those three events are wrapped in one
interface IWorldObjectUpdateEvent that has three types of behavior (see its javadoc).
The EDWV uses IWorldChangeEventFilter
s to process incoming events. During the construction of the EDWV the filters
should be registered into it (see method initFilters). Subclass this EDWV to provide a different set of filters.
Used filters: TODO! finish the documentation Handling of events (that is incoming):
Note that the implementation of raising / receiving / notifying about event is strictly time-ordered. Every event is fully processed before another is raised/received. There is a possibility that raising one event may produce another one - in that case processing of this new one is postponed until the previous event has been fully processed (e.g. all listeners has been notified about it). That means that recursion of events is forbidden.
Note that we rely on method update() of the IWorldObjectUpdateEvent to be called as the first before the event is propagated further. An original object must be passed to the update() method and that method should save it as the original so the event can return correct object via getObject() method.
Modifier and Type | Field and Description |
---|---|
protected LinkedList<IWorldChangeEvent> |
notifyEventsList
List of events we have to process.
|
protected boolean |
receiveEventProcessing
Flag that is telling us whether there is an event being processed or not.
|
static String |
WORLDVIEW_DEPENDENCY |
COMPONENT_ID, control, controller, eventBus, log
Constructor and Description |
---|
EventDrivenWorldView(ComponentDependencies dependencies,
IComponentBus bus,
IAgentLogger log) |
Modifier and Type | Method and Description |
---|---|
protected void |
innerNotify(IWorldChangeEvent event)
Used to process IWorldChangeEvent - it has to be either IWorldChangeEvent or IWorldObjectUpdateEvent.
|
void |
notify(IWorldChangeEvent event)
New event was generated from the world.
|
void |
notifyAfterPropagation(IWorldChangeEvent event)
Raise another event after current one finishes its propagation.
|
void |
notifyImmediately(IWorldChangeEvent event)
Notify immediately will process the event right away, it won't use "event recursion buffer" to postpone the processing of the event.
|
protected void |
objectCreated(IWorldObject obj)
Must be called whenever an object was created, raises correct events.
|
protected void |
objectDestroyed(IWorldObject obj)
Must be called whenever an object was destroyed - raises correct events.
|
protected void |
objectUpdated(IWorldObject obj)
Must be called whenever an object was updated - raises correct event.
|
protected void |
objectUpdatedEvent(IWorldObjectUpdatedEvent updateEvent)
Called from
innerNotify(IWorldChangeEvent) if the event is IWorldObjectUpdatedEvent
to process it. |
protected void |
raiseEvent(IWorldEvent event)
Catches exceptions.
|
addEventListener, addObjectListener, addObjectListener, addObjectListener, addObjectListener, addWorldObject, cleanUp, get, get, get, getAll, getAll, getComponentId, getEventBus, getLog, getSingle, isListening, isListening, isListening, isListening, isListening, isListening, isPaused, isRunning, kill, pause, prePause, preStop, removeEventListener, removeListener, removeObjectListener, removeObjectListener, removeObjectListener, removeObjectListener, removeWorldObject, reset, resume, start, stop, toString
public static final String WORLDVIEW_DEPENDENCY
protected boolean receiveEventProcessing
It is managed only by notify() method - DO NOT MODIFY OUTSIDE IT!
protected LinkedList<IWorldChangeEvent> notifyEventsList
It is managed only by notify() method - DO NOT MODIFY OUTSIDE IT!
@Inject public EventDrivenWorldView(ComponentDependencies dependencies, IComponentBus bus, IAgentLogger log)
protected void raiseEvent(IWorldEvent event)
ComponentController
.fatalError() and this.kill().raiseEvent
in class AbstractWorldView
protected void innerNotify(IWorldChangeEvent event)
DO NOT CALL SEPARATELY - should be called only from notifyEvent().
You may override it to provide event-specific processing behavior.
event
- protected void objectUpdatedEvent(IWorldObjectUpdatedEvent updateEvent)
innerNotify(IWorldChangeEvent)
if the event is IWorldObjectUpdatedEvent
to process it.updateEvent
- protected void objectCreated(IWorldObject obj)
Might be overridden to provide different behavior.
obj
- protected void objectUpdated(IWorldObject obj)
Might be overridden to provide a mechanism that will forbid update of certain objects (like items that can't move).
obj
- protected void objectDestroyed(IWorldObject obj)
Might be overriden to provide different behavior.
obj
- public void notify(IWorldChangeEvent event) throws ComponentNotRunningException, ComponentPausedException
IWorldChangeEventInput
public void notifyAfterPropagation(IWorldChangeEvent event) throws ComponentNotRunningException, ComponentPausedException
IWorldChangeEventInput
Won't propagate the event if the world view is locked!.
public void notifyImmediately(IWorldChangeEvent event) throws ComponentNotRunningException, ComponentPausedException
IWorldChangeEventInput
This will work even if the world view is locked!
Copyright © 2012 AMIS research group, Faculty of Mathematics and Physics, Charles University in Prague, Czech Republic. All Rights Reserved.