blob: 9d01a0037815320932d674c7f3928b72ef256f9b [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Laboratory
*
* 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 org.onosproject.incubator.net.virtual.event;
import com.google.common.collect.Maps;
import org.onosproject.event.Event;
import org.onosproject.event.EventSink;
import org.onosproject.event.ListenerRegistry;
import org.onosproject.incubator.net.virtual.NetworkId;
import java.util.Map;
/**
* Base implementation of an virtual event sink and a registry capable of tracking
* listeners and dispatching events to them as part of event sink processing.
*/
public final class VirtualListenerRegistryManager
implements EventSink<VirtualEvent> {
private Map<NetworkId, Map<Class<? extends Event>, ListenerRegistry>>
listenerMapByNetwork = Maps.newConcurrentMap();
ListenerRegistry lastStart;
// non-instantiable (except for our Singleton)
private VirtualListenerRegistryManager() {
}
public static VirtualListenerRegistryManager getInstance() {
return SingletonHelper.INSTANCE;
}
public ListenerRegistry getRegistry(NetworkId networkId,
Class<? extends Event> eventClass) {
Map<Class<? extends Event>, ListenerRegistry> listenerMapByEvent =
listenerMapByNetwork.get(networkId);
if (listenerMapByEvent == null) {
listenerMapByEvent = Maps.newConcurrentMap();
listenerMapByNetwork.putIfAbsent(networkId, listenerMapByEvent);
}
ListenerRegistry listenerRegistry = listenerMapByEvent.get(eventClass);
if (listenerRegistry == null) {
listenerRegistry = new ListenerRegistry();
listenerMapByEvent.putIfAbsent(eventClass, listenerRegistry);
}
return listenerRegistry;
}
@Override
public void process(VirtualEvent event) {
NetworkId networkId = event.networkId();
Event originalEvent = (Event) event.subject();
ListenerRegistry listenerRegistry =
listenerMapByNetwork.get(networkId).get(originalEvent.getClass());
listenerRegistry.process(originalEvent);
lastStart = listenerRegistry;
}
@Override
public void onProcessLimit() {
lastStart.onProcessLimit();
}
/**
* Prevents object instantiation from external.
*/
private static final class SingletonHelper {
private static final String ILLEGAL_ACCESS_MSG =
"Should not instantiate this class.";
private static final VirtualListenerRegistryManager INSTANCE =
new VirtualListenerRegistryManager();
private SingletonHelper() {
throw new IllegalAccessError(ILLEGAL_ACCESS_MSG);
}
}
}