use of com.github.victools.jsonschema.module.swagger2.Swagger2Module in project kestra by kestra-io.
the class JsonSchemaGenerator method build.
protected <T> void build(SchemaGeneratorConfigBuilder builder, Class<? extends T> cls) {
builder.with(new JacksonModule()).with(new JavaxValidationModule(JavaxValidationOption.NOT_NULLABLE_FIELD_IS_REQUIRED, JavaxValidationOption.INCLUDE_PATTERN_EXPRESSIONS)).with(new Swagger2Module()).with(Option.DEFINITIONS_FOR_ALL_OBJECTS).with(Option.DEFINITION_FOR_MAIN_SCHEMA).with(Option.PLAIN_DEFINITION_KEYS).with(Option.ALLOF_CLEANUP_AT_THE_END);
// default value
builder.forFields().withDefaultResolver(this::defaults);
// def name
builder.forTypesInGeneral().withDefinitionNamingStrategy(new DefaultSchemaDefinitionNamingStrategy() {
@Override
public String getDefinitionNameForKey(DefinitionKey key, SchemaGenerationContext context) {
TypeContext typeContext = context.getTypeContext();
ResolvedType type = key.getType();
return typeContext.getFullTypeDescription(type);
}
@Override
public String adjustNullableName(DefinitionKey key, String definitionName, SchemaGenerationContext context) {
return definitionName;
}
});
// inline some type
builder.forTypesInGeneral().withCustomDefinitionProvider(new CustomDefinitionProviderV2() {
@Override
public CustomDefinition provideCustomSchemaDefinition(ResolvedType javaType, SchemaGenerationContext context) {
if (javaType.isInstanceOf(Map.class) || javaType.isInstanceOf(Enum.class)) {
ObjectNode definition = context.createStandardDefinition(javaType, this);
return new CustomDefinition(definition, true);
} else if (javaType.isInstanceOf(Duration.class)) {
ObjectNode definitionReference = context.createDefinitionReference(context.getTypeContext().resolve(String.class)).put("format", "duration");
return new CustomDefinition(definitionReference, true);
} else {
return null;
}
}
});
// PluginProperty $dynamic && deprecated swagger properties
builder.forFields().withInstanceAttributeOverride((memberAttributes, member, context) -> {
PluginProperty pluginPropertyAnnotation = member.getAnnotation(PluginProperty.class);
if (pluginPropertyAnnotation != null) {
memberAttributes.put("$dynamic", pluginPropertyAnnotation.dynamic());
}
Schema schema = member.getAnnotation(Schema.class);
if (schema != null && schema.deprecated()) {
memberAttributes.put("$deprecated", true);
}
});
// Add Plugin annotation special docs
builder.forTypesInGeneral().withTypeAttributeOverride((collectedTypeAttributes, scope, context) -> {
Plugin pluginAnnotation = scope.getType().getErasedType().getAnnotation(Plugin.class);
if (pluginAnnotation != null) {
List<ObjectNode> examples = Arrays.stream(pluginAnnotation.examples()).map(example -> context.getGeneratorConfig().createObjectNode().put("full", example.full()).put("code", String.join("\n", example.code())).put("lang", example.lang()).put("title", example.title())).collect(Collectors.toList());
if (examples.size() > 0) {
collectedTypeAttributes.set("$examples", context.getGeneratorConfig().createArrayNode().addAll(examples));
}
}
});
// PluginProperty additionalProperties
builder.forFields().withAdditionalPropertiesResolver(target -> {
PluginProperty pluginPropertyAnnotation = target.getAnnotation(PluginProperty.class);
if (pluginPropertyAnnotation != null) {
return pluginPropertyAnnotation.additionalProperties();
}
return Object.class;
});
}
Aggregations