diff --git a/java-codegen/src/main/java/org/opensearch/client/codegen/model/SpecTransformer.java b/java-codegen/src/main/java/org/opensearch/client/codegen/model/SpecTransformer.java index 2a3b8ee993..575a955811 100644 --- a/java-codegen/src/main/java/org/opensearch/client/codegen/model/SpecTransformer.java +++ b/java-codegen/src/main/java/org/opensearch/client/codegen/model/SpecTransformer.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -42,7 +43,6 @@ import org.opensearch.client.codegen.openapi.OpenApiSchemaFormat; import org.opensearch.client.codegen.openapi.OpenApiSchemaType; import org.opensearch.client.codegen.openapi.OpenApiSpecification; -import org.opensearch.client.codegen.utils.Lists; import org.opensearch.client.codegen.utils.Versions; public class SpecTransformer { @@ -249,25 +249,33 @@ private Shape visit(Namespace parent, String className, String typedefName, Open var description = schema.getDescription().orElse(null); + var oneOf = schema.getOneOf(); + if (schema.isArray()) { shape = new ArrayShape(parent, className, mapType(schema), typedefName, description); visitedSchemas.putIfAbsent(schema, shape); - } else if (schema.isString() && schema.hasEnums()) { - var deprecatedEnums = schema.getDeprecatedEnums().orElseGet(Collections::emptySet); - shape = new EnumShape( - parent, - className, - Lists.map(schema.getEnums().orElseThrow(), v -> new EnumShape.Variant(v, deprecatedEnums.contains(v))), - typedefName, - description - ); + } else if (schema.isStringEnum() || (oneOf.isPresent() && oneOf.get().stream().allMatch(OpenApiSchema::isStringEnum))) { + var variants = new ArrayList(); + + if (oneOf.isPresent()) { + oneOf.get().forEach(s -> { + var isDeprecated = s.getVersionDeprecated().isPresent(); + s.getEnums().orElseThrow().forEach(v -> variants.add(new EnumShape.Variant(v, isDeprecated))); + }); + } else { + schema.getEnums().orElseThrow().forEach(v -> variants.add(new EnumShape.Variant(v, false))); + } + + variants.sort(Comparator.comparing(EnumShape.Variant::getName)); + + shape = new EnumShape(parent, className, variants, typedefName, description); visitedSchemas.putIfAbsent(schema, shape); - } else if (schema.hasOneOf()) { + } else if (oneOf.isPresent()) { var taggedUnion = new TaggedUnionShape(parent, className, typedefName, description); shape = taggedUnion; visitedSchemas.putIfAbsent(schema, shape); - schema.getOneOf().orElseThrow().forEach(s -> { + oneOf.get().forEach(s -> { var title = s.getTitle() .orElseThrow(() -> new IllegalStateException("oneOf variant [" + s.getPointer() + "] is missing a `title` tag")); taggedUnion.addVariant(title, mapType(s)); @@ -509,8 +517,8 @@ private boolean shouldKeepRef(OpenApiSchema schema) { if (schema.isInteger() || schema.isNumber() || schema.isArray()) { return false; } - if (schema.isString() && schema.getEnums().isEmpty()) { - return false; + if (schema.isString()) { + return schema.hasEnums(); } if (schema.isObject() && schema.getProperties().map(Map::isEmpty).orElse(true) @@ -518,7 +526,8 @@ private boolean shouldKeepRef(OpenApiSchema schema) { return false; } if (schema.getOneOf().isPresent()) { - return schema.getOneOf().orElseThrow().stream().allMatch(s -> s.getTitle().isPresent()); + var oneOf = schema.getOneOf().orElseThrow(); + return oneOf.stream().allMatch(s -> s.getTitle().isPresent()) || oneOf.stream().allMatch(OpenApiSchema::isStringEnum); } if (schema.getAllOf().isPresent()) { return schema.determineSingleType().orElse(null) == OpenApiSchemaType.Object; diff --git a/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/HttpStatusCode.java b/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/HttpStatusCode.java index 11e57a1b7b..36f39bb006 100644 --- a/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/HttpStatusCode.java +++ b/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/HttpStatusCode.java @@ -15,10 +15,12 @@ public enum HttpStatusCode { Ok("200"), Created("201"), + Accepted("202"), NoContent("204"), BadRequest("400"), Forbidden("403"), NotFound("404"), + RequestTimeout("408"), InternalServerError("500"), NotImplemented("501"); diff --git a/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/OpenApiSchema.java b/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/OpenApiSchema.java index d4df9b3c07..8a1a3d1d03 100644 --- a/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/OpenApiSchema.java +++ b/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/OpenApiSchema.java @@ -11,7 +11,6 @@ import static org.opensearch.client.codegen.utils.Functional.ifNonnull; import io.swagger.v3.oas.models.media.Schema; -import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -55,8 +54,6 @@ public class OpenApiSchema extends OpenApiRefElement { @Nullable private final List enums; @Nullable - private final Set deprecatedEnums; - @Nullable private final OpenApiSchema items; @Nullable private final OpenApiSchema additionalProperties; @@ -70,6 +67,8 @@ public class OpenApiSchema extends OpenApiRefElement { private final String pattern; @Nullable private final Semver versionRemoved; + @Nullable + private final Semver versionDeprecated; private OpenApiSchema(@Nonnull Builder builder) { super(builder.parent, Objects.requireNonNull(builder.pointer, "pointer must not be null"), builder.$ref, OpenApiSchema.class); @@ -82,7 +81,6 @@ private OpenApiSchema(@Nonnull Builder builder) { anyOf = builder.anyOf; oneOf = builder.oneOf; enums = builder.enums; - deprecatedEnums = builder.deprecatedEnums; items = builder.items; additionalProperties = builder.additionalProperties; properties = builder.properties; @@ -90,6 +88,7 @@ private OpenApiSchema(@Nonnull Builder builder) { title = builder.title; pattern = builder.pattern; versionRemoved = builder.versionRemoved; + versionDeprecated = builder.versionDeprecated; } protected OpenApiSchema(@Nullable OpenApiElement parent, @Nonnull JsonPointer pointer, @Nonnull Schema schema) { @@ -139,10 +138,8 @@ protected OpenApiSchema(@Nullable OpenApiElement parent, @Nonnull JsonPointer var extensions = schema.getExtensions(); - // noinspection unchecked - deprecatedEnums = Maps.tryGet(extensions, "x-deprecated-enums").map(e -> (Collection) e).map(HashSet::new).orElse(null); - versionRemoved = Maps.tryGet(extensions, "x-version-removed").map(v -> Versions.coerce((String) v)).orElse(null); + versionDeprecated = Maps.tryGet(extensions, "x-version-deprecated").map(v -> Versions.coerce((String) v)).orElse(null); } @Nonnull @@ -199,6 +196,10 @@ public boolean isString() { return is(OpenApiSchemaType.String); } + public boolean isStringEnum() { + return isString() && hasEnums(); + } + public boolean hasAllOf() { return allOf != null && !allOf.isEmpty(); } @@ -235,11 +236,6 @@ public Optional> getEnums() { return Lists.unmodifiableOpt(enums); } - @Nonnull - public Optional> getDeprecatedEnums() { - return Sets.unmodifiableOpt(deprecatedEnums); - } - @Nonnull public Optional getItems() { return Optional.ofNullable(items); @@ -275,6 +271,11 @@ public Optional getVersionRemoved() { return Optional.ofNullable(versionRemoved); } + @Nonnull + public Optional getVersionDeprecated() { + return Optional.ofNullable(versionDeprecated); + } + public static Set determineTypes(List schemas) { return schemas.stream().map(OpenApiSchema::determineTypes).flatMap(Set::stream).collect(Collectors.toSet()); } @@ -342,8 +343,6 @@ public static class Builder extends ObjectBuilderBase { @Nullable private List enums; @Nullable - private Set deprecatedEnums; - @Nullable private OpenApiSchema items; @Nullable private OpenApiSchema additionalProperties; @@ -357,6 +356,8 @@ public static class Builder extends ObjectBuilderBase { private String pattern; @Nullable private Semver versionRemoved; + @Nullable + private Semver versionDeprecated; private Builder() {} diff --git a/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/OpenApiSchemaFormat.java b/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/OpenApiSchemaFormat.java index f3bd8fa731..bdd021510e 100644 --- a/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/OpenApiSchemaFormat.java +++ b/java-codegen/src/main/java/org/opensearch/client/codegen/openapi/OpenApiSchemaFormat.java @@ -18,10 +18,21 @@ public enum OpenApiSchemaFormat { Double, Int32, Int64, - Binary; + Binary, + DateTime("date-time"); private static final Map VALUES = Maps.createLookupOf(values(), OpenApiSchemaFormat::toString); + private final String format; + + OpenApiSchemaFormat(String format) { + this.format = format; + } + + OpenApiSchemaFormat() { + this.format = name().toLowerCase(); + } + @Nonnull public static OpenApiSchemaFormat from(@Nonnull String format) { var value = VALUES.get(Strings.requireNonBlank(format, "format must not be blank")); @@ -33,6 +44,6 @@ public static OpenApiSchemaFormat from(@Nonnull String format) { @Override public String toString() { - return name().toLowerCase(); + return format; } }