From 8547929b5972bba369b1dc27409115c773c9ee8d Mon Sep 17 00:00:00 2001 From: Dilip Krishnan Date: Tue, 2 Feb 2016 17:27:43 -0600 Subject: [PATCH] Split the plugin into seperate plugins for each of the annotations --- .../validators/plugins/BeanValidators.java | 39 ++++++ .../plugins/MinMaxAnnotationPlugin.java | 100 +++------------- .../plugins/NotNullAnnotationPlugin.java | 109 +---------------- .../plugins/SizeAnnotationPlugin.java | 111 +++--------------- .../schema/contexts/ModelPropertyContext.java | 15 ++- 5 files changed, 92 insertions(+), 282 deletions(-) diff --git a/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/BeanValidators.java b/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/BeanValidators.java index 9a40f2e2af0..e008f19855c 100644 --- a/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/BeanValidators.java +++ b/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/BeanValidators.java @@ -18,12 +18,51 @@ */ package springfox.bean.validators.plugins; +import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition; +import com.google.common.base.Optional; +import com.google.common.collect.FluentIterable; import org.springframework.core.Ordered; +import springfox.documentation.spi.schema.contexts.ModelPropertyContext; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; public class BeanValidators { public final static int BEAN_VALIDATOR_PLUGIN_ORDER = Ordered.HIGHEST_PRECEDENCE + 500; + private BeanValidators() { throw new UnsupportedOperationException(); } + public static Optional validatorFromBean( + ModelPropertyContext context, + Class annotationType) { + + Optional propertyDefinition = context.getBeanPropertyDefinition(); + Optional notNull = Optional.absent(); + if (propertyDefinition.isPresent()) { + notNull = FluentIterable + .from(propertyDefinition.get().getGetter().annotations()) + .filter(annotationType) + .first() + .or(FluentIterable + .from(propertyDefinition.get().getField().annotations()) + .filter(annotationType) + .first()); + } + return notNull; + } + + public static Optional validatorFromField( + ModelPropertyContext context, + Class annotationType) { + + Optional annotatedElement = context.getAnnotatedElement(); + Optional notNull = Optional.absent(); + if (annotatedElement.isPresent()) { + notNull = Optional.fromNullable(annotatedElement.get().getAnnotation(annotationType)); + } + return notNull; + } + } diff --git a/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/MinMaxAnnotationPlugin.java b/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/MinMaxAnnotationPlugin.java index 40bf36fd300..50055933cc6 100644 --- a/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/MinMaxAnnotationPlugin.java +++ b/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/MinMaxAnnotationPlugin.java @@ -18,14 +18,11 @@ */ package springfox.bean.validators.plugins; -import com.fasterxml.jackson.databind.introspect.AnnotatedField; -import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition; import com.google.common.base.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import springfox.documentation.builders.ModelPropertyBuilder; import springfox.documentation.service.AllowableRangeValues; import springfox.documentation.service.AllowableValues; import springfox.documentation.spi.DocumentationType; @@ -34,8 +31,8 @@ import javax.validation.constraints.Max; import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; + +import static springfox.bean.validators.plugins.BeanValidators.*; @Component @Order(BeanValidators.BEAN_VALIDATOR_PLUGIN_ORDER) @@ -51,94 +48,33 @@ public boolean supports(DocumentationType delimiter) { @Override public void apply(ModelPropertyContext context) { - ModelPropertyBuilder mybuilder = context.getBuilder(); - - Optional beanPropDef = context.getBeanPropertyDefinition(); - BeanPropertyDefinition beanDef = beanPropDef.get(); - AnnotatedField field = beanDef.getField(); - - if (field != null) { - - // add support for @NotNull - addRequiredForNotNull(mybuilder, field); - - AllowableValues myvalues = null; - - // add support for @Size - Size mySize = field.getAnnotation(Size.class); - - if (mySize != null) { - myvalues = createAllowableValuesFromSizeForStrings(field, mySize); - - } else { - // add support for @Min/@Max - Min myMin = field.getAnnotation(Min.class); - Max myMax = field.getAnnotation(Max.class); - if (myMin != null || myMax != null) { - myvalues = createAllowableValuesFromMinMaxForNumbers(field, myMin, myMax); - } else { - - } - - } - - if (myvalues != null) { - mybuilder.allowableValues(myvalues); - } - - - } + Optional min = validatorFromBean(context, Min.class) + .or(validatorFromField(context, Min.class)); + Optional max = validatorFromBean(context, Max.class) + .or(validatorFromField(context, Max.class)); + // add support for @Min/@Max + context.getBuilder().allowableValues(createAllowableValuesFromMinMaxForNumbers(min, max)); } - private void addRequiredForNotNull(ModelPropertyBuilder mybuilder, AnnotatedField field) { - // add support for @NotNull - NotNull myNotNull = field.getAnnotation(NotNull.class); - if (myNotNull != null) { - LOG.debug("@NotNull detected: adding required to field " + field.getFullName()); - mybuilder.required(true); - } - } - - private AllowableValues createAllowableValuesFromSizeForStrings(AnnotatedField field, Size mySize) { - AllowableRangeValues myvalues = null; - - LOG.debug("@Size detected: adding MinLength/MaxLength to field " + field.getFullName()); - - if (mySize.min() > 0 && mySize.max() < Integer.MAX_VALUE) { - myvalues = new AllowableRangeValues(Integer.toString(mySize.min()), Integer.toString(mySize.max())); - - } else if (mySize.min() > 0) { - LOG.debug("@Size min detected: adding AllowableRangeValues to field " + field.getFullName()); - // use Max value until "infinity" works - myvalues = new AllowableRangeValues(Integer.toString(mySize.min()), Integer.toString(Integer.MAX_VALUE)); - - } else if (mySize.max() < Integer.MAX_VALUE) { - // use Min value until "infinity" works - LOG.debug("@Size max detected: adding AllowableRangeValues to field " + field.getFullName()); - myvalues = new AllowableRangeValues(Integer.toString(0), Integer.toString(mySize.max())); - } - - return myvalues; - } - private AllowableValues createAllowableValuesFromMinMaxForNumbers(AnnotatedField field, Min myMin, Max myMax) { + private AllowableValues createAllowableValuesFromMinMaxForNumbers(Optional min, Optional max) { AllowableRangeValues myvalues = null; - if (myMin != null && myMax != null) { - LOG.debug("@Min+@Max detected: adding AllowableRangeValues to field " + field.getFullName()); - myvalues = new AllowableRangeValues(Double.toString(myMin.value()), Double.toString(myMax.value())); + if (min.isPresent() && max.isPresent()) { + LOG.debug("@Min+@Max detected: adding AllowableRangeValues to field "); + myvalues = new AllowableRangeValues(Double.toString(min.get().value()), Double.toString(max.get().value())); - } else if (myMin != null) { - LOG.debug("@Min detected: adding AllowableRangeValues to field " + field.getFullName()); + } else if (min.isPresent()) { + LOG.debug("@Min detected: adding AllowableRangeValues to field "); // use Max value until "infinity" works - myvalues = new AllowableRangeValues(Double.toString(myMin.value()), Double.toString(Double.MAX_VALUE)); + myvalues = new AllowableRangeValues(Double.toString(min.get().value()), Double.toString(Double.MAX_VALUE)); - } else if (myMax != null) { + } else if (max.isPresent()) { // use Min value until "infinity" works - LOG.debug("@Max detected: adding AllowableRangeValues to field " + field.getFullName()); - myvalues = new AllowableRangeValues(Double.toString(Double.MIN_VALUE), Double.toString(myMax.value())); + LOG.debug("@Max detected: adding AllowableRangeValues to field "); + myvalues = new AllowableRangeValues(Double.toString(Double.MIN_VALUE), Double.toString(max.get().value())); } return myvalues; diff --git a/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/NotNullAnnotationPlugin.java b/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/NotNullAnnotationPlugin.java index a17febfaae3..7ec7f5dfb49 100644 --- a/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/NotNullAnnotationPlugin.java +++ b/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/NotNullAnnotationPlugin.java @@ -18,31 +18,21 @@ */ package springfox.bean.validators.plugins; -import com.fasterxml.jackson.databind.introspect.AnnotatedField; -import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition; import com.google.common.base.Optional; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import springfox.documentation.builders.ModelPropertyBuilder; -import springfox.documentation.service.AllowableRangeValues; -import springfox.documentation.service.AllowableValues; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.schema.ModelPropertyBuilderPlugin; import springfox.documentation.spi.schema.contexts.ModelPropertyContext; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; + +import static springfox.bean.validators.plugins.BeanValidators.*; @Component @Order(BeanValidators.BEAN_VALIDATOR_PLUGIN_ORDER) public class NotNullAnnotationPlugin implements ModelPropertyBuilderPlugin { - private static final Logger LOG = LoggerFactory.getLogger(NotNullAnnotationPlugin.class); - @Override public boolean supports(DocumentationType delimiter) { // we simply support all documentationTypes! @@ -51,98 +41,9 @@ public boolean supports(DocumentationType delimiter) { @Override public void apply(ModelPropertyContext context) { - ModelPropertyBuilder mybuilder = context.getBuilder(); - - Optional beanPropDef = context.getBeanPropertyDefinition(); - BeanPropertyDefinition beanDef = beanPropDef.get(); - AnnotatedField field = beanDef.getField(); - - if (field != null) { - - // add support for @NotNull - addRequiredForNotNull(mybuilder, field); - - AllowableValues myvalues = null; - - // add support for @Size - Size mySize = field.getAnnotation(Size.class); - - if (mySize != null) { - myvalues = createAllowableValuesFromSizeForStrings(field, mySize); - - } else { - // add support for @Min/@Max - Min myMin = field.getAnnotation(Min.class); - Max myMax = field.getAnnotation(Max.class); - if (myMin != null || myMax != null) { - myvalues = createAllowableValuesFromMinMaxForNumbers(field, myMin, myMax); - } else { - - } - - } - - if (myvalues != null) { - mybuilder.allowableValues(myvalues); - } - - - } - - + Optional notNull = validatorFromBean(context, NotNull.class) + .or(validatorFromField(context, NotNull.class)); + context.getBuilder().required(notNull.isPresent()); } - private void addRequiredForNotNull(ModelPropertyBuilder mybuilder, AnnotatedField field) { - // add support for @NotNull - NotNull myNotNull = field.getAnnotation(NotNull.class); - if (myNotNull != null) { - LOG.debug("@NotNull detected: adding required to field " + field.getFullName()); - mybuilder.required(true); - } - } - - private AllowableValues createAllowableValuesFromSizeForStrings(AnnotatedField field, Size mySize) { - AllowableRangeValues myvalues = null; - - LOG.debug("@Size detected: adding MinLength/MaxLength to field " + field.getFullName()); - - if (mySize.min() > 0 && mySize.max() < Integer.MAX_VALUE) { - myvalues = new AllowableRangeValues(Integer.toString(mySize.min()), Integer.toString(mySize.max())); - - } else if (mySize.min() > 0) { - LOG.debug("@Size min detected: adding AllowableRangeValues to field " + field.getFullName()); - // use Max value until "infinity" works - myvalues = new AllowableRangeValues(Integer.toString(mySize.min()), Integer.toString(Integer.MAX_VALUE)); - - } else if (mySize.max() < Integer.MAX_VALUE) { - // use Min value until "infinity" works - LOG.debug("@Size max detected: adding AllowableRangeValues to field " + field.getFullName()); - myvalues = new AllowableRangeValues(Integer.toString(0), Integer.toString(mySize.max())); - } - - return myvalues; - } - - private AllowableValues createAllowableValuesFromMinMaxForNumbers(AnnotatedField field, Min myMin, Max myMax) { - AllowableRangeValues myvalues = null; - - if (myMin != null && myMax != null) { - LOG.debug("@Min+@Max detected: adding AllowableRangeValues to field " + field.getFullName()); - myvalues = new AllowableRangeValues(Double.toString(myMin.value()), Double.toString(myMax.value())); - - } else if (myMin != null) { - LOG.debug("@Min detected: adding AllowableRangeValues to field " + field.getFullName()); - // use Max value until "infinity" works - myvalues = new AllowableRangeValues(Double.toString(myMin.value()), Double.toString(Double.MAX_VALUE)); - - } else if (myMax != null) { - // use Min value until "infinity" works - LOG.debug("@Max detected: adding AllowableRangeValues to field " + field.getFullName()); - myvalues = new AllowableRangeValues(Double.toString(Double.MIN_VALUE), Double.toString(myMax.value())); - - } - return myvalues; - } - - } diff --git a/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/SizeAnnotationPlugin.java b/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/SizeAnnotationPlugin.java index f5133b1c2cb..b319fc5c5b6 100644 --- a/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/SizeAnnotationPlugin.java +++ b/springfox-bean-validators/src/main/java/springfox/bean/validators/plugins/SizeAnnotationPlugin.java @@ -18,25 +18,21 @@ */ package springfox.bean.validators.plugins; -import com.fasterxml.jackson.databind.introspect.AnnotatedField; -import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition; import com.google.common.base.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import springfox.documentation.builders.ModelPropertyBuilder; import springfox.documentation.service.AllowableRangeValues; import springfox.documentation.service.AllowableValues; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.schema.ModelPropertyBuilderPlugin; import springfox.documentation.spi.schema.contexts.ModelPropertyContext; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import static springfox.bean.validators.plugins.BeanValidators.*; + @Component @Order(BeanValidators.BEAN_VALIDATOR_PLUGIN_ORDER) public class SizeAnnotationPlugin implements ModelPropertyBuilderPlugin { @@ -51,97 +47,28 @@ public boolean supports(DocumentationType delimiter) { @Override public void apply(ModelPropertyContext context) { - ModelPropertyBuilder mybuilder = context.getBuilder(); - - Optional beanPropDef = context.getBeanPropertyDefinition(); - BeanPropertyDefinition beanDef = beanPropDef.get(); - AnnotatedField field = beanDef.getField(); - - if (field != null) { - - // add support for @NotNull - addRequiredForNotNull(mybuilder, field); - - AllowableValues myvalues = null; - - // add support for @Size - Size mySize = field.getAnnotation(Size.class); - - if (mySize != null) { - myvalues = createAllowableValuesFromSizeForStrings(field, mySize); - - } else { - // add support for @Min/@Max - Min myMin = field.getAnnotation(Min.class); - Max myMax = field.getAnnotation(Max.class); - if (myMin != null || myMax != null) { - myvalues = createAllowableValuesFromMinMaxForNumbers(field, myMin, myMax); - } else { - - } - - } - - if (myvalues != null) { - mybuilder.allowableValues(myvalues); - } - + Optional size = validatorFromBean(context, Size.class) + .or(validatorFromField(context, Size.class)); + if (size.isPresent()) { + context.getBuilder().allowableValues(createAllowableValuesFromSizeForStrings(size.get())); } - - } - private void addRequiredForNotNull(ModelPropertyBuilder mybuilder, AnnotatedField field) { - // add support for @NotNull - NotNull myNotNull = field.getAnnotation(NotNull.class); - if (myNotNull != null) { - LOG.debug("@NotNull detected: adding required to field " + field.getFullName()); - mybuilder.required(true); - } - } - - private AllowableValues createAllowableValuesFromSizeForStrings(AnnotatedField field, Size mySize) { - AllowableRangeValues myvalues = null; - - LOG.debug("@Size detected: adding MinLength/MaxLength to field " + field.getFullName()); - - if (mySize.min() > 0 && mySize.max() < Integer.MAX_VALUE) { - myvalues = new AllowableRangeValues(Integer.toString(mySize.min()), Integer.toString(mySize.max())); - - } else if (mySize.min() > 0) { - LOG.debug("@Size min detected: adding AllowableRangeValues to field " + field.getFullName()); - // use Max value until "infinity" works - myvalues = new AllowableRangeValues(Integer.toString(mySize.min()), Integer.toString(Integer.MAX_VALUE)); - - } else if (mySize.max() < Integer.MAX_VALUE) { - // use Min value until "infinity" works - LOG.debug("@Size max detected: adding AllowableRangeValues to field " + field.getFullName()); - myvalues = new AllowableRangeValues(Integer.toString(0), Integer.toString(mySize.max())); - } - - return myvalues; - } - - private AllowableValues createAllowableValuesFromMinMaxForNumbers(AnnotatedField field, Min myMin, Max myMax) { - AllowableRangeValues myvalues = null; - - if (myMin != null && myMax != null) { - LOG.debug("@Min+@Max detected: adding AllowableRangeValues to field " + field.getFullName()); - myvalues = new AllowableRangeValues(Double.toString(myMin.value()), Double.toString(myMax.value())); - - } else if (myMin != null) { - LOG.debug("@Min detected: adding AllowableRangeValues to field " + field.getFullName()); - // use Max value until "infinity" works - myvalues = new AllowableRangeValues(Double.toString(myMin.value()), Double.toString(Double.MAX_VALUE)); - - } else if (myMax != null) { - // use Min value until "infinity" works - LOG.debug("@Max detected: adding AllowableRangeValues to field " + field.getFullName()); - myvalues = new AllowableRangeValues(Double.toString(Double.MIN_VALUE), Double.toString(myMax.value())); - + private AllowableValues createAllowableValuesFromSizeForStrings(Size size) { + AllowableRangeValues range = null; + LOG.debug("@Size detected: adding MinLength/MaxLength to field"); + + if (size.min() > 0 && size.max() < Integer.MAX_VALUE) { + range = new AllowableRangeValues(Integer.toString(size.min()), Integer.toString(size.max())); + } else if (size.min() > 0) { + LOG.debug("@Size min detected: adding AllowableRangeValues to field"); + range = new AllowableRangeValues(Integer.toString(size.min()), Integer.toString(Integer.MAX_VALUE)); + } else if (size.max() < Integer.MAX_VALUE) { + LOG.debug("@Size max detected: adding AllowableRangeValues to field"); + range = new AllowableRangeValues(Integer.toString(0), Integer.toString(size.max())); } - return myvalues; + return range; } diff --git a/springfox-spi/src/main/java/springfox/documentation/spi/schema/contexts/ModelPropertyContext.java b/springfox-spi/src/main/java/springfox/documentation/spi/schema/contexts/ModelPropertyContext.java index 141fc2bbfbe..7b5c4ab7c18 100644 --- a/springfox-spi/src/main/java/springfox/documentation/spi/schema/contexts/ModelPropertyContext.java +++ b/springfox-spi/src/main/java/springfox/documentation/spi/schema/contexts/ModelPropertyContext.java @@ -34,8 +34,12 @@ public class ModelPropertyContext { private final Optional annotatedElement; private final DocumentationType documentationType; - public ModelPropertyContext(ModelPropertyBuilder builder, AnnotatedElement annotatedElement, - TypeResolver resolver, DocumentationType documentationType) { + public ModelPropertyContext( + ModelPropertyBuilder builder, + AnnotatedElement annotatedElement, + TypeResolver resolver, + DocumentationType documentationType) { + this.builder = builder; this.resolver = resolver; this.annotatedElement = Optional.fromNullable(annotatedElement); @@ -43,8 +47,11 @@ public ModelPropertyContext(ModelPropertyBuilder builder, AnnotatedElement annot this.documentationType = documentationType; } - public ModelPropertyContext(ModelPropertyBuilder builder, BeanPropertyDefinition beanPropertyDefinition, - TypeResolver resolver, DocumentationType documentationType) { + public ModelPropertyContext( + ModelPropertyBuilder builder, + BeanPropertyDefinition beanPropertyDefinition, + TypeResolver resolver, + DocumentationType documentationType) { this.builder = builder; this.resolver = resolver;