Skip to content

Commit 252bc6c

Browse files
authored
Merge pull request #638 from bci-oss/635-Allow-Customization-of-Error-Responses-in-OpenAPI-Generator
Allow customization of error responses in open api generator
2 parents c7b2e4c + 2d3c17f commit 252bc6c

File tree

4 files changed

+58
-20
lines changed

4 files changed

+58
-20
lines changed

core/esmf-aspect-model-document-generators/src/main/java/org/eclipse/esmf/aspectmodel/generator/openapi/AspectModelOpenApiGenerator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,8 @@ private static ObjectNode mergeObjectNode( final ObjectNode node, final ObjectNo
617617
node.set( key, mergeObjectNode( (ObjectNode) resultValue, (ObjectNode) value ) );
618618
} else if ( resultValue.isArray() && value.isArray() ) {
619619
node.set( key, mergeArrayNode( (ArrayNode) resultValue, (ArrayNode) value ) );
620+
} else {
621+
node.set( key, value );
620622
}
621623
} else {
622624
node.set( key, value );

core/esmf-aspect-model-document-generators/src/main/java/org/eclipse/esmf/aspectmodel/generator/openapi/OpenApiSchemaGenerationConfig.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import static org.eclipse.esmf.aspectmodel.generator.openapi.AspectModelOpenApiGenerator.ObjectNodeExtension.getter;
1717

1818
import java.util.Locale;
19-
import java.util.Optional;
2019

2120
import org.eclipse.esmf.aspectmodel.generator.GenerationConfig;
2221

@@ -67,21 +66,20 @@ public record OpenApiSchemaGenerationConfig(
6766
}
6867

6968
public ObjectNode queriesTemplate() {
70-
return Optional.ofNullable( template )
71-
.map( getter( "paths" ) )
72-
.map( getter( QUERIES_TEMPLATE_PATH ) )
73-
.orElse( null );
69+
if ( template == null ) {
70+
return null;
71+
}
72+
73+
final ObjectNode objectNode = getter( "paths" ).apply( template );
74+
return getter( QUERIES_TEMPLATE_PATH ).apply( objectNode );
7475
}
7576

7677
public ObjectNode documentTemplate() {
77-
return Optional.ofNullable( template )
78-
.map( ObjectNode::deepCopy )
79-
.map( doc -> {
80-
Optional.of( doc ).map( getter( "paths" ) ).ifPresent(
81-
paths -> paths.remove( QUERIES_TEMPLATE_PATH )
82-
);
83-
return doc;
84-
} )
85-
.orElse( null );
78+
if ( template == null ) {
79+
return null;
80+
}
81+
final ObjectNode objectNode = template.deepCopy();
82+
getter( "paths" ).apply( objectNode ).remove( QUERIES_TEMPLATE_PATH );
83+
return objectNode;
8684
}
8785
}

core/esmf-aspect-model-document-generators/src/test/java/org/eclipse/esmf/aspectmodel/generator/openapi/AspectModelOpenApiGeneratorTest.java

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,28 @@ void testValidParameter() throws IOException {
254254
} );
255255
}
256256

