1
2
3
4
5
6
7
8
9
10
11
12
13 package net.sf.oval.expression;
14
15 import java.util.Map;
16
17 import net.sf.oval.Validator;
18 import net.sf.oval.exception.ExpressionLanguageNotAvailableException;
19 import net.sf.oval.internal.Log;
20 import net.sf.oval.internal.util.Assert;
21 import net.sf.oval.internal.util.ReflectionUtils;
22
23
24
25
26 public class ExpressionLanguageRegistry
27 {
28 private static final Log LOG = Log.getLog(ExpressionLanguageRegistry.class);
29
30 private final Map<String, ExpressionLanguage> elcache = Validator.getCollectionFactory().createMap(4);
31
32 private ExpressionLanguage _initializeDefaultEL(final String languageId)
33 {
34
35 if (("javascript".equals(languageId) || "js".equals(languageId))
36 && ReflectionUtils.isClassPresent("org.mozilla.javascript.Context"))
37 return registerExpressionLanguage("js", registerExpressionLanguage("javascript", new ExpressionLanguageJavaScriptImpl()));
38
39
40 if ("groovy".equals(languageId) && ReflectionUtils.isClassPresent("groovy.lang.Binding"))
41 return registerExpressionLanguage("groovy", new ExpressionLanguageGroovyImpl());
42
43
44 if (("beanshell".equals(languageId) || "bsh".equals(languageId)) && ReflectionUtils.isClassPresent("bsh.Interpreter"))
45 return registerExpressionLanguage("beanshell", registerExpressionLanguage("bsh", new ExpressionLanguageBeanShellImpl()));
46
47
48 if ("ognl".equals(languageId) && ReflectionUtils.isClassPresent("ognl.Ognl"))
49 return registerExpressionLanguage("ognl", new ExpressionLanguageOGNLImpl());
50
51
52 if ("mvel".equals(languageId) && ReflectionUtils.isClassPresent("org.mvel2.MVEL"))
53 return registerExpressionLanguage("mvel", new ExpressionLanguageMVELImpl());
54
55
56 else if (("jruby".equals(languageId) || "ruby".equals(languageId)) && ReflectionUtils.isClassPresent("org.jruby.Ruby"))
57 return registerExpressionLanguage("jruby", registerExpressionLanguage("ruby", new ExpressionLanguageJRubyImpl()));
58
59
60 if ("jexl".equals(languageId) && ReflectionUtils.isClassPresent("org.apache.commons.jexl2.JexlEngine"))
61 return registerExpressionLanguage("jexl", new ExpressionLanguageJEXLImpl());
62
63
64 if (ReflectionUtils.isClassPresent("javax.script.ScriptEngineManager"))
65 {
66 final ExpressionLanguage el = ExpressionLanguageScriptEngineImpl.get(languageId);
67 if (el != null) return registerExpressionLanguage(languageId, el);
68 }
69
70 return null;
71 }
72
73
74
75
76
77
78
79
80 public ExpressionLanguage getExpressionLanguage(final String languageId) throws IllegalArgumentException,
81 ExpressionLanguageNotAvailableException
82 {
83 Assert.argumentNotNull("languageId", languageId);
84
85 ExpressionLanguage el = elcache.get(languageId);
86
87 if (el == null) el = _initializeDefaultEL(languageId);
88
89 if (el == null) throw new ExpressionLanguageNotAvailableException(languageId);
90
91 return el;
92 }
93
94
95
96
97
98
99
100 public ExpressionLanguage registerExpressionLanguage(final String languageId, final ExpressionLanguage impl)
101 throws IllegalArgumentException
102 {
103 Assert.argumentNotNull("languageId", languageId);
104 Assert.argumentNotNull("impl", impl);
105
106 LOG.info("Expression language '{1}' registered: {2}", languageId, impl);
107 elcache.put(languageId, impl);
108 return impl;
109 }
110 }