X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fmdsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fmdsal%2Fconnector%2FMdsalNetconfOperationServiceFactory.java;h=7e57acafe68c519cece920eefc176db7b02cc2e2;hb=aafa2fb9d206df54b7088f449f6e3cfc7bcae50d;hp=d957097ae8fe68b45d4430c39ad0905600701a76;hpb=45cfee1861924b4a8086d38079ce8cbd320386d6;p=netconf.git diff --git a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/MdsalNetconfOperationServiceFactory.java b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/MdsalNetconfOperationServiceFactory.java index d957097ae8..7e57acafe6 100644 --- a/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/MdsalNetconfOperationServiceFactory.java +++ b/netconf/mdsal-netconf-connector/src/main/java/org/opendaylight/netconf/mdsal/connector/MdsalNetconfOperationServiceFactory.java @@ -5,10 +5,10 @@ * 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.netconf.mdsal.connector; -import com.google.common.base.Preconditions; +import static java.util.Objects.requireNonNull; + import com.google.common.io.CharStreams; import java.io.IOException; import java.io.InputStream; @@ -18,26 +18,36 @@ import java.util.HashSet; import java.util.Optional; import java.util.Set; import java.util.concurrent.ExecutionException; -import org.opendaylight.controller.config.util.capability.Capability; -import org.opendaylight.controller.config.util.capability.YangModuleCapability; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; -import org.opendaylight.controller.sal.core.api.model.SchemaService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker; +import org.opendaylight.mdsal.dom.api.DOMRpcService; +import org.opendaylight.mdsal.dom.api.DOMSchemaService; +import org.opendaylight.mdsal.dom.api.DOMYangTextSourceProvider; +import org.opendaylight.netconf.api.capability.BasicCapability; +import org.opendaylight.netconf.api.capability.Capability; +import org.opendaylight.netconf.api.capability.YangModuleCapability; import org.opendaylight.netconf.api.monitoring.CapabilityListener; -import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; -import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactoryListener; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier; +import org.opendaylight.netconf.server.api.operations.NetconfOperationService; +import org.opendaylight.netconf.server.api.operations.NetconfOperationServiceFactory; +import org.opendaylight.netconf.server.api.operations.NetconfOperationServiceFactoryListener; +import org.opendaylight.yangtools.concepts.Registration; +import org.opendaylight.yangtools.yang.common.Revision; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.ModuleLike; 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; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class MdsalNetconfOperationServiceFactory implements NetconfOperationServiceFactory, AutoCloseable { - +@Component(service = NetconfOperationServiceFactory.class, immediate = true, property = "type=mdsal-netconf-connector") +public final class MdsalNetconfOperationServiceFactory implements NetconfOperationServiceFactory, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(MdsalNetconfOperationServiceFactory.class); + private static final BasicCapability VALIDATE_CAPABILITY = + new BasicCapability("urn:ietf:params:netconf:capability:validate:1.0"); private final DOMDataBroker dataBroker; private final DOMRpcService rpcService; @@ -46,78 +56,65 @@ public class MdsalNetconfOperationServiceFactory implements NetconfOperationServ private final SchemaSourceProvider rootSchemaSourceProviderDependency; private final NetconfOperationServiceFactoryListener netconfOperationServiceFactoryListener; - public MdsalNetconfOperationServiceFactory( - final SchemaService schemaService, - final SchemaSourceProvider rootSchemaSourceProviderDependency, - final NetconfOperationServiceFactoryListener netconfOperationServiceFactoryListener, - final DOMDataBroker dataBroker, - final DOMRpcService rpcService) { - - this.dataBroker = dataBroker; - this.rpcService = rpcService; - - this.rootSchemaSourceProviderDependency = rootSchemaSourceProviderDependency; - this.currentSchemaContext = new CurrentSchemaContext(Preconditions.checkNotNull(schemaService), + @Activate + public MdsalNetconfOperationServiceFactory(@Reference final DOMSchemaService schemaService, + @Reference final DOMDataBroker dataBroker, @Reference final DOMRpcService rpcService, + @Reference(target = "(type=mapper-aggregator-registry)") + final NetconfOperationServiceFactoryListener netconfOperationServiceFactoryListener) { + this.dataBroker = requireNonNull(dataBroker); + this.rpcService = requireNonNull(rpcService); + this.netconfOperationServiceFactoryListener = requireNonNull(netconfOperationServiceFactoryListener); + + rootSchemaSourceProviderDependency = schemaService.getExtensions() + .getInstance(DOMYangTextSourceProvider.class); + currentSchemaContext = CurrentSchemaContext.create(requireNonNull(schemaService), rootSchemaSourceProviderDependency); - this.netconfOperationServiceFactoryListener = netconfOperationServiceFactoryListener; - this.netconfOperationServiceFactoryListener.onAddNetconfOperationServiceFactory(this); + netconfOperationServiceFactoryListener.onAddNetconfOperationServiceFactory(this); } + @Deactivate @Override - public MdsalNetconfOperationService createService(final String netconfSessionIdForReporting) { - Preconditions.checkState(dataBroker != null, "MD-SAL provider not yet initialized"); - return new MdsalNetconfOperationService(currentSchemaContext, netconfSessionIdForReporting, dataBroker, - rpcService); + public void close() { + netconfOperationServiceFactoryListener.onRemoveNetconfOperationServiceFactory(this); + currentSchemaContext.close(); } - @SuppressWarnings("checkstyle:IllegalCatch") @Override - public void close() { - try { - currentSchemaContext.close(); - if (netconfOperationServiceFactoryListener != null) { - netconfOperationServiceFactoryListener.onRemoveNetconfOperationServiceFactory(this); - } - } catch (Exception e) { - LOG.error("Failed to close resources correctly - ignore", e); - } + public NetconfOperationService createService(final String netconfSessionIdForReporting) { + return new MdsalNetconfOperationService(currentSchemaContext, netconfSessionIdForReporting, dataBroker, + rpcService); } @Override public Set getCapabilities() { + // FIXME: cache returned set return transformCapabilities(currentSchemaContext.getCurrentContext(), rootSchemaSourceProviderDependency); } + // FIXME: ImmutableSet static Set transformCapabilities( - final SchemaContext currentContext, + final EffectiveModelContext currentContext, final SchemaSourceProvider rootSchemaSourceProviderDependency) { - final Set capabilities = new HashSet<>(); + final var capabilities = new HashSet(); // Added by netconf-impl by default // capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:candidate:1.0")); - final Set modules = currentContext.getModules(); - for (final Module module : modules) { - Optional cap = moduleToCapability(module, rootSchemaSourceProviderDependency); - if (cap.isPresent()) { - capabilities.add(cap.get()); - } - for (final Module submodule : module.getSubmodules()) { - cap = moduleToCapability(submodule, rootSchemaSourceProviderDependency); - if (cap.isPresent()) { - capabilities.add(cap.get()); - } + // FIXME: rework in terms of ModuleEffectiveStatement + for (var module : currentContext.getModules()) { + moduleToCapability(module, rootSchemaSourceProviderDependency).ifPresent(capabilities::add); + for (var submodule : module.getSubmodules()) { + moduleToCapability(submodule, rootSchemaSourceProviderDependency).ifPresent(capabilities::add); } } return capabilities; } - private static Optional moduleToCapability( - final Module module, final SchemaSourceProvider rootSchemaSourceProviderDependency) { - - final SourceIdentifier moduleSourceIdentifier = RevisionSourceIdentifier.create(module.getName(), - module.getRevision()); + private static Optional moduleToCapability(final ModuleLike module, + final SchemaSourceProvider rootSchemaSourceProviderDependency) { + final SourceIdentifier moduleSourceIdentifier = new SourceIdentifier(module.getName(), + module.getRevision().map(Revision::toString).orElse(null)); InputStream sourceStream = null; String source; @@ -147,7 +144,12 @@ public class MdsalNetconfOperationServiceFactory implements NetconfOperationServ } @Override - public AutoCloseable registerCapabilityListener(final CapabilityListener listener) { + public Registration registerCapabilityListener(final CapabilityListener listener) { + // Advertise validate capability only if DOMDataBroker provides DOMDataTransactionValidator + if (dataBroker.getExtensions().get(DOMDataTransactionValidator.class) != null) { + listener.onCapabilitiesChanged(Set.of(VALIDATE_CAPABILITY), Set.of()); + } + // Advertise namespaces of supported YANG models as NETCONF capabilities return currentSchemaContext.registerCapabilityListener(listener); } }