package org.ovirt.engine.core.bll;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigCommon;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.common.queries.ConfigurationValues;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.compat.KeyValuePairCompat;
import org.ovirt.engine.core.compat.Version;
public class GetConfigurationValuesQuery<P extends VdcQueryParametersBase> extends QueriesCommandBase<P> {
private static final List<String> versions = getVersionsList();
public GetConfigurationValuesQuery(P parameters) {
super(parameters);
}
private static List<String> getVersionsList() {
return Stream.concat(Stream.of(ConfigCommon.defaultConfigurationVersion),
Version.ALL.stream().map(Object::toString))
.collect(Collectors.toList());
}
@Override
protected void executeQueryCommand() {
Map<KeyValuePairCompat<ConfigurationValues, String>, Object> configValuesMap = new HashMap<>();
for (ConfigurationValues configValue : ConfigurationValues.values()) {
// Ignore an admin configuration value on filtered mode
// Ignore a configuration value that doesn't exist in ConfigValues enum
if (!shouldReturnValue(configValue)) {
continue;
}
// Adding a configuration value for each version
for (String version : versions) {
populateValueForConfigValue(configValue, version, configValuesMap);
}
}
getQueryReturnValue().setReturnValue(configValuesMap);
}
private void populateValueForConfigValue(ConfigurationValues configValue,
String version,
Map<KeyValuePairCompat<ConfigurationValues, String>, Object> configValuesMap) {
KeyValuePairCompat<ConfigurationValues, String> key = new KeyValuePairCompat<>(configValue, version);
Object value = Config.getValue(ConfigValues.valueOf(configValue.toString()), version);
configValuesMap.put(key, value);
}
/**
* Validates if the query should return anything or not, according to the user's permissions:
* <ul>
* <li>If the query is run as an administrator (note that since we've reached the {@link #executeQueryCommand()} method,
* we've already validated that the use is indeed an administrator), the results from the database queries should be returned.</li>
* <li>If the query is run as a user, it may return results <b>ONLY</b> if the configuration value has {@link org.ovirt.engine.core.common.queries.ConfigurationValues.ConfigAuthType#User}.</li>
* </ul>
*/
private boolean shouldReturnValue(ConfigurationValues configValue) {
return !getParameters().isFiltered() || !configValue.isAdmin();
}
}