[
https://issues.apache.org/jira/browse/NIFI-4367?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16159925#comment-16159925
]
Patrice Freydiere commented on NIFI-4367:
-----------------------------------------
Test code reproduction on master :
diff --git
a/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
b/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
index 6fe5195..7d4a9b2 100644
---
a/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
+++
b/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
@@ -340,6 +340,9 @@ public class StandardProcessorTestRunner implements
TestRunner {
@Override
public void assertValid() {
context.assertValid();
+
+ final ValidationContext validationContext = new
MockValidationContext(context, this.processorStateManager, variableRegistry);
+ processor.validate(validationContext);
}
@Override
diff --git
a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/processors/script/InvokeScriptedProcessor.java
b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/processors/script/InvokeScriptedProcessor.java
index 6abf93e..2d425a2 100644
---
a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/processors/script/InvokeScriptedProcessor.java
+++
b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/main/java/org/apache/nifi/processors/script/InvokeScriptedProcessor.java
@@ -27,11 +27,14 @@ import org.apache.nifi.annotation.documentation.Tags;
import org.apache.nifi.annotation.lifecycle.OnScheduled;
import org.apache.nifi.annotation.lifecycle.OnStopped;
import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.components.PropertyValue;
import org.apache.nifi.components.ValidationContext;
import org.apache.nifi.components.ValidationResult;
import org.apache.nifi.components.state.Scope;
+import org.apache.nifi.controller.ControllerService;
import org.apache.nifi.controller.ControllerServiceLookup;
import org.apache.nifi.controller.NodeTypeProvider;
+import org.apache.nifi.expression.ExpressionLanguageCompiler;
import org.apache.nifi.logging.ComponentLog;
import org.apache.nifi.processor.AbstractSessionFactoryProcessor;
import org.apache.nifi.processor.ProcessContext;
@@ -43,6 +46,7 @@ import org.apache.nifi.processor.exception.ProcessException;
import org.apache.nifi.processor.util.StandardValidators;
import org.apache.nifi.script.ScriptingComponentHelper;
import org.apache.nifi.script.ScriptingComponentUtils;
+import org.apache.nifi.script.impl.FilteredPropertiesValidationContextAdapter;
import javax.script.Invocable;
import javax.script.ScriptEngine;
@@ -55,6 +59,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
@@ -461,8 +466,14 @@ public class InvokeScriptedProcessor extends
AbstractSessionFactoryProcessor {
// if there was existing validation errors and the processor loaded
successfully
if (currentValidationResults.isEmpty() && instance != null) {
try {
- // defer to the underlying processor for validation
- final Collection<ValidationResult> instanceResults =
instance.validate(context);
+ // defer to the underlying processor for validation, without
the
+ // invokescriptedprocessor properties
+
+ final Set<PropertyDescriptor> innerPropertyDescriptor = new
HashSet<PropertyDescriptor>(scriptingComponentHelper.getDescriptors());
+
+// ValidationContext innerValidationContext = new
FilteredPropertiesValidationContextAdapter(context, innerPropertyDescriptor);
+ final Collection<ValidationResult> instanceResults =
instance.validate(context);
+
if (instanceResults != null && instanceResults.size() > 0) {
// return the validation results from the underlying
instance
return instanceResults;
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 d7deeb7..4bd6a92 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,16 +16,18 @@
*/
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;
+import static org.junit.Assert.assertEquals;
+import java.io.FileInputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
-import static org.junit.Assert.assertEquals;
+import org.apache.commons.io.IOUtils;
+import org.apache.nifi.script.ScriptingComponentUtils;
+import org.apache.nifi.util.MockFlowFile;
+import org.junit.Before;
+import org.junit.Test;
public class TestExecuteGroovy extends BaseScriptTest {
@@ -289,4 +291,6 @@ public class TestExecuteGroovy extends BaseScriptTest {
runner.enqueue("test content".getBytes(StandardCharsets.UTF_8));
runner.run();
}
+
+
}
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 7568a04..5897e79 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
@@ -171,4 +171,26 @@ public class TestInvokeGroovy extends BaseScriptTest {
final List<MockFlowFile> result =
runner.getFlowFilesForRelationship("FAILURE");
assertFalse(result.isEmpty());
}
+
+ /**
+ * Tests a script that derive from AbstractProcessor as base class
+ *
+ * @throws Exception Any error encountered while testing
+ */
+ @Test
+ public void testAbstractProcessorImplementationWithBodyScriptFile()
throws Exception {
+ runner.setValidateExpressionUsage(false);
+
runner.setProperty(scriptingComponent.getScriptingComponentHelper().SCRIPT_ENGINE,
"Groovy");
+
+ runner.setProperty(ScriptingComponentUtils.SCRIPT_BODY,
getFileContentsAsString(TEST_RESOURCE_LOCATION +
"groovy/test_implementingabstractProcessor.groovy"));
+ // runner.setProperty(ScriptingComponentUtils.SCRIPT_FILE,
(String)null);
+
+ runner.setProperty(ScriptingComponentUtils.MODULES,
TEST_RESOURCE_LOCATION + "groovy");
+
+ runner.assertValid();
+
+ runner.enqueue("test".getBytes(StandardCharsets.UTF_8));
+ runner.run();
+
+ }
}
test_implementingabstractProcessor.groovy :
import org.apache.nifi.components.PropertyDescriptor
import org.apache.nifi.components.ValidationContext
import org.apache.nifi.components.ValidationResult
import org.apache.nifi.logging.ComponentLog
import org.apache.nifi.processor.AbstractProcessor
import org.apache.nifi.processor.ProcessContext
import org.apache.nifi.processor.ProcessSession
import org.apache.nifi.processor.ProcessSessionFactory
import org.apache.nifi.processor.ProcessorInitializationContext
import org.apache.nifi.processor.Relationship
import org.apache.nifi.processor.exception.ProcessException
class testImplementingAbstractProcessor extends AbstractProcessor {
def ComponentLog log
void onTrigger(final ProcessContext context, final
ProcessSession session) throws ProcessException {
}
}
processor = new testImplementingAbstractProcessor()
Exception raised :
[main] ERROR
org.apache.nifi.processors.script.BaseScriptTest$AccessibleInvokeScriptedProcessor
- [AccessibleInvokeScriptedProcessor[id=3d530126-78e2-4eab-94d1-9e81c1896c25]]
Unable to validate the script Processor:
java.lang.reflect.UndeclaredThrowableException
java.lang.reflect.UndeclaredThrowableException
at com.sun.proxy.$Proxy19.validate(Unknown Source)
at
org.apache.nifi.processors.script.InvokeScriptedProcessor.customValidate(InvokeScriptedProcessor.java:475)
at
org.apache.nifi.components.AbstractConfigurableComponent.validate(AbstractConfigurableComponent.java:126)
at
org.apache.nifi.util.MockProcessContext.validate(MockProcessContext.java:235)
at
org.apache.nifi.util.MockProcessContext.assertValid(MockProcessContext.java:252)
at
org.apache.nifi.util.StandardProcessorTestRunner.assertValid(StandardProcessorTestRunner.java:342)
at
org.apache.nifi.processors.script.TestInvokeGroovy.testAbstractProcessorImplementationWithBodyScriptFile(TestInvokeGroovy.java:190)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: javax.script.ScriptException: java.lang.NullPointerException
at
org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.invokeImpl(GroovyScriptEngineImpl.java:405)
at
org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.access$100(GroovyScriptEngineImpl.java:98)
at
org.codehaus.groovy.jsr223.GroovyScriptEngineImpl$3.invoke(GroovyScriptEngineImpl.java:446)
... 32 more
Caused by: java.lang.NullPointerException
at java.io.File.<init>(Unknown Source)
at
org.apache.nifi.processor.util.StandardValidators$FileExistsValidator.validate(StandardValidators.java:784)
at
org.apache.nifi.components.PropertyDescriptor.validate(PropertyDescriptor.java:200)
at
org.apache.nifi.components.AbstractConfigurableComponent.validate(AbstractConfigurableComponent.java:116)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1210)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1019)
at
org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:919)
at
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:902)
at
org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.invokeImpl(GroovyScriptEngineImpl.java:398)
... 34 more
> InvokedScriptedProcessor
> ------------------------
>
> Key: NIFI-4367
> URL: https://issues.apache.org/jira/browse/NIFI-4367
> Project: Apache NiFi
> Issue Type: Bug
> Components: Core Framework
> Affects Versions: 1.3.0
> Environment: Linux / Windows
> Reporter: Patrice Freydiere
> Labels: InvokeScriptedProcessor, validation
>
> InvokeScriptedProcessor pass his ValidationContext to the inner script,
> validate call
> InvokeScriptedProcessor Line 465 : final
> Collection<ValidationResult> instanceResults = instance.validate(context);
>
> The problem is that the invokedscript pass the ScriptFile PropertyDescriptor
> that is validated, if the script derived from the
> AbstractConfigurableComponent, (because the AbstractConfigurableComponent
> validate all the context properties).
> The context should be refined to remove the InvokeScriptedProcessor
> Properties.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)