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.ModuleInfoBackedContext;
14 import org.opendaylight.binding.runtime.spi.ModuleInfoRegistry;
15 import org.opendaylight.yangtools.concepts.ObjectRegistration;
16 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
17 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
18 import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
19 import org.osgi.framework.ServiceRegistration;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
24 * Update SchemaContext service in Service Registry each time new YangModuleInfo is added or removed.
26 final class OsgiModuleInfoRegistry implements ModuleInfoRegistry {
27 private static final Logger LOG = LoggerFactory.getLogger(OsgiModuleInfoRegistry.class);
29 private final SchemaContextProvider schemaContextProvider;
30 private final ModuleInfoBackedContext moduleInfoRegistry;
33 private ServiceRegistration<?> registration;
35 private long generation;
37 OsgiModuleInfoRegistry(final ModuleInfoBackedContext moduleInfoRegistry,
38 final SchemaContextProvider schemaContextProvider) {
40 this.moduleInfoRegistry = requireNonNull(moduleInfoRegistry);
41 this.schemaContextProvider = requireNonNull(schemaContextProvider);
45 public ObjectRegistration<YangModuleInfo> registerModuleInfo(final YangModuleInfo yangModuleInfo) {
46 return new ObjectRegistrationWrapper(registerInfo(yangModuleInfo));
49 @SuppressWarnings("checkstyle:illegalCatch")
50 synchronized void updateService() {
51 final SchemaContext context;
53 context = schemaContextProvider.getSchemaContext();
54 } catch (final RuntimeException e) {
55 // The ModuleInfoBackedContext throws a RuntimeException if it can't create the schema context.
56 LOG.error("Error updating the schema context", e);
59 LOG.trace("Assembled context {}", context);
61 // // FIXME: MDSAL-392: UGH, this should be a snapshot
62 // final BindingRuntimeContext next = DefaultBindingRuntimeContext.create(
63 // new DefaultBindingRuntimeGenerator().generateTypeMapping(context), moduleInfoRegistry);
65 // FIXME: publish new the new context, remove the old one
68 ObjectRegistration<YangModuleInfo> registerInfo(final YangModuleInfo yangModuleInfo) {
69 return moduleInfoRegistry.registerModuleInfo(yangModuleInfo);
72 private class ObjectRegistrationWrapper implements ObjectRegistration<YangModuleInfo> {
73 private final ObjectRegistration<YangModuleInfo> inner;
75 ObjectRegistrationWrapper(final ObjectRegistration<YangModuleInfo> inner) {
76 this.inner = requireNonNull(inner);
80 public YangModuleInfo getInstance() {
81 return inner.getInstance();
85 @SuppressWarnings("checkstyle:illegalCatch")
90 // send modify event when a bundle disappears
96 public String toString() {
97 return inner.toString();