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

Reply via email to