1 package net.sumaris.core.extraction.dao.technical.xml;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import com.google.common.collect.Maps;
26 import org.jdom2.filter.Filter;
27 import org.jdom2.xpath.XPathExpression;
28 import org.jdom2.xpath.XPathFactory;
29
30 import java.util.List;
31 import java.util.Map;
32
33
34
35
36 public class XPaths {
37
38 private static final ThreadLocal<XPathFactory> factoryMapper = ThreadLocal.withInitial(XPathFactory::instance);
39
40 private static final ThreadLocal<Map<String, XPathExpression<?>>> expressionMapper = ThreadLocal.withInitial(Maps::newHashMap);
41
42 public static XPathFactory getThreadXPathFactory() {
43 return factoryMapper.get();
44 }
45
46 public static <T> XPathExpression<T> compile(String expression, Filter<T> filter) {
47 Map<String, XPathExpression<?>> expressionMap = expressionMapper.get();
48 XPathExpression<?> xpathExpression = expressionMap.get(expressionMap);
49 if (xpathExpression == null) {
50 xpathExpression = getThreadXPathFactory().compile(expression, filter);
51 expressionMap.put(expression, xpathExpression);
52 }
53 return (XPathExpression<T>)xpathExpression;
54 }
55
56 public static <T> List<T> evaluate(String expression, Filter<T> filter, Object object) {
57 return compile(expression, filter).evaluate(object);
58 }
59
60 public static <T> T evaluateFirst(String expression, Filter<T> filter, Object object) {
61 return compile(expression, filter).evaluateFirst(object);
62 }
63 }