From 0745471b5b7c679d8feb6fd533733dfa3346bcfd Mon Sep 17 00:00:00 2001 From: Michael Vorburger Date: Mon, 28 Jan 2019 22:11:36 +0100 Subject: [PATCH] Add AbstractDOMSchemaService and FixedDOMSchemaService AbstractDOMSchemaService allows more code reuse between implementations by holding the common bits needed to interface with SchemaContextProviders. Also use these to implement a FixedDOMSchemaService for use in situations when the SchemaContext and the set of associated sources are known to never change. This also slightly simplifies ScanningSchemaSourceProvider. JIRA: MDSAL-418 Change-Id: I554837f8ae93e5bbb741b4cb801c31b8ebfcaa03 Signed-off-by: Michael Vorburger (cherry picked from commit 6f527c4f41f6d363cbd486e925e2447c4ab26995) --- .../mdsal/dom/api/DOMExtensibleService.java | 1 + .../schema/ScanningSchemaServiceProvider.java | 30 ++----- .../dom/spi/AbstractDOMSchemaService.java | 53 ++++++++++++ .../mdsal/dom/spi/FixedDOMSchemaService.java | 84 +++++++++++++++++++ 4 files changed, 143 insertions(+), 25 deletions(-) create mode 100644 dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/AbstractDOMSchemaService.java create mode 100644 dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/FixedDOMSchemaService.java diff --git a/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMExtensibleService.java b/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMExtensibleService.java index acc09dc942..07adada989 100644 --- a/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMExtensibleService.java +++ b/dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMExtensibleService.java @@ -27,5 +27,6 @@ public interface DOMExtensibleService, * * @return A map of supported functionality. */ + // FIXME: make this a default method returning empty @NonNull ClassToInstanceMap getExtensions(); } diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/schema/ScanningSchemaServiceProvider.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/schema/ScanningSchemaServiceProvider.java index f3a4f8733e..676e6de9a3 100644 --- a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/schema/ScanningSchemaServiceProvider.java +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/schema/ScanningSchemaServiceProvider.java @@ -8,8 +8,6 @@ package org.opendaylight.mdsal.dom.broker.schema; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ClassToInstanceMap; -import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.collect.Iterables; import com.google.common.util.concurrent.ListenableFuture; import java.io.IOException; @@ -18,15 +16,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; import javax.annotation.concurrent.GuardedBy; -import org.opendaylight.mdsal.dom.api.DOMSchemaService; -import org.opendaylight.mdsal.dom.api.DOMSchemaServiceExtension; -import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; +import org.opendaylight.mdsal.dom.spi.AbstractDOMSchemaService; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.util.ListenerRegistry; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; -import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider; import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException; import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceException; import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; @@ -35,8 +30,8 @@ import org.opendaylight.yangtools.yang.parser.repo.YangTextSchemaContextResolver import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ScanningSchemaServiceProvider - implements DOMSchemaService, SchemaContextProvider, DOMYangTextSourceProvider, AutoCloseable { +public class ScanningSchemaServiceProvider extends AbstractDOMSchemaService.WithYangTextSources + implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(ScanningSchemaServiceProvider.class); private final YangTextSchemaContextResolver contextResolver = YangTextSchemaContextResolver.create("global-bundle"); @@ -99,40 +94,25 @@ public class ScanningSchemaServiceProvider } } - @Override - public SchemaContext getSessionContext() { - throw new UnsupportedOperationException(); - } - @Override public SchemaContext getGlobalContext() { return contextResolver.getSchemaContext().orElse(null); } @Override - public ListenerRegistration - registerSchemaContextListener(final SchemaContextListener listener) { + public ListenerRegistration registerSchemaContextListener( + final SchemaContextListener listener) { synchronized (lock) { contextResolver.getSchemaContext().ifPresent(listener::onGlobalContextUpdated); return listeners.register(listener); } } - @Override - public SchemaContext getSchemaContext() { - return getGlobalContext(); - } - @Override public ListenableFuture getSource(final SourceIdentifier sourceIdentifier) { return contextResolver.getSource(sourceIdentifier); } - @Override - public ClassToInstanceMap getExtensions() { - return ImmutableClassToInstanceMap.of(DOMYangTextSourceProvider.class, this); - } - @Override public void close() { synchronized (lock) { diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/AbstractDOMSchemaService.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/AbstractDOMSchemaService.java new file mode 100644 index 0000000000..dbcb9d4cae --- /dev/null +++ b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/AbstractDOMSchemaService.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2019 Red Hat, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.dom.spi; + +import com.google.common.annotations.Beta; +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.ImmutableClassToInstanceMap; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.opendaylight.mdsal.dom.api.DOMSchemaService; +import org.opendaylight.mdsal.dom.api.DOMSchemaServiceExtension; +import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider; + +/** + * Base class to implement DOMSchemaService more easily while providing a bridge between MD-SAL DOM Schema services + * and YANG Tools Schema consumers. + * + * @author Michael Vorburger.ch + */ +@Beta +@NonNullByDefault +public abstract class AbstractDOMSchemaService implements DOMSchemaService, SchemaContextProvider { + public abstract static class WithYangTextSources extends AbstractDOMSchemaService + implements DOMYangTextSourceProvider { + @Override + public ClassToInstanceMap getExtensions() { + return ImmutableClassToInstanceMap.of(DOMYangTextSourceProvider.class, this); + } + } + + @Override + public final SchemaContext getSchemaContext() { + // Always route context queries to a single method + return getGlobalContext(); + } + + @Override + public final SchemaContext getSessionContext() { + // This method should not be implemented + throw new UnsupportedOperationException(); + } + + @Override + public ClassToInstanceMap getExtensions() { + return ImmutableClassToInstanceMap.of(); + } +} diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/FixedDOMSchemaService.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/FixedDOMSchemaService.java new file mode 100644 index 0000000000..f73cc27bd1 --- /dev/null +++ b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/FixedDOMSchemaService.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2019 Red Hat, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.dom.spi; + +import static java.util.Objects.requireNonNull; + +import com.google.common.annotations.Beta; +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.ImmutableClassToInstanceMap; +import com.google.common.util.concurrent.ListenableFuture; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.dom.api.DOMSchemaService; +import org.opendaylight.mdsal.dom.api.DOMSchemaServiceExtension; +import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.NoOpListenerRegistration; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; +import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider; +import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; +import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; + +/** + * {@link DOMSchemaService} (and {@link DOMYangTextSourceProvider}) implementations backed by a + * {@link SchemaContextProvider} (and {@link SchemaSourceProvider}) which are known to be fixed and never change + * schemas. + * + * @author Michael Vorburger.ch + */ +@Beta +public class FixedDOMSchemaService extends AbstractDOMSchemaService { + private static final class WithYangTextSources extends FixedDOMSchemaService implements DOMYangTextSourceProvider { + private final @NonNull SchemaSourceProvider schemaSourceProvider; + + WithYangTextSources(final SchemaContextProvider schemaContextProvider, + final SchemaSourceProvider schemaSourceProvider) { + super(schemaContextProvider); + this.schemaSourceProvider = requireNonNull(schemaSourceProvider); + } + + @Override + public ClassToInstanceMap getExtensions() { + return ImmutableClassToInstanceMap.of(DOMYangTextSourceProvider.class, this); + } + + @Override + public ListenableFuture getSource(final SourceIdentifier sourceIdentifier) { + return schemaSourceProvider.getSource(sourceIdentifier); + } + } + + private final @NonNull SchemaContextProvider schemaContextProvider; + + private FixedDOMSchemaService(final SchemaContextProvider schemaContextProvider) { + this.schemaContextProvider = requireNonNull(schemaContextProvider); + } + + public static @NonNull DOMSchemaService of(final SchemaContextProvider schemaContextProvider) { + return new FixedDOMSchemaService(schemaContextProvider); + } + + public static @NonNull DOMSchemaService of(final SchemaContextProvider schemaContextProvider, + final SchemaSourceProvider yangTextSourceProvider) { + return new WithYangTextSources(schemaContextProvider, requireNonNull(yangTextSourceProvider)); + } + + @Override + public final SchemaContext getGlobalContext() { + return schemaContextProvider.getSchemaContext(); + } + + @Override + public final @NonNull ListenerRegistration registerSchemaContextListener( + final SchemaContextListener listener) { + listener.onGlobalContextUpdated(getGlobalContext()); + return NoOpListenerRegistration.of(listener); + } +} -- 2.36.6