Repository: nifi Updated Branches: refs/heads/master d4f0c1d04 -> 9294a2613
http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentHelper.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentHelper.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentHelper.java new file mode 100644 index 0000000..e838baa --- /dev/null +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentHelper.java @@ -0,0 +1,332 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.nifi.script; + +import org.apache.nifi.controller.ConfigurationContext; +import org.apache.nifi.logging.ComponentLog; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.ServiceLoader; +import java.util.Set; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineFactory; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +import org.apache.nifi.components.AllowableValue; +import org.apache.nifi.components.PropertyDescriptor; +import org.apache.nifi.components.ValidationContext; +import org.apache.nifi.components.ValidationResult; +import org.apache.nifi.processor.ProcessContext; +import org.apache.nifi.processors.script.ScriptEngineConfigurator; +import org.apache.nifi.util.StringUtils; + +/** + * This class contains variables and methods common to scripting processors, reporting tasks, etc. + */ +public class ScriptingComponentHelper { + + public PropertyDescriptor SCRIPT_ENGINE; + + // A map from engine name to a custom configurator for that engine + public final Map<String, ScriptEngineConfigurator> scriptEngineConfiguratorMap = new ConcurrentHashMap<>(); + public final AtomicBoolean isInitialized = new AtomicBoolean(false); + + public Map<String, ScriptEngineFactory> scriptEngineFactoryMap; + private String scriptEngineName; + private String scriptPath; + private String scriptBody; + private String[] modules; + private List<PropertyDescriptor> descriptors; + + public BlockingQueue<ScriptEngine> engineQ = null; + + public String getScriptEngineName() { + return scriptEngineName; + } + + public void setScriptEngineName(String scriptEngineName) { + this.scriptEngineName = scriptEngineName; + } + + public String getScriptPath() { + return scriptPath; + } + + public void setScriptPath(String scriptPath) { + this.scriptPath = scriptPath; + } + + public String getScriptBody() { + return scriptBody; + } + + public void setScriptBody(String scriptBody) { + this.scriptBody = scriptBody; + } + + public String[] getModules() { + return modules; + } + + public void setModules(String[] modules) { + this.modules = modules; + } + + public List<PropertyDescriptor> getDescriptors() { + return descriptors; + } + + public void setDescriptors(List<PropertyDescriptor> descriptors) { + this.descriptors = descriptors; + } + + /** + * Custom validation for ensuring exactly one of Script File or Script Body is populated + * + * @param validationContext provides a mechanism for obtaining externally + * managed values, such as property values and supplies convenience methods + * for operating on those values + * @return A collection of validation results + */ + public Collection<ValidationResult> customValidate(ValidationContext validationContext) { + Set<ValidationResult> results = new HashSet<>(); + + // Verify that exactly one of "script file" or "script body" is set + Map<PropertyDescriptor, String> propertyMap = validationContext.getProperties(); + if (StringUtils.isEmpty(propertyMap.get(ScriptingComponentUtils.SCRIPT_FILE)) == StringUtils.isEmpty(propertyMap.get(ScriptingComponentUtils.SCRIPT_BODY))) { + results.add(new ValidationResult.Builder().valid(false).explanation( + "Exactly one of Script File or Script Body must be set").build()); + } + + return results; + } + + /** + * This method creates all resources needed for the script processor to function, such as script engines, + * script file reloader threads, etc. + */ + public void createResources() { + descriptors = new ArrayList<>(); + // The following is required for JRuby, should be transparent to everything else. + // Note this is not done in a ScriptEngineConfigurator, as it is too early in the lifecycle. The + // setting must be there before the factories/engines are loaded. + System.setProperty("org.jruby.embed.localvariable.behavior", "persistent"); + + // Create list of available engines + ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); + List<ScriptEngineFactory> scriptEngineFactories = scriptEngineManager.getEngineFactories(); + if (scriptEngineFactories != null) { + scriptEngineFactoryMap = new HashMap<>(scriptEngineFactories.size()); + List<AllowableValue> engineList = new LinkedList<>(); + for (ScriptEngineFactory factory : scriptEngineFactories) { + engineList.add(new AllowableValue(factory.getLanguageName())); + scriptEngineFactoryMap.put(factory.getLanguageName(), factory); + } + + // Sort the list by name so the list always looks the same. + Collections.sort(engineList, (o1, o2) -> { + if (o1 == null) { + return o2 == null ? 0 : 1; + } + if (o2 == null) { + return -1; + } + return o1.getValue().compareTo(o2.getValue()); + }); + + AllowableValue[] engines = engineList.toArray(new AllowableValue[engineList.size()]); + + SCRIPT_ENGINE = new PropertyDescriptor.Builder() + .name("Script Engine") + .required(true) + .description("The engine to execute scripts") + .allowableValues(engines) + .defaultValue(engines[0].getValue()) + .required(true) + .expressionLanguageSupported(false) + .build(); + descriptors.add(SCRIPT_ENGINE); + } + + descriptors.add(ScriptingComponentUtils.SCRIPT_FILE); + descriptors.add(ScriptingComponentUtils.SCRIPT_BODY); + descriptors.add(ScriptingComponentUtils.MODULES); + + isInitialized.set(true); + } + + /** + * Determines whether the given path refers to a valid file + * + * @param path a path to a file + * @return true if the path refers to a valid file, false otherwise + */ + public static boolean isFile(final String path) { + return path != null && Files.isRegularFile(Paths.get(path)); + } + + /** + * Performs common setup operations when the processor is scheduled to run. This method assumes the member + * variables associated with properties have been filled. + * + * @param numberOfScriptEngines number of engines to setup + */ + public void setup(int numberOfScriptEngines, ComponentLog log) { + + if (scriptEngineConfiguratorMap.isEmpty()) { + ServiceLoader<ScriptEngineConfigurator> configuratorServiceLoader = + ServiceLoader.load(ScriptEngineConfigurator.class); + for (ScriptEngineConfigurator configurator : configuratorServiceLoader) { + scriptEngineConfiguratorMap.put(configurator.getScriptEngineName().toLowerCase(), configurator); + } + } + setupEngines(numberOfScriptEngines, log); + } + + /** + * Configures the specified script engine. First, the engine is loaded and instantiated using the JSR-223 + * javax.script APIs. Then, if any script configurators have been defined for this engine, their init() method is + * called, and the configurator is saved for future calls. + * + * @param numberOfScriptEngines number of engines to setup + * @see org.apache.nifi.processors.script.ScriptEngineConfigurator + */ + protected void setupEngines(int numberOfScriptEngines, ComponentLog log) { + engineQ = new LinkedBlockingQueue<>(numberOfScriptEngines); + ClassLoader originalContextClassLoader = Thread.currentThread().getContextClassLoader(); + try { + if (StringUtils.isBlank(scriptEngineName)) { + throw new IllegalArgumentException("The script engine name cannot be null"); + } + + ScriptEngineConfigurator configurator = scriptEngineConfiguratorMap.get(scriptEngineName.toLowerCase()); + + // Get a list of URLs from the configurator (if present), or just convert modules from Strings to URLs + URL[] additionalClasspathURLs = null; + if (configurator != null) { + additionalClasspathURLs = configurator.getModuleURLsForClasspath(modules, log); + } else { + if (modules != null) { + List<URL> urls = new LinkedList<>(); + for (String modulePathString : modules) { + try { + urls.add(new File(modulePathString).toURI().toURL()); + } catch (MalformedURLException mue) { + log.error("{} is not a valid file, ignoring", new Object[]{modulePathString}, mue); + } + } + additionalClasspathURLs = urls.toArray(new URL[urls.size()]); + } + } + + // Need the right classloader when the engine is created. This ensures the NAR's execution class loader + // (plus the module path) becomes the parent for the script engine + ClassLoader scriptEngineModuleClassLoader = additionalClasspathURLs != null + ? new URLClassLoader(additionalClasspathURLs, originalContextClassLoader) + : originalContextClassLoader; + if (scriptEngineModuleClassLoader != null) { + Thread.currentThread().setContextClassLoader(scriptEngineModuleClassLoader); + } + + for (int i = 0; i < numberOfScriptEngines; i++) { + ScriptEngine scriptEngine = createScriptEngine(); + try { + if (configurator != null) { + configurator.init(scriptEngine, modules); + } + if (!engineQ.offer(scriptEngine)) { + log.error("Error adding script engine {}", new Object[]{scriptEngine.getFactory().getEngineName()}); + } + + } catch (ScriptException se) { + log.error("Error initializing script engine configurator {}", new Object[]{scriptEngineName}); + if (log.isDebugEnabled()) { + log.error("Error initializing script engine configurator", se); + } + } + } + } finally { + // Restore original context class loader + Thread.currentThread().setContextClassLoader(originalContextClassLoader); + } + } + + public void setupVariables(ProcessContext context) { + scriptEngineName = context.getProperty(SCRIPT_ENGINE).getValue(); + scriptPath = context.getProperty(ScriptingComponentUtils.SCRIPT_FILE).evaluateAttributeExpressions().getValue(); + scriptBody = context.getProperty(ScriptingComponentUtils.SCRIPT_BODY).getValue(); + String modulePath = context.getProperty(ScriptingComponentUtils.MODULES).evaluateAttributeExpressions().getValue(); + if (!StringUtils.isEmpty(modulePath)) { + modules = modulePath.split(","); + } else { + modules = new String[0]; + } + } + + public void setupVariables(ConfigurationContext context) { + scriptEngineName = context.getProperty(SCRIPT_ENGINE).getValue(); + scriptPath = context.getProperty(ScriptingComponentUtils.SCRIPT_FILE).evaluateAttributeExpressions().getValue(); + scriptBody = context.getProperty(ScriptingComponentUtils.SCRIPT_BODY).getValue(); + String modulePath = context.getProperty(ScriptingComponentUtils.MODULES).evaluateAttributeExpressions().getValue(); + if (!StringUtils.isEmpty(modulePath)) { + modules = modulePath.split(","); + } else { + modules = new String[0]; + } + } + + /** + * Provides a ScriptEngine corresponding to the currently selected script engine name. + * ScriptEngineManager.getEngineByName() doesn't use find ScriptEngineFactory.getName(), which + * is what we used to populate the list. So just search the list of factories until a match is + * found, then create and return a script engine. + * + * @return a Script Engine corresponding to the currently specified name, or null if none is found. + */ + protected ScriptEngine createScriptEngine() { + // + ScriptEngineFactory factory = scriptEngineFactoryMap.get(scriptEngineName); + if (factory == null) { + return null; + } + return factory.getScriptEngine(); + } + + public void stop() { + if (engineQ != null) { + engineQ.clear(); + } + } +} http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentUtils.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentUtils.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentUtils.java new file mode 100644 index 0000000..e3af457 --- /dev/null +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/ScriptingComponentUtils.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.nifi.script; + +import org.apache.nifi.components.PropertyDescriptor; +import org.apache.nifi.components.Validator; +import org.apache.nifi.processor.Relationship; +import org.apache.nifi.processor.util.StandardValidators; + +/** + * Utility methods and constants used by the scripting components. + */ +public class ScriptingComponentUtils { + /** A relationship indicating flow files were processed successfully */ + public static final Relationship REL_SUCCESS = new Relationship.Builder() + .name("success") + .description("FlowFiles that were successfully processed") + .build(); + + /** A relationship indicating an error while processing flow files */ + public static final Relationship REL_FAILURE = new Relationship.Builder() + .name("failure") + .description("FlowFiles that failed to be processed") + .build(); + + /** A property descriptor for specifying the location of a script file */ + public static final PropertyDescriptor SCRIPT_FILE = new PropertyDescriptor.Builder() + .name("Script File") + .required(false) + .description("Path to script file to execute. Only one of Script File or Script Body may be used") + .addValidator(new StandardValidators.FileExistsValidator(true)) + .expressionLanguageSupported(true) + .build(); + + /** A property descriptor for specifying the body of a script */ + public static final PropertyDescriptor SCRIPT_BODY = new PropertyDescriptor.Builder() + .name("Script Body") + .required(false) + .description("Body of script to execute. Only one of Script File or Script Body may be used") + .addValidator(Validator.VALID) + .expressionLanguageSupported(false) + .build(); + + /** A property descriptor for specifying the location of additional modules to be used by the script */ + public static final PropertyDescriptor MODULES = new PropertyDescriptor.Builder() + .name("Module Directory") + .description("Comma-separated list of paths to files and/or directories which contain modules required by the script.") + .required(false) + .expressionLanguageSupported(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); +} + http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/AbstractModuleClassloaderConfigurator.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/AbstractModuleClassloaderConfigurator.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/AbstractModuleClassloaderConfigurator.java new file mode 100644 index 0000000..2285b1f --- /dev/null +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/AbstractModuleClassloaderConfigurator.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.nifi.script.impl; + +import org.apache.nifi.logging.ComponentLog; +import org.apache.nifi.processors.script.ScriptEngineConfigurator; + +import java.io.File; +import java.io.FilenameFilter; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.LinkedList; +import java.util.List; + +/** + * This base class provides a common implementation for the getModuleURLsForClasspath method of the + * ScriptEngineConfigurator interface + */ +public abstract class AbstractModuleClassloaderConfigurator implements ScriptEngineConfigurator { + + /** + * Scans the given module paths for JARs. The path itself (whether a directory or file) will be added to the list + * of returned module URLs, and if a directory is specified, it is scanned for JAR files (files ending with .jar). + * Any JAR files found are added to the list of module URLs. This is a convenience method for adding directories + * full of JAR files to an ExecuteScript or InvokeScriptedProcessor instance, rather than having to enumerate each + * JAR's URL. + * @param modulePaths An array of module paths to scan/add + * @param log A logger for the calling component, to provide feedback for missing files, e.g. + * @return An array of URLs corresponding to all modules determined from the input set of module paths. + */ + @Override + public URL[] getModuleURLsForClasspath(String[] modulePaths, ComponentLog log) { + List<URL> additionalClasspath = new LinkedList<>(); + if (modulePaths != null) { + for (String modulePathString : modulePaths) { + File modulePath = new File(modulePathString); + + if (modulePath.exists()) { + // Add the URL of this path + try { + additionalClasspath.add(modulePath.toURI().toURL()); + } catch (MalformedURLException mue) { + log.warn("{} is not a valid file/folder, ignoring", new Object[]{modulePath.getAbsolutePath()}, mue); + } + + // If the path is a directory, we need to scan for JARs and add them to the classpath + if (modulePath.isDirectory()) { + File[] jarFiles = modulePath.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return (name != null && name.endsWith(".jar")); + } + }); + + if (jarFiles != null) { + // Add each to the classpath + for (File jarFile : jarFiles) { + try { + additionalClasspath.add(jarFile.toURI().toURL()); + + } catch (MalformedURLException mue) { + log.warn("{} is not a valid file/folder, ignoring", new Object[]{modulePath.getAbsolutePath()}, mue); + } + } + } + } + } else { + log.warn("{} does not exist, ignoring", new Object[]{modulePath.getAbsolutePath()}); + } + } + } + return additionalClasspath.toArray(new URL[additionalClasspath.size()]); + } +} http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/ClojureScriptEngineConfigurator.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/ClojureScriptEngineConfigurator.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/ClojureScriptEngineConfigurator.java new file mode 100644 index 0000000..7eeb7dd --- /dev/null +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/ClojureScriptEngineConfigurator.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.nifi.script.impl; + +import org.apache.nifi.processors.script.engine.ClojureScriptEngine; + +import javax.script.ScriptEngine; +import javax.script.ScriptException; + +public class ClojureScriptEngineConfigurator extends AbstractModuleClassloaderConfigurator { + + private static final String PRELOADS = + "(:import \n" + + "[org.apache.nifi.components " + + "AbstractConfigurableComponent AllowableValue ConfigurableComponent PropertyDescriptor PropertyValue ValidationContext ValidationResult Validator" + + "]\n" + + "[org.apache.nifi.components.state Scope StateManager StateMap]\n" + + "[org.apache.nifi.flowfile FlowFile]\n" + + "[org.apache.nifi.processor " + + "AbstractProcessor AbstractSessionFactoryProcessor DataUnit FlowFileFilter ProcessContext Processor " + + "ProcessorInitializationContext ProcessSession ProcessSessionFactory Relationship SchedulingContext" + + "]\n" + + "[org.apache.nifi.processor.exception FlowFileAccessException FlowFileHandlingException MissingFlowFileException ProcessException]\n" + + "[org.apache.nifi.processor.io InputStreamCallback OutputStreamCallback StreamCallback]\n" + + "[org.apache.nifi.processor.util FlowFileFilters StandardValidators]\n" + + "[org.apache.nifi.processors.script ExecuteScript InvokeScriptedProcessor ScriptEngineConfigurator]\n" + + "[org.apache.nifi.script ScriptingComponentHelper ScriptingComponentUtils]\n" + + "[org.apache.nifi.logging ComponentLog]\n" + + "[org.apache.nifi.lookup LookupService RecordLookupService StringLookupService LookupFailureException]\n" + + ")\n"; + + + private ScriptEngine scriptEngine; + + @Override + public String getScriptEngineName() { + return "Clojure"; + } + + + @Override + public Object init(ScriptEngine engine, String[] modulePaths) throws ScriptException { + scriptEngine = engine; + return scriptEngine; + } + + @Override + public Object eval(ScriptEngine engine, String scriptBody, String[] modulePaths) throws ScriptException { + scriptEngine = engine; + StringBuilder sb = new StringBuilder("(ns "); + sb.append(((ClojureScriptEngine) scriptEngine).getNamespace()); + sb.append(" "); + sb.append(PRELOADS); + sb.append(")\n"); + sb.append(scriptBody); + return engine.eval(sb.toString()); + } +} http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/GroovyScriptEngineConfigurator.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/GroovyScriptEngineConfigurator.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/GroovyScriptEngineConfigurator.java new file mode 100644 index 0000000..8856bf1 --- /dev/null +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/GroovyScriptEngineConfigurator.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.nifi.script.impl; + +import javax.script.ScriptEngine; +import javax.script.ScriptException; + +public class GroovyScriptEngineConfigurator extends AbstractModuleClassloaderConfigurator { + + private static final String PRELOADS = + "import org.apache.nifi.components.*\n" + + "import org.apache.nifi.flowfile.FlowFile\n" + + "import org.apache.nifi.processor.*\n" + + "import org.apache.nifi.processor.exception.*\n" + + "import org.apache.nifi.processor.io.*\n" + + "import org.apache.nifi.processor.util.*\n" + + "import org.apache.nifi.processors.script.*\n" + + "import org.apache.nifi.logging.ComponentLog\n" + + "import org.apache.nifi.script.*\n" + + "import org.apache.nifi.lookup.*\n"; + + private ScriptEngine scriptEngine; + + @Override + public String getScriptEngineName() { + return "Groovy"; + } + + + + @Override + public Object init(ScriptEngine engine, String[] modulePaths) throws ScriptException { + scriptEngine = engine; + return scriptEngine; + } + + @Override + public Object eval(ScriptEngine engine, String scriptBody, String[] modulePaths) throws ScriptException { + scriptEngine = engine; + return engine.eval(PRELOADS + scriptBody); + } +} http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/JavascriptScriptEngineConfigurator.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/JavascriptScriptEngineConfigurator.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/JavascriptScriptEngineConfigurator.java new file mode 100644 index 0000000..fe64b4c --- /dev/null +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/JavascriptScriptEngineConfigurator.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.nifi.script.impl; + +import javax.script.ScriptEngine; +import javax.script.ScriptException; + +/** + * This class offers methods to perform Javascript-specific operations during the script engine lifecycle. + */ +public class JavascriptScriptEngineConfigurator extends AbstractModuleClassloaderConfigurator { + + @Override + public String getScriptEngineName() { + return "ECMAScript"; + } + + @Override + public Object init(ScriptEngine engine, String[] modulePaths) throws ScriptException { + // No initialization methods needed at present + return engine; + } + + @Override + public Object eval(ScriptEngine engine, String scriptBody, String[] modulePaths) throws ScriptException { + return engine.eval(scriptBody); + } +} http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/JythonScriptEngineConfigurator.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/JythonScriptEngineConfigurator.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/JythonScriptEngineConfigurator.java new file mode 100644 index 0000000..35f34d6 --- /dev/null +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/script/impl/JythonScriptEngineConfigurator.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.nifi.script.impl; + +import org.apache.nifi.logging.ComponentLog; +import org.apache.nifi.processors.script.ScriptEngineConfigurator; + +import javax.script.ScriptEngine; +import javax.script.ScriptException; +import java.net.URL; + +/** + * A helper class to configure the Jython engine with any specific requirements + */ +public class JythonScriptEngineConfigurator implements ScriptEngineConfigurator { + + @Override + public String getScriptEngineName() { + return "python"; + } + + @Override + public URL[] getModuleURLsForClasspath(String[] modulePaths, ComponentLog log) { + // We don't need to add the module paths to the classpath, they will be added via sys.path.append + return new URL[0]; + } + + @Override + public Object init(ScriptEngine engine, String[] modulePaths) throws ScriptException { + return null; + } + + @Override + public Object eval(ScriptEngine engine, String scriptBody, String[] modulePaths) throws ScriptException { + Object returnValue = null; + if (engine != null) { + // Need to import the module path inside the engine, in order to pick up + // other Python/Jython modules + engine.eval("import sys"); + if (modulePaths != null) { + for (String modulePath : modulePaths) { + engine.eval("sys.path.append('" + modulePath + "')"); + } + } + returnValue = engine.eval(scriptBody); + } + return returnValue; + } +} http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService index f698255..a49f837 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/resources/META-INF/services/org.apache.nifi.controller.ControllerService @@ -14,4 +14,5 @@ # limitations under the License. org.apache.nifi.record.script.ScriptedReader -org.apache.nifi.record.script.ScriptedRecordSetWriter \ No newline at end of file +org.apache.nifi.record.script.ScriptedRecordSetWriter +org.apache.nifi.lookup.script.ScriptedLookupService \ No newline at end of file http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/resources/META-INF/services/org.apache.nifi.processors.script.ScriptEngineConfigurator ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/resources/META-INF/services/org.apache.nifi.processors.script.ScriptEngineConfigurator b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/resources/META-INF/services/org.apache.nifi.processors.script.ScriptEngineConfigurator index 7602f6d..fa53e29 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/resources/META-INF/services/org.apache.nifi.processors.script.ScriptEngineConfigurator +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/resources/META-INF/services/org.apache.nifi.processors.script.ScriptEngineConfigurator @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -org.apache.nifi.processors.script.impl.ClojureScriptEngineConfigurator -org.apache.nifi.processors.script.impl.JythonScriptEngineConfigurator -org.apache.nifi.processors.script.impl.GroovyScriptEngineConfigurator -org.apache.nifi.processors.script.impl.JavascriptScriptEngineConfigurator +org.apache.nifi.script.impl.ClojureScriptEngineConfigurator +org.apache.nifi.script.impl.JythonScriptEngineConfigurator +org.apache.nifi.script.impl.GroovyScriptEngineConfigurator +org.apache.nifi.script.impl.JavascriptScriptEngineConfigurator http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/lookup/script/TestScriptedLookupService.groovy ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/lookup/script/TestScriptedLookupService.groovy b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/lookup/script/TestScriptedLookupService.groovy new file mode 100644 index 0000000..439b37d --- /dev/null +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/lookup/script/TestScriptedLookupService.groovy @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.nifi.lookup.script + +import org.apache.commons.io.FileUtils +import org.apache.nifi.components.PropertyDescriptor +import org.apache.nifi.controller.ConfigurationContext +import org.apache.nifi.controller.ControllerServiceInitializationContext +import org.apache.nifi.logging.ComponentLog +import org.apache.nifi.processors.script.AccessibleScriptingComponentHelper +import org.apache.nifi.script.ScriptingComponentHelper +import org.apache.nifi.script.ScriptingComponentUtils +import org.apache.nifi.util.MockFlowFile +import org.apache.nifi.util.MockPropertyValue +import org.junit.Before +import org.junit.BeforeClass +import org.junit.Test +import org.slf4j.Logger +import org.slf4j.LoggerFactory + +import static junit.framework.TestCase.assertEquals +import static org.junit.Assert.assertFalse +import static org.junit.Assert.assertTrue +import static org.mockito.Mockito.mock +import static org.mockito.Mockito.when + +/** + * Unit tests for the ScriptedLookupService controller service + */ +class TestScriptedLookupService { + + private static final Logger logger = LoggerFactory.getLogger(TestScriptedLookupService) + ScriptedLookupService scriptedLookupService + def scriptingComponent + + + @BeforeClass + static void setUpOnce() throws Exception { + logger.metaClass.methodMissing = {String name, args -> + logger.info("[${name?.toUpperCase()}] ${(args as List).join(" ")}") + } + FileUtils.copyDirectory('src/test/resources' as File, 'target/test/resources' as File) + } + + @Before + void setUp() { + scriptedLookupService = new MockScriptedLookupService() + scriptingComponent = (AccessibleScriptingComponentHelper) scriptedLookupService + } + + @Test + void testLookupServiceGroovyScript() { + + def properties = [:] as Map<PropertyDescriptor, String> + scriptedLookupService.getSupportedPropertyDescriptors().each {PropertyDescriptor descriptor -> + properties.put(descriptor, descriptor.getDefaultValue()) + } + + // Mock the ConfigurationContext for setup(...) + def configurationContext = mock(ConfigurationContext) + when(configurationContext.getProperty(scriptingComponent.getScriptingComponentHelper().SCRIPT_ENGINE)) + .thenReturn(new MockPropertyValue('Groovy')) + when(configurationContext.getProperty(ScriptingComponentUtils.SCRIPT_FILE)) + .thenReturn(new MockPropertyValue('target/test/resources/groovy/test_lookup_inline.groovy')) + when(configurationContext.getProperty(ScriptingComponentUtils.SCRIPT_BODY)) + .thenReturn(new MockPropertyValue(null)) + when(configurationContext.getProperty(ScriptingComponentUtils.MODULES)) + .thenReturn(new MockPropertyValue(null)) + + def logger = mock(ComponentLog) + def initContext = mock(ControllerServiceInitializationContext) + when(initContext.getIdentifier()).thenReturn(UUID.randomUUID().toString()) + when(initContext.getLogger()).thenReturn(logger) + + scriptedLookupService.initialize initContext + scriptedLookupService.onEnabled configurationContext + + MockFlowFile mockFlowFile = new MockFlowFile(1L) + InputStream inStream = new ByteArrayInputStream('Flow file content not used'.bytes) + + Optional opt = scriptedLookupService.lookup('Hello') + assertTrue(opt.present) + assertEquals('Hi', opt.get()) + opt = scriptedLookupService.lookup('World') + assertTrue(opt.present) + assertEquals('there', opt.get()) + opt = scriptedLookupService.lookup('Not There') + assertFalse(opt.present) + } + + class MockScriptedLookupService extends ScriptedLookupService implements AccessibleScriptingComponentHelper { + + @Override + ScriptingComponentHelper getScriptingComponentHelper() { + return this.@scriptingComponentHelper + } + } +} http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/processors/script/ExecuteScriptGroovyTest.groovy ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/processors/script/ExecuteScriptGroovyTest.groovy b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/processors/script/ExecuteScriptGroovyTest.groovy index 0302616..36d8dc7 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/processors/script/ExecuteScriptGroovyTest.groovy +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/processors/script/ExecuteScriptGroovyTest.groovy @@ -16,6 +16,7 @@ */ package org.apache.nifi.processors.script +import org.apache.nifi.script.ScriptingComponentUtils import org.apache.nifi.util.MockFlowFile import org.apache.nifi.util.StopWatch import org.apache.nifi.util.TestRunners http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/record/script/ScriptedReaderTest.groovy ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/record/script/ScriptedReaderTest.groovy b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/record/script/ScriptedReaderTest.groovy index 1025146..440ecb2 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/record/script/ScriptedReaderTest.groovy +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/record/script/ScriptedReaderTest.groovy @@ -23,8 +23,8 @@ import org.apache.nifi.controller.ControllerServiceInitializationContext import org.apache.nifi.logging.ComponentLog import org.apache.nifi.processor.util.StandardValidators import org.apache.nifi.processors.script.AccessibleScriptingComponentHelper -import org.apache.nifi.processors.script.ScriptingComponentHelper -import org.apache.nifi.processors.script.ScriptingComponentUtils +import org.apache.nifi.script.ScriptingComponentHelper +import org.apache.nifi.script.ScriptingComponentUtils import org.apache.nifi.serialization.RecordReader import org.apache.nifi.util.MockComponentLog import org.apache.nifi.util.MockFlowFile http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/record/script/ScriptedRecordSetWriterTest.groovy ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/record/script/ScriptedRecordSetWriterTest.groovy b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/record/script/ScriptedRecordSetWriterTest.groovy index 96fda19..42a9826 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/record/script/ScriptedRecordSetWriterTest.groovy +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/record/script/ScriptedRecordSetWriterTest.groovy @@ -22,8 +22,8 @@ import org.apache.nifi.controller.ConfigurationContext import org.apache.nifi.controller.ControllerServiceInitializationContext import org.apache.nifi.logging.ComponentLog import org.apache.nifi.processors.script.AccessibleScriptingComponentHelper -import org.apache.nifi.processors.script.ScriptingComponentHelper -import org.apache.nifi.processors.script.ScriptingComponentUtils +import org.apache.nifi.script.ScriptingComponentHelper +import org.apache.nifi.script.ScriptingComponentUtils import org.apache.nifi.serialization.RecordSetWriter import org.apache.nifi.serialization.SimpleRecordSchema import org.apache.nifi.serialization.record.MapRecord http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/reporting/script/ScriptedReportingTaskGroovyTest.groovy ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/reporting/script/ScriptedReportingTaskGroovyTest.groovy b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/reporting/script/ScriptedReportingTaskGroovyTest.groovy index 085c054..f0b77d3 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/reporting/script/ScriptedReportingTaskGroovyTest.groovy +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/reporting/script/ScriptedReportingTaskGroovyTest.groovy @@ -22,8 +22,8 @@ import org.apache.nifi.components.PropertyValue import org.apache.nifi.controller.ConfigurationContext import org.apache.nifi.logging.ComponentLog import org.apache.nifi.processors.script.AccessibleScriptingComponentHelper -import org.apache.nifi.processors.script.ScriptingComponentHelper -import org.apache.nifi.processors.script.ScriptingComponentUtils +import org.apache.nifi.script.ScriptingComponentHelper +import org.apache.nifi.script.ScriptingComponentUtils import org.apache.nifi.provenance.ProvenanceEventBuilder import org.apache.nifi.provenance.ProvenanceEventRecord import org.apache.nifi.provenance.ProvenanceEventRepository http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/AccessibleScriptingComponentHelper.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/AccessibleScriptingComponentHelper.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/AccessibleScriptingComponentHelper.java index 5e3928e..a08a18a 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/AccessibleScriptingComponentHelper.java +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/AccessibleScriptingComponentHelper.java @@ -16,6 +16,8 @@ */ package org.apache.nifi.processors.script; +import org.apache.nifi.script.ScriptingComponentHelper; + /** * An interface for retrieving the scripting component helper for a scripting processor. Aids in testing (for setting the Script Engine descriptor, for example). */ http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/BaseScriptTest.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/BaseScriptTest.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/BaseScriptTest.java index 881383e..03ff29c 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/BaseScriptTest.java +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/BaseScriptTest.java @@ -17,6 +17,7 @@ package org.apache.nifi.processors.script; import org.apache.commons.io.FileUtils; +import org.apache.nifi.script.ScriptingComponentHelper; import org.apache.nifi.util.TestRunner; import org.apache.nifi.util.TestRunners; import org.junit.BeforeClass; http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteClojure.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteClojure.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteClojure.java index 6818a78..99b377c 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteClojure.java +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteClojure.java @@ -16,6 +16,7 @@ */ package org.apache.nifi.processors.script; +import org.apache.nifi.script.ScriptingComponentUtils; import org.apache.nifi.util.MockFlowFile; import org.junit.Before; import org.junit.Test; http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteGroovy.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteGroovy.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteGroovy.java index adaf955..d7deeb7 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteGroovy.java +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteGroovy.java @@ -16,6 +16,7 @@ */ package org.apache.nifi.processors.script; +import org.apache.nifi.script.ScriptingComponentUtils; import org.apache.nifi.util.MockFlowFile; import org.junit.Before; import org.junit.Test; http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJRuby.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJRuby.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJRuby.java index 64a0524..843bd5a 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJRuby.java +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJRuby.java @@ -16,6 +16,7 @@ */ package org.apache.nifi.processors.script; +import org.apache.nifi.script.ScriptingComponentUtils; import org.apache.nifi.util.MockFlowFile; import org.apache.nifi.util.TestRunner; import org.apache.nifi.util.TestRunners; http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJavascript.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJavascript.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJavascript.java index 032f567..e07ced0 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJavascript.java +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJavascript.java @@ -16,6 +16,7 @@ */ package org.apache.nifi.processors.script; +import org.apache.nifi.script.ScriptingComponentUtils; import org.apache.nifi.util.MockFlowFile; import org.apache.nifi.util.TestRunner; import org.apache.nifi.util.TestRunners; http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJython.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJython.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJython.java index 412f243..a8827aa 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJython.java +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteJython.java @@ -16,6 +16,7 @@ */ package org.apache.nifi.processors.script; +import org.apache.nifi.script.ScriptingComponentUtils; import org.apache.nifi.util.MockFlowFile; import org.junit.Before; import org.junit.Test; http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteLua.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteLua.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteLua.java index 65bd0dd..4e72f7d 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteLua.java +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestExecuteLua.java @@ -16,6 +16,7 @@ */ package org.apache.nifi.processors.script; +import org.apache.nifi.script.ScriptingComponentUtils; import org.apache.nifi.util.MockFlowFile; import org.apache.nifi.util.TestRunner; import org.apache.nifi.util.TestRunners; http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeGroovy.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeGroovy.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeGroovy.java index 1fb8ac5..7568a04 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeGroovy.java +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeGroovy.java @@ -18,6 +18,7 @@ package org.apache.nifi.processors.script; import org.apache.nifi.components.PropertyDescriptor; import org.apache.nifi.processor.Relationship; +import org.apache.nifi.script.ScriptingComponentUtils; import org.apache.nifi.util.MockFlowFile; import org.apache.nifi.util.MockProcessContext; import org.apache.nifi.util.MockProcessorInitializationContext; http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeJavascript.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeJavascript.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeJavascript.java index 5db00ff..f6500c6 100644 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeJavascript.java +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeJavascript.java @@ -18,6 +18,7 @@ package org.apache.nifi.processors.script; import org.apache.nifi.components.PropertyDescriptor; import org.apache.nifi.processor.Relationship; +import org.apache.nifi.script.ScriptingComponentUtils; import org.apache.nifi.util.MockFlowFile; import org.apache.nifi.util.MockProcessContext; import org.apache.nifi.util.MockProcessorInitializationContext; http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeJython.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeJython.java b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeJython.java index 661b8e4..5b17e04 100755 --- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeJython.java +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/java/org/apache/nifi/processors/script/TestInvokeJython.java @@ -17,6 +17,7 @@ package org.apache.nifi.processors.script; import org.apache.nifi.components.ValidationResult; +import org.apache.nifi.script.ScriptingComponentUtils; import org.apache.nifi.util.MockFlowFile; import org.apache.nifi.util.MockProcessContext; import org.apache.nifi.util.TestRunner; http://git-wip-us.apache.org/repos/asf/nifi/blob/9294a261/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/groovy/test_lookup_inline.groovy ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/groovy/test_lookup_inline.groovy b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/groovy/test_lookup_inline.groovy new file mode 100644 index 0000000..273ccb9 --- /dev/null +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/groovy/test_lookup_inline.groovy @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.apache.nifi.controller.ControllerServiceInitializationContext +import org.apache.nifi.reporting.InitializationException + + +class GroovyLookupService implements LookupService<String> { + + def lookupTable = [ + 'Hello': 'Hi', + 'World': 'there' + ] + + + @Override + Optional<String> lookup(String key) { + Optional.ofNullable(lookupTable[key]) + } + + @Override + Class<?> getValueType() { + return String + } + + @Override + void initialize(ControllerServiceInitializationContext context) throws InitializationException { + + } + + @Override + Collection<ValidationResult> validate(ValidationContext context) { + return null + } + + @Override + PropertyDescriptor getPropertyDescriptor(String name) { + return null + } + + @Override + void onPropertyModified(PropertyDescriptor descriptor, String oldValue, String newValue) { + + } + + @Override + List<PropertyDescriptor> getPropertyDescriptors() { + return null + } + + @Override + String getIdentifier() { + return null + } +} + +lookupService = new GroovyLookupService() \ No newline at end of file
