package org.jtwig.environment;
import org.jtwig.environment.initializer.EnvironmentInitializer;
import org.jtwig.escape.environment.EscapeEnvironmentFactory;
import org.jtwig.extension.Extension;
import org.jtwig.functions.environment.FunctionResolverFactory;
import org.jtwig.parser.JtwigParserFactory;
import org.jtwig.property.environment.PropertyResolverEnvironmentFactory;
import org.jtwig.render.environment.RenderEnvironmentFactory;
import org.jtwig.render.expression.calculator.enumerated.environment.EnumerationListStrategyFactory;
import org.jtwig.resource.environment.ResourceEnvironmentFactory;
import org.jtwig.value.environment.ValueEnvironmentFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Stateless and thread-safe implementation of a Environment factory.
*/
public class EnvironmentFactory {
private static final Logger log = LoggerFactory.getLogger(EnvironmentFactory.class);
private final JtwigParserFactory jtwigParserFactory;
private final ResourceEnvironmentFactory resourceEnvironmentFactory;
private final RenderEnvironmentFactory renderEnvironmentFactory;
private final FunctionResolverFactory functionResolverFactory;
private final PropertyResolverEnvironmentFactory propertyResolverFactory;
private final ValueEnvironmentFactory valueEnvironmentFactory;
private final EnumerationListStrategyFactory enumerationListStrategyFactory;
private final EscapeEnvironmentFactory escapeEnvironmentFactory;
public EnvironmentFactory () {
this(new JtwigParserFactory(), new ResourceEnvironmentFactory(),
new RenderEnvironmentFactory(),
new FunctionResolverFactory(),
new PropertyResolverEnvironmentFactory(),
new ValueEnvironmentFactory(),
new EnumerationListStrategyFactory(),
new EscapeEnvironmentFactory());
}
public EnvironmentFactory(JtwigParserFactory jtwigParserFactory, ResourceEnvironmentFactory resourceEnvironmentFactory, RenderEnvironmentFactory renderEnvironmentFactory, FunctionResolverFactory functionResolverFactory, PropertyResolverEnvironmentFactory propertyResolverFactory, ValueEnvironmentFactory valueEnvironmentFactory, EnumerationListStrategyFactory enumerationListStrategyFactory, EscapeEnvironmentFactory escapeEnvironmentFactory) {
this.jtwigParserFactory = jtwigParserFactory;
this.resourceEnvironmentFactory = resourceEnvironmentFactory;
this.renderEnvironmentFactory = renderEnvironmentFactory;
this.functionResolverFactory = functionResolverFactory;
this.propertyResolverFactory = propertyResolverFactory;
this.enumerationListStrategyFactory = enumerationListStrategyFactory;
this.valueEnvironmentFactory = valueEnvironmentFactory;
this.escapeEnvironmentFactory = escapeEnvironmentFactory;
}
public Environment create(EnvironmentConfiguration environmentConfiguration) {
EnvironmentConfiguration configuration = environmentConfiguration;
if (!environmentConfiguration.getExtensions().isEmpty()) {
log.info("Jtwig base configuration extended with:");
EnvironmentConfigurationBuilder builder = new EnvironmentConfigurationBuilder(environmentConfiguration);
for (Extension extension : environmentConfiguration.getExtensions()) {
log.info("- {}", extension.getClass().getSimpleName());
extension.configure(builder);
}
configuration = builder.build();
}
Environment instance = new Environment(
jtwigParserFactory.create(configuration.getJtwigParserConfiguration()),
configuration.getParameters(),
resourceEnvironmentFactory.create(configuration.getResourceConfiguration()),
functionResolverFactory.create(configuration.getFunctions()),
propertyResolverFactory.create(configuration.getPropertyResolverConfiguration()),
renderEnvironmentFactory.create(configuration.getRenderConfiguration()),
valueEnvironmentFactory.create(configuration.getValueConfiguration()),
enumerationListStrategyFactory.create(configuration.getEnumerationStrategies()),
escapeEnvironmentFactory.create(configuration.getEscapeConfiguration()));
if (!configuration.getInitializers().isEmpty()) {
log.info("Jtwig pre-loading resources");
for (EnvironmentInitializer initializer : configuration.getInitializers()) {
initializer.initialize(instance);
}
}
return instance;
}
}