a7ea21f1ab31ab486d57650751ca565131add7d6
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / config / yang / config / distributed_entity_ownership_service / DistributedEntityOwnershipServiceProviderModule.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.distributed_entity_ownership_service;
10
11 import com.google.common.base.Optional;
12 import com.google.common.collect.ForwardingObject;
13 import org.opendaylight.controller.config.api.DependencyResolver;
14 import org.opendaylight.controller.config.api.ModuleIdentifier;
15 import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
16 import org.opendaylight.controller.md.sal.common.api.clustering.CandidateAlreadyRegisteredException;
17 import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
18 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipCandidateRegistration;
19 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListener;
20 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListenerRegistration;
21 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
22 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipState;
23 import org.osgi.framework.BundleContext;
24
25 public class DistributedEntityOwnershipServiceProviderModule extends AbstractDistributedEntityOwnershipServiceProviderModule {
26     private BundleContext bundleContext;
27
28     public DistributedEntityOwnershipServiceProviderModule(final ModuleIdentifier identifier,
29             final DependencyResolver dependencyResolver) {
30         super(identifier, dependencyResolver);
31     }
32
33     public DistributedEntityOwnershipServiceProviderModule(final ModuleIdentifier identifier,
34             final DependencyResolver dependencyResolver,
35             final DistributedEntityOwnershipServiceProviderModule oldModule, final AutoCloseable oldInstance) {
36         super(identifier, dependencyResolver, oldModule, oldInstance);
37     }
38
39     @Override
40     public void customValidation() {
41     }
42
43     @Override
44     public boolean canReuseInstance(final AbstractDistributedEntityOwnershipServiceProviderModule oldModule) {
45         return true;
46     }
47
48     @Override
49     public AutoCloseable createInstance() {
50         // The DistributedEntityOwnershipService is provided via blueprint so wait for and return it here for
51         // backwards compatibility.
52         WaitingServiceTracker<EntityOwnershipService> tracker = WaitingServiceTracker.create(
53                 EntityOwnershipService.class, bundleContext);
54         EntityOwnershipService delegate = tracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
55         return new ForwardingEntityOwnershipService(delegate, tracker);
56     }
57
58     public void setBundleContext(final BundleContext bundleContext) {
59         this.bundleContext = bundleContext;
60     }
61
62     private static class ForwardingEntityOwnershipService extends ForwardingObject
63             implements EntityOwnershipService, AutoCloseable {
64         private final EntityOwnershipService delegate;
65         private final AutoCloseable closeable;
66
67         public ForwardingEntityOwnershipService(EntityOwnershipService delegate, AutoCloseable closeable) {
68             this.delegate = delegate;
69             this.closeable = closeable;
70         }
71
72         @Override
73         public EntityOwnershipCandidateRegistration registerCandidate(Entity entity)
74                 throws CandidateAlreadyRegisteredException {
75             return delegate().registerCandidate(entity);
76         }
77
78         @Override
79         public EntityOwnershipListenerRegistration registerListener(String entityType,
80                 EntityOwnershipListener listener) {
81             return delegate().registerListener(entityType, listener);
82         }
83
84         @Override
85         public Optional<EntityOwnershipState> getOwnershipState(Entity forEntity) {
86             return delegate().getOwnershipState(forEntity);
87         }
88
89         @Override
90         public boolean isCandidateRegistered(Entity entity) {
91             return delegate().isCandidateRegistered(entity);
92         }
93
94         @Override
95         protected EntityOwnershipService delegate() {
96             return delegate;
97         }
98
99         @Override
100         public void close() throws Exception {
101             // We don't close the delegate as the life-cycle is controlled via blueprint.
102             closeable.close();
103         }
104     }
105 }