[ 
https://issues.apache.org/jira/browse/NIFI-4367?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Patrice Freydiere updated NIFI-4367:
------------------------------------
    Comment: was deleted

(was: 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)

Reply via email to