Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion multiapi-engine/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<groupId>com.sngular</groupId>
<artifactId>multiapi-engine</artifactId>
<version>6.5.0</version>
<version>6.5.1</version>
<packaging>jar</packaging>

<properties>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -448,15 +448,15 @@ private static List<SchemaFieldObject> processArray(
final List<SchemaFieldObject> fieldObjectArrayList = new LinkedList<>();

if (!ApiTool.hasItems(schema) || ApiTool.getItems(schema).isBoolean()) {
// No `items` schema, or `items: false` (JSON Schema 2020-12). If the array
// declares positional `prefixItems` (tuple), or nothing typable at all, the
// element type degrades to Object -> List<Object>.
// No `items` schema, or `items: false` (JSON Schema 2020-12). A `prefixItems`
// tuple becomes a List of its common element type when every position shares one
// type, otherwise (mixed types, or nothing typable) the element type is Object.
final boolean isTuple = ApiTool.hasPrefixItems(schema);
fieldObjectArrayList.add(SchemaFieldObject
.builder()
.baseName(fieldName)
.dataType(isTuple
? SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, TypeConstants.OBJECT)
? SchemaFieldObjectType.fromTypeList(TypeConstants.ARRAY, uniformPrefixItemType(schema, specFile))
: new SchemaFieldObjectType(TypeConstants.OBJECT))
.build());
} else {
Expand Down Expand Up @@ -922,8 +922,35 @@ private static String resolveArrayItemType(final JsonNode schema, final CommonSp
if (Objects.nonNull(items) && !items.isBoolean()) {
return ApiTool.hasRef(items) ? MapperUtil.getPojoNameFromRef(items, specFile, null) : ApiTool.getType(items);
}
// `prefixItems` (tuple) or `items: false` -> degrade the element type to Object.
return TypeConstants.OBJECT;
// `prefixItems` (tuple): common element type if uniform, else Object. `items: false` -> Object.
return uniformPrefixItemType(schema, specFile);
}

private static String uniformPrefixItemType(final JsonNode schema, final CommonSpecFile specFile) {
if (!ApiTool.hasPrefixItems(schema)) {
return TypeConstants.OBJECT;
}
final JsonNode prefixItems = ApiTool.getPrefixItems(schema);
if (Objects.isNull(prefixItems) || !prefixItems.isArray() || !prefixItems.elements().hasNext()) {
return TypeConstants.OBJECT;
}
String common = null;
for (final JsonNode item : prefixItems) {
final String type;
if (ApiTool.hasRef(item)) {
type = MapperUtil.getPojoNameFromRef(item, specFile, null);
} else if (ApiTool.hasType(item)) {
type = MapperUtil.getSimpleType(item, specFile);
} else {
return TypeConstants.OBJECT;
}
if (Objects.isNull(common)) {
common = type;
} else if (!common.equals(type)) {
return TypeConstants.OBJECT;
}
}
return Objects.isNull(common) ? TypeConstants.OBJECT : common;
}

private static SchemaFieldObject buildPatternPropertiesField(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.ArrayList;
import java.math.BigDecimal;
import java.util.Map;
import java.util.HashMap;

Expand All @@ -24,7 +25,7 @@ public class GadgetDTO {
@JsonProperty(value ="metadata")
private Map<String, String> metadata;
@JsonProperty(value ="coords")
private List<Object> coords;
private List<BigDecimal> coords;
@JsonProperty(value ="owner")
private PersonDTO owner;
@JsonProperty(value ="serial")
Expand Down Expand Up @@ -52,7 +53,7 @@ public static class GadgetDTOBuilder {
private Object nothing;
private String id;
private Map<String, String> metadata = new HashMap<String, String>();
private List<Object> coords = new ArrayList<Object>();
private List<BigDecimal> coords = new ArrayList<BigDecimal>();
private PersonDTO owner;
private String serial;

Expand Down Expand Up @@ -81,14 +82,14 @@ public GadgetDTO.GadgetDTOBuilder metadataValue(String key, String value) {
return this;
}

public GadgetDTO.GadgetDTOBuilder coords(List<Object> coords) {
public GadgetDTO.GadgetDTOBuilder coords(List<BigDecimal> coords) {
if (!coords.isEmpty()) {
this.coords.addAll(coords);
}
return this;
}

public GadgetDTO.GadgetDTOBuilder coord(Object coord) {
public GadgetDTO.GadgetDTOBuilder coord(BigDecimal coord) {
if (Objects.nonNull(coord)) {
this.coords.add(coord);
}
Expand Down Expand Up @@ -144,10 +145,10 @@ public void setMetadata(Map<String, String> metadata) {
}

@Schema(name = "coords", required = false)
public List<Object> getCoords() {
public List<BigDecimal> getCoords() {
return coords;
}
public void setCoords(List<Object> coords) {
public void setCoords(List<BigDecimal> coords) {
this.coords = coords;
}

Expand Down
6 changes: 3 additions & 3 deletions scs-multiapi-gradle-plugin/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ repositories {
}

group = 'com.sngular'
version = '6.5.0'
version = '6.5.1'

def SCSMultiApiPluginGroupId = group
def SCSMultiApiPluginVersion = version
Expand All @@ -31,7 +31,7 @@ dependencies {
shadow localGroovy()
shadow gradleApi()

implementation 'com.sngular:multiapi-engine:6.5.0'
implementation 'com.sngular:multiapi-engine:6.5.1'
testImplementation 'org.assertj:assertj-core:3.24.2'
testImplementation 'com.puppycrawl.tools:checkstyle:10.12.3'
testImplementation 'org.junit.platform:junit-platform-launcher:1.9.2'
Expand Down Expand Up @@ -100,7 +100,7 @@ testing {

integrationTest(JvmTestSuite) {
dependencies {
implementation 'com.sngular:scs-multiapi-gradle-plugin:6.5.0'
implementation 'com.sngular:scs-multiapi-gradle-plugin:6.5.1'
implementation 'org.assertj:assertj-core:3.24.2'
}

Expand Down
6 changes: 3 additions & 3 deletions scs-multiapi-maven-plugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<groupId>com.sngular</groupId>
<artifactId>scs-multiapi-maven-plugin</artifactId>
<version>6.5.0</version>
<version>6.5.1</version>
<packaging>maven-plugin</packaging>

<name>AsyncApi - OpenApi Code Generator Maven Plugin</name>
Expand Down Expand Up @@ -271,7 +271,7 @@
<dependency>
<groupId>com.sngular</groupId>
<artifactId>multiapi-engine</artifactId>
<version>6.5.0</version>
<version>6.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
Expand Down Expand Up @@ -560,7 +560,7 @@
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.6.0</version>
<version>0.11.0</version>
<extensions>true</extensions>
<configuration>
<autoPublish>true</autoPublish>
Expand Down
Loading