Skip to content

Commit f9e82b4

Browse files
committed
Implement generation of $comment keywords for bamm:see attributes.
1 parent 058a733 commit f9e82b4

File tree

7 files changed

+154
-88
lines changed

7 files changed

+154
-88
lines changed

core/sds-aspect-model-document-generators/src/main/java/io/openmanufacturing/sds/aspectmodel/generator/jsonschema/AspectModelJsonSchemaGenerator.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* Copyright (c) 2021 Robert Bosch Manufacturing Solutions GmbH
33
*
44
* See the AUTHORS file(s) distributed with this work for additional
5-
* information regarding authorship.
5+
* information regarding authorship.
66
*
77
* This Source Code Form is subject to the terms of the Mozilla Public
88
* License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -13,23 +13,25 @@
1313

1414
package io.openmanufacturing.sds.aspectmodel.generator.jsonschema;
1515

16-
import com.fasterxml.jackson.databind.JsonNode;
17-
import io.openmanufacturing.sds.metamodel.Aspect;
1816
import java.util.Locale;
1917
import java.util.function.BiFunction;
2018

19+
import com.fasterxml.jackson.databind.JsonNode;
20+
21+
import io.openmanufacturing.sds.metamodel.Aspect;
22+
2123
/**
2224
* Generator that generates a JSON Schema for payloads corresponding to a given Aspect model.
2325
*/
2426
public class AspectModelJsonSchemaGenerator implements BiFunction<Aspect, Locale, JsonNode> {
2527
@Override
2628
public JsonNode apply( final Aspect aspect, final Locale locale ) {
27-
final AspectModelJsonSchemaVisitor visitor = new AspectModelJsonSchemaVisitor(true, locale);
29+
final AspectModelJsonSchemaVisitor visitor = new AspectModelJsonSchemaVisitor( true, locale );
2830
return visitor.visitAspect( aspect, null );
2931
}
3032

31-
public JsonNode applyForOpenApi( final Aspect aspect, final Locale locale ) {
32-
final AspectModelJsonSchemaVisitor visitor = new AspectModelJsonSchemaVisitor(false, locale);
33+
public JsonNode applyForOpenApi( final Aspect aspect, final Locale locale, final boolean generateCommentForSeeAttributes ) {
34+
final AspectModelJsonSchemaVisitor visitor = new AspectModelJsonSchemaVisitor( false, locale, generateCommentForSeeAttributes );
3335
return visitor.visitAspectForOpenApi( aspect );
3436
}
3537
}

core/sds-aspect-model-document-generators/src/main/java/io/openmanufacturing/sds/aspectmodel/generator/jsonschema/AspectModelJsonSchemaVisitor.java

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313

1414
package io.openmanufacturing.sds.aspectmodel.generator.jsonschema;
1515

16-
import com.google.common.base.Strings;
17-
import io.openmanufacturing.sds.metamodel.NamedElement;
1816
import java.math.BigDecimal;
1917
import java.util.HashMap;
2018
import java.util.LinkedList;
@@ -34,36 +32,38 @@
3432
import com.fasterxml.jackson.databind.node.NumericNode;
3533
import com.fasterxml.jackson.databind.node.ObjectNode;
3634
import com.fasterxml.jackson.databind.node.TextNode;
35+
import com.google.common.base.Strings;
3736
import com.google.common.collect.ImmutableMap;
3837

3938
import io.openmanufacturing.sds.aspectmetamodel.KnownVersion;
4039
import io.openmanufacturing.sds.aspectmodel.generator.DocumentGenerationException;
4140
import io.openmanufacturing.sds.aspectmodel.resolver.services.BammDataType;
4241
import io.openmanufacturing.sds.aspectmodel.urn.AspectModelUrn;
4342
import io.openmanufacturing.sds.aspectmodel.vocabulary.BAMM;
43+
import io.openmanufacturing.sds.characteristic.Collection;
44+
import io.openmanufacturing.sds.characteristic.Either;
45+
import io.openmanufacturing.sds.characteristic.Enumeration;
46+
import io.openmanufacturing.sds.characteristic.Set;
47+
import io.openmanufacturing.sds.characteristic.SingleEntity;
48+
import io.openmanufacturing.sds.characteristic.SortedSet;
49+
import io.openmanufacturing.sds.characteristic.Trait;
50+
import io.openmanufacturing.sds.constraint.LengthConstraint;
51+
import io.openmanufacturing.sds.constraint.RangeConstraint;
52+
import io.openmanufacturing.sds.constraint.RegularExpressionConstraint;
4453
import io.openmanufacturing.sds.metamodel.AbstractEntity;
4554
import io.openmanufacturing.sds.metamodel.Aspect;
46-
import io.openmanufacturing.sds.metamodel.ModelElement;
4755
import io.openmanufacturing.sds.metamodel.Characteristic;
48-
import io.openmanufacturing.sds.characteristic.Collection;
4956
import io.openmanufacturing.sds.metamodel.CollectionValue;
5057
import io.openmanufacturing.sds.metamodel.ComplexType;
5158
import io.openmanufacturing.sds.metamodel.Constraint;
52-
import io.openmanufacturing.sds.characteristic.Either;
5359
import io.openmanufacturing.sds.metamodel.Entity;
5460
import io.openmanufacturing.sds.metamodel.EntityInstance;
55-
import io.openmanufacturing.sds.characteristic.Enumeration;
5661
import io.openmanufacturing.sds.metamodel.HasProperties;
57-
import io.openmanufacturing.sds.constraint.LengthConstraint;
62+
import io.openmanufacturing.sds.metamodel.ModelElement;
63+
import io.openmanufacturing.sds.metamodel.NamedElement;
5864
import io.openmanufacturing.sds.metamodel.Property;
59-
import io.openmanufacturing.sds.constraint.RangeConstraint;
60-
import io.openmanufacturing.sds.constraint.RegularExpressionConstraint;
6165
import io.openmanufacturing.sds.metamodel.Scalar;
6266
import io.openmanufacturing.sds.metamodel.ScalarValue;
63-
import io.openmanufacturing.sds.characteristic.Set;
64-
import io.openmanufacturing.sds.characteristic.SingleEntity;
65-
import io.openmanufacturing.sds.characteristic.SortedSet;
66-
import io.openmanufacturing.sds.characteristic.Trait;
6767
import io.openmanufacturing.sds.metamodel.Type;
6868
import io.openmanufacturing.sds.metamodel.Value;
6969
import io.openmanufacturing.sds.metamodel.datatypes.LangString;
@@ -192,18 +192,25 @@ private JsonNode toJsonNode() {
192192
private final ObjectNode rootNode = factory.objectNode();
193193
private final Map<ModelElement, JsonNode> hasVisited = new HashMap<>();
194194

195+
private final boolean generateCommentForSeeAttributes;
196+
195197
public AspectModelJsonSchemaVisitor( final boolean useExtendedTypes, final Locale locale ) {
198+
this( useExtendedTypes, locale, false );
199+
}
200+
201+
public AspectModelJsonSchemaVisitor( final boolean useExtendedTypes ) {
202+
this( useExtendedTypes, Locale.ENGLISH );
203+
}
204+
205+
public AspectModelJsonSchemaVisitor( final boolean useExtendedTypes, final Locale locale, final boolean generateCommentForSeeAttributes ) {
196206
if ( useExtendedTypes ) {
197207
typeData = extendedTypeData;
198208
} else {
199209
typeData = openApiTypeData;
200210
}
201211

202212
this.locale = locale;
203-
}
204-
205-
public AspectModelJsonSchemaVisitor( final boolean useExtendedTypes ) {
206-
this( useExtendedTypes, Locale.ENGLISH );
213+
this.generateCommentForSeeAttributes = generateCommentForSeeAttributes;
207214
}
208215

209216
public ObjectNode getRootNode() {
@@ -420,7 +427,7 @@ public JsonNode visitEither( final Either either, final ObjectNode context ) {
420427
properties.set( "left", either.getLeft().accept( this, properties ) );
421428
properties.set( "right", either.getRight().accept( this, properties ) );
422429

423-
return addDescription( factory.objectNode(), either , locale)
430+
return addDescription( factory.objectNode(), either, locale )
424431
.put( "additionalProperties", false )
425432
.<ObjectNode> set( "properties", properties )
426433
.set( "oneOf",
@@ -431,11 +438,11 @@ public JsonNode visitEither( final Either either, final ObjectNode context ) {
431438

432439
@Override
433440
public JsonNode visitCharacteristic( final Characteristic characteristic,
434-
final ObjectNode context ) {
441+
final ObjectNode context ) {
435442
final JsonNode dataTypeNode = characteristic.getDataType().map( type -> type.accept( this, context ) )
436443
.orElseThrow( () -> new DocumentGenerationException( "Characteristic " + characteristic + " is missing a dataType" ) );
437444

438-
return addDescription( ( ObjectNode ) dataTypeNode, characteristic, locale );
445+
return addDescription( (ObjectNode) dataTypeNode, characteristic, locale );
439446
}
440447

441448
private void setNodeInRootSchema( final JsonNode node, final String name ) {
@@ -584,7 +591,7 @@ private JsonNode createNodeForEnumEntityInstance( final EntityInstance entityIns
584591
final ObjectNode enumEntityInstanceNode = factory.objectNode();
585592
final ArrayNode required = factory.arrayNode();
586593
final ObjectNode properties = factory.objectNode();
587-
addDescription(enumEntityInstanceNode, entityInstance, locale);
594+
addDescription( enumEntityInstanceNode, entityInstance, locale );
588595
enumEntityInstanceNode.put( "type", "object" );
589596

590597
final Entity entity = entityInstance.getEntityType();
@@ -636,13 +643,20 @@ private JsonNode createNodeForEnumEntityPropertyInstance( final Property propert
636643
return propertyInstanceNode;
637644
}
638645

639-
private static ObjectNode addDescription( final ObjectNode node,
640-
final NamedElement describedElement, final Locale locale ) {
646+
private ObjectNode addDescription( final ObjectNode node, final NamedElement describedElement, final Locale locale ) {
641647
final String description = describedElement.getDescription( locale );
642648

643649
if ( !Strings.isNullOrEmpty( description ) ) {
644650
node.put( "description", description );
645651
}
652+
653+
if ( generateCommentForSeeAttributes ) {
654+
final String sees = String.join( ", ", describedElement.getSee() );
655+
if ( !Strings.isNullOrEmpty( sees ) ) {
656+
node.put( "$comment", "See: " + sees );
657+
}
658+
}
659+
646660
return node;
647661
}
648662
}

0 commit comments

Comments
 (0)