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
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.commercetools.rmf.validators

import io.vrap.rmf.raml.model.types.ObjectType
import org.eclipse.emf.common.util.Diagnostic
import java.util.ArrayList
import java.util.Locale

@ValidatorSet
class DiscriminatedSubtypeRule(severity: RuleSeverity, options: List<RuleOption>? = null) : TypesRule(severity, options) {

// implement
private val exclude: List<String> =
(options?.filter { ruleOption -> ruleOption.type.lowercase(Locale.getDefault()) == RuleOptionType.EXCLUDE.toString() }?.map { ruleOption -> ruleOption.value }?.plus("") ?: defaultExcludes)

// implement
override fun caseObjectType(type: ObjectType): List<Diagnostic> {
val validationResults: MutableList<Diagnostic> = ArrayList()

val parent = type.type
if (!type.isInlineType && parent != null && (parent as ObjectType).discriminator != null && type.discriminatorValue == null && exclude.contains(type.name).not()) {
validationResults.add(create(type,
"Discriminator was added to supertype, it should be set to not null for all subtypes. Discriminator is set to null for subtype: {0}, while there is a discriminator for parent type: {1}",
type.name, parent.name))
}

return validationResults
}

companion object : ValidatorFactory<DiscriminatedSubtypeRule> {
private val defaultExcludes by lazy { listOf("") }

@JvmStatic
override fun create(options: List<RuleOption>?): DiscriminatedSubtypeRule {
return DiscriminatedSubtypeRule(RuleSeverity.ERROR, options)
}

@JvmStatic
override fun create(severity: RuleSeverity, options: List<RuleOption>?): DiscriminatedSubtypeRule {
return DiscriminatedSubtypeRule(severity, options)
} }
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,16 @@ class ValidatorRulesTest extends Specification implements ValidatorFixtures {
result.validationResults[0].message == "Discriminator and DiscriminatorValue property defined in the same type: InvalidFooBaz"
}

def "discriminator subtype rule"() {
def validators = Arrays.asList(new TypesValidator(Arrays.asList(DiscriminatedSubtypeRule.create(emptyList()))))
def uri = uriFromClasspath("/discriminatorsubtype-rule.raml")
when:
def result = new RamlModelBuilder(validators).buildApi(uri)
then:
result.validationResults.size() == 1
result.validationResults[0].message == "Discriminator was added to supertype, it should be set to not null for all subtypes. Discriminator is set to null for subtype: InvalidFoo, while there is a discriminator for parent type: Foo"
}

def "filename rule"() {
when:
def validators = Arrays.asList(new ModulesValidator(Arrays.asList(FilenameRule.create(emptyList()))))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#%RAML 1.0
title: discriminator parent rule

types:
Foo:
description: Foo
type: object
discriminator: type
properties:
type: string
FooBar:
description: FooBar
type: Foo
discriminatorValue: foobar
InvalidFoo:
description: FooBar
type: Foo
properties:
type: string
ValidProperty:
type: object
properties:
foo:
type: Foo
description: foo
fooBar:
type: FooBar
description: foobar

/test:
post:
body:
application/json:
type: Foo
description: foo
Loading