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 index 1db75bf28d..f11558403a 100644 --- 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 @@ -265,7 +265,11 @@ public class ScriptingComponentHelper { scriptEngineName = context.getProperty(SCRIPT_ENGINE).getValue(); scriptPath = context.getProperty(ScriptingComponentUtils.SCRIPT_FILE).evaluateAttributeExpressions().getValue(); scriptBody = context.getProperty(ScriptingComponentUtils.SCRIPT_BODY).getValue(); - modules = context.getProperty(ScriptingComponentUtils.MODULES).evaluateAttributeExpressions().asResources().flattenRecursively(); + if ("python".equalsIgnoreCase(scriptEngineName)) { + modules = context.getProperty(ScriptingComponentUtils.MODULES).evaluateAttributeExpressions().asResources(); + } else { + modules = context.getProperty(ScriptingComponentUtils.MODULES).evaluateAttributeExpressions().asResources().flattenRecursively(); + } } public void stop() { 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 4a987d172c..3bc0abc071 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 @@ -61,6 +61,32 @@ public class TestExecuteJython extends BaseScriptTest { result.get(0).assertAttributeEquals("from-content", "test content"); } + /** + * Tests a Jython script that references an outside python module + * + */ + @Test + public void testAccessModuleAndStoreInFlowFileAttributeWithScriptBody() { + runner.setValidateExpressionUsage(false); + runner.setProperty(scriptingComponent.getScriptingComponentHelper().SCRIPT_ENGINE, "python"); + runner.setProperty(ScriptingComponentUtils.MODULES, "target/test/resources/jython/"); + runner.setProperty(ScriptingComponentUtils.SCRIPT_BODY, + "from org.apache.nifi.processors.script import ExecuteScript\n" + + "from test_external_module import ExternalModule\n" + + "externalModule = ExternalModule()\n" + + "flowFile = session.get()\n" + + "flowFile = session.putAttribute(flowFile, \"key\", externalModule.testHelloWorld())\n" + + "session.transfer(flowFile, ExecuteScript.REL_SUCCESS)"); + + runner.assertValid(); + runner.enqueue("test content".getBytes(StandardCharsets.UTF_8)); + runner.run(); + + runner.assertAllFlowFilesTransferred(ExecuteScript.REL_SUCCESS, 1); + final List result = runner.getFlowFilesForRelationship(ExecuteScript.REL_SUCCESS); + result.get(0).assertAttributeEquals("key", "helloWorld"); + } + /** * Tests a script that does not transfer or remove the original flow file, thereby causing an error during commit. * diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/jython/test_external_module.py b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/jython/test_external_module.py new file mode 100755 index 0000000000..20c47c590c --- /dev/null +++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/jython/test_external_module.py @@ -0,0 +1,29 @@ +#! /usr/bin/python +# +# 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. +# + +class ExternalModule : + + def __init__(self) : + pass + + def testHelloWorld(self) : + return "helloWorld" + +