2 * Copyright (c) 2013 Cisco Systems, Inc. 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
9 package org.opendaylight.controller.netconf.mdsal.connector;
11 import com.google.common.base.Optional;
12 import com.google.common.base.Preconditions;
13 import java.util.Collection;
14 import java.util.Collections;
15 import java.util.HashSet;
17 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
18 import org.opendaylight.controller.netconf.api.Capability;
19 import org.opendaylight.controller.netconf.api.monitoring.CapabilityListener;
20 import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceFactory;
21 import org.opendaylight.controller.sal.core.api.model.SchemaService;
22 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
23 import org.opendaylight.yangtools.yang.model.api.Module;
24 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 public class MdsalNetconfOperationServiceFactory implements NetconfOperationServiceFactory, AutoCloseable {
30 private static final Logger LOG = LoggerFactory.getLogger(MdsalNetconfOperationServiceFactory.class);
32 private final DOMDataBroker dataBroker;
33 private final CurrentSchemaContext currentSchemaContext;
35 public MdsalNetconfOperationServiceFactory(final SchemaService schemaService, final DOMDataBroker domDataBroker) {
36 this.currentSchemaContext = new CurrentSchemaContext(Preconditions.checkNotNull(schemaService));
37 this.dataBroker = Preconditions.checkNotNull(domDataBroker);
41 public MdsalNetconfOperationService createService(final String netconfSessionIdForReporting) {
42 return new MdsalNetconfOperationService(currentSchemaContext, netconfSessionIdForReporting, dataBroker);
46 public void close() throws Exception {
47 currentSchemaContext.close();
51 public Set<Capability> getCapabilities() {
52 final Set<Capability> capabilities = new HashSet<>();
53 // [RFC6241] 8.3. Candidate Configuration Capability
54 capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:candidate:1.0"));
56 final SchemaContext currentContext = currentSchemaContext.getCurrentContext();
57 final Set<Module> modules = currentContext.getModules();
58 for (final Module module : modules) {
59 if(currentContext.getModuleSource(module).isPresent()) {
60 capabilities.add(new YangStoreCapability(module, currentContext.getModuleSource(module).get()));
62 LOG.warn("Missing source for module {}. This module will not be available from netconf server",
71 public AutoCloseable registerCapabilityListener(final CapabilityListener listener) {
72 // TODO provide notifications about changed schemas
73 return new AutoCloseable() {
75 public void close() throws Exception {
81 private static class BasicCapability implements Capability {
83 private final String capability;
85 private BasicCapability(final String capability) {
86 this.capability = capability;
90 public String getCapabilityUri() {
95 public Optional<String> getModuleNamespace() {
96 return Optional.absent();
100 public Optional<String> getModuleName() {
101 return Optional.absent();
105 public Optional<String> getRevision() {
106 return Optional.absent();
110 public Optional<String> getCapabilitySchema() {
111 return Optional.absent();
115 public Collection<String> getLocation() {
116 return Collections.emptyList();
120 public String toString() {
125 private static final class YangStoreCapability extends BasicCapability {
127 private final String content;
128 private final String revision;
129 private final String moduleName;
130 private final String moduleNamespace;
132 public YangStoreCapability(final Module module, final String moduleContent) {
133 super(toCapabilityURI(module));
134 this.content = moduleContent;
135 this.moduleName = module.getName();
136 this.moduleNamespace = module.getNamespace().toString();
137 this.revision = SimpleDateFormatUtil.getRevisionFormat().format(module.getRevision());
141 public Optional<String> getCapabilitySchema() {
142 return Optional.of(content);
145 private static String toCapabilityURI(final Module module) {
146 return String.valueOf(module.getNamespace()) + "?module="
147 + module.getName() + "&revision=" + SimpleDateFormatUtil.getRevisionFormat().format(module.getRevision());
151 public Optional<String> getModuleName() {
152 return Optional.of(moduleName);
156 public Optional<String> getModuleNamespace() {
157 return Optional.of(moduleNamespace);
161 public Optional<String> getRevision() {
162 return Optional.of(revision);