Skip to content

Commit

Permalink
Add oneOfStrings validator annotation for configuration validation
Browse files Browse the repository at this point in the history
  • Loading branch information
woop committed Apr 16, 2020
1 parent 6587b72 commit 204b05b
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 13 deletions.
20 changes: 7 additions & 13 deletions core/src/main/java/feast/core/config/FeastProperties.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
package feast.core.config;

import feast.core.config.FeastProperties.StreamProperties.FeatureStreamOptions;
import feast.core.validators.OneOfStrings;
import java.util.*;
import javax.annotation.PostConstruct;
import javax.validation.*;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
Expand Down Expand Up @@ -130,7 +130,9 @@ public feast.core.job.Runner getType() {
public static class StreamProperties {

/* Feature stream type. Only "kafka" is supported. */
@NotBlank private String type;
@OneOfStrings({"kafka"})
@NotBlank
private String type;

/* Feature stream options */
@NotNull private FeatureStreamOptions options;
Expand All @@ -157,16 +159,6 @@ public static class FeatureStreamOptions {
}
}

/**
* Validates whether stream options are correct.
*
* @return Boolean used for assertion
*/
@AssertTrue
public boolean isValidStreamTypeSelected() {
return Objects.equals(getStream().getType(), "kafka");
}

/** Feast population job metrics */
@Getter
@Setter
Expand All @@ -176,7 +168,9 @@ public static class MetricsProperties {
private boolean enabled;

/* Metric type. Possible options: statsd */
@NotBlank private String type;
@OneOfStrings({"statsd"})
@NotBlank
private String type;

/* Host of metric sink */
@URL private String host;
Expand Down
51 changes: 51 additions & 0 deletions core/src/main/java/feast/core/validators/OneOfStringValidator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright 2018-2020 The Feast Authors
*
* 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
*
* https://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 feast.core.validators;

import java.util.Arrays;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/** Validates whether a string value is found within a collection. */
public class OneOfStringValidator implements ConstraintValidator<OneOfStrings, String> {

/** Values that are permitted for a specific instance of this validator */
String[] allowedValues;

/**
* Initialize the OneOfStringValidator with a collection of allowed String values.
*
* @param constraintAnnotation
*/
@Override
public void initialize(OneOfStrings constraintAnnotation) {
allowedValues = constraintAnnotation.value();
}

/**
* Validates whether a string value is found within the collection defined in the annotation.
*
* @param value String value that should be validated
* @param context Provides contextual data and operation when applying a given constraint
* validator
* @return Boolean value indicating whether the string is found within the allowed values.
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return Arrays.asList(allowedValues).contains(value);
}
}
49 changes: 49 additions & 0 deletions core/src/main/java/feast/core/validators/OneOfStrings.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright 2018-2020 The Feast Authors
*
* 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
*
* https://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 feast.core.validators;

import java.lang.annotation.*;
import javax.validation.Constraint;
import javax.validation.Payload;

/**
* Annotation for String "one of" validation. Allows for the definition of a collection through an
* annotation. The collection is used to test values defined in the object.
*/
@Target({
ElementType.METHOD,
ElementType.FIELD,
ElementType.ANNOTATION_TYPE,
ElementType.CONSTRUCTOR,
ElementType.PARAMETER
})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = OneOfStringValidator.class)
public @interface OneOfStrings {
/** @return Default error message that is returned if the incorrect value is set */
String message() default "Field value must be one of the following: {value}";

/** Allows for the specification of validation groups to which this constraint belongs. */
Class<?>[] groups() default {};

/** An attribute payload that can be used to assign custom payload objects to a constraint. */
Class<? extends Payload>[] payload() default {};

/** @return Default value that is returned if no allowed values are configured */
String[] value() default {};
}

0 comments on commit 204b05b

Please sign in to comment.