Fix a few sonar warnings
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / NamespaceBehaviourWithListeners.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.parser.stmt.reactor;
9
10 import com.google.common.base.Optional;
11 import com.google.common.collect.HashMultimap;
12 import com.google.common.collect.Multimap;
13 import java.util.Collection;
14 import java.util.Iterator;
15 import java.util.Map;
16 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
17 import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
18 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
19 import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl;
20 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
21
22 final class NamespaceBehaviourWithListeners<K,V, N extends IdentifierNamespace<K, V>> extends NamespaceBehaviour<K, V, N> {
23
24     abstract static class ValueAddedListener {
25         private final NamespaceStorageNode ctxNode;
26
27         public ValueAddedListener(final NamespaceStorageNode contextNode) {
28             this.ctxNode = contextNode;
29         }
30
31         abstract void onValueAdded(Object key, Object value);
32     }
33
34     private final NamespaceBehaviour<K, V, N> delegate;
35     private final Multimap<K, ValueAddedListener> listeners = HashMultimap.create();
36
37     protected NamespaceBehaviourWithListeners(final NamespaceBehaviour<K, V, N> delegate) {
38         super(delegate.getIdentifier());
39         this.delegate = delegate;
40     }
41
42     @Override
43     public void addTo(final NamespaceStorageNode storage, final K key, final V value) {
44         delegate.addTo(storage, key, value);
45
46         Iterator<ValueAddedListener> keyListeners = listeners.get(key).iterator();
47         while (keyListeners.hasNext()) {
48             ValueAddedListener listener = keyListeners.next();
49             if (listener.ctxNode == storage || hasIdentiticalValue(listener.ctxNode,key,value)) {
50                 keyListeners.remove();
51                 listener.onValueAdded(key, value);
52             }
53         }
54
55         if (key instanceof ModuleIdentifier && !listeners.isEmpty()) {
56             Collection<ValueAddedListener> defaultImportListeners = getDefaultImportListeners((ModuleIdentifier) key);
57             Iterator<ValueAddedListener> defaultImportsIterator = defaultImportListeners.iterator();
58             while (defaultImportsIterator.hasNext()) {
59                 ValueAddedListener listener = defaultImportsIterator.next();
60                 if(listener.ctxNode == storage || hasIdentiticalValue(listener.ctxNode,key,value)) {
61                     defaultImportsIterator.remove();
62                     listener.onValueAdded(key, value);
63                 }
64             }
65         }
66     }
67
68     private Collection<ValueAddedListener> getDefaultImportListeners(final ModuleIdentifier key) {
69         ModuleIdentifier defaultImportKey = new ModuleIdentifierImpl(key.getName(),
70             Optional.fromNullable(key.getNamespace()), Optional.of(SimpleDateFormatUtil.DEFAULT_DATE_IMP));
71         return listeners.get((K)defaultImportKey);
72     }
73
74     private boolean hasIdentiticalValue(final NamespaceStorageNode ctxNode, final K key, final V value) {
75         return getFrom(ctxNode, key) == value;
76     }
77
78     void addValueListener(final K key, final ValueAddedListener listener) {
79         listeners.put(key, listener);
80     }
81
82     @Override
83     public V getFrom(final NamespaceStorageNode storage, final K key) {
84         return delegate.getFrom(storage, key);
85     }
86
87     @Override
88     public Map<K, V> getAllFrom(final NamespaceStorageNode storage) {
89         return delegate.getAllFrom(storage);
90     }
91 }