From 17857391f03fbe2790a86a85dcd93eef8b1622d2 Mon Sep 17 00:00:00 2001 From: bmichalik Date: Sat, 15 Sep 2018 17:56:34 +0200 Subject: [PATCH] Fix for #15 --- .../yangtools/codegen/DataObjectBuilder.java | 4 +-- .../impl/AbstractDataObjectBuilder.java | 26 +++------------- .../impl/OptimizingDataObjectBuilder.java | 30 ++++++++++++------- .../mrv/yangtools/codegen/AbstractItTest.java | 1 - .../SwaggerGeneratorAugmentationsTestIt.java | 20 ++++++------- 5 files changed, 36 insertions(+), 45 deletions(-) diff --git a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/DataObjectBuilder.java b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/DataObjectBuilder.java index 2c27be56..c9631690 100644 --- a/swagger-generator/src/main/java/com/mrv/yangtools/codegen/DataObjectBuilder.java +++ b/swagger-generator/src/main/java/com/mrv/yangtools/codegen/DataObjectBuilder.java @@ -45,6 +45,8 @@ public interface DataObjectBuilder extends DataObjectRepo { */ void addModel(T node); + void addModel(T node, String definitionId); + /** * Add model for enum * @param enumType enum to build swagger model from @@ -52,6 +54,4 @@ public interface DataObjectBuilder extends DataObjectRepo { */ String addModel(EnumTypeDefinition enumType); - - void addModel(T input, String parentTag); } 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 78b15038..5f33ceef 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 @@ -289,33 +289,15 @@ private static void assignCaseMetadata(Property property, ChoiceSchemaNode choic /** * Add model to referenced swagger for given node. All related models are added as well if needed. * @param node for which build a node - * @param tagName wrapping model name + * @param modelName model name * @param type of the node */ @Override - public void addModel(T node, String tagName) { + public void addModel(T node, String modelName) { Model model = build(node); - String modelName = getName(node); - - if(tagName != null) { - final ModelImpl wrapper = new ModelImpl(); - if(model instanceof ModelImpl) { - wrapper.addProperty(tagName, new ObjectProperty(model.getProperties())); - } - - if(model instanceof ComposedModel) { - String internal = modelName + Character.toUpperCase(tagName.charAt(0)) + tagName.substring(1).toLowerCase(); - swagger.addDefinition(internal, model); - wrapper.addProperty(tagName, new RefProperty(DEF_PREFIX + internal)); - } - - modelName = modelName + tagName.substring(0,1).toUpperCase() + tagName.substring(1); - - model = wrapper; - } if(swagger.getDefinitions() != null && swagger.getDefinitions().containsKey(modelName)) { if(model.equals(swagger.getDefinitions().get(modelName))) { @@ -327,11 +309,11 @@ public void addModel(T node, String t swagger.addDefinition(modelName, model); } - @Override public void addModel(T node) { - addModel(node, null); + addModel(node, getName(node)); } + @Override public String addModel(EnumTypeDefinition enumType) { QName qName = enumType.getQName(); 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 aef37487..4cd9dd11 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 @@ -129,7 +129,7 @@ private boolean isDirectGrouping(Data if(isAugmented.test(node)) return false; Set uses = uses(node); - return uses.size() == 1 && node.getChildNodes().stream().filter(n -> !n.isAddedByUses()).count() == 0; + return uses.size() == 1 && node.getChildNodes().stream().allMatch(DataSchemaNode::isAddedByUses); } @Override @@ -183,13 +183,17 @@ protected Property refOrStructure log.debug("reference to {}", definitionId); RefProperty prop = new RefProperty(definitionId); - if(treeAugmented && ! existingModels.containsKey(effectiveNode)) { - log.debug("adding referenced model {} for node {} ", definitionId, effectiveNode); - addModel(effectiveNode); + if(treeAugmented) { + if(! existingModels.containsKey(effectiveNode)) { + log.debug("adding referenced model {} for node {} ", definitionId, effectiveNode); + addModel(effectiveNode, getName(effectiveNode)); + } else { + return prop; + } } else if(existingModel(node) == null) { log.debug("adding referenced model {} for node {} ", definitionId, node); - addModel(node); + addModel(node, getName(node)); } return prop; @@ -338,12 +342,18 @@ private Model model(T node) { } augmented.setInterfaces(aModels); model = augmented; + //add to existing models cache only the augmeted model + existingModels.put(node, model); + } else { + //add to existing models cache mapping between original and used for generation + // e.g. to properly support case where model was based on grouping + existingModels.put(toModel, model); + existingModels.put(node, model); } verifyModel(node, model); - existingModels.put(toModel, model); - existingModels.put(node, model); + Optional toRemove = effectiveNode.stream().filter( n -> n instanceof SchemaNode && ((SchemaNode) n).getQName().equals(node.getQName())) @@ -392,8 +402,8 @@ private Set optimizeInheritance(Set result) { } @Override - public void addModel(T node) { - super.addModel(node); + public void addModel(T node, String name) { + super.addModel(node, name); } @@ -457,7 +467,7 @@ private Model composed(DataNodeContainer node) { if (existingModel(def) == null) { log.debug("adding model {} for grouping", groupingIdx); - addModel(def); + addModel(def, getName(def)); } models.add(refModel); }); diff --git a/swagger-generator/src/test/java/com/mrv/yangtools/codegen/AbstractItTest.java b/swagger-generator/src/test/java/com/mrv/yangtools/codegen/AbstractItTest.java index 4a1308b8..9c05dac4 100644 --- a/swagger-generator/src/test/java/com/mrv/yangtools/codegen/AbstractItTest.java +++ b/swagger-generator/src/test/java/com/mrv/yangtools/codegen/AbstractItTest.java @@ -7,7 +7,6 @@ import io.swagger.models.*; import io.swagger.models.parameters.BodyParameter; import io.swagger.models.parameters.Parameter; -import io.swagger.models.properties.ObjectProperty; import io.swagger.models.properties.Property; import io.swagger.models.properties.RefProperty; import org.junit.After; diff --git a/swagger-generator/src/test/java/com/mrv/yangtools/codegen/SwaggerGeneratorAugmentationsTestIt.java b/swagger-generator/src/test/java/com/mrv/yangtools/codegen/SwaggerGeneratorAugmentationsTestIt.java index 3903aef0..096899b0 100644 --- a/swagger-generator/src/test/java/com/mrv/yangtools/codegen/SwaggerGeneratorAugmentationsTestIt.java +++ b/swagger-generator/src/test/java/com/mrv/yangtools/codegen/SwaggerGeneratorAugmentationsTestIt.java @@ -1,12 +1,10 @@ package com.mrv.yangtools.codegen; -import com.mrv.yangtools.test.utils.SwaggerWritter; import io.swagger.models.*; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.RefProperty; -import java.io.OutputStreamWriter; import java.util.*; import java.util.function.Consumer; import java.util.function.Function; @@ -65,18 +63,20 @@ public void testAugGroupEx() { assertEquals("base.base.C2",c2.getSimpleRef()); } + @org.junit.Test public void testBug15() { swaggerFor(p -> p.getParent().getFileName().toString().equals("bug_15")); -// Model base = swagger.getDefinitions().get("base.Base"); -// RefProperty c1 = (RefProperty) base.getProperties().get("c1"); -// RefProperty c2 = (RefProperty) base.getProperties().get("c2"); -// -// -// assertEquals("base.Coll",c1.getSimpleRef()); -// assertEquals("base.base.C2",c2.getSimpleRef()); - SwaggerWritter.writeSwagger(new OutputStreamWriter(System.out), swagger); + Map attributeModels = swagger.getDefinitions().entrySet().stream() + .filter(e -> e.getKey().endsWith(".Attributes")) + .collect(Collectors.toMap(Map.Entry::getKey, e -> (ComposedModel) e.getValue())); + + assertEquals(2, attributeModels.size()); + ComposedModel regular = attributeModels.get("ext1.Attributes"); + ComposedModel augmented = attributeModels.get("ext1.job.Attributes"); + assertEquals(4, augmented.getAllOf().size()); + assertEquals(2, regular.getAllOf().size()); } @org.junit.Test