in src/main/java/org/apache/sling/feature/extension/apiregions/api/config/validation/FeatureValidator.java [119:205]
public FeatureValidationResult validate(final Feature feature, final ConfigurationApi api) {
final FeatureValidationResult result = new FeatureValidationResult();
if ( api == null ) {
throw new IllegalArgumentException();
}
cache.putAll(api.getFeatureToRegionCache());
cache.put(feature.getId(), api.detectRegion());
for(final Configuration config : feature.getConfigurations()) {
final RegionInfo regionInfo = getRegionInfo(feature, config, cache);
if ( regionInfo == null ) {
final ConfigurationValidationResult cvr = new ConfigurationValidationResult();
cvr.getErrors().add("Unable to properly validate configuration, region info cannot be determined");
result.getConfigurationResults().put(config.getPid(), cvr);
} else {
if ( config.isFactoryConfiguration() ) {
final FactoryConfigurationDescription desc = api.getFactoryConfigurationDescriptions().get(config.getFactoryPid());
if ( desc != null ) {
final Mode validationMode = desc.getMode() != null ? desc.getMode() : api.getMode();
final ConfigurationValidationResult r = configurationValidator.validate(config, desc, regionInfo.region, api.getMode());
result.getConfigurationResults().put(config.getPid(), r);
if ( regionInfo.region != Region.INTERNAL ) {
if ( desc.getOperations().isEmpty() ) {
ConfigurationValidator.setResult(r, validationMode, desc, "No operations allowed for " +
"factory configuration");
} else {
if ( regionInfo.isUpdate && !desc.getOperations().contains(Operation.UPDATE)) {
ConfigurationValidator.setResult(r, validationMode, desc, "Updating of factory " +
"configuration is not allowed");
} else if ( !regionInfo.isUpdate && !desc.getOperations().contains(Operation.CREATE)) {
ConfigurationValidator.setResult(r, validationMode, desc, "Creation of factory " +
"configuration is not allowed");
}
}
if ( desc.getInternalNames().contains(config.getName())) {
ConfigurationValidator.setResult(r, validationMode, desc, "Factory configuration with " +
"name is not allowed");
}
}
} else if ( regionInfo.region != Region.INTERNAL && api.isInternalFactoryConfiguration(config.getFactoryPid(), config.getName())) {
final ConfigurationValidationResult cvr = new ConfigurationValidationResult();
ConfigurationValidator.setResult(cvr, api.getMode(), desc, "Factory configuration is not " +
"allowed");
result.getConfigurationResults().put(config.getPid(), cvr);
}
} else {
final ConfigurationDescription desc = api.getConfigurationDescriptions().get(config.getPid());
if ( desc != null ) {
final ConfigurationValidationResult r = configurationValidator.validate(config, desc, regionInfo.region, api.getMode());
result.getConfigurationResults().put(config.getPid(), r);
} else if ( regionInfo.region!= Region.INTERNAL && api.isInternalConfiguration(config.getPid())) {
final ConfigurationValidationResult cvr = new ConfigurationValidationResult();
ConfigurationValidator.setResult(cvr, api.getMode(), desc, "Configuration is not allowed");
result.getConfigurationResults().put(config.getPid(), cvr);
}
}
}
// make sure a result exists
result.getConfigurationResults().computeIfAbsent(config.getPid(), id -> new ConfigurationValidationResult());
}
for(final String frameworkProperty : feature.getFrameworkProperties().keySet()) {
final RegionInfo regionInfo = getRegionInfo(feature, frameworkProperty, cache);
if ( regionInfo == null ) {
final PropertyValidationResult pvr = new PropertyValidationResult();
pvr.getErrors().add("Unable to properly validate framework property, region info cannot be determined");
result.getFrameworkPropertyResults().put(frameworkProperty, pvr);
} else {
final FrameworkPropertyDescription fpd = api.getFrameworkPropertyDescriptions().get(frameworkProperty);
if ( fpd != null ) {
final PropertyValidationResult pvr = propertyValidator.validate(feature.getFrameworkProperties().get(frameworkProperty), fpd, api.getMode());
result.getFrameworkPropertyResults().put(frameworkProperty, pvr);
} else if ( regionInfo.region != Region.INTERNAL && api.getInternalFrameworkProperties().contains(frameworkProperty) ) {
final PropertyValidationResult pvr = new PropertyValidationResult();
PropertyValidator.setResult(pvr, null, api.getMode(), null, "Framework property is not allowed");
result.getFrameworkPropertyResults().put(frameworkProperty, pvr);
}
}
// make sure a result exists
result.getFrameworkPropertyResults().computeIfAbsent(frameworkProperty, id -> new PropertyValidationResult());
}
return result;
}