MDSAL-API Migration
[genius.git] / mdsalutil / mdsalutil-testutils / src / main / java / org / opendaylight / genius / datastoreutils / testutils / TestableDataTreeChangeListenerModule.java
1 /*
2  * Copyright (c) 2016 Red Hat, 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.genius.datastoreutils.testutils;
9
10 import com.google.inject.AbstractModule;
11 import com.google.inject.Injector;
12 import com.google.inject.Key;
13 import com.google.inject.Provides;
14 import com.google.inject.Singleton;
15 import org.opendaylight.genius.datastoreutils.testutils.infra.AutoCloseableModule;
16 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
17 import org.opendaylight.serviceutils.tools.listener.ChainableDataTreeChangeListener;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
20
21 /**
22  * Guice wiring module which binds a {@link TestableDataTreeChangeListener} as
23  * an {@link AsyncEventsWaiter}, and automatically registers all bound
24  * {@link ChainableDataTreeChangeListener} to it.
25  *
26  * @author Michael Vorburger.ch
27  */
28 public class TestableDataTreeChangeListenerModule extends AbstractModule {
29
30     private static final Logger LOG = LoggerFactory.getLogger(TestableDataTreeChangeListenerModule.class);
31
32     @Override
33     protected void configure() {
34         install(new AutoCloseableModule());
35     }
36
37     @Provides
38     @Singleton
39     protected final AsyncEventsWaiter getAsyncEventsWaiter(Injector injector) {
40         return getRealAsyncEventsWaiter(injector);
41     }
42
43     protected AsyncEventsWaiter getRealAsyncEventsWaiter(Injector injector) {
44         return getTestableDataTreeChangeListener(injector);
45     }
46
47     @SuppressWarnings({ "unchecked", "rawtypes" })
48     protected TestableDataTreeChangeListener getTestableDataTreeChangeListener(Injector injector) {
49         TestableDataTreeChangeListener beforeTestableDataTreeChangeListener = new TestableDataTreeChangeListener();
50         DataTreeChangeListener afterTestableDataTreeChangeListener =
51                 new DecrementingTestableDataTreeChangeDecoratorListener(beforeTestableDataTreeChangeListener);
52         for (Key<?> key : injector.getAllBindings().keySet()) {
53             if (ChainableDataTreeChangeListener.class.isAssignableFrom(key.getTypeLiteral().getRawType())) {
54                 ChainableDataTreeChangeListener chainableListener
55                     = (ChainableDataTreeChangeListener) injector.getInstance(key);
56                 chainableListener.addBeforeListener(beforeTestableDataTreeChangeListener);
57                 chainableListener.addAfterListener(afterTestableDataTreeChangeListener);
58                 LOG.info("AsyncEventsWaiter: {}", chainableListener);
59             }
60         }
61         return beforeTestableDataTreeChangeListener;
62     }
63
64 }