Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.

Commit 4ec3364

Browse files
committed
Adds JsonPathPieceMethod
1 parent 1968059 commit 4ec3364

File tree

6 files changed

+82
-9
lines changed

6 files changed

+82
-9
lines changed

src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -2981,7 +2981,7 @@ public CodegenOperation fromOperation(Operation operation, String jsonPath, Link
29812981
);
29822982
}
29832983

2984-
protected List<MapBuilder<?>> getOperationBuilders(String jsonSchema, CodegenRequestBody requestBody, CodegenParametersInfo parametersInfo, CodegenList<CodegenServer> servers, CodegenList<CodegenSecurityRequirementObject> security) {
2984+
protected List<MapBuilder<?>> getOperationBuilders(String jsonPath, CodegenRequestBody requestBody, CodegenParametersInfo parametersInfo, CodegenList<CodegenServer> servers, CodegenList<CodegenSecurityRequirementObject> security) {
29852985
return null;
29862986
}
29872987

src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java

+58-5
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.openapijsonschematools.codegen.generators.openapimodels.CodegenServer;
5353
import org.openapijsonschematools.codegen.generators.openapimodels.EnumInfo;
5454
import org.openapijsonschematools.codegen.generators.openapimodels.EnumValue;
55+
import org.openapijsonschematools.codegen.generators.openapimodels.JsonPathPieceMethod;
5556
import org.openapijsonschematools.codegen.generators.openapimodels.MapBuilder;
5657
import org.openapijsonschematools.codegen.templating.HandlebarsEngineAdapter;
5758
import org.openapijsonschematools.codegen.templating.SupportingFile;
@@ -2413,16 +2414,16 @@ private void addDoubleEnum(LinkedHashMap<String, LinkedHashMap<EnumValue, String
24132414
}
24142415
}
24152416

