1 | package com.hammurapi.extract.scripting; |
2 | |
3 | import javax.script.ScriptEngineFactory; |
4 | import javax.script.ScriptEngineManager; |
5 | |
6 | import com.hammurapi.extract.Extractor; |
7 | import com.hammurapi.extract.ExtractorFactory; |
8 | import com.hammurapi.extract.Predicate; |
9 | |
10 | public class ScriptingExtractorFactory implements ExtractorFactory { |
11 | |
12 | public <T, V, C> Extractor<T, V, C> createExtractor( |
13 | String language, |
14 | String code, |
15 | String[] parameterNames, |
16 | Class<T>[] parameterTypes, |
17 | Class<V> valueType, |
18 | Class<C> contextType, |
19 | ClassLoader classLoader) { |
20 | |
21 | ScriptEngineManager sem = new ScriptEngineManager(classLoader==null ? contextType.getClassLoader() : classLoader); |
22 | for (ScriptEngineFactory sef: sem.getEngineFactories()) { |
23 | if (sef.getLanguageName().equals(language)) { |
24 | ScriptingExtractor<T, V, C> scriptingExtractor = new ScriptingExtractor<T, V, C>(code, sef, parameterNames); |
25 | return scriptingExtractor; |
26 | } |
27 | } |
28 | |
29 | // Trying engine names |
30 | for (ScriptEngineFactory sef: sem.getEngineFactories()) { |
31 | for (String en: sef.getNames()) { |
32 | if (en.equals(language)) { |
33 | ScriptingExtractor<T, V, C> scriptingExtractor = new ScriptingExtractor<T, V, C>(code, sef, parameterNames); |
34 | return scriptingExtractor; |
35 | } |
36 | } |
37 | } |
38 | |
39 | return null; |
40 | } |
41 | |
42 | public <T, C> Predicate<T, C> createPredicate( |
43 | String language, |
44 | String code, |
45 | String[] parameterNames, |
46 | Class<T>[] parameterTypes, |
47 | Class<C> contextType, |
48 | ClassLoader classLoader) { |
49 | |
50 | ScriptEngineManager sem = new ScriptEngineManager(classLoader==null ? contextType.getClassLoader() : classLoader); |
51 | for (ScriptEngineFactory sef: sem.getEngineFactories()) { |
52 | if (sef.getLanguageName().equals(language)) { |
53 | ScriptingPredicate<T, C> scriptingPredicate = new ScriptingPredicate<T, C>(code, sef, parameterNames); |
54 | return scriptingPredicate; |
55 | } |
56 | } |
57 | |
58 | // Trying engine names |
59 | for (ScriptEngineFactory sef: sem.getEngineFactories()) { |
60 | for (String en: sef.getNames()) { |
61 | if (en.equals(language)) { |
62 | ScriptingPredicate<T, C> scriptingPredicate = new ScriptingPredicate<T, C>(code, sef, parameterNames); |
63 | return scriptingPredicate; |
64 | } |
65 | } |
66 | } |
67 | |
68 | return null; |
69 | } |
70 | |
71 | |
72 | } |