Modify config Module impls to co-exist with blueprint
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / config / yang / config / actor_system_provider / impl / ActorSystemProviderModule.java
1 /*
2  * Copyright (c) 2015 Brocade Communications 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
9 package org.opendaylight.controller.config.yang.config.actor_system_provider.impl;
10
11 import akka.actor.ActorSystem;
12 import com.google.common.collect.ForwardingObject;
13 import org.opendaylight.controller.cluster.ActorSystemProvider;
14 import org.opendaylight.controller.cluster.ActorSystemProviderListener;
15 import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
16 import org.opendaylight.yangtools.concepts.ListenerRegistration;
17 import org.osgi.framework.BundleContext;
18
19 public class ActorSystemProviderModule extends AbstractActorSystemProviderModule {
20     private BundleContext bundleContext;
21
22     public ActorSystemProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
23         super(identifier, dependencyResolver);
24     }
25
26     public ActorSystemProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, ActorSystemProviderModule oldModule, java.lang.AutoCloseable oldInstance) {
27         super(identifier, dependencyResolver, oldModule, oldInstance);
28     }
29
30     @Override
31     public void customValidation() {
32         // add custom validation form module attributes here.
33     }
34
35     @Override
36     public boolean canReuseInstance(AbstractActorSystemProviderModule oldModule) {
37         return true;
38     }
39
40     @Override
41     public AutoCloseable createInstance() {
42         // The service is provided via blueprint so wait for and return it here for backwards compatibility.
43         WaitingServiceTracker<ActorSystemProvider> tracker = WaitingServiceTracker.create(
44                 ActorSystemProvider.class, bundleContext);
45         ActorSystemProvider delegate = tracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
46         return new ForardingActorSystemProvider(delegate, tracker);
47     }
48
49     public void setBundleContext(BundleContext bundleContext) {
50         this.bundleContext = bundleContext;
51     }
52
53     private static class ForardingActorSystemProvider extends ForwardingObject
54             implements ActorSystemProvider, AutoCloseable {
55         private final ActorSystemProvider delegate;
56         private final AutoCloseable closeable;
57
58         ForardingActorSystemProvider(ActorSystemProvider delegate, AutoCloseable closeable) {
59             this.delegate = delegate;
60             this.closeable = closeable;
61         }
62
63         @Override
64         public ActorSystem getActorSystem() {
65             return delegate().getActorSystem();
66         }
67
68         @Override
69         public ListenerRegistration<ActorSystemProviderListener> registerActorSystemProviderListener(
70                 ActorSystemProviderListener listener) {
71             return delegate().registerActorSystemProviderListener(listener);
72         }
73
74         @Override
75         protected ActorSystemProvider delegate() {
76             return delegate;
77         }
78
79         @Override
80         public void close() throws Exception {
81             // We don't close the delegate as the life-cycle is controlled via blueprint.
82             closeable.close();
83         }
84     }
85 }