package org.atomnuke.fallout.context.config;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.atomnuke.atombus.config.model.LanguageType;
import org.atomnuke.atombus.config.model.MessageActor;
import org.atomnuke.plugin.InstanceContext;
import org.atomnuke.util.LanguageTypeUtil;
import org.atomnuke.fallout.config.server.ServerConfigurationHandler;
import org.atomnuke.container.packaging.PackageContext;
import org.atomnuke.container.packaging.bindings.lang.BindingLanguage;
import org.atomnuke.fallout.context.FalloutContext;
import org.atomnuke.plugin.ReferenceInstantiationException;
import org.atomnuke.util.config.ConfigurationException;
import org.atomnuke.lifecycle.Reclaimable;
import org.atomnuke.lifecycle.ResourceLifeCycle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author zinic
*/
public class ConfigurationProcessor {
private static final Logger LOG = LoggerFactory.getLogger(ConfigurationProcessor.class);
private final Map<String, InstanceContext> builtInstances;
private final Collection<PackageContext> loadedPackages;
private final ServerConfigurationHandler cfgHandler;
private final FalloutContext containerContext;
public ConfigurationProcessor(FalloutContext containerContext, ServerConfigurationHandler cfgHandler, Collection<PackageContext> loadedPackages) {
this.containerContext = containerContext;
this.cfgHandler = cfgHandler;
this.loadedPackages = loadedPackages;
builtInstances = new HashMap<String, InstanceContext>();
}
public void merge() throws ConfigurationException {
for (MessageActor actor : cfgHandler.getMessageActors()) {
try {
final InstanceContext<? extends Reclaimable> actorContext = constructActor(actor.getType(), actor.getHref());
containerContext.enlistActor(actor.getId(), actorContext);
} catch (ReferenceInstantiationException bie) {
LOG.error("Could not look up actor instance, \"" + actor.getId() + "\" - Reason: " + bie.getMessage(), bie);
}
}
containerContext.process(cfgHandler);
builtInstances.clear();
}
private InstanceContext<? extends Reclaimable> constructActor(LanguageType langType, String ref) throws ReferenceInstantiationException {
if (builtInstances.containsKey(ref)) {
return builtInstances.get(ref);
}
final BindingLanguage bindingLanguage = LanguageTypeUtil.asBindingLanguage(langType);
for (PackageContext packageContext : loadedPackages) {
final InstanceContext<ResourceLifeCycle> source = packageContext.packageBindings().resolveReference(ResourceLifeCycle.class, bindingLanguage, ref);
if (source != null) {
builtInstances.put(ref, source);
return source;
}
}
throw new ReferenceInstantiationException("Unable to locate actor reference: " + ref);
}
}