/**
* This file is part of the source code and related artifacts for eGym Application.
*
* Copyright © 2013 eGym GmbH
*/
package de.egym.logqueue;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.google.inject.Binding;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import com.google.inject.spi.InstanceBinding;
import de.egym.logqueue.config.EgymLogPipelineConfig;
import de.egym.logqueue.decorator.EgymLogDecorator;
import de.egym.logqueue.formatter.EgymLogFormatter;
import de.egym.logqueue.writer.EgymLogWriter;
/**
* Takes care of instantiating the log pipelines from the Guice bindings.
*/
class EgymLogPipelineService {
private final Injector injector;
@Inject
EgymLogPipelineService(final Injector injector) {
this.injector = injector;
}
/**
* Creates all the pipelines for the configuration bound in Guice.
*
* @return a list of pipelines. Never null. Never contains null entries.
*/
public List<EgymLogPipeline> createPipelines() {
final List<EgymLogPipelineConfig> configs = getPipelineConfigs();
final List<EgymLogPipeline> pipelines = new ArrayList<>();
for (EgymLogPipelineConfig logWiringConfig : configs) {
pipelines.add(createPipeline(logWiringConfig));
}
return pipelines;
}
/**
* Creates a pipeline from a config.
*
* @param config
* the config to use. Must not be null.
* @return a pipeline adhering to the config.
*/
private EgymLogPipeline createPipeline(EgymLogPipelineConfig config) {
if (config == null) {
throw new IllegalArgumentException("config must not be null");
}
final EgymLogDecorator logRecordDecorator = createDecoratorFromConfig(config);
final EgymLogFormatter logFormatter = createFormatterFromConfig(config);
final EgymLogWriter logWriter = createWriterFromConfig(config);
return new EgymLogPipeline(logRecordDecorator, logFormatter, logWriter);
}
private EgymLogDecorator createDecoratorFromConfig(EgymLogPipelineConfig config) {
final Class<? extends EgymLogDecorator> logDecoratorClazz = config.getLogDecoratorClazz();
final EgymLogDecorator logRecordDecorator = injector.getInstance(logDecoratorClazz);
if (logRecordDecorator == null) {
throw new AssertionError("Failed to create decorator for config " + config);
}
return logRecordDecorator;
}
private EgymLogFormatter createFormatterFromConfig(EgymLogPipelineConfig config) {
final Class<? extends EgymLogFormatter> logFormatterClazz = config.getLogFormatterClazz();
final EgymLogFormatter logFormatter = injector.getInstance(logFormatterClazz);
if (logFormatter == null) {
throw new AssertionError("Failed to create formatter for config " + config);
}
return logFormatter;
}
private EgymLogWriter createWriterFromConfig(EgymLogPipelineConfig config) {
final Class<? extends EgymLogWriter> logWriterClazz = config.getLogWriterClazz();
final EgymLogWriter logWriter = injector.getInstance(logWriterClazz);
if (logWriter == null) {
throw new AssertionError("Failed to create writer for config " + config);
}
return logWriter;
}
/**
* Retrieves the {@link EgymLogPipelineConfig} instances from Guice.
*
* @return all bound config instances.
*/
private List<EgymLogPipelineConfig> getPipelineConfigs() {
final Map<Key<?>, Binding<?>> bindings = injector.getBindings();
if (bindings == null) {
throw new IllegalStateException("injector.bindings must not be null");
}
final List<EgymLogPipelineConfig> logPipelineConfigs = new ArrayList<>();
for (Key<?> key : bindings.keySet()) {
final TypeLiteral<?> typeLiteral = key.getTypeLiteral();
if (typeLiteral == null) {
throw new IllegalStateException("typeLiteral must not be null");
}
final Class<?> type = typeLiteral.getRawType();
if (type == null) {
throw new IllegalStateException("type must not be null");
}
if (EgymLogPipelineConfig.class.isAssignableFrom(type)) {
final Binding<?> binding = bindings.get(key);
if (binding instanceof InstanceBinding) {
final InstanceBinding instanceBinding = (InstanceBinding) binding;
final EgymLogPipelineConfig config = (EgymLogPipelineConfig) instanceBinding.getInstance();
if (config == null) {
throw new IllegalStateException("The binding " + binding + " does not point to an instance.");
}
logPipelineConfigs.add(config);
}
}
}
return logPipelineConfigs;
}
}