Skip to content

Commit

Permalink
Update the code to yangtools 6.0.7
Browse files Browse the repository at this point in the history
Adapt the code to use new classes, statements, utilities
and features of yangtools 6.0.7.

Signed-off-by: Ivan Hrasko <ivan.hrasko@pantheon.tech>
  • Loading branch information
ihrasko committed Jun 22, 2022
1 parent a32fc76 commit 81daa36
Show file tree
Hide file tree
Showing 22 changed files with 115 additions and 288 deletions.
4 changes: 2 additions & 2 deletions cli/src/main/java/com/mrv/yangtools/codegen/main/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
import org.opendaylight.yangtools.yang.model.api.ModuleLike;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
import org.slf4j.Logger;
Expand Down Expand Up @@ -112,7 +112,7 @@ protected void generate() throws IOException, ReactorException {
final SchemaContext context = buildSchemaContext(yangDir, p -> matcher.matches(p.getFileName()));

if(log.isInfoEnabled()) {
String modulesSting = context.getModules().stream().map(ModuleIdentifier::getName).collect(Collectors.joining(", "));
String modulesSting = context.getModules().stream().map(ModuleLike::getName).collect(Collectors.joining(", "));

log.info("Modules found in the {} are {}", yangDir, modulesSting);
}
Expand Down
50 changes: 18 additions & 32 deletions common/src/main/java/com/mrv/yangtools/common/SchemaBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,7 @@

package com.mrv.yangtools.common;

import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor;
import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangInferencePipeline;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
Expand All @@ -27,6 +20,15 @@
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
import org.opendaylight.yangtools.yang.parser.impl.DefaultReactors;
import org.opendaylight.yangtools.yang.parser.rfc7950.repo.YangStatementStreamSource;
import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor.BuildAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Yang schema context builder
Expand Down Expand Up @@ -68,32 +70,16 @@ public SchemaBuilder add(Path path) throws IOException {
return this;
}


public SchemaContext build() throws ReactorException {
final CrossSourceStatementReactor.BuildAction reactor = YangInferencePipeline.RFC6020_REACTOR.newBuild();
SchemaContext resolveSchemaContext;
SchemaContext build() throws ReactorException {
final BuildAction reactor = DefaultReactors.defaultReactor().newBuild();
log.info("Inspecting all defined yangs {}", yangs);
final List<InputStream> yangsStreams = new ArrayList<>();

try {
for (Path y : yangs) {
try {
yangsStreams.add(new FileInputStream(y.toFile()));
} catch (FileNotFoundException e) {
throw new IllegalStateException(y + " is not a file");
}
for (final Path path : yangs) {
try {
reactor.addSource(YangStatementStreamSource.create(YangTextSchemaSource.forFile(path.toFile())));
} catch (final IOException | YangSyntaxErrorException e) {
throw new IllegalStateException(path + " is not a valid YANG file");
}
resolveSchemaContext = reactor.buildEffective(new ArrayList<InputStream>(yangsStreams));
return resolveSchemaContext;
} finally {

yangsStreams.forEach(s -> {
try {
s.close();
} catch (IOException e) {
//ignore
}
});
}
return reactor.buildEffective();
}
}
6 changes: 6 additions & 0 deletions swagger-generator/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-data-util</artifactId>
<version>${yangtools.version}</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
import org.opendaylight.yangtools.yang.model.api.ModuleLike;
import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.slf4j.Logger;
Expand Down Expand Up @@ -122,7 +122,7 @@ public IoCSwaggerGenerator(@Assisted SchemaContext ctx, @Assisted Set<Module> mo
target = new Swagger();
converter = new AnnotatingTypeConverter(ctx);
moduleUtils = new ModuleUtils(ctx);
this.moduleNames = modulesToGenerate.stream().map(ModuleIdentifier::getName).collect(Collectors.toSet());
this.moduleNames = modulesToGenerate.stream().map(ModuleLike::getName).collect(Collectors.toSet());
//assign default strategy
strategy(Strategy.optimizing);

Expand Down Expand Up @@ -298,12 +298,12 @@ public Swagger generate() {
}

log.info("Generating swagger for yang modules: {}",
modules.stream().map(ModuleIdentifier::getName).collect(Collectors.joining(",","[", "]")));
modules.stream().map(ModuleLike::getName).collect(Collectors.joining(",","[", "]")));

modules.forEach(m -> {
mNames.add(m.getName());
if(m.getDescription() != null && !m.getDescription().isEmpty()) {
mDescs.add(m.getDescription());
if(m.getDescription().isPresent()) {
mDescs.add(m.getDescription().get());
}
dataObjectsBuilder.processModule(m);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
public class SwaggerGenerator {
private static final Logger log = LoggerFactory.getLogger(SwaggerGenerator.class);
private final SchemaContext ctx;
private final Set<org.opendaylight.yangtools.yang.model.api.Module> modules;
private final Collection<? extends org.opendaylight.yangtools.yang.model.api.Module> modules;
private final Swagger target;
private final Set<String> moduleNames;
private final ModuleUtils moduleUtils;
Expand Down Expand Up @@ -100,7 +100,7 @@ public enum Strategy {optimizing, unpacking}
* @param ctx context for generation
* @param modulesToGenerate modules that will be transformed to swagger API
*/
public SwaggerGenerator(SchemaContext ctx, Set<org.opendaylight.yangtools.yang.model.api.Module> modulesToGenerate) {
public SwaggerGenerator(SchemaContext ctx, Collection<? extends org.opendaylight.yangtools.yang.model.api.Module> modulesToGenerate) {
Objects.requireNonNull(ctx);
Objects.requireNonNull(modulesToGenerate);

Expand All @@ -111,7 +111,7 @@ public SwaggerGenerator(SchemaContext ctx, Set<org.opendaylight.yangtools.yang.m
if(modulesToGenerate.isEmpty()) {
log.error("No modules has been specified for swagger generation");
if(log.isInfoEnabled()) {
String msg = ctx.getModules().stream().map(ModuleIdentifier::getName).collect(Collectors.joining(", "));
String msg = ctx.getModules().stream().map(ModuleLike::getName).collect(Collectors.joining(", "));
log.info("Modules in the context are: {}", msg);
}
throw new IllegalStateException("No modules to generate has been specified");
Expand All @@ -121,7 +121,7 @@ public SwaggerGenerator(SchemaContext ctx, Set<org.opendaylight.yangtools.yang.m
target = new Swagger();
converter = new AnnotatingTypeConverter(ctx);
moduleUtils = new ModuleUtils(ctx);
this.moduleNames = modulesToGenerate.stream().map(ModuleIdentifier::getName).collect(Collectors.toSet());
this.moduleNames = modulesToGenerate.stream().map(ModuleLike::getName).collect(Collectors.toSet());
//assign default strategy
strategy(Strategy.optimizing);

Expand Down Expand Up @@ -297,12 +297,12 @@ public Swagger generate() {


log.info("Generating swagger for yang modules: {}",
modules.stream().map(ModuleIdentifier::getName).collect(Collectors.joining(",","[", "]")));
modules.stream().map(ModuleLike::getName).collect(Collectors.joining(",","[", "]")));

modules.forEach(m -> {
mNames.add(m.getName());
if(m.getDescription() != null && !m.getDescription().isEmpty()) {
mDescs.add(m.getDescription());
if(m.getDescription().isPresent()) {
mDescs.add(m.getDescription().get());
}
dataObjectsBuilder.processModule(m);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import io.swagger.models.*;
import io.swagger.models.properties.*;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.data.util.ContainerSchemaNodes;
import org.opendaylight.yangtools.yang.model.api.*;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
Expand Down Expand Up @@ -48,9 +50,9 @@ public abstract class AbstractDataObjectBuilder implements DataObjectBuilder {
private final HashMap<QName, String> generatedEnums;
private final HashMap<DataNodeContainer, String> orgNames;

protected final static Function<DataNodeContainer, Set<AugmentationSchema>> augmentations = node -> {
protected final static Function<DataNodeContainer, Collection<? extends AugmentationSchemaNode>> augmentations = node -> {
if(node instanceof AugmentationTarget) {
Set<AugmentationSchema> res = ((AugmentationTarget) node).getAvailableAugmentations();
Collection<? extends AugmentationSchemaNode> res = ((AugmentationTarget) node).getAvailableAugmentations();
if(res != null) return res;
}
return Collections.emptySet();
Expand Down Expand Up @@ -98,13 +100,13 @@ public void processModule(Module module) {
if(r.getInput() != null)
processNode(r.getInput(), null, cache);
if(r.getOutput() != null)
processNode(new RpcContainerSchemaNode(r), null, cache);
processNode(ContainerSchemaNodes.forRPC(r), null, cache);
});
log.debug("processing augmentations defined in {}", module.getName());
module.getAugmentations().forEach(r -> processNode(r, cache));
}

protected void processNode(ContainerSchemaNode container, String proposedName, Set<String> cache) {
protected <T extends ContainerLike> void processNode(T container, String proposedName, Set<String> cache) {
if(container == null) return;
String name = generateName(container, null, cache);
names.put(container, name);
Expand All @@ -127,7 +129,7 @@ protected DataNodeContainer original(DataNodeContainer node) {
DataNodeContainer tmp = node;
do {
if(tmp instanceof DerivableSchemaNode) {
com.google.common.base.Optional<? extends SchemaNode> original = ((DerivableSchemaNode) tmp).getOriginal();
Optional<? extends SchemaNode> original = ((DerivableSchemaNode) tmp).getOriginal();
tmp = null;
if(original.isPresent() && original.get() instanceof DataNodeContainer) {
result = (DataNodeContainer) original.get();
Expand Down Expand Up @@ -165,7 +167,7 @@ protected String generateName(SchemaNode node, String proposedName, Set<String>
}
}

String modulePrefix = nameToPackageSegment(moduleUtils.toModuleName(node.getQName()));
String modulePrefix = nameToPackageSegment(moduleUtils.toModuleName(node.getQName().getModule()));
if(proposedName != null) {
return modulePrefix + "." + getClassName(proposedName);
}
Expand Down Expand Up @@ -198,7 +200,7 @@ protected Property getPropertyByType(LeafListSchemaNode llN) {
protected Property getPropertyByType(LeafSchemaNode lN) {

final Property property = converter.convert(lN.getType(), lN);
property.setDefault(lN.getDefault());
property.setDefault(lN.getType().getDefaultValue().map(Object::toString).orElse(null));

return property;
}
Expand Down Expand Up @@ -250,11 +252,11 @@ protected Pair prop(DataSchemaNode node) {
} else if (node instanceof LeafSchemaNode) {
LeafSchemaNode lN = (LeafSchemaNode) node;
prop = getPropertyByType(lN);
} else if (node instanceof ContainerSchemaNode) {
prop = refOrStructure((ContainerSchemaNode) node);
} else if (node instanceof ContainerLike) {
prop = refOrStructure((ContainerLike) node);
} else if (node instanceof ListSchemaNode) {
prop = new ArrayProperty().items(refOrStructure((ListSchemaNode) node));
} else if (node instanceof AnyXmlSchemaNode) {
} else if (node instanceof AnyxmlSchemaNode) {
log.warn("generating swagger string property for any schema type for {}", node.getQName());
prop = new StringProperty();
}
Expand All @@ -276,13 +278,13 @@ public String getPropertyName(DataSchemaNode node) {
}

private String moduleName(DataSchemaNode node) {
Module module = ctx.findModuleByNamespaceAndRevision(node.getQName().getNamespace(), node.getQName().getRevision());
Module module = ctx.findModule(QNameModule.create(node.getQName().getNamespace(), node.getQName().getRevision())).orElseThrow();
return module.getName();
}

protected abstract <T extends DataSchemaNode & DataNodeContainer> Property refOrStructure(T node);

private static void assignCaseMetadata(Property property, ChoiceSchemaNode choice, ChoiceCaseNode aCase) {
private static void assignCaseMetadata(Property property, ChoiceSchemaNode choice, CaseSchemaNode aCase) {
String choiceName = choice.getQName().getLocalName();
String caseName = aCase.getQName().getLocalName();

Expand Down Expand Up @@ -348,7 +350,7 @@ protected ModelImpl build(EnumTypeDefinition enumType, QName qName) {
}

protected String getName(QName qname) {
String modulePrefix = nameToPackageSegment(moduleUtils.toModuleName(qname));
String modulePrefix = nameToPackageSegment(moduleUtils.toModuleName(qname.getModule()));
String name = modulePrefix + "." + getClassName(qname);

String candidate = name;
Expand All @@ -362,8 +364,8 @@ protected String getName(QName qname) {
}

protected String desc(DocumentedNode node) {
return node.getReference() == null ? node.getDescription() :
node.getDescription() + " REF:" + node.getReference();
return node.getReference().isEmpty() ? node.getDescription().orElse(null) :
node.getDescription().orElse(null) + " REF:" + node.getReference();
}

protected static class Pair {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ private void traverse(final DataNodeContainer dataNode) {
return;
}

final Iterable<DataSchemaNode> childNodes = dataNode.getChildNodes();
final Collection<? extends DataSchemaNode> childNodes = dataNode.getChildNodes();

if (childNodes != null) {
for (DataSchemaNode childNode : childNodes) {
Expand All @@ -69,10 +69,10 @@ private void traverse(final DataNodeContainer dataNode) {
traverse(containerNode);
} else if (childNode instanceof ChoiceSchemaNode) {
final ChoiceSchemaNode choiceNode = (ChoiceSchemaNode) childNode;
final Set<ChoiceCaseNode> cases = choiceNode.getCases();
final Collection<? extends CaseSchemaNode> cases = choiceNode.getCases();
if (cases != null) {
log.debug("processing choice: {}", childNode.getQName().getLocalName());
for (final ChoiceCaseNode caseNode : cases) {
for (final CaseSchemaNode caseNode : cases) {
log.debug("traversing case {}:{}", childNode.getQName().getLocalName(), caseNode.getQName().getLocalName());
traverse(caseNode);
}
Expand All @@ -84,7 +84,7 @@ private void traverse(final DataNodeContainer dataNode) {
}

private void traverseGroupings(final DataNodeContainer dataNode) {
final Set<GroupingDefinition> groupings = dataNode.getGroupings();
final Collection<? extends GroupingDefinition> groupings = dataNode.getGroupings();
if (groupings != null) {
groupings.forEach(n -> { allChildren.add(n); traverse(n); });
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ private Map<GroupingDefinition, String> computeNames() {
String localName = g.getQName().getLocalName();
int times = names.get(localName).size();
if(times < 2) return new Tuple<>(g, localName);
return new Tuple<>(g, moduleUtils.toModuleName(g.getQName()) + ":" + localName);
return new Tuple<>(g, moduleUtils.toModuleName(g.getQName().getModule()) + ":" + localName);
}).collect(Collectors.toMap(Tuple::first, Tuple::second));
}

Expand All @@ -73,9 +73,9 @@ private Map<QName, HierarchyNode> buildHierarchy() {
ctx.getGroupings().forEach(g -> {
HierarchyNode node = result.get(g.getPath().getLastComponent());
g.getUses().forEach(u -> {
HierarchyNode parent = result.get(u.getGroupingPath().getLastComponent());
HierarchyNode parent = result.get(u.getSourceGrouping().getPath().getLastComponent());
if (parent == null) {
log.warn("Hierarchy creation problem. No grouping with name {} found. Ignoring hierarchy relation.", u.getGroupingPath().getLastComponent());
log.warn("Hierarchy creation problem. No grouping with name {} found. Ignoring hierarchy relation.", u.getSourceGrouping().getPath().getLastComponent());
} else {
node.addParent(parent);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,12 @@

package com.mrv.yangtools.codegen.impl;

import org.opendaylight.yangtools.yang.common.QName;
import java.util.Optional;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;

import java.net.URI;
import java.util.Set;

/**
*
* @author bartosz.michalik@amartus.com
Expand All @@ -29,19 +27,13 @@ public class ModuleUtils {
public ModuleUtils(SchemaContext ctx) {
this.ctx = ctx;
}
public String toModuleName(QName qname) {
Set<Module> modules = ctx.findModuleByNamespace(qname.getModule().getNamespace());
if(modules.size() != 1) throw new IllegalStateException("no support for " + modules.size() + " modules with name " + qname);
return modules.iterator().next().getName();
}

public String toModuleName(URI uri) {
Set<Module> modules = ctx.findModuleByNamespace(uri);
if(modules.size() != 1) throw new IllegalStateException("no support for " + modules.size() + " modules with uri " + uri);
return modules.iterator().next().getName();
public String toModuleName(QNameModule qname) {
Optional<Module> modules = ctx.findModule(qname);
if(modules.isEmpty()) throw new IllegalStateException("no support for " + qname + " modules with name " + qname);
return modules.get().getName();
}

public String toModuleName(SchemaNode node) {
return toModuleName(node.getQName());
return toModuleName(node.getPath().getLastComponent().getModule());
}
}
Loading

0 comments on commit 81daa36

Please sign in to comment.