Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions samples/client/petstore/java/.openapi-generator/FILES
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ src/main/java/org/openapijsonschematools/schemas/DateTimeSchema.java
src/main/java/org/openapijsonschematools/schemas/DecimalSchema.java
src/main/java/org/openapijsonschematools/schemas/DoubleSchema.java
src/main/java/org/openapijsonschematools/schemas/FloatSchema.java
src/main/java/org/openapijsonschematools/schemas/FrozenList.java
src/main/java/org/openapijsonschematools/schemas/FrozenMap.java
src/main/java/org/openapijsonschematools/schemas/Int32Schema.java
src/main/java/org/openapijsonschematools/schemas/Int64Schema.java
src/main/java/org/openapijsonschematools/schemas/IntSchema.java
src/main/java/org/openapijsonschematools/schemas/ListSchema.java
src/main/java/org/openapijsonschematools/schemas/MapSchema.java
src/main/java/org/openapijsonschematools/schemas/NullSchema.java
src/main/java/org/openapijsonschematools/schemas/NumberSchema.java
Expand All @@ -26,21 +28,25 @@ src/main/java/org/openapijsonschematools/schemas/UnsetAnyTypeSchema.java
src/main/java/org/openapijsonschematools/schemas/ValidationMetadata.java
src/main/java/org/openapijsonschematools/schemas/validators/AdditionalPropertiesValidator.java
src/main/java/org/openapijsonschematools/schemas/validators/FormatValidator.java
src/main/java/org/openapijsonschematools/schemas/validators/ItemsValidator.java
src/main/java/org/openapijsonschematools/schemas/validators/KeywordValidator.java
src/main/java/org/openapijsonschematools/schemas/validators/PropertiesValidator.java
src/main/java/org/openapijsonschematools/schemas/validators/RequiredValidator.java
src/main/java/org/openapijsonschematools/schemas/validators/TypeValidator.java
src/test/java/org/openapijsonschematools/configurations/JsonSchemaKeywordFlagsTest.java
src/test/java/org/openapijsonschematools/schemas/AnyTypeSchemaTest.java
src/test/java/org/openapijsonschematools/schemas/ArrayTypeSchemaTest.java
src/test/java/org/openapijsonschematools/schemas/BooleanSchemaTest.java
src/test/java/org/openapijsonschematools/schemas/CustomIsoparserTest.java
src/test/java/org/openapijsonschematools/schemas/ListSchemaTest.java
src/test/java/org/openapijsonschematools/schemas/MapSchemaTest.java
src/test/java/org/openapijsonschematools/schemas/NullSchemaTest.java
src/test/java/org/openapijsonschematools/schemas/NumberSchemaTest.java
src/test/java/org/openapijsonschematools/schemas/ObjectTypeSchemaTest.java
src/test/java/org/openapijsonschematools/schemas/SchemaValidatorTest.java
src/test/java/org/openapijsonschematools/schemas/validators/AdditionalPropertiesValidatorTest.java
src/test/java/org/openapijsonschematools/schemas/validators/FormatValidatorTest.java
src/test/java/org/openapijsonschematools/schemas/validators/ItemsValidatorTest.java
src/test/java/org/openapijsonschematools/schemas/validators/PropertiesValidatorTest.java
src/test/java/org/openapijsonschematools/schemas/validators/RequiredValidatorTest.java
src/test/java/org/openapijsonschematools/schemas/validators/TypeValidatorTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public static <T extends FrozenMap> T validate(Map<String, Object> arg, SchemaCo
return Schema.validate(AnyTypeSchema.class, arg, configuration);
}

