package inject; import com.github.jknack.handlebars.io.ClassPathTemplateLoader; import com.github.jknack.handlebars.io.FileTemplateLoader; import com.github.jknack.handlebars.io.TemplateLoader; import com.google.inject.Provider; import common.templates.HandlebarsTemplateService; import common.templates.TemplateService; import play.Configuration; import play.Logger; import javax.inject.Inject; import java.util.List; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; public class TemplateServiceProvider implements Provider<TemplateService> { private static final String CONFIG_TEMPLATE_LOADERS = "handlebars.templateLoaders"; private static final String CONFIG_FALLBACK_CONTEXTS = "handlebars.fallbackContexts"; private static final String CONFIG_CACHE_ENABLED = "handlebars.chache.enabled"; private static final String CLASSPATH_TYPE = "classpath"; private static final String FILE_TYPE = "file"; private static final String TYPE_ATTR = "type"; private static final String PATH_ATTR = "path"; private final Configuration configuration; @Inject public TemplateServiceProvider(final Configuration configuration) { this.configuration = configuration; } @Override public TemplateService get() { final boolean cacheIsEnabled = configuration.getBoolean(CONFIG_CACHE_ENABLED); final List<TemplateLoader> templateLoaders = initializeTemplateLoaders(CONFIG_TEMPLATE_LOADERS); final List<TemplateLoader> fallbackContexts = initializeTemplateLoaders(CONFIG_FALLBACK_CONTEXTS); final String templatePath = templateLoaders.stream().map(TemplateLoader::getPrefix).collect(joining(", ")); Logger.debug("Provide HandlebarsTemplateService: {}", templatePath); Logger.debug("HandlebarsTemplateService cache enabled: {}", cacheIsEnabled); return HandlebarsTemplateService.of(templateLoaders, fallbackContexts, cacheIsEnabled); } private List<TemplateLoader> initializeTemplateLoaders(final String configKey) { return configuration.getConfigList(configKey) .stream() .map(this::initializeTemplateLoader) .collect(toList()); } private TemplateLoader initializeTemplateLoader(final Configuration loaderConfig) { final String type = loaderConfig.getString(TYPE_ATTR); final String path = loaderConfig.getString(PATH_ATTR); if (CLASSPATH_TYPE.equals(type)) { return new ClassPathTemplateLoader(path); } else if (FILE_TYPE.equals(type)) { return new FileTemplateLoader(path); } else { throw new RuntimeException("Cannot build template loader for " + loaderConfig); } } }