package org.wildfly.swarm.netflix.archaius.runtime;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import com.netflix.config.ConfigurationManager;
import org.apache.commons.configuration.AbstractConfiguration;
import org.wildfly.swarm.container.runtime.ConfigurableHandle;
import org.wildfly.swarm.container.runtime.ConfigurableManager;
import org.wildfly.swarm.spi.api.Customizer;
import org.wildfly.swarm.spi.api.config.ConfigKey;
import org.wildfly.swarm.spi.runtime.annotations.Post;
/**
* @author Bob McWhirter
*/
@Post
@ApplicationScoped
public class ArchaiusCustomizer implements Customizer {
@Inject
ConfigurableManager configurableManager;
@Inject
@Any
Instance<ArchaiusLinkage> links;
Set<String> linkable = new HashSet<>();
@PostConstruct
protected void buildLinkNameSet() {
for (ArchaiusLinkage link : this.links) {
this.linkable.add(link.name() + ".");
}
}
@Override
public void customize() {
AbstractConfiguration config = ConfigurationManager.getConfigInstance();
Set<ConfigKey> seen = new HashSet<>();
this.configurableManager.configurables().stream()
.filter(this::shouldLink)
.forEach(e -> {
try {
Object value = e.currentValue();
if (value != null) {
config.setProperty(e.key().subkey(1).name(), e.currentValue());
}
seen.add(e.key());
} catch (Exception ex) {
throw new RuntimeException(ex);
}
});
this.configurableManager.configView().allKeysRecursively()
.filter(this::shouldLink)
.filter(k -> !seen.contains(k))
.forEach(k -> {
Object value = this.configurableManager.configView().valueOf(k);
if (value != null) {
config.setProperty(k.subkey(1).name(), value);
}
});
}
protected boolean shouldLink(ConfigKey key) {
if (!key.head().name().equals("swarm")) {
return false;
}
return linkable.stream().anyMatch(e -> key.subkey(1).name().startsWith(e));
}
protected boolean shouldLink(ConfigurableHandle configurable) {
return shouldLink(configurable.key());
}
}