package org.springframework.roo.classpath.operations.jsr303;
import static org.springframework.roo.model.Jsr303JavaType.DIGITS;
import static org.springframework.roo.model.Jsr303JavaType.MAX;
import static org.springframework.roo.model.Jsr303JavaType.MIN;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.Validate;
import org.springframework.roo.classpath.details.annotations.AnnotationAttributeValue;
import org.springframework.roo.classpath.details.annotations.AnnotationMetadataBuilder;
import org.springframework.roo.classpath.details.annotations.IntegerAttributeValue;
import org.springframework.roo.classpath.details.annotations.LongAttributeValue;
import org.springframework.roo.model.JavaSymbolName;
import org.springframework.roo.model.JavaType;
import org.springframework.roo.model.JdkJavaType;
import org.springframework.roo.model.SpringJavaType;
public class NumericField extends StringOrNumericField {
/**
* Whether the JSR 303 @Digits annotation will be added (you must also set
* digitsInteger)
*/
private Integer digitsFraction;
/**
* Whether the JSR 303 @Digits annotation will be added (you must also set
* digitsFractional)
*/
private Integer digitsInteger;
/** Whether the JSR 303 @Max annotation will be added */
private Long max;
/** Whether the JSR 303 @Min annotation will be added */
private Long min;
public NumericField(final String physicalTypeIdentifier, final JavaType fieldType,
final JavaSymbolName fieldName) {
super(physicalTypeIdentifier, fieldType, fieldName);
}
@Override
public void decorateAnnotationsList(final List<AnnotationMetadataBuilder> annotations) {
super.decorateAnnotationsList(annotations);
if (min != null) {
final List<AnnotationAttributeValue<?>> attrs = new ArrayList<AnnotationAttributeValue<?>>();
attrs.add(new LongAttributeValue(new JavaSymbolName("value"), min));
annotations.add(new AnnotationMetadataBuilder(MIN, attrs));
}
if (max != null) {
final List<AnnotationAttributeValue<?>> attrs = new ArrayList<AnnotationAttributeValue<?>>();
attrs.add(new LongAttributeValue(new JavaSymbolName("value"), max));
annotations.add(new AnnotationMetadataBuilder(MAX, attrs));
}
Validate.isTrue(isDigitsSetCorrectly(),
"Validation constraints for @Digit are not correctly set");
if (digitsInteger != null) {
final List<AnnotationAttributeValue<?>> attrs = new ArrayList<AnnotationAttributeValue<?>>();
attrs.add(new IntegerAttributeValue(new JavaSymbolName("integer"), digitsInteger));
attrs.add(new IntegerAttributeValue(new JavaSymbolName("fraction"), digitsFraction));
annotations.add(new AnnotationMetadataBuilder(DIGITS, attrs));
}
// Always add a default @NumberFormat
annotations.add(new AnnotationMetadataBuilder(SpringJavaType.NUMBER_FORMAT));
}
public Integer getDigitsFraction() {
return digitsFraction;
}
public Integer getDigitsInteger() {
return digitsInteger;
}
public Long getMax() {
return max;
}
public Long getMin() {
return min;
}
public boolean isDigitsSetCorrectly() {
return digitsInteger == null && digitsFraction == null || digitsInteger != null
&& digitsFraction != null;
}
public void setDigitsFraction(final Integer digitsFractional) {
digitsFraction = digitsFractional;
}
public void setDigitsInteger(final Integer digitsInteger) {
this.digitsInteger = digitsInteger;
}
public void setMax(final Long max) {
if (JdkJavaType.isDoubleOrFloat(getFieldType())) {
LOGGER.warning("@Max constraint is not supported for double or float fields");
}
this.max = max;
}
public void setMin(final Long min) {
if (JdkJavaType.isDoubleOrFloat(getFieldType())) {
LOGGER.warning("@Min constraint is not supported for double or float fields");
}
this.min = min;
}
}