|
|
@@ -20,28 +20,33 @@ |
|
|
|
|
|
|
|
package org.sonar.server.setting.ws; |
|
|
|
|
|
|
|
import java.util.Collections; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Locale; |
|
|
|
import java.util.Optional; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
import javax.annotation.CheckForNull; |
|
|
|
import javax.annotation.Nullable; |
|
|
|
import org.sonar.api.PropertyType; |
|
|
|
import org.sonar.api.config.PropertyDefinition; |
|
|
|
import org.sonar.api.config.PropertyDefinitions; |
|
|
|
import org.sonar.api.i18n.I18n; |
|
|
|
import org.sonar.db.DbClient; |
|
|
|
import org.sonar.db.DbSession; |
|
|
|
import org.sonar.db.component.ComponentDto; |
|
|
|
import org.sonarqube.ws.client.setting.SetRequest; |
|
|
|
import org.sonar.db.metric.MetricDto; |
|
|
|
import org.sonar.server.exceptions.BadRequestException; |
|
|
|
|
|
|
|
import static java.lang.String.format; |
|
|
|
import static java.util.Objects.requireNonNull; |
|
|
|
import static org.sonar.server.ws.WsUtils.checkRequest; |
|
|
|
|
|
|
|
public class SettingValidations { |
|
|
|
private final PropertyDefinitions definitions; |
|
|
|
private final DbClient dbClient; |
|
|
|
private final I18n i18n; |
|
|
|
|
|
|
|
public SettingValidations(PropertyDefinitions definitions, I18n i18n) { |
|
|
|
public SettingValidations(PropertyDefinitions definitions, DbClient dbClient, I18n i18n) { |
|
|
|
this.definitions = definitions; |
|
|
|
this.dbClient = dbClient; |
|
|
|
this.i18n = i18n; |
|
|
|
} |
|
|
|
|
|
|
@@ -63,24 +68,7 @@ public class SettingValidations { |
|
|
|
} |
|
|
|
|
|
|
|
public SettingValidation valueType() { |
|
|
|
return data -> { |
|
|
|
PropertyDefinition definition = definitions.get(data.key); |
|
|
|
if (definition == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
Optional<PropertyDefinition.Result> failingResult = data.values.stream() |
|
|
|
.map(definition::validate) |
|
|
|
.filter(result -> !result.isValid()) |
|
|
|
.findAny(); |
|
|
|
String errorKey = failingResult.isPresent() ? failingResult.get().getErrorKey() : null; |
|
|
|
checkRequest(errorKey == null, |
|
|
|
i18n.message(Locale.ENGLISH, "property.error." + errorKey, "Error when validating setting with key '%s' and value [%s]"), |
|
|
|
data.key, data.values.stream().collect(Collectors.joining(", "))); |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
private static List<String> valuesFromRequest(SetRequest request) { |
|
|
|
return request.getValue() == null ? request.getValues() : Collections.singletonList(request.getValue()); |
|
|
|
return new ValueTypeValidation(); |
|
|
|
} |
|
|
|
|
|
|
|
private static boolean isGlobal(PropertyDefinition definition) { |
|
|
@@ -103,6 +91,41 @@ public class SettingValidations { |
|
|
|
this.values = requireNonNull(values); |
|
|
|
this.component = component; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private class ValueTypeValidation implements SettingValidation { |
|
|
|
|
|
|
|
@Override |
|
|
|
public void validate(SettingData data) { |
|
|
|
PropertyDefinition definition = definitions.get(data.key); |
|
|
|
if (definition == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (definition.type() == PropertyType.METRIC) { |
|
|
|
metric(data); |
|
|
|
} else { |
|
|
|
otherTypes(data, definition); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void otherTypes(SettingData data, PropertyDefinition definition) { |
|
|
|
data.values.stream() |
|
|
|
.map(definition::validate) |
|
|
|
.filter(result -> !result.isValid()) |
|
|
|
.findAny() |
|
|
|
.ifPresent(result -> { |
|
|
|
throw new BadRequestException(i18n.message(Locale.ENGLISH, "property.error." + result.getErrorKey(), |
|
|
|
format("Error when validating setting with key '%s' and value [%s]", data.key, data.values.stream().collect(Collectors.joining(", "))))); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private void metric(SettingData data) { |
|
|
|
try (DbSession dbSession = dbClient.openSession(false)) { |
|
|
|
List<MetricDto> metrics = dbClient.metricDao().selectByKeys(dbSession, data.values); |
|
|
|
checkRequest(data.values.size() == metrics.size(), "Error when validating metric setting with key '%s' and values [%s]. A value is not a valid metric key.", |
|
|
|
data.key, data.values.stream().collect(Collectors.joining(", "))); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |