CapacityValidator.java
package com.cloudforge.core.config;
/**
* Validates that maxCapacity >= minCapacity for scaling configurations.
*
* <p>This validator ensures consistent capacity settings for auto-scaling groups,
* ECS services, and other scalable resources.</p>
*
* <h2>Usage:</h2>
* <pre>{@code
* @ConfigField(
* displayName = "Maximum Capacity",
* validators = {"CapacityValidator"}
* )
* public int maxCapacity = 10;
* }</pre>
*
* <h2>Validation Logic:</h2>
* <ul>
* <li>Looks for fields named "minCapacity" and "maxCapacity"</li>
* <li>If both exist, validates maxCapacity >= minCapacity</li>
* <li>Skips validation if either field is missing or null</li>
* </ul>
*
* @since 3.0.0
*/
public class CapacityValidator implements FieldValidator {
@Override
public ValidationResult validate(ConfigFieldInfo field, Object value, Object config) {
if (config == null || value == null) {
return ValidationResult.ok();
}
// Only validate if this is maxCapacity field
if (!field.fieldName().equals("maxCapacity")) {
return ValidationResult.ok();
}
try {
// Get minCapacity from config
java.lang.reflect.Field minCapacityField = config.getClass().getDeclaredField("minCapacity");
minCapacityField.setAccessible(true);
Object minCapacityValue = minCapacityField.get(config);
if (minCapacityValue == null) {
return ValidationResult.ok();
}
// Compare as numbers
int maxCapacity = ((Number) value).intValue();
int minCapacity = ((Number) minCapacityValue).intValue();
if (maxCapacity < minCapacity) {
return ValidationResult.error(
"Maximum Capacity (" + maxCapacity + ") must be >= Minimum Capacity (" + minCapacity + ")"
);
}
return ValidationResult.ok();
} catch (NoSuchFieldException e) {
// minCapacity field doesn't exist - skip validation
return ValidationResult.ok();
} catch (Exception e) {
// Other reflection errors - log but don't fail
System.err.println("Warning: CapacityValidator failed: " + e.getMessage());
return ValidationResult.ok();
}
}
}