Skip to content

Commit 291047f

Browse files
committed
Correct output classes to match the output schema from draft 2020-12
1 parent 484a4b3 commit 291047f

File tree

5 files changed

+114
-210
lines changed

5 files changed

+114
-210
lines changed

api/json-schema-validator.api

Lines changed: 3 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -232,46 +232,6 @@ public final class io/github/optimumcode/json/schema/ValidationOutput$Basic : io
232232
public fun toString ()Ljava/lang/String;
233233
}
234234

235-
public final class io/github/optimumcode/json/schema/ValidationOutput$BasicError {
236-
public fun <init> (Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Ljava/lang/String;Lio/github/optimumcode/json/schema/AbsoluteLocation;)V
237-
public synthetic fun <init> (Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Ljava/lang/String;Lio/github/optimumcode/json/schema/AbsoluteLocation;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
238-
public final fun component1 ()Lio/github/optimumcode/json/pointer/JsonPointer;
239-
public final fun component2 ()Lio/github/optimumcode/json/pointer/JsonPointer;
240-
public final fun component3 ()Ljava/lang/String;
241-
public final fun component4 ()Lio/github/optimumcode/json/schema/AbsoluteLocation;
242-
public final fun copy (Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Ljava/lang/String;Lio/github/optimumcode/json/schema/AbsoluteLocation;)Lio/github/optimumcode/json/schema/ValidationOutput$BasicError;
243-
public static synthetic fun copy$default (Lio/github/optimumcode/json/schema/ValidationOutput$BasicError;Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Ljava/lang/String;Lio/github/optimumcode/json/schema/AbsoluteLocation;ILjava/lang/Object;)Lio/github/optimumcode/json/schema/ValidationOutput$BasicError;
244-
public fun equals (Ljava/lang/Object;)Z
245-
public final fun getAbsoluteKeywordLocation ()Lio/github/optimumcode/json/schema/AbsoluteLocation;
246-
public final fun getError ()Ljava/lang/String;
247-
public final fun getInstanceLocation ()Lio/github/optimumcode/json/pointer/JsonPointer;
248-
public final fun getKeywordLocation ()Lio/github/optimumcode/json/pointer/JsonPointer;
249-
public fun hashCode ()I
250-
public fun toString ()Ljava/lang/String;
251-
}
252-
253-
public final class io/github/optimumcode/json/schema/ValidationOutput$Detailed : io/github/optimumcode/json/schema/ValidationOutput {
254-
public fun <init> (ZLio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/schema/AbsoluteLocation;Ljava/lang/String;Ljava/util/Set;)V
255-
public synthetic fun <init> (ZLio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/schema/AbsoluteLocation;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
256-
public final fun component1 ()Z
257-
public final fun component2 ()Lio/github/optimumcode/json/pointer/JsonPointer;
258-
public final fun component3 ()Lio/github/optimumcode/json/pointer/JsonPointer;
259-
public final fun component4 ()Lio/github/optimumcode/json/schema/AbsoluteLocation;
260-
public final fun component5 ()Ljava/lang/String;
261-
public final fun component6 ()Ljava/util/Set;
262-
public final fun copy (ZLio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/schema/AbsoluteLocation;Ljava/lang/String;Ljava/util/Set;)Lio/github/optimumcode/json/schema/ValidationOutput$Detailed;
263-
public static synthetic fun copy$default (Lio/github/optimumcode/json/schema/ValidationOutput$Detailed;ZLio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/schema/AbsoluteLocation;Ljava/lang/String;Ljava/util/Set;ILjava/lang/Object;)Lio/github/optimumcode/json/schema/ValidationOutput$Detailed;
264-
public fun equals (Ljava/lang/Object;)Z
265-
public final fun getAbsoluteKeywordLocation ()Lio/github/optimumcode/json/schema/AbsoluteLocation;
266-
public final fun getError ()Ljava/lang/String;
267-
public final fun getErrors ()Ljava/util/Set;
268-
public final fun getInstanceLocation ()Lio/github/optimumcode/json/pointer/JsonPointer;
269-
public final fun getKeywordLocation ()Lio/github/optimumcode/json/pointer/JsonPointer;
270-
public fun getValid ()Z
271-
public fun hashCode ()I
272-
public fun toString ()Ljava/lang/String;
273-
}
274-
275235
public final class io/github/optimumcode/json/schema/ValidationOutput$Flag : io/github/optimumcode/json/schema/ValidationOutput {
276236
public static final field Companion Lio/github/optimumcode/json/schema/ValidationOutput$Flag$Companion;
277237
public static final field INVALID Lio/github/optimumcode/json/schema/ValidationOutput$Flag;
@@ -289,7 +249,7 @@ public final class io/github/optimumcode/json/schema/ValidationOutput$Flag : io/
289249
public final class io/github/optimumcode/json/schema/ValidationOutput$Flag$Companion {
290250
}
291251

292-
public final class io/github/optimumcode/json/schema/ValidationOutput$Verbose : io/github/optimumcode/json/schema/ValidationOutput {
252+
public final class io/github/optimumcode/json/schema/ValidationOutput$OutputUnit : io/github/optimumcode/json/schema/ValidationOutput {
293253
public fun <init> (ZLio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/schema/AbsoluteLocation;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;)V
294254
public synthetic fun <init> (ZLio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/schema/AbsoluteLocation;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
295255
public final fun component1 ()Z
@@ -299,8 +259,8 @@ public final class io/github/optimumcode/json/schema/ValidationOutput$Verbose :
299259
public final fun component5 ()Ljava/lang/String;
300260
public final fun component6 ()Ljava/util/Set;
301261
public final fun component7 ()Ljava/util/Set;
302-
public final fun copy (ZLio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/schema/AbsoluteLocation;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;)Lio/github/optimumcode/json/schema/ValidationOutput$Verbose;
303-
public static synthetic fun copy$default (Lio/github/optimumcode/json/schema/ValidationOutput$Verbose;ZLio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/schema/AbsoluteLocation;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;ILjava/lang/Object;)Lio/github/optimumcode/json/schema/ValidationOutput$Verbose;
262+
public final fun copy (ZLio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/schema/AbsoluteLocation;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;)Lio/github/optimumcode/json/schema/ValidationOutput$OutputUnit;
263+
public static synthetic fun copy$default (Lio/github/optimumcode/json/schema/ValidationOutput$OutputUnit;ZLio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/pointer/JsonPointer;Lio/github/optimumcode/json/schema/AbsoluteLocation;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;ILjava/lang/Object;)Lio/github/optimumcode/json/schema/ValidationOutput$OutputUnit;
304264
public fun equals (Ljava/lang/Object;)Z
305265
public final fun getAbsoluteKeywordLocation ()Lio/github/optimumcode/json/schema/AbsoluteLocation;
306266
public final fun getAnnotations ()Ljava/util/Set;

benchmark/src/jvmMain/kotlin/io/github/optimumcode/json/schema/benchmark/AbstractComparisonBenchmark.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ import com.networknt.schema.output.OutputUnit
1111
import io.github.optimumcode.json.schema.ErrorCollector
1212
import io.github.optimumcode.json.schema.OutputCollector
1313
import io.github.optimumcode.json.schema.ValidationError
14-
import io.github.optimumcode.json.schema.ValidationOutput.Detailed
15-
import io.github.optimumcode.json.schema.ValidationOutput.Flag
16-
import io.github.optimumcode.json.schema.ValidationOutput.Verbose
14+
import io.github.optimumcode.json.schema.ValidationOutput
1715
import io.github.optimumcode.json.schema.fromStream
1816
import io.openapiprocessor.jackson.JacksonConverter
1917
import io.openapiprocessor.jsonschema.reader.UriReader
@@ -133,17 +131,17 @@ abstract class AbstractComparisonBenchmark {
133131
}
134132

135133
@Benchmark
136-
fun validateKmpFlag(): Flag {
134+
fun validateKmpFlag(): ValidationOutput.Flag {
137135
return schema.validate(document, OutputCollector.flag())
138136
}
139137

140138
@Benchmark
141-
fun validateKmpDetailed(): Detailed {
139+
fun validateKmpDetailed(): ValidationOutput.OutputUnit {
142140
return schema.validate(document, OutputCollector.detailed())
143141
}
144142

145143
@Benchmark
146-
fun validateKmpVerbose(): Verbose {
144+
fun validateKmpVerbose(): ValidationOutput.OutputUnit {
147145
return schema.validate(document, OutputCollector.verbose())
148146
}
149147
}

src/commonMain/kotlin/io/github/optimumcode/json/schema/OutputCollector.kt

Lines changed: 32 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ package io.github.optimumcode.json.schema
33
import io.github.optimumcode.json.pointer.JsonPointer
44
import io.github.optimumcode.json.pointer.plus
55
import io.github.optimumcode.json.pointer.relative
6-
import io.github.optimumcode.json.schema.ValidationOutput.BasicError
7-
import io.github.optimumcode.json.schema.ValidationOutput.Detailed
8-
import io.github.optimumcode.json.schema.ValidationOutput.Verbose
6+
import io.github.optimumcode.json.schema.ValidationOutput.OutputUnit
97
import kotlin.jvm.JvmStatic
108

119
internal typealias OutputErrorTransformer<T> = OutputCollector<T>.(ValidationError) -> ValidationError?
@@ -24,10 +22,10 @@ public sealed class OutputCollector<T> private constructor(
2422
public fun basic(): OutputCollector<ValidationOutput.Basic> = Basic()
2523

2624
@JvmStatic
27-
public fun detailed(): OutputCollector<ValidationOutput.Detailed> = Detailed()
25+
public fun detailed(): OutputCollector<OutputUnit> = Detailed()
2826

2927
@JvmStatic
30-
public fun verbose(): OutputCollector<ValidationOutput.Verbose> = Verbose()
28+
public fun verbose(): OutputCollector<OutputUnit> = Verbose()
3129
}
3230

3331
public abstract val output: T
@@ -195,16 +193,16 @@ public sealed class OutputCollector<T> private constructor(
195193
private val parent: Basic? = null,
196194
transformer: OutputErrorTransformer<ValidationOutput.Basic> = NO_TRANSFORMATION,
197195
) : OutputCollector<ValidationOutput.Basic>(parent, transformer) {
198-
private lateinit var errors: MutableSet<BasicError>
196+
private lateinit var errors: MutableSet<OutputUnit>
199197

200-
private fun addError(error: BasicError) {
198+
private fun addError(error: OutputUnit) {
201199
if (!::errors.isInitialized) {
202200
errors = linkedSetOf()
203201
}
204202
errors.add(error)
205203
}
206204

207-
private fun addErrors(errors: MutableSet<BasicError>) {
205+
private fun addErrors(errors: MutableSet<OutputUnit>) {
208206
if (::errors.isInitialized) {
209207
this.errors.addAll(errors)
210208
} else {
@@ -215,7 +213,8 @@ public sealed class OutputCollector<T> private constructor(
215213
override fun onError(error: ValidationError) {
216214
val err = transformError(error) ?: return
217215
addError(
218-
BasicError(
216+
OutputUnit(
217+
valid = false,
219218
keywordLocation = err.schemaPath,
220219
instanceLocation = err.objectPath,
221220
absoluteKeywordLocation = err.absoluteLocation,
@@ -261,11 +260,11 @@ public sealed class OutputCollector<T> private constructor(
261260
private val parent: Detailed? = null,
262261
private val absoluteLocation: AbsoluteLocation? = null,
263262
private val collapse: Boolean = true,
264-
transformer: OutputErrorTransformer<ValidationOutput.Detailed> = NO_TRANSFORMATION,
265-
) : OutputCollector<ValidationOutput.Detailed>(parent, transformer) {
266-
private lateinit var results: MutableSet<ValidationOutput.Detailed>
263+
transformer: OutputErrorTransformer<OutputUnit> = NO_TRANSFORMATION,
264+
) : OutputCollector<OutputUnit>(parent, transformer) {
265+
private lateinit var results: MutableSet<OutputUnit>
267266

268-
private fun addResult(result: ValidationOutput.Detailed) {
267+
private fun addResult(result: OutputUnit) {
269268
if (result.valid) {
270269
// do not add valid
271270
return
@@ -276,11 +275,11 @@ public sealed class OutputCollector<T> private constructor(
276275
results.add(result)
277276
}
278277

279-
override val output: ValidationOutput.Detailed
278+
override val output: OutputUnit
280279
get() {
281280
if (!::results.isInitialized) {
282281
// variable is uninitialized only if all results are valid
283-
return Detailed(
282+
return OutputUnit(
284283
valid = true,
285284
keywordLocation = keywordLocation,
286285
instanceLocation = location,
@@ -292,7 +291,7 @@ public sealed class OutputCollector<T> private constructor(
292291
return if (failed.size == 1 && collapse) {
293292
failed.single()
294293
} else {
295-
Detailed(
294+
OutputUnit(
296295
valid = false,
297296
keywordLocation = keywordLocation,
298297
absoluteKeywordLocation = absoluteLocation,
@@ -333,12 +332,10 @@ public sealed class OutputCollector<T> private constructor(
333332
)
334333
}
335334

336-
override fun childCollector(): OutputCollector<ValidationOutput.Detailed> =
335+
override fun childCollector(): OutputCollector<OutputUnit> =
337336
Detailed(location, keywordLocation, this, absoluteLocation)
338337

339-
override fun withErrorTransformer(
340-
transformer: OutputErrorTransformer<ValidationOutput.Detailed>,
341-
): OutputCollector<ValidationOutput.Detailed> =
338+
override fun withErrorTransformer(transformer: OutputErrorTransformer<OutputUnit>): OutputCollector<OutputUnit> =
342339
Detailed(location, keywordLocation, parent, absoluteLocation, collapse, transformer = transformer)
343340

344341
override fun reportErrors() {
@@ -348,7 +345,7 @@ public sealed class OutputCollector<T> private constructor(
348345
override fun onError(error: ValidationError) {
349346
val err = transformError(error) ?: return
350347
addResult(
351-
Detailed(
348+
OutputUnit(
352349
valid = false,
353350
instanceLocation = err.objectPath,
354351
keywordLocation = err.schemaPath,
@@ -364,22 +361,22 @@ public sealed class OutputCollector<T> private constructor(
364361
private val keywordLocation: JsonPointer = JsonPointer.ROOT,
365362
private val parent: Verbose? = null,
366363
private val absoluteLocation: AbsoluteLocation? = null,
367-
transformer: OutputErrorTransformer<ValidationOutput.Verbose> = NO_TRANSFORMATION,
368-
) : OutputCollector<ValidationOutput.Verbose>(parent, transformer) {
369-
private val results: MutableList<ValidationOutput.Verbose> = ArrayList(1)
364+
transformer: OutputErrorTransformer<OutputUnit> = NO_TRANSFORMATION,
365+
) : OutputCollector<OutputUnit>(parent, transformer) {
366+
private val errors: MutableList<OutputUnit> = ArrayList(1)
370367

371-
private fun addResult(result: ValidationOutput.Verbose) {
368+
private fun addResult(result: OutputUnit) {
372369
// init hashCode to reduce overhead in future
373370
result.hashCode()
374-
results.add(result)
371+
errors.add(result)
375372
}
376373

377-
override val output: ValidationOutput.Verbose
374+
override val output: OutputUnit
378375
get() {
379-
if (results.size == 1) {
376+
if (errors.size == 1) {
380377
// when this is a leaf we should return the reported error
381378
// instead of creating a new node
382-
val childError = results.single()
379+
val childError = errors.single()
383380
if (
384381
childError.errors.isEmpty() &&
385382
childError.let {
@@ -389,12 +386,12 @@ public sealed class OutputCollector<T> private constructor(
389386
return childError
390387
}
391388
}
392-
return Verbose(
393-
valid = results.none { !it.valid },
389+
return OutputUnit(
390+
valid = errors.none { !it.valid },
394391
keywordLocation = keywordLocation,
395392
absoluteKeywordLocation = absoluteLocation,
396393
instanceLocation = location,
397-
errors = results.toSet(),
394+
errors = errors.toSet(),
398395
)
399396
}
400397

@@ -429,13 +426,11 @@ public sealed class OutputCollector<T> private constructor(
429426
)
430427
}
431428

432-
override fun childCollector(): OutputCollector<ValidationOutput.Verbose> {
429+
override fun childCollector(): OutputCollector<OutputUnit> {
433430
return Verbose(location, keywordLocation, this, absoluteLocation)
434431
}
435432

436-
override fun withErrorTransformer(
437-
transformer: OutputErrorTransformer<ValidationOutput.Verbose>,
438-
): OutputCollector<ValidationOutput.Verbose> =
433+
override fun withErrorTransformer(transformer: OutputErrorTransformer<OutputUnit>): OutputCollector<OutputUnit> =
439434
Verbose(location, keywordLocation, parent, absoluteLocation, transformer)
440435

441436
override fun reportErrors() {
@@ -445,7 +440,7 @@ public sealed class OutputCollector<T> private constructor(
445440
override fun onError(error: ValidationError) {
446441
val err = transformError(error) ?: return
447442
addResult(
448-
Verbose(
443+
OutputUnit(
449444
valid = false,
450445
instanceLocation = err.objectPath,
451446
keywordLocation = err.schemaPath,

0 commit comments

Comments
 (0)