1 package de.juplo.thymeleaf;
4 import com.fasterxml.jackson.core.JsonFactory;
5 import com.fasterxml.jackson.core.JsonLocation;
6 import com.fasterxml.jackson.core.JsonParser;
7 import com.fasterxml.jackson.core.JsonToken;
8 import com.fasterxml.jackson.databind.ObjectMapper;
9 import java.io.IOException;
10 import java.io.InputStream;
11 import java.time.format.DateTimeFormatter;
12 import java.util.LinkedHashMap;
13 import java.util.LinkedList;
14 import java.util.List;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
25 public class ImportVariablesAttrProcessor
27 private static final Logger LOG =
28 LoggerFactory.getLogger(ImportVariablesAttrProcessor.class);
29 private static final DateTimeFormatter FORMATTER =
30 DateTimeFormatter.ofPattern("dd.MM");
31 private static final ObjectMapper MAPPER = new ObjectMapper();
32 private static final JsonFactory FACTORY = new JsonFactory();
35 public Object processAttribute(InputStream is)
39 /** Read the JSON and create the variables */
40 JsonParser parser = FACTORY.createParser(is);
42 JsonToken token = parser.nextToken();
46 LOG.warn("empty input-stream");
50 Object result = convert(parser);
52 if (parser.nextToken() != null)
53 fail(parser, "unexpected data after parsed variables");
59 LOG.error("cannot parse input-stream as JSON: {}", e.getMessage());
60 throw new RuntimeException(e);
65 static Object convert(JsonParser parser) throws IOException
67 JsonToken token = parser.getCurrentToken();
69 fail(parser, "unexpected EOF");
73 case VALUE_STRING: return parser.getText();
74 case VALUE_NUMBER_INT: return parser.getIntValue();
75 case VALUE_NUMBER_FLOAT: return parser.getDoubleValue();
76 case START_OBJECT: return convertObject(parser);
77 case START_ARRAY: return convertArray(parser);
78 case VALUE_TRUE: return Boolean.TRUE;
79 case VALUE_FALSE: return Boolean.FALSE;
80 case VALUE_NULL: return null;
83 fail(parser, "unexpected token " + token.toString());
84 return null; // << Will never be reached, because fail always throws an exception
87 static Map<String, Object> convertObject(JsonParser parser) throws IOException
89 JsonToken token = parser.nextToken();
91 fail(parser, "unexpected EOF");
93 Map<String, Object> map = new LinkedHashMap<>();
95 while (!JsonToken.END_OBJECT.equals(token))
97 if (!JsonToken.FIELD_NAME.equals(token))
98 fail(parser, "expected a field-name");
100 String name = parser.getText();
102 Object value = convert(parser);
103 map.put(name, value);
105 token = parser.nextToken();
107 fail(parser, "unexpected EOF");
113 static List<Object> convertArray(JsonParser parser) throws IOException
115 JsonToken token = parser.nextToken();
117 fail(parser, "unexpected EOF");
119 List<Object> list = new LinkedList<>();
121 while (!JsonToken.END_ARRAY.equals(token))
123 list.add(convert(parser));
125 token = parser.nextToken();
127 fail(parser, "unexpected EOF");
133 static void fail(JsonParser parser, String message)
135 JsonLocation location = parser.getCurrentLocation();
137 "{} at char-offset {} (line {}, column {})",
139 location.getCharOffset(),
140 location.getLineNr(),
141 location.getColumnNr()
143 throw new RuntimeException("Cannot parse JSON: " + message);