public static <U extends List> U validate(List<Object> arg, SchemaConfiguration configuration) {
public static <U extends FrozenList> U validate(List<Object> arg, SchemaConfiguration configuration) {
return Schema.validate(AnyTypeSchema.class, arg, configuration);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package org.openapijsonschematools.schemas;

import java.util.ArrayList;
import java.util.Collection;

public class FrozenList<E> extends ArrayList<E> {
/*
A frozen List
Once schema validation has been run, indexed access returns values of the correct type
If values were mutable, the types in those methods would not agree with returned values
*/
public FrozenList(Collection<? extends E> m) {
super(m);
}

public boolean add(E e) {
throw new UnsupportedOperationException();
}

public void add(int index, E element) {
throw new UnsupportedOperationException();
}

public E remove(int index) {
throw new UnsupportedOperationException();
}

public boolean remove(Object o) {
throw new UnsupportedOperationException();
}

public void clear() {
throw new UnsupportedOperationException();
}

public boolean addAll(Collection<? extends E> c) {
throw new UnsupportedOperationException();
}

public boolean addAll(int index, Collection<? extends E> c) {
throw new UnsupportedOperationException();
}

public boolean removeAll(Collection<?> c) {
throw new UnsupportedOperationException();
}

public boolean retainAll(Collection<?> c) {
throw new UnsupportedOperationException();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.openapijsonschematools.schemas;

import org.openapijsonschematools.configurations.SchemaConfiguration;

import java.util.LinkedHashSet;
import java.util.List;

public record ListSchema(LinkedHashSet<Class<?>> type) implements Schema {
public static ListSchema withDefaults() {
LinkedHashSet<Class<?>> type = new LinkedHashSet<>();
type.add(FrozenList.class);
return new ListSchema(type);
}

public static FrozenList<Object> validate(List<Object> arg, SchemaConfiguration configuration) {
return Schema.validate(ListSchema.class, arg, configuration);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ private static Object castToAllowedTypes(Object arg, List<Object> pathToItem, Pa
pathToType.put(pathToItem, Double.class);
return arg;
} else if (arg instanceof List) {
pathToType.put(pathToItem, List.class);
pathToType.put(pathToItem, FrozenList.class);
List<Object> argFixed = new ArrayList<>();
int i =0;
for (Object item: ((List<?>) arg).toArray()) {
Expand All @@ -62,7 +62,7 @@ private static Object castToAllowedTypes(Object arg, List<Object> pathToItem, Pa
argFixed.add(fixedVal);
i += 1;
}
return argFixed;
return new FrozenList(argFixed);
} else if (arg instanceof ZonedDateTime) {
pathToType.put(pathToItem, String.class);
return arg.toString();
Expand Down Expand Up @@ -115,7 +115,7 @@ private static LinkedHashMap<String, Object> getProperties(Object arg, List<Obje
return new FrozenMap(properties);
}

private static List<Object> getItems(Object arg, List<Object> pathToItem, PathToSchemasMap pathToSchemas) {
private static FrozenList<Object> getItems(Object arg, List<Object> pathToItem, PathToSchemasMap pathToSchemas) {
ArrayList<Object> items = new ArrayList<>();
List<Object> castItems = (List<Object>) arg;
int i = 0;
Expand All @@ -127,7 +127,7 @@ private static List<Object> getItems(Object arg, List<Object> pathToItem, PathTo
items.add(castItem);
i += 1;
}
return items;
return new FrozenList(items);
}

private static Map<Class<?>, Class<?>> getTypeToOutputClass(Class<?> cls) {
Expand Down Expand Up @@ -201,7 +201,7 @@ static <T extends FrozenMap> T validate(Class<?> cls, Map<String, Object> arg, S
return (T) validateObject(cls, arg, configuration);
}

static <U extends List> U validate(Class<?> cls, List<Object> arg, SchemaConfiguration configuration) {
static <U extends FrozenList> U validate(Class<?> cls, List<Object> arg, SchemaConfiguration configuration) {
return (U) validateObject(cls, arg, configuration);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.openapijsonschematools.schemas.validators.FormatValidator;
import org.openapijsonschematools.schemas.validators.PropertiesValidator;
import org.openapijsonschematools.schemas.validators.RequiredValidator;
import org.openapijsonschematools.schemas.validators.ItemsValidator;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.RecordComponent;
Expand All @@ -22,6 +23,7 @@ public interface SchemaValidator {
put("format", new FormatValidator());
put("properties", new PropertiesValidator());
put("required", new RequiredValidator());
put("items", new ItemsValidator());
}};

static PathToSchemasMap validate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ static <T extends FrozenMap> T validate(Map<String, Object> arg, SchemaConfigura
return Schema.validate(UnsetAnyTypeSchema.class, arg, configuration);
}

static <U extends List> U validate(List<Object> arg, SchemaConfiguration configuration) {
static <U extends FrozenList> U validate(List<Object> arg, SchemaConfiguration configuration) {
return Schema.validate(UnsetAnyTypeSchema.class, arg, configuration);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.openapijsonschematools.schemas.validators;

import org.openapijsonschematools.schemas.PathToSchemasMap;
import org.openapijsonschematools.schemas.Schema;
import org.openapijsonschematools.schemas.SchemaValidator;
import org.openapijsonschematools.schemas.ValidationMetadata;

import java.util.ArrayList;
import java.util.List;

public class ItemsValidator implements KeywordValidator {
@Override
public PathToSchemasMap validate(Object arg, Object value, Object extra, Class<SchemaValidator> cls, ValidationMetadata validationMetadata) {
if (!(arg instanceof List)) {
return null;
}
List<Object> castArg = (List<Object>) arg;
Class<Schema> itemsSchema = (Class<Schema>) value;
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
// todo add handling for prefixItems
int i = 0;
for(Object itemValue: castArg) {
List<Object> itemPathToItem = new ArrayList<>(validationMetadata.pathToItem());
itemPathToItem.add(i);
ValidationMetadata itemValidationMetadata = new ValidationMetadata(
itemPathToItem,
validationMetadata.configuration(),
validationMetadata.validatedPathToSchemas(),
validationMetadata.seenClasses()
);
if (itemValidationMetadata.validationRanEarlier(itemsSchema)) {
// todo add_deeper_validated_schemas
i +=1;
continue;
}
PathToSchemasMap otherPathToSchemas = SchemaValidator.validate(itemsSchema, itemValue, itemValidationMetadata);
pathToSchemas.update(otherPathToSchemas);
i += 1;
}
return pathToSchemas;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public void testValidateMap() {
public void testValidateList() {
ArrayList<Object> inList = new ArrayList<>();
inList.add(LocalDate.of(2017, 7, 21));
ArrayList<String> validatedValue = AnyTypeSchema.validate(inList, configuration);
FrozenList<String> validatedValue = AnyTypeSchema.validate(inList, configuration);
ArrayList<String> outList = new ArrayList<>();
outList.add( "2017-07-21");
Assert.assertEquals(validatedValue, outList);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package org.openapijsonschematools.schemas;

import org.junit.Assert;
import org.junit.Test;
import org.openapijsonschematools.configurations.JsonSchemaKeywordFlags;
import org.openapijsonschematools.configurations.SchemaConfiguration;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;

record ArrayWithItemsSchema(LinkedHashSet<Class<?>> type, Class<?> items) implements Schema {
public static ArrayWithItemsSchema withDefaults() {
LinkedHashSet<Class<?>> type = new LinkedHashSet<>();
// can't use ImmutableList because it does not allow null values in entries
// can't use Collections.unmodifiableList because Collections.UnmodifiableList is not public + extensible
type.add(FrozenList.class);
Class<?> items = StringSchema.class;
return new ArrayWithItemsSchema(type, items);
}

public static FrozenList<Object> validate(List<Object> arg, SchemaConfiguration configuration) {
return Schema.validate(ArrayWithItemsSchema.class, arg, configuration);
}
}

public class ArrayTypeSchemaTest {
static final SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone());

@Test
public void testExceptionThrownForInvalidType() {
Assert.assertThrows(RuntimeException.class, () -> Schema.validate(
ArrayWithItemsSchema.class, (Void) null, configuration
));
}

@Test
public void testValidateArrayWithItemsSchema() {
// map with only item works
List<Object> inList = new ArrayList<>();
inList.add("abc");
FrozenList<Object> validatedValue = ArrayWithItemsSchema.validate(inList, configuration);
List<Object> outList = new ArrayList<>();
outList.add("abc");
Assert.assertEquals(validatedValue, outList);

// map with no items works
inList = new ArrayList<>();
validatedValue = ArrayWithItemsSchema.validate(inList, configuration);
outList = new ArrayList<>();
Assert.assertEquals(validatedValue, outList);

// invalid prop type fails
inList = new ArrayList<>();
inList.add(1);
List<Object> finalInList = inList;
Assert.assertThrows(RuntimeException.class, () -> ArrayWithItemsSchema.validate(
finalInList, configuration
));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.openapijsonschematools.schemas;

import org.junit.Assert;
import org.junit.Test;
import org.openapijsonschematools.configurations.JsonSchemaKeywordFlags;
import org.openapijsonschematools.configurations.SchemaConfiguration;

import java.util.ArrayList;
import java.util.List;

public class ListSchemaTest {
static final SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone());

@Test
public void testExceptionThrownForInvalidType() {
Assert.assertThrows(RuntimeException.class, () -> Schema.validate(
ListSchema.class, (Void) null, configuration
));
}

@Test
public void testValidateList() {
List<Object> inList = new ArrayList<>();
inList.add("today");
FrozenList<Object> validatedValue = ListSchema.validate(inList, configuration);
ArrayList<String> outList = new ArrayList<>();
outList.add("today");
Assert.assertEquals(validatedValue, outList);
}
}
Loading