diff --git a/cli/src/main/java/com/mrv/yangtools/codegen/main/Main.java b/cli/src/main/java/com/mrv/yangtools/codegen/main/Main.java index 48072b2e..1894ad6f 100644 --- a/cli/src/main/java/com/mrv/yangtools/codegen/main/Main.java +++ b/cli/src/main/java/com/mrv/yangtools/codegen/main/Main.java @@ -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; @@ -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); } diff --git a/common/src/main/java/com/mrv/yangtools/common/SchemaBuilder.java b/common/src/main/java/com/mrv/yangtools/common/SchemaBuilder.java index e74cb967..70c82a8e 100644 --- a/common/src/main/java/com/mrv/yangtools/common/SchemaBuilder.java +++ b/common/src/main/java/com/mrv/yangtools/common/SchemaBuilder.java @@ -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; @@ -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 @@ -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 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(yangsStreams)); - return resolveSchemaContext; - } finally { - - yangsStreams.forEach(s -> { - try { - s.close(); - } catch (IOException e) { - //ignore - } - }); } + return reactor.buildEffective(); } } diff --git a/swagger-generator/pom.xml b/swagger-generator/pom.xml index ad8e7485..f8773daf 100644 --- a/swagger-generator/pom.xml +++ b/swagger-generator/pom.xml @@ -62,6 +62,12 @@ test + + org.opendaylight.yangtools + yang-data-util + ${yangtools.version} + + junit junit diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/IoCSwaggerGenerator.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/IoCSwaggerGenerator.java index 29cda5d7..60f3e274 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/IoCSwaggerGenerator.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/IoCSwaggerGenerator.java @@ -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; @@ -122,7 +122,7 @@ public IoCSwaggerGenerator(@Assisted SchemaContext ctx, @Assisted Set 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); @@ -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); diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/SwaggerGenerator.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/SwaggerGenerator.java index 6e7d8481..d356b7d6 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/SwaggerGenerator.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/SwaggerGenerator.java @@ -52,7 +52,7 @@ public class SwaggerGenerator { private static final Logger log = LoggerFactory.getLogger(SwaggerGenerator.class); private final SchemaContext ctx; - private final Set modules; + private final Collection modules; private final Swagger target; private final Set moduleNames; private final ModuleUtils moduleUtils; @@ -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 modulesToGenerate) { + public SwaggerGenerator(SchemaContext ctx, Collection modulesToGenerate) { Objects.requireNonNull(ctx); Objects.requireNonNull(modulesToGenerate); @@ -111,7 +111,7 @@ public SwaggerGenerator(SchemaContext ctx, Set { 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); diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/AbstractDataObjectBuilder.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/AbstractDataObjectBuilder.java index 4b1f23e3..09f4cb83 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/AbstractDataObjectBuilder.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/AbstractDataObjectBuilder.java @@ -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; @@ -48,9 +50,9 @@ public abstract class AbstractDataObjectBuilder implements DataObjectBuilder { private final HashMap generatedEnums; private final HashMap orgNames; - protected final static Function> augmentations = node -> { + protected final static Function> augmentations = node -> { if(node instanceof AugmentationTarget) { - Set res = ((AugmentationTarget) node).getAvailableAugmentations(); + Collection res = ((AugmentationTarget) node).getAvailableAugmentations(); if(res != null) return res; } return Collections.emptySet(); @@ -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 cache) { + protected void processNode(T container, String proposedName, Set cache) { if(container == null) return; String name = generateName(container, null, cache); names.put(container, name); @@ -127,7 +129,7 @@ protected DataNodeContainer original(DataNodeContainer node) { DataNodeContainer tmp = node; do { if(tmp instanceof DerivableSchemaNode) { - com.google.common.base.Optional original = ((DerivableSchemaNode) tmp).getOriginal(); + Optional original = ((DerivableSchemaNode) tmp).getOriginal(); tmp = null; if(original.isPresent() && original.get() instanceof DataNodeContainer) { result = (DataNodeContainer) original.get(); @@ -165,7 +167,7 @@ protected String generateName(SchemaNode node, String proposedName, Set } } - String modulePrefix = nameToPackageSegment(moduleUtils.toModuleName(node.getQName())); + String modulePrefix = nameToPackageSegment(moduleUtils.toModuleName(node.getQName().getModule())); if(proposedName != null) { return modulePrefix + "." + getClassName(proposedName); } @@ -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; } @@ -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(); } @@ -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 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(); @@ -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; @@ -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 { diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/DataNodeIterable.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/DataNodeIterable.java index 10e7e061..9522ae4a 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/DataNodeIterable.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/DataNodeIterable.java @@ -55,7 +55,7 @@ private void traverse(final DataNodeContainer dataNode) { return; } - final Iterable childNodes = dataNode.getChildNodes(); + final Collection childNodes = dataNode.getChildNodes(); if (childNodes != null) { for (DataSchemaNode childNode : childNodes) { @@ -69,10 +69,10 @@ private void traverse(final DataNodeContainer dataNode) { traverse(containerNode); } else if (childNode instanceof ChoiceSchemaNode) { final ChoiceSchemaNode choiceNode = (ChoiceSchemaNode) childNode; - final Set cases = choiceNode.getCases(); + final Collection 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); } @@ -84,7 +84,7 @@ private void traverse(final DataNodeContainer dataNode) { } private void traverseGroupings(final DataNodeContainer dataNode) { - final Set groupings = dataNode.getGroupings(); + final Collection groupings = dataNode.getGroupings(); if (groupings != null) { groupings.forEach(n -> { allChildren.add(n); traverse(n); }); } diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/GroupingHierarchyHandler.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/GroupingHierarchyHandler.java index 35007ef5..366765ea 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/GroupingHierarchyHandler.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/GroupingHierarchyHandler.java @@ -62,7 +62,7 @@ private Map 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)); } @@ -73,9 +73,9 @@ private Map 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); } diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/ModuleUtils.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/ModuleUtils.java index ac2e5c31..08e5c572 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/ModuleUtils.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/ModuleUtils.java @@ -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 @@ -29,19 +27,13 @@ public class ModuleUtils { public ModuleUtils(SchemaContext ctx) { this.ctx = ctx; } - public String toModuleName(QName qname) { - Set 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 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 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()); } } diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/OptimizingDataObjectBuilder.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/OptimizingDataObjectBuilder.java index a777f2e5..15c234ab 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/OptimizingDataObjectBuilder.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/OptimizingDataObjectBuilder.java @@ -17,15 +17,13 @@ import io.swagger.models.properties.Property; import io.swagger.models.properties.RefProperty; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.*; import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.GroupingEffectiveStatementImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.net.URI; import java.util.*; -import java.util.Objects; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -59,7 +57,7 @@ public OptimizingDataObjectBuilder(SchemaContext ctx, Swagger swagger, TypeConve groupingHierarchyHandler = new GroupingHierarchyHandler(ctx); effectiveNode = new LinkedList<>(); - Set allModules = ctx.getModules(); + Collection allModules = ctx.getModules(); HashSet names = new HashSet<>(); allModules.forEach(m -> processGroupings(m, names)); } @@ -106,14 +104,14 @@ private T getEffectiveChild(QName nam private Stream groupings(DataNodeContainer node) { Set uses = uses(node); //noinspection SuspiciousMethodCalls - return uses.stream().map(u -> groupings.get(u.getGroupingPath())); + return uses.stream().map(u -> groupings.get(u.getSourceGrouping().getPath())); } private GroupingDefinition grouping(DataNodeContainer node) { Set uses = uses(node); assert uses.size() == 1; //noinspection SuspiciousMethodCalls - return groupings.get(uses.iterator().next().getGroupingPath()); + return groupings.get(uses.iterator().next().getSourceGrouping().getPath()); } /** @@ -166,8 +164,8 @@ protected void processGroupings(DataNodeContainer container, Set cache) if(names.values().contains(gName)) { //no type compatibility check at the moment thus this piece of code is prone to changes in parser - boolean differentDeclaration = groupings.values().stream().map(g -> ((GroupingEffectiveStatementImpl) g).getDeclared()) - .noneMatch(g -> g.equals(((GroupingEffectiveStatementImpl) n).getDeclared())); + boolean differentDeclaration = groupings.values().stream().map(g -> g.asEffectiveStatement().getDeclared()) + .noneMatch(g -> g.equals(n.asEffectiveStatement().getDeclared())); if(differentDeclaration) { gName = "G" + gName; } @@ -268,7 +266,7 @@ private Model fromContainer(DataNodeContainer c) { return simpleModel ? simple(toModel) : composed(toModel); } - private Model fromAugmentation(AugmentationSchema augmentation) { + private Model fromAugmentation(AugmentationSchemaNode augmentation) { Model model = fromContainer(augmentation); final Model toCheck = model; @@ -285,10 +283,10 @@ private Model fromAugmentation(AugmentationSchema augmentation) { HashMap properties = new HashMap<>(); - if(augmentation instanceof NamespaceRevisionAware) { - URI uri = ((NamespaceRevisionAware) augmentation).getNamespace(); - properties.put("namespace", uri.toString()); - properties.put("prefix", moduleUtils.toModuleName(uri)); + if(augmentation instanceof QNameModuleAware) { + QNameModule module = ((QNameModuleAware) augmentation).getQNameModule(); + properties.put("namespace", module.getNamespace().toString()); + properties.put("prefix", moduleUtils.toModuleName(module)); model.getVendorExtensions().put("x-augmentation", properties); } @@ -414,10 +412,10 @@ private Set uses(DataNodeContainer toModel) { private Set optimizeInheritance(Set result) { return result.stream().filter(r -> { - SchemaPath rName = r.getGroupingPath(); + SchemaPath rName = r.getSourceGrouping().getPath(); return result.stream().filter(o -> ! o.equals(r)) - .noneMatch(o -> groupingHierarchyHandler.isParent(rName, o.getGroupingPath().getLastComponent())); + .noneMatch(o -> groupingHierarchyHandler.isParent(rName, o.getSourceGrouping().getPath().getLastComponent())); }).collect(Collectors.toSet()); } @@ -478,7 +476,7 @@ private Model composed(DataNodeContainer node) { final List models = new LinkedList<>(); uses(node).forEach(u -> { - GroupingDefinition grouping = groupings.get(u.getGroupingPath()); + GroupingDefinition grouping = groupings.get(u.getSourceGrouping().getPath()); GroupingInfo info = traverse(grouping); info.models.forEach(def -> { String groupingIdx = getDefinitionId(def); diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/RpcContainerSchemaNode.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/RpcContainerSchemaNode.java deleted file mode 100644 index a20c31b2..00000000 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/RpcContainerSchemaNode.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.mrv.yangtools.codegen.impl; - -import java.util.Collection; -import java.util.List; -import java.util.Set; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.util.EmptyConstraintDefinition; -import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; -import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.opendaylight.yangtools.yang.model.api.Status; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; -import org.opendaylight.yangtools.yang.model.api.UsesNode; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; - -public class RpcContainerSchemaNode implements ContainerSchemaNode { - - private final RpcDefinition rpcDefinition; - - public RpcContainerSchemaNode(final RpcDefinition rpcDefinition) { - this.rpcDefinition = rpcDefinition; - } - - @Override - public Set getGroupings() { - return rpcDefinition.getGroupings(); - } - - @Override - public Set> getTypeDefinitions() { - return rpcDefinition.getTypeDefinitions(); - } - - @Override - public Set getAvailableAugmentations() { - return ImmutableSet.of(); - } - - @Override - public Collection getChildNodes() { - final ContainerSchemaNode output = rpcDefinition.getOutput(); - if (output == null) { - return ImmutableList.of(); - } else { - return ImmutableList.of(output); - } - } - - @Override - public DataSchemaNode getDataChildByName(QName name) { - switch (name.getLocalName()) { - case "input": - return rpcDefinition.getInput(); - case "output": - return rpcDefinition.getOutput(); - default: - return null; - } - } - - @Override - public boolean isAddedByUses() { - return rpcDefinition.getOutput().isAddedByUses(); - } - - @Override - public boolean isPresenceContainer() { - return false; - } - - @Override - public Set getUses() { - return ImmutableSet.of(); - } - - @Override - public boolean isAugmenting() { - return false; - } - - @Override - public boolean isConfiguration() { - return false; - } - - @Override - public ConstraintDefinition getConstraints() { - return EmptyConstraintDefinition.create(false); - } - - @Nonnull - @Override - public QName getQName() { - return rpcDefinition.getQName(); - } - - @Nonnull - @Override - public SchemaPath getPath() { - return rpcDefinition.getPath(); - } - - @Nullable - @Override - public String getDescription() { - return rpcDefinition.getDescription(); - } - - @Nullable - @Override - public String getReference() { - return rpcDefinition.getReference(); - } - - @Nonnull - @Override - public Status getStatus() { - return rpcDefinition.getStatus(); - } - - @Nonnull - @Override - public List getUnknownSchemaNodes() { - return ImmutableList.of(); - } - - @Override - public boolean equals(Object obj) { - if(obj == null) return false; - if(obj instanceof RpcContainerSchemaNode) - return ((RpcContainerSchemaNode)obj).rpcDefinition == this.rpcDefinition; - else - return false; - } - - @Override - public int hashCode() { - return this.rpcDefinition.hashCode(); - } -} diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/TypeConverter.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/TypeConverter.java index 48e6d90d..430cfa2e 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/TypeConverter.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/TypeConverter.java @@ -18,7 +18,6 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.*; import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; -import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,10 +57,10 @@ public Property convert(TypeDefinition type, SchemaNode parent) { return new BooleanProperty(); } - if(baseType instanceof IntegerTypeDefinition || baseType instanceof UnsignedIntegerTypeDefinition) { + if(baseType instanceof RangeRestrictedTypeDefinition) { //TODO [bmi] how to map int8 type ??? BaseIntegerProperty integer = new IntegerProperty(); - if (BaseTypes.isInt64(baseType) || BaseTypes.isUint32(baseType)) { + if (baseType instanceof Int64TypeDefinition || baseType instanceof Uint32TypeDefinition) { integer = new LongProperty(); } return integer; diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/AbstractPathHandler.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/AbstractPathHandler.java index 7425ec28..5e3a228d 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/AbstractPathHandler.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/AbstractPathHandler.java @@ -1,14 +1,16 @@ package com.mrv.yangtools.codegen.impl.path; import com.mrv.yangtools.codegen.*; -import com.mrv.yangtools.codegen.impl.RpcContainerSchemaNode; import io.swagger.models.*; import io.swagger.models.parameters.BodyParameter; import io.swagger.models.properties.RefProperty; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.data.util.ContainerSchemaNodes; +import org.opendaylight.yangtools.yang.model.api.ContainerLike; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.InputSchemaNode; +import org.opendaylight.yangtools.yang.model.api.OutputSchemaNode; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -49,9 +51,9 @@ public PathHandler useModuleName(boolean use) { @Override public void path(RpcDefinition rpc, PathSegment pathCtx) { - ContainerSchemaNode input = rpc.getInput(); - ContainerSchemaNode output = rpc.getOutput(); - ContainerSchemaNode root = new RpcContainerSchemaNode(rpc); + InputSchemaNode input = rpc.getInput(); + OutputSchemaNode output = rpc.getOutput(); + ContainerLike root = ContainerSchemaNodes.forRPC(rpc); input = input.getChildNodes().isEmpty() ? null : input; output = output.getChildNodes().isEmpty() ? null : output; @@ -72,23 +74,18 @@ public void path(RpcDefinition rpc, PathSegment pathCtx) { post.parameter(new BodyParameter() .name(dataObjectBuilder.getName(input) + ".body-param") .schema(inputModel) - .description(input.getDescription()) + .description(input.getDescription().orElse("")) ); } if(output != null) { - String description = output.getDescription(); - if(description == null) { - description = "Correct response"; - } - RefProperty refProperty = new RefProperty(); refProperty.set$ref(dataObjectBuilder.getDefinitionId(root)); dataObjectBuilder.addModel(root); post.response(200, new Response() .schema(refProperty) - .description(description)); + .description(output.getDescription().orElse("Correct response"))); } post.response(201, new Response().description("No response")); //no output body swagger.path(operations + printer.path(), new Path().post(post)); diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/DeleteOperationGenerator.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/DeleteOperationGenerator.java index 6a5dd9c3..246227e6 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/DeleteOperationGenerator.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/DeleteOperationGenerator.java @@ -30,8 +30,7 @@ public DeleteOperationGenerator(PathSegment path, DataObjectRepo repo) { public Operation execute(DataSchemaNode node) { final Operation delete = defaultOperation(); delete.summary("removes " + getName(node)); - String description = node.getDescription() == null ? "removes " + getName(node) : - node.getDescription(); + String description = node.getDescription().orElse("removes " + getName(node)); delete.description(description); delete.response(204, new Response().description("Object deleted")); return delete; diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/GetOperationGenerator.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/GetOperationGenerator.java index a9b9d146..ff9eee0f 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/GetOperationGenerator.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/GetOperationGenerator.java @@ -31,8 +31,7 @@ public GetOperationGenerator(PathSegment path, DataObjectRepo repo) { public Operation execute(DataSchemaNode node) { final Operation get = defaultOperation(); get.summary("returns " + getName(node)); - String description = node.getDescription() == null ? "returns " + getName(node) : - node.getDescription(); + String description = node.getDescription().orElse("returns " + getName(node)); get.description(description); get.response(200, new Response() .schema(new RefProperty(getDefinitionId(node))) diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PatchOperationGenerator.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PatchOperationGenerator.java index c15b1a2c..d7692d72 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PatchOperationGenerator.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PatchOperationGenerator.java @@ -22,8 +22,7 @@ public Operation execute(DataSchemaNode node) { final Operation patch = defaultOperation(); final RefModel definition = new RefModel(getDefinitionId(node)); patch.summary("patches " + getName(node)); - String description = node.getDescription() == null ? "patches " + getName(node) : - node.getDescription(); + String description = node.getDescription().orElse("patches " + getName(node)); patch.description(description); patch.parameter(new BodyParameter() .name(getName(node) + ".body-param") diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PostOperationGenerator.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PostOperationGenerator.java index 9fee9b7a..415a8d4b 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PostOperationGenerator.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PostOperationGenerator.java @@ -36,8 +36,7 @@ public Operation execute(DataSchemaNode node) { final Operation post = dropLastSegmentParameters ? listOperation() : defaultOperation(); final RefModel definition = new RefModel(getDefinitionId(node)); post.summary("creates " + getName(node)); - String description = node.getDescription() == null ? "creates " + getName(node) : - node.getDescription(); + String description = node.getDescription().orElse("creates " + getName(node)); post.description(description); post.parameter(new BodyParameter() .name(getName(node) + ".body-param") diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PutOperationGenerator.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PutOperationGenerator.java index e96350bf..9cd53508 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PutOperationGenerator.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/impl/path/PutOperationGenerator.java @@ -33,8 +33,7 @@ public Operation execute(DataSchemaNode node) { final Operation put = defaultOperation(); final RefModel definition = new RefModel(getDefinitionId(node)); put.summary("creates or updates " + getName(node)); - String description = node.getDescription() == null ? "creates or updates " + getName(node) : - node.getDescription(); + String description = node.getDescription().orElse("creates or updates " + getName(node)); put.description(description); put.parameter(new BodyParameter() .name(getName(node) + ".body-param") diff --git a/swagger-generator/src/test/java/com/mrv/yangtools/codegen/DataObjectsBuilderTest.java b/swagger-generator/src/test/java/com/mrv/yangtools/codegen/DataObjectsBuilderTest.java index f5d808f9..8462a5b7 100644 --- a/swagger-generator/src/test/java/com/mrv/yangtools/codegen/DataObjectsBuilderTest.java +++ b/swagger-generator/src/test/java/com/mrv/yangtools/codegen/DataObjectsBuilderTest.java @@ -21,11 +21,11 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; +import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; 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 org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ListEffectiveStatementImpl; import java.util.Collections; import java.util.HashSet; @@ -61,7 +61,7 @@ public void testAddModelGroupings() throws Exception { SchemaNode c1 = DataNodeHelper.stream(groupings).filter(n -> n.getQName().getLocalName().equals("c1")).findFirst().orElseThrow(IllegalArgumentException::new); //when builder.processModule(groupings); - builder.addModel((ListEffectiveStatementImpl) c1); + builder.addModel((ListSchemaNode) c1); //then verify(swagger).addDefinition(eq("with.groupings.groupingroot.C1"), any(Model.class)); } diff --git a/swagger-generator/src/test/java/com/mrv/yangtools/test/utils/MockNodeBuilder.java b/swagger-generator/src/test/java/com/mrv/yangtools/test/utils/MockNodeBuilder.java index d92bd072..fb4403e0 100644 --- a/swagger-generator/src/test/java/com/mrv/yangtools/test/utils/MockNodeBuilder.java +++ b/swagger-generator/src/test/java/com/mrv/yangtools/test/utils/MockNodeBuilder.java @@ -11,8 +11,11 @@ package com.mrv.yangtools.test.utils; +import java.util.List; +import org.joda.time.LocalDate; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; @@ -21,7 +24,6 @@ import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Date; import static org.mockito.Mockito.*; @@ -32,11 +34,11 @@ public class MockNodeBuilder { private final QNameModule module; - private final ArrayList params; - private ArrayList names; + private final List params; + private List names; public MockNodeBuilder(String module) { - this.module = QNameModule.create(Paths.get("test", module).toUri(), new Date()); + this.module = QNameModule.create(Paths.get("test", module).toUri(), Revision.of(new LocalDate().toString())); this.params = new ArrayList<>(); this.names = new ArrayList<>(); } @@ -44,7 +46,7 @@ public MockNodeBuilder(String module) { @SuppressWarnings("unchecked") public MockNodeBuilder param(String name) { - LeafListSchemaNode leaf = mock(LeafListSchemaNode.class); + final LeafListSchemaNode leaf = mock(LeafListSchemaNode.class); QName qname = QName.create(module, name); when(leaf.getQName()).thenReturn(qname); @@ -58,8 +60,8 @@ public MockNodeBuilder param(String name) { public ListSchemaNode build() { ListSchemaNode result = mock(ListSchemaNode.class); - when(result.getKeyDefinition()).thenReturn(names); - when(result.getChildNodes()).thenReturn(params); + doReturn(names).when(result).getKeyDefinition(); + doReturn(params).when(result).getChildNodes(); return result; } diff --git a/swagger-generator/src/test/resources/with-groupings.yang b/swagger-generator/src/test/resources/with-groupings.yang index 2cd88a5a..922ccb37 100644 --- a/swagger-generator/src/test/resources/with-groupings.yang +++ b/swagger-generator/src/test/resources/with-groupings.yang @@ -48,7 +48,7 @@ module with-groupings { } container grouping-root { - grouping g1 { + grouping g3 { leaf g1-l2 { type string; } diff --git a/swagger-maven-plugin/src/main/java/com/mrv/yangtools/maven/gen/swagger/MavenSwaggerGenerator.java b/swagger-maven-plugin/src/main/java/com/mrv/yangtools/maven/gen/swagger/MavenSwaggerGenerator.java index b4e2c302..de36acc9 100644 --- a/swagger-maven-plugin/src/main/java/com/mrv/yangtools/maven/gen/swagger/MavenSwaggerGenerator.java +++ b/swagger-maven-plugin/src/main/java/com/mrv/yangtools/maven/gen/swagger/MavenSwaggerGenerator.java @@ -12,18 +12,18 @@ package com.mrv.yangtools.maven.gen.swagger; import com.google.common.base.Preconditions; -import com.mrv.yangtools.codegen.PathHandlerBuilder; import com.mrv.yangtools.codegen.SwaggerGenerator; import com.mrv.yangtools.codegen.impl.path.AbstractPathHandlerBuilder; import com.mrv.yangtools.codegen.impl.path.SegmentTagGenerator; import com.mrv.yangtools.codegen.impl.path.odl.ODLPathHandlerBuilder; import org.apache.maven.project.MavenProject; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang2sources.spi.BasicCodeGenerator; import org.opendaylight.yangtools.yang2sources.spi.BuildContextAware; import org.opendaylight.yangtools.yang2sources.spi.MavenProjectAware; +import org.opendaylight.yangtools.yang2sources.spi.ModuleResourceResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,7 +57,8 @@ public class MavenSwaggerGenerator implements BasicCodeGenerator, BuildContextAw private File resourceBaseDir; @Override - public Collection generateSources(SchemaContext schemaContext, File outputDir, Set modules) throws IOException { + public Collection generateSources(EffectiveModelContext schemaContext, File outputDir, Set modules, + final ModuleResourceResolver moduleResourcePathResolver) throws IOException { final File outputBaseDir = outputDir == null ? getDefaultOutputBaseDir() : outputDir; if(! outputBaseDir.exists()) {