2 * Copyright (c) 2020 PANTHEON.tech 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.yanglib.rfc8525;
10 import static com.google.common.base.Preconditions.checkState;
12 import java.util.HashMap;
14 import java.util.Objects;
15 import java.util.Optional;
16 import java.util.stream.Collectors;
17 import org.eclipse.jdt.annotation.NonNull;
18 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
19 import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
20 import org.opendaylight.mdsal.yanglib.api.YangLibraryContentBuilder;
21 import org.opendaylight.mdsal.yanglib.api.YangLibraryContentBuilderWithLegacy;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.RevisionIdentifier;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibrary;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryBuilder;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.set.parameters.Module;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.set.parameters.ModuleBuilder;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.set.parameters.module.SubmoduleBuilder;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.ModuleSet;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.ModuleSetBuilder;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.ModuleSetKey;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.YangIdentifier;
33 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
34 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
35 import org.opendaylight.yangtools.yang.common.Revision;
36 import org.opendaylight.yangtools.yang.data.api.DatastoreIdentifier;
37 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
38 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
40 final class YangLibraryContentBuilderImpl implements YangLibraryContentBuilder {
41 private static final String MODULE_SET_NAME = "ODL_modules";
43 private final Map<DatastoreIdentifier, EffectiveModelContext> datastores = new HashMap<>();
44 private final BindingDataObjectCodecTreeNode<YangLibrary> codec;
45 private final BindingCodecTree codecTree;
47 private EffectiveModelContext modelContext;
49 YangLibraryContentBuilderImpl(final BindingCodecTree codecTree) {
50 this.codecTree = Objects.requireNonNull(codecTree);
51 codec = codecTree.getDataObjectCodec(InstanceIdentifier.create(YangLibrary.class));
55 public YangLibraryContentBuilder defaultContext(final EffectiveModelContext context) {
56 modelContext = context;
60 EffectiveModelContext getModelContext() {
65 public YangLibraryContentBuilderWithLegacy includeLegacy() {
66 return new LegacyContentBuilder(this, codecTree);
70 public YangLibraryContentBuilder addDatastore(final DatastoreIdentifier identifier,
71 final EffectiveModelContext context) {
72 datastores.put(identifier, context);
77 public ContainerNode formatYangLibraryContent() {
78 checkState(modelContext != null, "EffectiveModelContext is required to format YangLibrary content");
79 return formatYangLibrary();
82 @NonNull ContainerNode formatYangLibrary() {
83 // Two-step process: we first build the content and then use hashCode() to generate module-set-id
84 final YangLibraryBuilder builder = new YangLibraryBuilder().setContentId("");
85 final ModuleSetBuilder moduleSetBuilder = new ModuleSetBuilder()
86 .setModule(modelContext.getModules().stream()
87 .map(YangLibraryContentBuilderImpl::buildModule)
88 .collect(BindingMap.toMap()))
89 .setName(MODULE_SET_NAME);
90 final ModuleSet moduleSet = moduleSetBuilder.build();
92 builder.setModuleSet(Map.of(new ModuleSetKey(moduleSet.getName()), moduleSet));
93 return (ContainerNode) codec.serialize(builder.setContentId(String.valueOf(builder.build().hashCode()))
97 private static Module buildModule(final org.opendaylight.yangtools.yang.model.api.Module module) {
98 return new ModuleBuilder()
99 .setName(new YangIdentifier(module.getName()))
100 .setNamespace(new Uri(module.getQNameModule().getNamespace().toString()))
101 .setRevision(convertRevision(module.getRevision()))
102 .setSubmodule(module.getSubmodules().stream()
103 .map(submodule -> new SubmoduleBuilder()
104 .setName(new YangIdentifier(submodule.getName()))
105 .setRevision(convertRevision(submodule.getRevision()))
107 .collect(BindingMap.toMap()))
108 .setFeature(module.getFeatures().stream()
109 .map(feat -> new YangIdentifier(feat.getQName().getLocalName()))
110 .collect(Collectors.toUnmodifiableSet()))
114 private static RevisionIdentifier convertRevision(final Optional<Revision> revision) {
115 return revision.map(rev -> new RevisionIdentifier(rev.toString())).orElse(null);