package com.github.nyrkovalex.ironadmin.core.defaults;
import com.github.nyrkovalex.ironadmin.core.TemplateResolver;
import com.github.nyrkovalex.ironadmin.core.pages.PageContext;
import com.github.nyrkovalex.ironadmin.core.utils.IronContracts;
import org.jetbrains.annotations.NotNull;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.context.IContext;
import org.thymeleaf.resourceresolver.ClassLoaderResourceResolver;
import java.io.Writer;
class ThymeleafTemplateResolver implements TemplateResolver {
private final TemplateEngine templateEngine;
private final EnvironmentContext env;
public ThymeleafTemplateResolver(EnvironmentContext env) {
org.thymeleaf.templateresolver.TemplateResolver templateResolver = createThymeleafResolver();
templateEngine = createThymeleafEngine(templateResolver);
this.env = env;
}
private TemplateEngine createThymeleafEngine(org.thymeleaf.templateresolver.TemplateResolver templateResolver) {
TemplateEngine engine = new TemplateEngine();
engine.setTemplateResolver(templateResolver);
return engine;
}
private org.thymeleaf.templateresolver.TemplateResolver createThymeleafResolver() {
org.thymeleaf.templateresolver.TemplateResolver templateResolver =
new org.thymeleaf.templateresolver.TemplateResolver();
templateResolver.setResourceResolver(new ClassLoaderResourceResolver());
return templateResolver;
}
@Override
public void resolvePageTemplate(String urlPrefix, @NotNull PageContext pageContext, @NotNull Writer writer) {
IronContracts.notNull(pageContext, "context", writer, "writer");
IContext thymeleafContext = new MainPageContext(pageContext, urlPrefix, env);
templateEngine.process(pageContext.templatePath(), thymeleafContext, writer);
}
private static class MainPageContext extends Context {
public MainPageContext(PageContext context, String urlPrefix, EnvironmentContext env) {
setVariable("page", context);
setVariable("ia", env);
setVariable("iaUrl", new UrlResolver(urlPrefix));
}
}
private static class UrlResolver {
private final String prefix;
public UrlResolver(String urlPrefix) {
this.prefix = urlPrefix;
}
@SuppressWarnings("UnusedDeclaration")
public String resolve(String url) {
return prefix + url;
}
}
}