package org.ovirt.engine.core.sso.utils;
import static java.util.Arrays.sort;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.api.extensions.Base;
import org.ovirt.engine.core.extensions.mgr.ExtensionProxy;
import org.ovirt.engine.core.extensions.mgr.ExtensionsManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SsoExtensionsManager extends ExtensionsManager {
private static final String ENGINE_EXTENSION_ENABLED = "ENGINE_EXTENSION_ENABLED_";
private static Logger log = LoggerFactory.getLogger(SsoExtensionsManager.class);
private SsoLocalConfig localConfig;
public SsoExtensionsManager(SsoLocalConfig localConfig) {
super();
this.localConfig = localConfig;
getGlobalContext().put(
Base.GlobalContextKeys.APPLICATION_NAME,
Base.ApplicationNames.OVIRT_ENGINE);
initialize();
}
private void initialize() {
String path = localConfig.getExtensionsPath();
List<File> extensionsDirectories = new ArrayList<>();
if (path != null) {
for (String currentPath : path.split(":")) {
if (StringUtils.isNotBlank(currentPath)) {
extensionsDirectories.add(new File(currentPath));
}
}
}
for (File directory : extensionsDirectories) {
if (!directory.exists()) {
log.warn("The directory '{}' cotaning configuration files does not exist.",
directory.getAbsolutePath());
} else {
// The order of the files inside the directory is relevant, as the objects are created in
// the same order
// that
// the files are processed, so it is better to sort them so that objects will always be
// created in the
// same
// order regardless of how the filesystem decides to store the entries of the directory:
File[] files = directory.listFiles();
if (files != null) {
sort(files);
for (File file : files) {
if (file.getName().endsWith(".properties")) {
try {
load(file);
} catch (Exception ex) {
log.error("Could not load extension based on configuration file '{}'. " +
"Please check the configuration file is valid. Exception message is: {}",
file.getAbsolutePath(),
ex.getMessage());
log.debug("Exception", ex);
}
}
}
}
}
}
for (ExtensionProxy extension : getLoadedExtensions()) {
if (
localConfig.getBoolean(
ENGINE_EXTENSION_ENABLED + normalizeName(
extension.getContext().get(
Base.ContextKeys.INSTANCE_NAME
)
),
Boolean.parseBoolean(
extension.getContext().<Properties>get(
Base.ContextKeys.CONFIGURATION
).getProperty(Base.ConfigKeys.ENABLED, "true")
)
)
) {
try {
initialize(extension.getContext().get(Base.ContextKeys.INSTANCE_NAME));
} catch (Exception ex) {
log.error("Could not initialize extension '{}'. Exception message is: {}",
extension.getContext().<String>get(Base.ContextKeys.INSTANCE_NAME),
ex.getMessage());
log.debug("Exception", ex);
}
}
}
dump();
}
private String normalizeName(String s) {
StringBuilder ret = new StringBuilder();
for (char c : s.toCharArray()) {
if (c == '_' || Character.isLetterOrDigit(c)) {
ret.append(c);
} else {
ret.append('_');
}
}
return ret.toString();
}
}