Add attributes to nodes that can take attributes
[yangtools.git] / concepts / src / main / java / org / opendaylight / yangtools / concepts / util / ListenerRegistry.java
index 458c54d806ce330c6116f3d75dd58d38b85f03bf..e8f271c075360830e0fb3a5045ac0b47c0022956 100644 (file)
@@ -1,21 +1,33 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
 package org.opendaylight.yangtools.concepts.util;
 
+
 import java.util.Collections;
 import java.util.EventListener;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-
 import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 
+
 public class ListenerRegistry<T extends EventListener> implements Iterable<ListenerRegistration<T>> {
 
-    final ConcurrentHashMap<ListenerRegistration<T>,ListenerRegistration<T>> listeners;
+    private final ConcurrentHashMap<ListenerRegistration<? extends T>,ListenerRegistration<? extends T>> listeners;
     final Set<ListenerRegistration<T>> unmodifiableView;
 
+    @SuppressWarnings("unchecked")
     public ListenerRegistry() {
         listeners = new ConcurrentHashMap<>();
-        unmodifiableView = Collections.unmodifiableSet(listeners.keySet());
+        // This conversion is known to be safe.
+        @SuppressWarnings("rawtypes")
+        final Set rawSet = Collections.unmodifiableSet(listeners.keySet());
+        unmodifiableView = rawSet;
     }
 
     public Iterable<ListenerRegistration<T>> getListeners() {
@@ -31,6 +43,12 @@ public class ListenerRegistry<T extends EventListener> implements Iterable<Liste
         return ret;
     }
     
+    public <L extends T> ListenerRegistration<L> registerWithType(L listener) {
+        ListenerRegistrationImpl<L> ret = new ListenerRegistrationImpl<L>(listener);
+        listeners.put(ret,ret);
+        return ret;
+    }
+    
     @Override
     public java.util.Iterator<ListenerRegistration<T>> iterator() {
         return unmodifiableView.iterator();
@@ -54,4 +72,8 @@ public class ListenerRegistry<T extends EventListener> implements Iterable<Liste
             ListenerRegistry.this.remove(this);
         }
     }
+
+    public static <T extends EventListener> ListenerRegistry<T> create() {
+        return new ListenerRegistry<>();
+    }
 }