import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
-import java.util.Locale;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Configurable;
-import org.springframework.context.MessageSource;
-import org.thymeleaf.Arguments;
-import org.thymeleaf.Configuration;
-import org.thymeleaf.TemplateProcessingParameters;
-import org.thymeleaf.context.IContext;
-import org.thymeleaf.context.VariablesMap;
-import org.thymeleaf.dom.Element;
-import org.thymeleaf.processor.ProcessorResult;
-import org.thymeleaf.processor.attr.AbstractAttrProcessor;
-import org.thymeleaf.resourceresolver.IResourceResolver;
-import org.thymeleaf.templateresolver.ITemplateResolver;
-import org.thymeleaf.templateresolver.TemplateResolution;
*
* @author kai
*/
-@Configurable
-public class ImportVariablesAttrProcessor extends AbstractAttrProcessor
+public class ImportVariablesAttrProcessor
{
- public static final int ATTR_PRECEDENCE = 200;
- public static final String ATTR_VAR_NAME =
- JuploDialect.DIALECT_PREFIX + ":var";
- public static final String ATTR_LOCALE_NAME =
- JuploDialect.DIALECT_PREFIX + ":locale";
- public static final String DEFAULT_VAR_NAME = "crumb";
-
private static final Logger LOG =
LoggerFactory.getLogger(ImportVariablesAttrProcessor.class);
private static final DateTimeFormatter FORMATTER =
private static final JsonFactory FACTORY = new JsonFactory();
- @Autowired
- MessageSource messageSource;
- @Autowired
- Locale defaultLocale;
-
-
- public ImportVariablesAttrProcessor()
+ public Object processAttribute(InputStream is)
{
- super("variables");
- }
-
-
- @Override
- public final ProcessorResult processAttribute(
- final Arguments arguments,
- final Element element,
- final String name
- )
- {
- Configuration config = arguments.getConfiguration();
- String templateName = element.getAttributeValue(name);
-
- TemplateProcessingParameters params =
- new TemplateProcessingParameters(
- config,
- templateName,
- new IContext() // << We will not execute the template, hence we need no context
- {
- @Override
- public VariablesMap<String, Object> getVariables()
- {
- return new VariablesMap<>();
- }
-
- @Override
- public Locale getLocale()
- {
- return Locale.getDefault();
- }
-
- @Override
- public void addContextExecutionInfo(String templateName)
- {
- }
- });
-
- for (ITemplateResolver t_resolver : config.getTemplateResolvers())
- {
- TemplateResolution resolution = t_resolver.resolveTemplate(params);
- if (resolution == null)
- continue;
- if (!"JSON".equals(resolution.getTemplateMode()))
- continue;
- IResourceResolver r_resolver = resolution.getResourceResolver();
- InputStream is =
- r_resolver.getResourceAsStream(params, resolution.getResourceName());
- if (is == null)
- continue;
-
try
{
/** Read the JSON and create the variables */
if (token == null)
{
- LOG.warn("found empty content for {}", templateName);
- break;
+ LOG.warn("empty input-stream");
+ return null;
}
- if (!JsonToken.START_OBJECT.equals(token))
- {
- LOG.error("{} must contain an object as root-element", templateName);
- throw new RuntimeException(
- "The root-element of " +
- templateName +
- " has to be an object, that contains the variable-definitions!"
- );
- }
-
- token = parser.nextToken();
- if (token == null)
- fail(parser, "unexpected EOF");
- if (JsonToken.END_OBJECT.equals(token))
- {
- LOG.warn("found empty object for {}", templateName);
- break;
- }
-
- do
- {
- if (!JsonToken.FIELD_NAME.equals(token))
- fail(parser, "expected a field-name");
-
- String var_name = parser.getText();
- parser.nextToken();
- Object var_value = convert(parser);
-
- LOG.debug(
- "defining variable {} of type {}",
- var_name,
- var_value == null ? "NULL" : var_value.getClass().getSimpleName()
- );
- element.setNodeLocalVariable(var_name, var_value);
-
- token = parser.nextToken();
- if (token == null)
- fail(parser, "unexpected EOF");
- }
- while (!JsonToken.END_OBJECT.equals(token));
+ Object result = convert(parser);
if (parser.nextToken() != null)
fail(parser, "unexpected data after parsed variables");
+
+ return result;
}
catch (IOException e)
{
- LOG.error("cannot parse {} as JSON: {}", templateName, e.getMessage());
+ LOG.error("cannot parse input-stream as JSON: {}", e.getMessage());
throw new RuntimeException(e);
}
- }
-
- element.removeAttribute(name);
-
- return ProcessorResult.OK;
- }
-
-
- @Override
- public int getPrecedence()
- {
- return ATTR_PRECEDENCE;
}