Skip to content

Commit 43c1299

Browse files
authored
[Backport main] Add support for codegen overrides (#1185)
* Add support for codegen overrides * Implement ability to override property type mappings Signed-off-by: Thomas Farr <[email protected]> * Ensure generated code is up-to-date Signed-off-by: Thomas Farr <[email protected]> * Fix license header Signed-off-by: Thomas Farr <[email protected]> * Fix tests Signed-off-by: Thomas Farr <[email protected]> --------- Signed-off-by: Thomas Farr <[email protected]> (cherry picked from commit 9c5d9c1) * spotlessApply Signed-off-by: Thomas Farr <[email protected]> --------- Signed-off-by: Thomas Farr <[email protected]>
1 parent 020e0b0 commit 43c1299

19 files changed

+394
-66
lines changed

java-codegen/src/main/java/org/opensearch/client/codegen/CodeGenerator.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.opensearch.client.codegen.model.OperationGroupMatcher;
3636
import org.opensearch.client.codegen.model.ShapeRenderingContext;
3737
import org.opensearch.client.codegen.model.SpecTransformer;
38+
import org.opensearch.client.codegen.model.overrides.Overrides;
3839
import org.opensearch.client.codegen.openapi.OpenApiSpecification;
3940

4041
public class CodeGenerator {
@@ -121,7 +122,7 @@ public static void main(String[] args) {
121122

122123
private static Namespace parseSpec(URI location) throws ApiSpecificationParseException {
123124
var spec = OpenApiSpecification.retrieve(location);
124-
var transformer = new SpecTransformer(OPERATION_MATCHER);
125+
var transformer = new SpecTransformer(OPERATION_MATCHER, Overrides.OVERRIDES);
125126
transformer.visit(spec);
126127
return transformer.getRoot();
127128
}

java-codegen/src/main/java/org/opensearch/client/codegen/model/ShapeRenderingContext.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,12 @@ public static final class Builder extends ObjectBuilderBase<ShapeRenderingContex
7878
private JavaCodeFormatter javaCodeFormatter;
7979
private boolean ownedJavaCodeFormatter;
8080

81-
private Builder() {
82-
super(ShapeRenderingContext::new);
83-
}
81+
private Builder() {}
8482

83+
@Nonnull
8584
@Override
86-
protected @Nonnull Builder self() {
87-
return this;
85+
protected ShapeRenderingContext construct() {
86+
return new ShapeRenderingContext(this);
8887
}
8988

9089
@Nonnull

java-codegen/src/main/java/org/opensearch/client/codegen/model/SpecTransformer.java

+12-4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.apache.commons.lang3.NotImplementedException;
2626
import org.apache.logging.log4j.LogManager;
2727
import org.apache.logging.log4j.Logger;
28+
import org.opensearch.client.codegen.model.overrides.Overrides;
29+
import org.opensearch.client.codegen.model.overrides.PropertyOverride;
2830
import org.opensearch.client.codegen.openapi.HttpStatusCode;
2931
import org.opensearch.client.codegen.openapi.In;
3032
import org.opensearch.client.codegen.openapi.JsonPointer;
@@ -48,14 +50,17 @@ public class SpecTransformer {
4850
@Nonnull
4951
private final OperationGroupMatcher matcher;
5052
@Nonnull
53+
private final Overrides overrides;
54+
@Nonnull
5155
private final Namespace root = new Namespace();
5256
@Nonnull
5357
private final Set<OpenApiSchema> visitedSchemas = new HashSet<>();
5458
@Nonnull
5559
private final Map<OpenApiSchema, Type> schemaToType = new ConcurrentHashMap<>();
5660

57-
public SpecTransformer(@Nonnull OperationGroupMatcher matcher) {
61+
public SpecTransformer(@Nonnull OperationGroupMatcher matcher, @Nonnull Overrides overrides) {
5862
this.matcher = Objects.requireNonNull(matcher, "matcher must not be null");
63+
this.overrides = Objects.requireNonNull(overrides, "overrides must not be null");
5964
}
6065

6166
@Nonnull
@@ -285,9 +290,12 @@ private void visitInto(OpenApiSchema schema, ObjectShape shape) {
285290
final var additionalProperties = new ArrayList<OpenApiSchema>();
286291
final var required = collectObjectProperties(schema, properties, additionalProperties);
287292

288-
properties.forEach(
289-
(k, v) -> shape.addBodyField(new Field(k, mapType(v), required.contains(k), v.getDescription().orElse(null), null))
290-
);
293+
final var overrides = this.overrides.getSchema(schema.getPointer());
294+
295+
properties.forEach((k, v) -> {
296+
var type = overrides.flatMap(so -> so.getProperty(k)).flatMap(PropertyOverride::getMappedType).orElseGet(() -> mapType(v));
297+
shape.addBodyField(new Field(k, type, required.contains(k), v.getDescription().orElse(null), null));
298+
});
291299

292300
if (!additionalProperties.isEmpty()) {
293301
var valueSchema = additionalProperties.size() == 1 ? additionalProperties.get(0) : OpenApiSchema.ANONYMOUS_UNTYPED;

java-codegen/src/main/java/org/opensearch/client/codegen/model/Type.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public class Type {
3939
"float",
4040
"Float",
4141
"double",
42-
"Double"
42+
"Double",
43+
"Number"
4344
);
4445

4546
public static Builder builder() {
@@ -148,6 +149,10 @@ public boolean isPrimitive() {
148149
return PRIMITIVES.contains(name);
149150
}
150151

152+
public boolean isNumber() {
153+
return "Number".equals(name);
154+
}
155+
151156
public boolean isEnum() {
152157
return isEnum;
153158
}
@@ -218,13 +223,12 @@ public static final class Builder extends ObjectBuilderBase<Type, Builder> {
218223
private Type[] typeParams;
219224
private boolean isEnum;
220225

221-
private Builder() {
222-
super(Type::new);
223-
}
226+
private Builder() {}
224227

228+
@Nonnull
225229
@Override
226-
protected @Nonnull Builder self() {
227-
return this;
230+
protected Type construct() {
231+
return new Type(this);
228232
}
229233

230234
@Nonnull

java-codegen/src/main/java/org/opensearch/client/codegen/model/TypeParameterDefinition.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,12 @@ public static final class Builder extends ObjectBuilderBase<TypeParameterDefinit
4747
private String name;
4848
private Type extendsType;
4949

50-
private Builder() {
51-
super(TypeParameterDefinition::new);
52-
}
50+
private Builder() {}
5351

52+
@Nonnull
5453
@Override
55-
protected @Nonnull Builder self() {
56-
return this;
54+
protected TypeParameterDefinition construct() {
55+
return new TypeParameterDefinition(this);
5756
}
5857

5958
@Nonnull

java-codegen/src/main/java/org/opensearch/client/codegen/model/TypeParameterDiamond.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,12 @@ public static Builder builder() {
5454
public static class Builder extends ObjectBuilderBase<TypeParameterDiamond, Builder> {
5555
private Either<Type[], TypeParameterDefinition[]> params;
5656

57-
private Builder() {
58-
super(TypeParameterDiamond::new);
59-
}
57+
private Builder() {}
6058

59+
@Nonnull
6160
@Override
62-
protected @Nonnull Builder self() {
63-
return this;
61+
protected TypeParameterDiamond construct() {
62+
return new TypeParameterDiamond(this);
6463
}
6564

6665
@Nonnull

java-codegen/src/main/java/org/opensearch/client/codegen/model/Types.java

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public static final class Lang {
6767
public static final Type Float = Type.builder().withPackage(PACKAGE).withName("Float").build();
6868
public static final Type Double = Type.builder().withPackage(PACKAGE).withName("Double").build();
6969
public static final Type Object = Type.builder().withPackage(PACKAGE).withName("Object").build();
70+
public static final Type Number = Type.builder().withPackage(PACKAGE).withName("Number").build();
7071
}
7172

7273
public static final class Util {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.client.codegen.model.overrides;
10+
11+
import java.util.Collections;
12+
import java.util.Map;
13+
import java.util.Objects;
14+
import java.util.Optional;
15+
import java.util.function.Function;
16+
import javax.annotation.Nonnull;
17+
import javax.annotation.Nullable;
18+
import org.opensearch.client.codegen.openapi.JsonPointer;
19+
import org.opensearch.client.codegen.utils.ObjectBuilder;
20+
import org.opensearch.client.codegen.utils.ObjectBuilderBase;
21+
22+
public class Overrides {
23+
public static final Overrides OVERRIDES = builder().build();
24+
25+
@Nonnull
26+
private final Map<JsonPointer, SchemaOverride> schemas;
27+
28+
private Overrides(Builder builder) {
29+
this.schemas = builder.schemas != null ? Collections.unmodifiableMap(builder.schemas) : Collections.emptyMap();
30+
}
31+
32+
@Nonnull
33+
public Optional<SchemaOverride> getSchema(@Nonnull JsonPointer pointer) {
34+
return Optional.ofNullable(schemas.get(pointer));
35+
}
36+
37+
@Nonnull
38+
public static Builder builder() {
39+
return new Builder();
40+
}
41+
42+
public static final class Builder extends ObjectBuilderBase<Overrides, Builder> {
43+
@Nullable
44+
private Map<JsonPointer, SchemaOverride> schemas;
45+
46+
private Builder() {}
47+
48+
@Nonnull
49+
@Override
50+
protected Overrides construct() {
51+
return new Overrides(this);
52+
}
53+
54+
@Nonnull
55+
public Builder withSchemas(@Nonnull Function<SchemaOverride.MapBuilder, ObjectBuilder<Map<JsonPointer, SchemaOverride>>> fn) {
56+
this.schemas = Objects.requireNonNull(fn, "fn must not be null").apply(SchemaOverride.mapBuilder()).build();
57+
return this;
58+
}
59+
}
60+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.client.codegen.model.overrides;
10+
11+
import java.util.Optional;
12+
import javax.annotation.Nonnull;
13+
import javax.annotation.Nullable;
14+
import org.opensearch.client.codegen.model.Type;
15+
import org.opensearch.client.codegen.utils.MapBuilderBase;
16+
import org.opensearch.client.codegen.utils.ObjectBuilderBase;
17+
18+
public final class PropertyOverride {
19+
@Nullable
20+
private final Type mappedType;
21+
22+
private PropertyOverride(Builder builder) {
23+
this.mappedType = builder.mappedType;
24+
}
25+
26+
@Nonnull
27+
public Optional<Type> getMappedType() {
28+
return Optional.ofNullable(mappedType);
29+
}
30+
31+
@Nonnull
32+
public static Builder builder() {
33+
return new Builder();
34+
}
35+
36+
@Nonnull
37+
public static MapBuilder mapBuilder() {
38+
return new MapBuilder();
39+
}
40+
41+
public static final class Builder extends ObjectBuilderBase<PropertyOverride, Builder> {
42+
@Nullable
43+
private Type mappedType;
44+
45+
private Builder() {}
46+
47+
@Nonnull
48+
@Override
49+
protected PropertyOverride construct() {
50+
return new PropertyOverride(this);
51+
}
52+
53+
@Nonnull
54+
public Builder withMappedType(@Nullable Type mappedType) {
55+
this.mappedType = mappedType;
56+
return this;
57+
}
58+
}
59+
60+
public static final class MapBuilder extends MapBuilderBase<String, PropertyOverride, Builder, MapBuilder> {
61+
private MapBuilder() {}
62+
63+
@Nonnull
64+
@Override
65+
protected Builder valueBuilder() {
66+
return builder();
67+
}
68+
}
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.client.codegen.model.overrides;
10+
11+
import java.util.Collections;
12+
import java.util.Map;
13+
import java.util.Objects;
14+
import java.util.Optional;
15+
import java.util.function.Function;
16+
import javax.annotation.Nonnull;
17+
import javax.annotation.Nullable;
18+
import org.opensearch.client.codegen.openapi.JsonPointer;
19+
import org.opensearch.client.codegen.utils.MapBuilderBase;
20+
import org.opensearch.client.codegen.utils.ObjectBuilder;
21+
import org.opensearch.client.codegen.utils.ObjectBuilderBase;
22+
23+
public final class SchemaOverride {
24+
@Nonnull
25+
private final Map<String, PropertyOverride> properties;
26+
27+
private SchemaOverride(Builder builder) {
28+
this.properties = builder.properties != null ? Collections.unmodifiableMap(builder.properties) : Collections.emptyMap();
29+
}
30+
31+
@Nonnull
32+
public Optional<PropertyOverride> getProperty(@Nonnull String key) {
33+
return Optional.ofNullable(properties.get(key));
34+
}
35+
36+
@Nonnull
37+
public static Builder builder() {
38+
return new Builder();
39+
}
40+
41+
@Nonnull
42+
public static MapBuilder mapBuilder() {
43+
return new MapBuilder();
44+
}
45+
46+
public static final class Builder extends ObjectBuilderBase<SchemaOverride, Builder> {
47+
@Nullable
48+
private Map<String, PropertyOverride> properties;
49+
50+
private Builder() {}
51+
52+
@Nonnull
53+
@Override
54+
protected SchemaOverride construct() {
55+
return new SchemaOverride(this);
56+
}
57+
58+
@Nonnull
59+
public Builder withProperties(@Nonnull Function<PropertyOverride.MapBuilder, ObjectBuilder<Map<String, PropertyOverride>>> fn) {
60+
this.properties = Objects.requireNonNull(fn, "fn must not be null").apply(PropertyOverride.mapBuilder()).build();
61+
return this;
62+
}
63+
}
64+
65+
public static final class MapBuilder extends MapBuilderBase<JsonPointer, SchemaOverride, Builder, MapBuilder> {
66+
private MapBuilder() {}
67+
68+
@Nonnull
69+
@Override
70+
protected Builder valueBuilder() {
71+
return builder();
72+
}
73+
}
74+
}

java-codegen/src/main/java/org/opensearch/client/codegen/openapi/OpenApiSchema.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -354,13 +354,12 @@ public static class Builder extends ObjectBuilderBase<OpenApiSchema, Builder> {
354354
@Nullable
355355
private Semver versionRemoved;
356356

357-
private Builder() {
358-
super(OpenApiSchema::new);
359-
}
357+
private Builder() {}
360358

359+
@Nonnull
361360
@Override
362-
protected @Nonnull Builder self() {
363-
return this;
361+
protected OpenApiSchema construct() {
362+
return new OpenApiSchema(this);
364363
}
365364

366365
@Nonnull

0 commit comments

Comments
 (0)