257+
@Test
258+
void testValidTemplate() throws IOException {
259+
final Aspect aspect = TestResources.load( TestAspect.ASPECT_WITHOUT_SEE_ATTRIBUTE ).aspect();
260+
final OpenApiSchemaGenerationConfig config = OpenApiSchemaGenerationConfigBuilder.builder()
261+
.useSemanticVersion( true )
262+
.baseUrl( TEST_BASE_URL )
263+
.resourcePath( TEST_RESOURCE_PATH )
264+
.template( getTemplateParameter() )
265+
.build();
266+
final JsonNode json = apiJsonGenerator.apply( aspect, config ).getContent();
267+
final SwaggerParseResult result = new OpenAPIParser().readContents( json.toString(), null, null );
268+
assertThat( result.getMessages() ).isEmpty();
269+
270+
final OpenAPI openApi = result.getOpenAPI();
271+
assertThat( openApi.getPaths().values().stream().findFirst().get().getGet().getResponses().get( "400" ).get$ref() )
272+
.isEqualTo( "./core-api.yaml#/components/responses/ClientError" );
273+
assertThat( openApi.getPaths().values().stream().findFirst().get().getGet().getResponses().get( "401" ).get$ref() )
274+
.isEqualTo( "./core-api.yaml#/components/responses/Unauthorized" );
275+
assertThat( openApi.getPaths().values().stream().findFirst().get().getGet().getResponses().get( "403" ).get$ref() )
276+
.isEqualTo( "./core-api.yaml#/components/responses/Forbidden" );
277+
}
278+
257279
@Test
258280
void testInValidParameterName() throws IOException {
259281
final ListAppender<ILoggingEvent> logAppender = new ListAppender<>();
@@ -495,11 +517,11 @@ void testAspectWithOperationWithSeeAttribute() {
495517
final SwaggerParseResult result = new OpenAPIParser().readContents( json.toString(), null, null );
496518
final OpenAPI openApi = result.getOpenAPI();
497519
assertThat(
498-
((Schema) openApi.getComponents().getSchemas().get( "testOperation" ).getAllOf()
499-
.get( 1 )).getProperties() ).doesNotContainKey(
520+
( (Schema) openApi.getComponents().getSchemas().get( "testOperation" ).getAllOf()
521+
.get( 1 ) ).getProperties() ).doesNotContainKey(
500522
"params" );
501-
assertThat( ((Schema) openApi.getComponents().getSchemas().get( "testOperationTwo" ).getAllOf()
502-
.get( 1 )).getProperties() ).doesNotContainKey( "params" );
523+
assertThat( ( (Schema) openApi.getComponents().getSchemas().get( "testOperationTwo" ).getAllOf()
524+
.get( 1 ) ).getProperties() ).doesNotContainKey( "params" );
503525
}
504526

505527
@Test
@@ -635,8 +657,8 @@ void testAspectWithCommentForSeeAttributes() {
635657
assertThat( openApi.getSpecVersion() ).isEqualTo( SpecVersion.V31 );
636658
assertThat( openApi.getComponents().getSchemas().get( "AspectWithCollection" ).get$comment() ).isEqualTo(
637659
"See: http://example.com/" );
638-
assertThat( ((Schema) openApi.getComponents().getSchemas().get( "AspectWithCollection" ).getProperties()
639-
.get( "testProperty" )).get$comment() )
660+
assertThat( ( (Schema) openApi.getComponents().getSchemas().get( "AspectWithCollection" ).getProperties()
661+
.get( "testProperty" ) ).get$comment() )
640662
.isEqualTo( "See: http://example.com/, http://example.com/me" );
641663
assertThat( openApi.getComponents().getSchemas().get( "TestCollection" ).get$comment() )
642664
.isEqualTo( "See: http://example.com/" );
@@ -766,4 +788,10 @@ private ObjectNode getTestParameter() throws IOException {
766788
final String inputString = IOUtils.toString( inputStream, StandardCharsets.UTF_8 );
767789
return (ObjectNode) OBJECT_MAPPER.readTree( inputString );
768790
}
791+
792+
private ObjectNode getTemplateParameter() throws IOException {
793+
final InputStream inputStream = getClass().getResourceAsStream( "/openapi/open-api-error-template.yaml" );
794+
final String inputString = IOUtils.toString( inputStream, StandardCharsets.UTF_8 );
795+
return (ObjectNode) new YAMLMapper().readTree( inputString );
796+
}
769797
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
paths:
2+
__DEFAULT_QUERIES_TEMPLATE__:
3+
get:
4+
responses:
5+
'400':
6+
$ref: "core-api.yaml#/components/responses/ClientError"
7+
'401':
8+
$ref: "core-api.yaml#/components/responses/Unauthorized"
9+
'403':
10+
$ref: "core-api.yaml#/components/responses/Forbidden"

0 commit comments

Comments
 (0)