1 package de.juplo.thymeleaf;
4 import com.fasterxml.jackson.core.JsonFactory;
5 import de.juplo.jackson.SimpleMapper;
6 import java.io.IOException;
7 import java.io.InputStream;
8 import java.util.Iterator;
9 import java.util.Locale;
10 import java.util.Map.Entry;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13 import org.thymeleaf.Arguments;
14 import org.thymeleaf.Configuration;
15 import org.thymeleaf.TemplateProcessingParameters;
16 import org.thymeleaf.context.IContext;
17 import org.thymeleaf.context.VariablesMap;
18 import org.thymeleaf.dom.Element;
19 import org.thymeleaf.processor.ProcessorResult;
20 import org.thymeleaf.processor.attr.AbstractAttrProcessor;
21 import org.thymeleaf.resourceresolver.IResourceResolver;
22 import org.thymeleaf.templateresolver.ITemplateResolver;
23 import org.thymeleaf.templateresolver.TemplateResolution;
28 * Retrievs and parses JSON-data and imports the parsed variables as node-local
32 public class ImportVariablesAttrProcessor extends AbstractAttrProcessor
34 public static final int ATTR_PRECEDENCE = 200;
36 private static final Logger LOG =
37 LoggerFactory.getLogger(ImportVariablesAttrProcessor.class);
38 private static final JsonFactory FACTORY = new JsonFactory();
41 public ImportVariablesAttrProcessor()
48 public final ProcessorResult processAttribute(
49 final Arguments arguments,
50 final Element element,
54 Configuration config = arguments.getConfiguration();
55 String templateName = element.getAttributeValue(name);
57 TemplateProcessingParameters params =
58 new TemplateProcessingParameters(
61 new IContext() // << We will not execute the template, hence we need no context
64 public VariablesMap<String, Object> getVariables()
66 return new VariablesMap<>();
70 public Locale getLocale()
72 return Locale.getDefault();
76 public void addContextExecutionInfo(String templateName)
81 for (ITemplateResolver t_resolver : config.getTemplateResolvers())
83 TemplateResolution resolution = t_resolver.resolveTemplate(params);
84 if (resolution == null)
86 if (!"JSON".equals(resolution.getTemplateMode()))
88 IResourceResolver r_resolver = resolution.getResourceResolver();
90 r_resolver.getResourceAsStream(params, resolution.getResourceName());
96 Iterator<Entry<String, Object>> it =
97 SimpleMapper.getObjectIterator(FACTORY.createParser(is));
100 Entry<String, Object> entry = it.next();
101 element.setNodeLocalVariable(entry.getKey(), entry.getValue());
104 catch (IOException e)
106 LOG.error("cannot retreive {} as JSON: {}", templateName, e.getMessage());
107 throw new RuntimeException(e);
109 catch (IllegalArgumentException e)
111 LOG.error("cannot parse {} as JSON: {}", templateName, e.getMessage());
112 throw new RuntimeException(e);
116 element.removeAttribute(name);
118 return ProcessorResult.OK;
123 public int getPrecedence()
125 return ATTR_PRECEDENCE;