BUG 2743 - Added support for runtime RPC's to netconf mdsal northbound.
[controller.git] / opendaylight / netconf / mdsal-netconf-connector / src / main / java / org / opendaylight / controller / netconf / mdsal / connector / MdsalNetconfOperationServiceFactory.java
index 9bd71c3c7ca9d893289f1753a59fc61403a44657..4086d2afec9145c12689a34b40d75c3777c4d8f1 100644 (file)
@@ -8,38 +8,43 @@
 
 package org.opendaylight.controller.netconf.mdsal.connector;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
 import org.opendaylight.controller.netconf.api.Capability;
 import org.opendaylight.controller.netconf.api.monitoring.CapabilityListener;
 import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceFactory;
+import org.opendaylight.controller.netconf.util.capability.BasicCapability;
+import org.opendaylight.controller.netconf.util.capability.YangModuleCapability;
+import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession;
+import org.opendaylight.controller.sal.core.api.Consumer;
 import org.opendaylight.controller.sal.core.api.model.SchemaService;
-import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class MdsalNetconfOperationServiceFactory implements NetconfOperationServiceFactory, AutoCloseable {
+public class MdsalNetconfOperationServiceFactory implements NetconfOperationServiceFactory, Consumer, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(MdsalNetconfOperationServiceFactory.class);
 
-    private final DOMDataBroker dataBroker;
+    private ConsumerSession session = null;
+    private DOMDataBroker dataBroker = null;
+    private DOMRpcService rpcService = null;
     private final CurrentSchemaContext currentSchemaContext;
 
-    public MdsalNetconfOperationServiceFactory(final SchemaService schemaService, final DOMDataBroker domDataBroker) {
+    public MdsalNetconfOperationServiceFactory(final SchemaService schemaService) {
         this.currentSchemaContext = new CurrentSchemaContext(Preconditions.checkNotNull(schemaService));
-        this.dataBroker = Preconditions.checkNotNull(domDataBroker);
     }
 
     @Override
     public MdsalNetconfOperationService createService(final String netconfSessionIdForReporting) {
-        return new MdsalNetconfOperationService(currentSchemaContext, netconfSessionIdForReporting, dataBroker);
+        Preconditions.checkState(dataBroker != null, "MD-SAL provider not yet initialized");
+        return new MdsalNetconfOperationService(currentSchemaContext, netconfSessionIdForReporting, dataBroker, rpcService);
     }
 
     @Override
@@ -49,15 +54,19 @@ public class MdsalNetconfOperationServiceFactory implements NetconfOperationServ
 
     @Override
     public Set<Capability> getCapabilities() {
+        return transformCapabilities(currentSchemaContext.getCurrentContext());
+    }
+
+    static Set<Capability> transformCapabilities(final SchemaContext currentContext1) {
         final Set<Capability> capabilities = new HashSet<>();
         // [RFC6241] 8.3.  Candidate Configuration Capability
         capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:candidate:1.0"));
 
-        final SchemaContext currentContext = currentSchemaContext.getCurrentContext();
+        final SchemaContext currentContext = currentContext1;
         final Set<Module> modules = currentContext.getModules();
         for (final Module module : modules) {
             if(currentContext.getModuleSource(module).isPresent()) {
-                capabilities.add(new YangStoreCapability(module, currentContext.getModuleSource(module).get()));
+                capabilities.add(new YangModuleCapability(module, currentContext.getModuleSource(module).get()));
             } else {
                 LOG.warn("Missing source for module {}. This module will not be available from netconf server",
                         module);
@@ -69,97 +78,18 @@ public class MdsalNetconfOperationServiceFactory implements NetconfOperationServ
 
     @Override
     public AutoCloseable registerCapabilityListener(final CapabilityListener listener) {
-        // TODO provide notifications about changed schemas
-        return new AutoCloseable() {
-            @Override
-            public void close() throws Exception {
-
-            }
-        };
+        return currentSchemaContext.registerCapabilityListener(listener);
     }
 
-    private static class BasicCapability implements Capability {
-
-        private final String capability;
-
-        private BasicCapability(final String capability) {
-            this.capability = capability;
-        }
-
-        @Override
-        public String getCapabilityUri() {
-            return capability;
-        }
-
-        @Override
-        public Optional<String> getModuleNamespace() {
-            return Optional.absent();
-        }
-
-        @Override
-        public Optional<String> getModuleName() {
-            return Optional.absent();
-        }
-
-        @Override
-        public Optional<String> getRevision() {
-            return Optional.absent();
-        }
-
-        @Override
-        public Optional<String> getCapabilitySchema() {
-            return Optional.absent();
-        }
-
-        @Override
-        public Collection<String> getLocation() {
-            return Collections.emptyList();
-        }
-
-        @Override
-        public String toString() {
-            return capability;
-        }
+    @Override
+    public void onSessionInitiated(ConsumerSession session) {
+        this.session = Preconditions.checkNotNull(session);
+        this.dataBroker = this.session.getService(DOMDataBroker.class);
+        this.rpcService = this.session.getService(DOMRpcService.class);
     }
 
-    private static final class YangStoreCapability extends BasicCapability {
-
-        private final String content;
-        private final String revision;
-        private final String moduleName;
-        private final String moduleNamespace;
-
-        public YangStoreCapability(final Module module, final String moduleContent) {
-            super(toCapabilityURI(module));
-            this.content = moduleContent;
-            this.moduleName = module.getName();
-            this.moduleNamespace = module.getNamespace().toString();
-            this.revision = SimpleDateFormatUtil.getRevisionFormat().format(module.getRevision());
-        }
-
-        @Override
-        public Optional<String> getCapabilitySchema() {
-            return Optional.of(content);
-        }
-
-        private static String toCapabilityURI(final Module module) {
-            return String.valueOf(module.getNamespace()) + "?module="
-                    + module.getName() + "&revision=" + SimpleDateFormatUtil.getRevisionFormat().format(module.getRevision());
-        }
-
-        @Override
-        public Optional<String> getModuleName() {
-            return Optional.of(moduleName);
-        }
-
-        @Override
-        public Optional<String> getModuleNamespace() {
-            return Optional.of(moduleNamespace);
-        }
-
-        @Override
-        public Optional<String> getRevision() {
-            return Optional.of(revision);
-        }
+    @Override
+    public Collection<ConsumerFunctionality> getConsumerFunctionality() {
+        return Collections.emptySet();
     }
 }