/** * * Copyright (c) 2006-2017, Speedment, Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); You may not * use this file except in compliance with the License. You may obtain a copy of * the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.speedment.generator.core.internal.component; import com.speedment.generator.core.component.EventComponent; import com.speedment.generator.core.event.DefaultEvent; import com.speedment.generator.core.event.Event; import java.util.Collections; import java.util.EnumMap; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; /** * * @author Emil Forslund */ public final class EventComponentImpl implements EventComponent { private final Map<DefaultEvent, Set<Consumer<DefaultEvent>>> defaultEventListeners; private final Map<Class<? extends Event>, Set<Consumer<Event>>> otherEventListeners; private final Set<Consumer<Event>> anyEventListeners; public EventComponentImpl() { final EnumMap<DefaultEvent, Set<Consumer<DefaultEvent>>> defaultListeners = new EnumMap<>(DefaultEvent.class); for (final DefaultEvent ev : DefaultEvent.values()) { defaultListeners.put(ev, Collections.newSetFromMap(new ConcurrentHashMap<>())); } defaultEventListeners = Collections.unmodifiableMap(defaultListeners); otherEventListeners = new ConcurrentHashMap<>(); anyEventListeners = Collections.newSetFromMap(new ConcurrentHashMap<>()); } @Override public void notify(Event event) { if (event instanceof DefaultEvent) { final DefaultEvent ev = (DefaultEvent) event; defaultListeners(ev).forEach(listener -> listener.accept(ev)); } else { listeners(event.getClass()).forEach(listener -> listener.accept(event)); } anyEventListeners.forEach(listener -> listener.accept(event)); } @Override @SuppressWarnings("unchecked") public <E extends Event> void on(Class<E> event, Consumer<E> action) { listeners(event).add((Consumer<Event>) action); } @Override public void on(DefaultEvent event, Consumer<DefaultEvent> action) { defaultListeners(event).add(action); } @Override public void onAny(Consumer<Event> action) { anyEventListeners.add(action); } private <E extends Event> Set<Consumer<Event>> listeners(Class<E> event) { return otherEventListeners .computeIfAbsent(event, ev -> Collections.newSetFromMap(new ConcurrentHashMap<>())); } private Set<Consumer<DefaultEvent>> defaultListeners(DefaultEvent event) { return defaultEventListeners.get(event); } }