* proxy using this method.
*
* @param event the {@link Event} to be handled.
*/
public void handle(Event event) {
StateContext context = event.getContext();
synchronized (context) {
LinkedList<Event> eventQueue = eventQueueThreadLocal.get();
eventQueue.addLast(event);
if (processingThreadLocal.get()) {
/*
* This thread is already processing an event. Queue this
* event.
*/
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("State machine called recursively. Queuing event " + event
+ " for later processing.");
}
} else {
processingThreadLocal.set(true);
try {
if (context.getCurrentState() == null) {
context.setCurrentState(startState);
}
processEvents(eventQueue);
} finally {
processingThreadLocal.set(false);
}