001package com.hammurapi.extract.scripting;
002
003import javax.script.ScriptEngineFactory;
004import javax.script.ScriptEngineManager;
005
006import com.hammurapi.extract.Extractor;
007import com.hammurapi.extract.ExtractorFactory;
008import com.hammurapi.extract.Predicate;
009
010public class ScriptingExtractorFactory implements ExtractorFactory {
011
012        public <T, V, C> Extractor<T, V, C> createExtractor(
013                        String language,
014                        String code, 
015                        String[] parameterNames, 
016                        Class<T>[] parameterTypes,
017                        Class<V> valueType, 
018                        Class<C> contextType,
019                        ClassLoader classLoader) {
020
021                ScriptEngineManager sem = new ScriptEngineManager(classLoader==null ? contextType.getClassLoader() : classLoader);
022                for (ScriptEngineFactory sef: sem.getEngineFactories()) {
023                        if (sef.getLanguageName().equals(language)) {
024                                ScriptingExtractor<T, V, C> scriptingExtractor = new ScriptingExtractor<T, V, C>(code, sef, parameterNames);
025                                return scriptingExtractor;
026                        }
027                }
028
029                // Trying engine names
030                for (ScriptEngineFactory sef: sem.getEngineFactories()) {
031                        for (String en: sef.getNames()) {
032                                if (en.equals(language)) {
033                                        ScriptingExtractor<T, V, C> scriptingExtractor = new ScriptingExtractor<T, V, C>(code, sef, parameterNames);
034                                        return scriptingExtractor;
035                                }
036                        }
037                }                       
038
039                return null;
040        }
041        
042        public <T, C> Predicate<T, C> createPredicate(
043                        String language,
044                        String code, 
045                        String[] parameterNames, 
046                        Class<T>[] parameterTypes,
047                        Class<C> contextType,
048                        ClassLoader classLoader) {
049
050                ScriptEngineManager sem = new ScriptEngineManager(classLoader==null ? contextType.getClassLoader() : classLoader);
051                for (ScriptEngineFactory sef: sem.getEngineFactories()) {
052                        if (sef.getLanguageName().equals(language)) {
053                                ScriptingPredicate<T, C> scriptingPredicate = new ScriptingPredicate<T, C>(code, sef, parameterNames);
054                                return scriptingPredicate;
055                        }
056                }
057
058                // Trying engine names
059                for (ScriptEngineFactory sef: sem.getEngineFactories()) {
060                        for (String en: sef.getNames()) {
061                                if (en.equals(language)) {
062                                        ScriptingPredicate<T, C> scriptingPredicate = new ScriptingPredicate<T, C>(code, sef, parameterNames);
063                                        return scriptingPredicate;
064                                }
065                        }
066                }                       
067
068                return null;
069        }
070        
071        
072}