All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.reprezen.kaizen.oasparser.val3.SchemaValidator Maven / Gradle / Ivy

/*******************************************************************************
 *  Copyright (c) 2017 ModelSolv, Inc. and others.
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *
 *  Contributors:
 *     ModelSolv, Inc. - initial API and implementation and/or initial documentation
 *******************************************************************************/
package com.reprezen.kaizen.oasparser.val3;

import static com.reprezen.kaizen.oasparser.val.Messages.m;

import com.google.inject.Inject;
import com.reprezen.jsonoverlay.Overlay;
import com.reprezen.kaizen.oasparser.model3.Example;
import com.reprezen.kaizen.oasparser.model3.ExternalDocs;
import com.reprezen.kaizen.oasparser.model3.Schema;
import com.reprezen.kaizen.oasparser.model3.Xml;
import com.reprezen.kaizen.oasparser.val.ObjectValidatorBase;
import com.reprezen.kaizen.oasparser.val.ValidationResults;
import com.reprezen.kaizen.oasparser.val.Validator;

public class SchemaValidator extends ObjectValidatorBase {

	@Inject
	private Validator xmlValidator;
	@Inject
	private Validator externalDocsValidator;
	@Inject
	private Validator exampleValidator;

	@Override
	public void validateObject(Schema schema, ValidationResults results) {
		// no validation for: title, description, maximum, exclusiveMaximum, minimum
		// exclusiveMinimum, uniqueItems,
		// nullable, example, deprecated
		validatePositive(schema.getMultipleOf(), results, false, "multipleOf");
		validateNonNegative(schema.getMaxLength(), results, false, "maxLength");
		validateNonNegative(schema.getMinLength(), results, false, "minLength");
		validatePattern(schema.getPattern(), results, false, "pattern");
		validateNonNegative(schema.getMaximum(), results, false, "maxItems");
		validateNonNegative(schema.getMaximum(), results, false, "minItems");
		validateNonNegative(schema.getMaxProperties(), results, false, "maxProperties");
		validateNonNegative(schema.getMinProperties(), results, false, "minProperties");
		validateUnique(schema.getRequiredFields(), results, "required");
		validateList(schema.getEnums(), schema.hasEnums(), results, false, "enum", null);
		validateNonEmpty(schema.getEnums(), schema.hasEnums(), results, "enum");
		validateUnique(schema.getEnums(), results, "enum");
		validateString(schema.getType(), results, false, "boolean|object|array|number|integer|string", "type");
		validateList(schema.getAllOfSchemas(), schema.hasAllOfSchemas(), results, false, "allOf", this);
		validateList(schema.getOneOfSchemas(), schema.hasOneOfSchemas(), results, false, "oneOf", this);
		validateList(schema.getAnyOfSchemas(), schema.hasAnyOfSchemas(), results, false, "anyOf", this);
		if (schema.getNotSchema(false) != null && Overlay.of(schema.getNotSchema(false)).isPresent()) {
			validate(schema.getNotSchema(false), results, "not");
		}
		if (schema.getItemsSchema(false) != null && Overlay.of(schema.getItemsSchema(false)).isPresent()) {
			validate(schema.getItemsSchema(false), results, "items");
		}
		validateMap(schema.getProperties(), results, false, "properties", null, this);
		validateFormat(schema.getFormat(), schema.getType(), results, "format");
		validateDefault(schema.getDefault(), schema.getType(), results, "default");
		checkDiscriminator(schema, results, "discriminator");
		checkReadWrite(schema, results);
		validateField(schema.getXml(false), results, false, "xml", xmlValidator);
		validateField(schema.getExternalDocs(false), results, false, "externalDocs", externalDocsValidator);
		validateMap(schema.getExamples(), results, false, "examples", Regexes.NOEXT_NAME_REGEX, exampleValidator);
		validateExtensions(schema.getExtensions(), results);
	}

	private void checkDiscriminator(Schema schema, ValidationResults results, String crumb) {
		String discriminator = schema.getDiscriminator();
		if (discriminator != null) {
			if (!schema.getProperties().keySet().contains(discriminator)) {
				results.addError(m.msg("DiscNotProp|The discriminator is not a property of this schema", discriminator),
						crumb);
			}
			if (!schema.getRequiredFields().contains(discriminator)) {
				results.addError(
						m.msg("DiscNotReq|The discriminator property is not required in this schema", discriminator),
						crumb);
			}
		}
	}

	private void checkReadWrite(Schema schema, ValidationResults results) {
		if (schema.isReadOnly() && schema.isWriteOnly()) {
			// don't set crumb... this validation involves multiple fields so is tied to
			// schema
			results.addError(m.msg("ROnlyAndWOnly|Schema cannot be both ReadOnly and WriteOnly"));
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy