com.networknt.schema.Format Maven / Gradle / Ivy
Show all versions of json-schema-validator Show documentation
/*
* Copyright (c) 2016 Network New Technologies Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.networknt.schema;
import java.util.Collections;
import java.util.Set;
import java.util.function.Supplier;
import com.fasterxml.jackson.databind.JsonNode;
/**
* Used to implement the various formats for the format keyword.
*
* Simple implementations need only override {@link #matches(ExecutionContext, String)}.
*/
public interface Format {
/**
* Gets the format name.
*
* @return the format name as referred to in a json schema format node.
*/
String getName();
/**
* Gets the message key to use for the message.
*
* See jsv-messages.properties.
*
* The following are the arguments.
* {0} The instance location
* {1} The format name
* {2} The error message description
* {3} The input value
*
* @return the message key
*/
default String getMessageKey() {
return "format";
}
/**
* Gets the error message description.
*
* Deprecated. Override getMessageKey() and set the localized message in the
* resource bundle or message source.
*
* @return the error message description.
*/
@Deprecated
default String getErrorMessageDescription() {
return "";
}
/**
* Determines if the value matches the format.
*
* This should be implemented for string node types.
*
* @param executionContext the execution context
* @param value to match
* @return true if matches
*/
default boolean matches(ExecutionContext executionContext, String value) {
return true;
}
/**
* Determines if the value matches the format.
*
* @param executionContext the execution context
* @param validationContext the validation context
* @param value to match
* @return true if matches
*/
default boolean matches(ExecutionContext executionContext, ValidationContext validationContext, String value) {
return matches(executionContext, value);
}
/**
* Determines if the value matches the format.
*
* @param executionContext the execution context
* @param validationContext the validation context
* @param value to match
* @return true if matches
*/
default boolean matches(ExecutionContext executionContext, ValidationContext validationContext, JsonNode value) {
JsonType nodeType = TypeFactory.getValueNodeType(value, validationContext.getConfig());
if (nodeType != JsonType.STRING) {
return true;
}
return matches(executionContext, validationContext, value.textValue());
}
/**
* Determines if the value matches the format.
*
* This can be implemented for non-string node types.
*
* @param executionContext the execution context
* @param validationContext the validation context
* @param node the node
* @param rootNode the root node
* @param instanceLocation the instance location
* @param assertionsEnabled if assertions are enabled
* @param formatValidator the format validator
* @return true if matches
*/
default boolean matches(ExecutionContext executionContext, ValidationContext validationContext, JsonNode node,
JsonNode rootNode, JsonNodePath instanceLocation, boolean assertionsEnabled, FormatValidator formatValidator) {
return matches(executionContext, validationContext, node);
}
/**
* Validates the format.
*
* This is the most flexible method to implement.
*
* @param executionContext the execution context
* @param validationContext the validation context
* @param node the node
* @param rootNode the root node
* @param instanceLocation the instance locaiton
* @param assertionsEnabled if assertions are enabled
* @param message the message builder
* @param formatValidator the format validator
* @return the messages
*/
default Set validate(ExecutionContext executionContext, ValidationContext validationContext,
JsonNode node, JsonNode rootNode, JsonNodePath instanceLocation, boolean assertionsEnabled,
Supplier message,
FormatValidator formatValidator) {
if (assertionsEnabled) {
if (!matches(executionContext, validationContext, node, rootNode, instanceLocation, assertionsEnabled,
formatValidator)) {
return Collections
.singleton(message.get()
.arguments(this.getName(), this.getErrorMessageDescription(), node.asText()).build());
}
}
return Collections.emptySet();
}
}