1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.scxml2;
18
19 import java.util.Map;
20 import java.util.concurrent.ConcurrentHashMap;
21
22 import org.apache.commons.scxml2.env.groovy.GroovyEvaluator;
23 import org.apache.commons.scxml2.env.javascript.JSEvaluator;
24 import org.apache.commons.scxml2.env.jexl.JexlEvaluator;
25 import org.apache.commons.scxml2.env.minimal.MinimalEvaluator;
26 import org.apache.commons.scxml2.env.xpath.XPathEvaluator;
27 import org.apache.commons.scxml2.model.ModelException;
28 import org.apache.commons.scxml2.model.SCXML;
29 import static org.apache.commons.scxml2.Evaluator.DEFAULT_DATA_MODEL;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 public class EvaluatorFactory {
58
59 private static EvaluatorFactory INSTANCE = new EvaluatorFactory();
60
61 private final Map<String, EvaluatorProvider> providers = new ConcurrentHashMap<String, EvaluatorProvider>();
62
63 private EvaluatorFactory() {
64 providers.put(XPathEvaluator.SUPPORTED_DATA_MODEL, new XPathEvaluator.XPathEvaluatorProvider());
65 providers.put(JSEvaluator.SUPPORTED_DATA_MODEL, new JSEvaluator.JSEvaluatorProvider());
66 providers.put(GroovyEvaluator.SUPPORTED_DATA_MODEL, new GroovyEvaluator.GroovyEvaluatorProvider());
67 providers.put(JexlEvaluator.SUPPORTED_DATA_MODEL, new JexlEvaluator.JexlEvaluatorProvider());
68 providers.put(MinimalEvaluator.SUPPORTED_DATA_MODEL, new MinimalEvaluator.MinimalEvaluatorProvider());
69 providers.put(DEFAULT_DATA_MODEL, providers.get(JexlEvaluator.SUPPORTED_DATA_MODEL));
70 }
71
72 public static void setDefaultProvider(EvaluatorProvider defaultProvider) {
73 INSTANCE.providers.put(DEFAULT_DATA_MODEL, defaultProvider);
74 }
75
76 @SuppressWarnings("unused")
77 public static EvaluatorProvider getDefaultProvider() {
78 return INSTANCE.providers.get(DEFAULT_DATA_MODEL);
79 }
80
81 @SuppressWarnings("unused")
82 public static EvaluatorProvider getEvaluatorProvider(String datamodelName) {
83 return INSTANCE.providers.get(datamodelName == null ? DEFAULT_DATA_MODEL : datamodelName);
84 }
85
86 @SuppressWarnings("unused")
87 public static void registerEvaluatorProvider(EvaluatorProvider provider) {
88 INSTANCE.providers.put(provider.getSupportedDatamodel(), provider);
89 }
90
91 @SuppressWarnings("unused")
92 public static void unregisterEvaluatorProvider(String datamodelName) {
93 INSTANCE.providers.remove(datamodelName == null ? DEFAULT_DATA_MODEL : datamodelName);
94 }
95
96
97
98
99
100
101
102
103 public static Evaluator getEvaluator(SCXML document) throws ModelException {
104 String datamodelName = document != null ? document.getDatamodelName() : null;
105 EvaluatorProvider provider = INSTANCE.providers.get(datamodelName == null ? DEFAULT_DATA_MODEL : datamodelName);
106 if (provider == null) {
107 throw new ModelException("Unsupported SCXML document datamodel \""+(datamodelName)+"\"");
108 }
109 return document != null ? provider.getEvaluator(document) : provider.getEvaluator();
110 }
111 }