2416-
protected List<MapBuilder<?>> getOperationBuilders(String jsonSchema, CodegenRequestBody requestBody, CodegenParametersInfo parametersInfo, CodegenList<CodegenServer> servers, CodegenList<CodegenSecurityRequirementObject> security) {
2417+
protected List<MapBuilder<?>> getOperationBuilders(String jsonPath, CodegenRequestBody requestBody, CodegenParametersInfo parametersInfo, CodegenList<CodegenServer> servers, CodegenList<CodegenSecurityRequirementObject> security) {
24172418
if (requestBody == null && parametersInfo == null && servers == null && security == null) {
24182419
return null;
24192420
}
24202421
int qtyBuilders = 1;
24212422
int reqPropsSize = 0;
24222423
boolean requestBodyExists = requestBody != null;
24232424
boolean parametersExist = parametersInfo != null;
2424-
List<Object> requiredProperties = new ArrayList<>();
2425-
List<Object> optionalProperties = new ArrayList<>();
2425+
List<JsonPathPieceMethod> requiredProperties = new ArrayList<>();
2426+
List<JsonPathPieceMethod> optionalProperties = new ArrayList<>();
24262427
if (requestBodyExists) {
24272428
if (Boolean.TRUE.equals(requestBody.getSelfOrDeepestRef().required)) {
24282429
qtyBuilders += 1;
@@ -2476,8 +2477,60 @@ protected List<MapBuilder<?>> getOperationBuilders(String jsonSchema, CodegenReq
24762477
if (security != null) {
24772478
optionalProperties.add(security);
24782479
}
2479-
// todo pass in and use path/root servers + security here if they are used
2480-
return List.of();
2480+
2481+
Map<String, MapBuilder<Object>> bitStrToBuilder = new HashMap<>();
2482+
MapBuilder<Object> lastBuilder = null;
2483+
// builders are built last to first, last builder has build method
2484+
String[] pathPieces = jsonPath.split("/");
2485+
CodegenKey operationKey = getKey(pathPieces[pathPieces.length-1], "misc", jsonPath);
2486+
String builderName = operationKey.pascalCase;
2487+
List<MapBuilder<?>> builders = new ArrayList<>();
2488+
for (int i=0; i < qtyBuilders; i++) {
2489+
String bitStr = "";
2490+
if (reqPropsSize != 0) {
2491+
bitStr = String.format("%"+reqPropsSize+"s", Integer.toBinaryString(i)).replace(' ', '0');
2492+
}
2493+
CodegenKey builderClassName;
2494+
if (i == qtyBuilders - 1) {
2495+
// first invoked builder has the simplest name with no bitStr
2496+
builderClassName = getKey(builderName + "RequestBuilder", "schemas", jsonPath);
2497+
} else {
2498+
builderClassName = getKey(builderName + bitStr + "RequestBuilder", "schemas", jsonPath);
2499+
}
2500+
MapBuilder<Object> builder;
2501+
if (i == 0) {
2502+
builder = new MapBuilder<>(builderClassName, new LinkedHashMap<>());
2503+
lastBuilder = builder;
2504+
} else {
2505+
LinkedHashMap<CodegenKey, MapBuilder.BuilderPropertyPair<Object>> keyToBuilder = new LinkedHashMap<>();
2506+
for (int c=0; c < reqPropsSize; c++) {
2507+
if (bitStr.charAt(c) == '1') {
2508+
StringBuilder nextBuilderBitStr = new StringBuilder(bitStr);
2509+
nextBuilderBitStr.setCharAt(c, '0');
2510+
CodegenKey key = requiredProperties.get(c).jsonPathPiece();
2511+
if (key == null) {
2512+
throw new RuntimeException("key must exist at c="+c);
2513+
}
2514+
MapBuilder<Object> nextBuilder = bitStrToBuilder.get(nextBuilderBitStr.toString());
2515+
if (nextBuilder == null) {
2516+
throw new RuntimeException("Next builder must exist for bitStr="+ nextBuilderBitStr);
2517+
}
2518+
var pair = new MapBuilder.BuilderPropertyPair<>(nextBuilder, requiredProperties.get(c));
2519+
keyToBuilder.put(key, pair);
2520+
}
2521+
}
2522+
builder = new MapBuilder<>(builderClassName, keyToBuilder);
2523+
}
2524+
bitStrToBuilder.put(bitStr, builder);
2525+
builders.add(builder);
2526+
}
2527+
if (!optionalProperties.isEmpty()) {
2528+
for (JsonPathPieceMethod property: optionalProperties) {
2529+
var pair = new MapBuilder.BuilderPropertyPair<>(lastBuilder, property);
2530+
lastBuilder.keyToBuilder.put(property.jsonPathPiece(), pair);
2531+
}
2532+
}
2533+
return builders;
24812534
}
24822535

24832536
protected List<MapBuilder<CodegenSchema>> getMapBuilders(CodegenSchema schema, String currentJsonPath, String sourceJsonPath) {

src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenList.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/**
77
* A class to store inline codegenschema definitions
88
*/
9-
public class CodegenList <T> extends AbstractList<T> {
9+
public class CodegenList <T> extends AbstractList<T> implements JsonPathPieceMethod {
1010
public final List<T> items;
1111
public final CodegenKey jsonPathPiece;
1212
public final String subpackage;
@@ -28,4 +28,9 @@ public T get(int index) {
2828
public int size() {
2929
return this.items.size();
3030
}
31+
32+
@Override
33+
public CodegenKey jsonPathPiece() {
34+
return jsonPathPiece;
35+
}
3136
}

src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenRequestBody.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* A unique parameter is defined by a combination of a name and location.
1313
* Parameters may be located in a path, query, header or cookie.
1414
*/
15-
public class CodegenRequestBody {
15+
public class CodegenRequestBody implements JsonPathPieceMethod {
1616
public final CodegenText description;
1717
public final Map<String, Object> vendorExtensions;
1818
public final Boolean required;
@@ -138,5 +138,10 @@ public CodegenRequestBody getDeepestRef() {
138138
}
139139
return refObject;
140140
}
141+
142+
@Override
143+
public CodegenKey jsonPathPiece() {
144+
return jsonPathPiece;
145+
}
141146
}
142147

src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import java.util.TreeSet;
3131
import java.util.function.Function;
3232

33-
public class CodegenSchema {
33+
public class CodegenSchema implements JsonPathPieceMethod {
3434
// 3.0.0
3535
public String title;
3636
public Number multipleOf;
@@ -1020,4 +1020,9 @@ public int hashCode() {
10201020
properties, optionalProperties, requiredProperties, externalDocumentation,
10211021
discriminator, imports, componentModule, testCases, refInfo);
10221022
}
1023+
1024+
@Override
1025+
public CodegenKey jsonPathPiece() {
1026+
return jsonPathPiece;
1027+
}
10231028
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.openapijsonschematools.codegen.generators.openapimodels;
2+
3+
public interface JsonPathPieceMethod {
4+
CodegenKey jsonPathPiece();
5+
}

0 commit comments

Comments
 (0)