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 com.google.common.base.Preconditions.checkNotNull;
11 import static com.google.common.base.Preconditions.checkState;
12 import static com.google.common.base.Verify.verifyNotNull;
14 import com.google.common.util.concurrent.CheckedFuture;
15 import javax.annotation.concurrent.GuardedBy;
16 import org.opendaylight.mdsal.binding.dom.codec.osgi.BindingRuntimeContextListener;
17 import org.opendaylight.mdsal.binding.dom.codec.osgi.BindingRuntimeContextService;
18 import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy;
19 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
20 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
21 import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceException;
22 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
23 import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
24 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
25 import org.osgi.framework.BundleContext;
26 import org.osgi.framework.ServiceReference;
27 import org.osgi.util.tracker.ServiceTracker;
30 final class SimpleBindingRuntimeContextService extends
31 ServiceTracker<BindingRuntimeContextListener, BindingRuntimeContextListener>
32 implements BindingRuntimeContextService {
33 private final SchemaSourceProvider<YangTextSchemaSource> sourceProvider;
34 private final ClassLoadingStrategy strategy;
35 private final Object lock = new Object();
38 private BindingRuntimeContext current;
40 SimpleBindingRuntimeContextService(final BundleContext context, final ClassLoadingStrategy strategy,
41 final SchemaSourceProvider<YangTextSchemaSource> sourceProvider) {
42 super(context, BindingRuntimeContextListener.class, null);
43 this.sourceProvider = checkNotNull(sourceProvider);
44 this.strategy = checkNotNull(strategy);
48 public CheckedFuture<? extends YangTextSchemaSource, SchemaSourceException> getSource(
49 final SourceIdentifier sourceIdentifier) {
50 return sourceProvider.getSource(sourceIdentifier);
54 public BindingRuntimeContext getBindingRuntimeContext() {
56 checkState(current != null, "Runtime context is not initialized yet");
61 void updateBindingRuntimeContext(final SchemaContext schemaContext) {
62 final BindingRuntimeContext next = verifyNotNull(BindingRuntimeContext.create(strategy, schemaContext));
64 final BindingRuntimeContextListener[] listeners;
67 listeners = this.getServices(new BindingRuntimeContextListener[0]);
70 for (BindingRuntimeContextListener l : listeners) {
71 l.onBindingRuntimeContextUpdated(next);
76 public BindingRuntimeContextListener addingService(
77 final ServiceReference<BindingRuntimeContextListener> reference) {
78 final BindingRuntimeContextListener listener = super.addingService(reference);
81 listener.onBindingRuntimeContextUpdated(current);