2 * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others. All rights reserved.
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
8 package org.opendaylight.mdsal.binding.dom.codec.osgi.impl;
10 import static java.util.Objects.requireNonNull;
12 import org.checkerframework.checker.lock.qual.GuardedBy;
13 import org.opendaylight.binding.runtime.spi.ModuleInfoRegistry;
14 import org.opendaylight.yangtools.concepts.ObjectRegistration;
15 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
16 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
17 import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
18 import org.osgi.framework.ServiceRegistration;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
23 * Update SchemaContext service in Service Registry each time new YangModuleInfo is added or removed.
25 final class OsgiModuleInfoRegistry implements ModuleInfoRegistry {
26 private static final Logger LOG = LoggerFactory.getLogger(OsgiModuleInfoRegistry.class);
28 private final SimpleBindingRuntimeContextService runtimeContext;
29 private final SchemaContextProvider schemaContextProvider;
30 private final ModuleInfoRegistry moduleInfoRegistry;
33 private ServiceRegistration<?> registration;
35 private long generation;
37 OsgiModuleInfoRegistry(final ModuleInfoRegistry moduleInfoRegistry,
38 final SchemaContextProvider schemaContextProvider, final SimpleBindingRuntimeContextService runtimeContext) {
40 this.moduleInfoRegistry = requireNonNull(moduleInfoRegistry);
41 this.schemaContextProvider = requireNonNull(schemaContextProvider);
42 this.runtimeContext = requireNonNull(runtimeContext);
46 public ObjectRegistration<YangModuleInfo> registerModuleInfo(final YangModuleInfo yangModuleInfo) {
47 return new ObjectRegistrationWrapper(registerInfo(yangModuleInfo));
50 @SuppressWarnings("checkstyle:illegalCatch")
51 synchronized void updateService() {
52 final SchemaContext context;
54 context = schemaContextProvider.getSchemaContext();
55 } catch (final RuntimeException e) {
56 // The ModuleInfoBackedContext throws a RuntimeException if it can't create the schema context.
57 LOG.error("Error updating the schema context", e);
62 runtimeContext.updateBindingRuntimeContext(context);
63 } catch (final RuntimeException e) {
64 LOG.error("Error updating binding runtime context", e);
69 ObjectRegistration<YangModuleInfo> registerInfo(final YangModuleInfo yangModuleInfo) {
70 return moduleInfoRegistry.registerModuleInfo(yangModuleInfo);
73 private class ObjectRegistrationWrapper implements ObjectRegistration<YangModuleInfo> {
74 private final ObjectRegistration<YangModuleInfo> inner;
76 ObjectRegistrationWrapper(final ObjectRegistration<YangModuleInfo> inner) {
77 this.inner = requireNonNull(inner);
81 public YangModuleInfo getInstance() {
82 return inner.getInstance();
86 @SuppressWarnings("checkstyle:illegalCatch")
91 // send modify event when a bundle disappears
97 public String toString() {
98 return inner.toString();