package com.google.code.joto.eventrecorder.processor; import java.util.HashMap; import java.util.Map; import com.google.code.joto.eventrecorder.RecordEventSummary; /** * a dispatcher for RecordEventsProcessor, based on RecordEvent type */ public class DispatcherRecordEventsProcessor<T> implements RecordEventsProcessor { public static class Factory<T> implements RecordEventsProcessorFactory<T> { private Map<String,RecordEventsProcessorFactory<T>> eventTypeToFactory = new HashMap<String,RecordEventsProcessorFactory<T>>(); private RecordEventsProcessorFactory<T> defaultFactory; public Factory() { super(); } public Factory(Map<String,RecordEventsProcessorFactory<T>> eventTypeToFactory, RecordEventsProcessorFactory<T> defaultFactory) { this(); this.eventTypeToFactory.putAll(eventTypeToFactory); this.defaultFactory = defaultFactory; } @Override public RecordEventsProcessor create(T result) { return new DispatcherRecordEventsProcessor<T>(eventTypeToFactory, defaultFactory, result); } public void registerEventTypeProcessorFactory(String eventType, RecordEventsProcessorFactory<T> eventTypeFactory) { eventTypeToFactory.put(eventType, eventTypeFactory); } } private Map<String,RecordEventsProcessorFactory<T>> eventTypeToFactory = new HashMap<String,RecordEventsProcessorFactory<T>>(); private RecordEventsProcessorFactory<T> defaultFactory; private Map<String,RecordEventsProcessor> currEventTypeToProcessor = new HashMap<String,RecordEventsProcessor>(); private T result; //------------------------------------------------------------------------- public DispatcherRecordEventsProcessor( Map<String,RecordEventsProcessorFactory<T>> eventTypeToFactory, RecordEventsProcessorFactory<T> defaultFactory, T result) { this.eventTypeToFactory = eventTypeToFactory; this.defaultFactory = defaultFactory; this.result = result; } @Override public boolean needEventObjectData() { return true; // ?? may optim } @Override public void processEvent(RecordEventSummary event, Object eventObjectData) { // Lookup processor for eventtype, create (and register) if needed String eventType = event.getEventType(); RecordEventsProcessor processor = currEventTypeToProcessor.get(eventType); if (processor == null) { RecordEventsProcessorFactory<T> factory = eventTypeToFactory.get(eventType); if (factory == null) { factory = defaultFactory; } if (factory == null) { // TODO??? should throw an event for unrecognized event type, or ignore? return; } processor = factory.create(result); currEventTypeToProcessor.put(eventType, processor); } // do dispatch to processor for eventType processor.processEvent(event, eventObjectData); } }