Merge "Bug 716: Errors on controller shutdown"
[controller.git] / opendaylight / md-sal / sal-dom-broker / src / main / java / org / opendaylight / controller / config / yang / md / sal / dom / impl / SchemaServiceImplSingletonModule.java
1 /*
2  * Copyright (c) 2014 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.controller.config.yang.md.sal.dom.impl;
9
10 import org.opendaylight.controller.sal.core.api.model.SchemaService;
11 import org.opendaylight.controller.sal.dom.broker.GlobalBundleScanningSchemaServiceImpl;
12 import org.opendaylight.yangtools.concepts.Delegator;
13 import org.opendaylight.yangtools.concepts.ListenerRegistration;
14 import org.opendaylight.yangtools.yang.model.api.Module;
15 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
16 import org.opendaylight.yangtools.yang.model.api.SchemaServiceListener;
17 import org.osgi.framework.BundleContext;
18 import org.osgi.framework.ServiceReference;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
21
22 /**
23 *
24 */
25 public final class SchemaServiceImplSingletonModule extends
26         org.opendaylight.controller.config.yang.md.sal.dom.impl.AbstractSchemaServiceImplSingletonModule {
27
28     private static final Logger LOG = LoggerFactory.getLogger(SchemaServiceImplSingletonModule.class);
29
30     BundleContext bundleContext;
31
32     public SchemaServiceImplSingletonModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier,
33             org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
34         super(identifier, dependencyResolver);
35     }
36
37     public SchemaServiceImplSingletonModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier,
38             org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
39             SchemaServiceImplSingletonModule oldModule, java.lang.AutoCloseable oldInstance) {
40         super(identifier, dependencyResolver, oldModule, oldInstance);
41     }
42
43     @Override
44     public boolean canReuseInstance(AbstractSchemaServiceImplSingletonModule oldModule) {
45         return true;
46     }
47
48     public BundleContext getBundleContext() {
49         return bundleContext;
50     }
51
52     public void setBundleContext(BundleContext bundleContext) {
53         this.bundleContext = bundleContext;
54     }
55
56     @Override
57     public void validate() {
58         super.validate();
59     }
60
61     @Override
62     public java.lang.AutoCloseable createInstance() {
63         ServiceReference<SchemaService> ref = getBundleContext().getServiceReference(SchemaService.class);
64         if (ref != null) {
65             return new GlobalSchemaServiceProxy(getBundleContext(), ref);
66         }
67
68         GlobalBundleScanningSchemaServiceImpl newInstance = new GlobalBundleScanningSchemaServiceImpl();
69         newInstance.setContext(getBundleContext());
70         newInstance.start();
71         return newInstance;
72     }
73
74     public class GlobalSchemaServiceProxy implements AutoCloseable, SchemaService, Delegator<SchemaService> {
75
76         private BundleContext bundleContext;
77         private ServiceReference<SchemaService> reference;
78         private SchemaService delegate;
79
80         public GlobalSchemaServiceProxy(BundleContext bundleContext, ServiceReference<SchemaService> ref) {
81             this.bundleContext = bundleContext;
82             this.reference = ref;
83             this.delegate = bundleContext.getService(reference);
84         }
85
86         @Override
87         public void close() throws Exception {
88             if (delegate != null) {
89                 delegate = null;
90
91                 try {
92                     bundleContext.ungetService(reference);
93                 } catch (IllegalStateException e) {
94                     // Indicates the service was already unregistered which can happen normally
95                     // on shutdown.
96                     LOG.debug( "Error unregistering service", e );
97                 }
98
99                 reference = null;
100                 bundleContext = null;
101             }
102         }
103
104         @Override
105         public void addModule(Module arg0) {
106             delegate.addModule(arg0);
107         }
108
109         @Override
110         public SchemaContext getGlobalContext() {
111             return delegate.getGlobalContext();
112         }
113
114         @Override
115         public SchemaContext getSessionContext() {
116             return delegate.getSessionContext();
117         }
118
119         @Override
120         public ListenerRegistration<SchemaServiceListener> registerSchemaServiceListener(SchemaServiceListener arg0) {
121             return delegate.registerSchemaServiceListener(arg0);
122         }
123
124         @Override
125         public void removeModule(Module arg0) {
126             delegate.removeModule(arg0);
127         }
128
129         @Override
130         public SchemaService getDelegate() {
131             return delegate;
132         }
133
134     }
135 }