This is an automated email from the ASF dual-hosted git repository.

pgyori pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 36fb6f109f NIFI-13528: fixed Python processor's customValidate function
36fb6f109f is described below

commit 36fb6f109fd06b61ecaf47d43a40308a1f94f94b
Author: Mark Bathori <[email protected]>
AuthorDate: Mon Jul 8 13:32:09 2024 +0200

    NIFI-13528: fixed Python processor's customValidate function
    
    This closes #9061.
    
    Signed-off-by: Peter Gyori <[email protected]>
---
 .../src/main/python/src/nifiapi/properties.py      | 80 ++++++++++++++++------
 .../python/framework/PythonProcessorAdapter.py     |  9 ++-
 2 files changed, 65 insertions(+), 24 deletions(-)

diff --git 
a/nifi-extension-bundles/nifi-py4j-bundle/nifi-python-extension-api/src/main/python/src/nifiapi/properties.py
 
b/nifi-extension-bundles/nifi-py4j-bundle/nifi-python-extension-api/src/main/python/src/nifiapi/properties.py
index 27f4877506..a37107ac18 100644
--- 
a/nifi-extension-bundles/nifi-py4j-bundle/nifi-python-extension-api/src/main/python/src/nifiapi/properties.py
+++ 
b/nifi-extension-bundles/nifi-py4j-bundle/nifi-python-extension-api/src/main/python/src/nifiapi/properties.py
@@ -292,30 +292,11 @@ class PropertyDescriptor:
         builder.identifiesExternalResource(cardinality, types[0], types[1:])
 
 
-class ProcessContext:
+class PropertyContext:
     __trivial_attribute_reference__ = re.compile(r"\$\{([^${}\[\],:;/*\' 
\t\r\n\\d][^${}\[\],:;/*\' \t\r\n]*)}")
     __escaped_attribute_reference__ = re.compile(r"\$\{'([^${}\[\],:;/*\' 
\t\r\n\\d][^${}\[\],:;/*\'\t\r\n]*)'}")
 
-    def __init__(self, java_context):
-        self.java_context = java_context
-
-        descriptors = java_context.getProperties().keySet()
-        self.name = java_context.getName()
-        self.property_values = {}
-        self.descriptor_value_map = {}
-
-        for descriptor in descriptors:
-            property_value = java_context.getProperty(descriptor.getName())
-            string_value = property_value.getValue()
-
-            property_value = 
self.__create_python_property_value(descriptor.isExpressionLanguageSupported(), 
property_value, string_value)
-            self.property_values[descriptor.getName()] = property_value
-
-            python_descriptor = 
PropertyDescriptor.from_java_descriptor(descriptor)
-            self.descriptor_value_map[python_descriptor] = string_value
-
-
-    def __create_python_property_value(self, el_supported, 
java_property_value, string_value):
+    def create_python_property_value(self, el_supported, java_property_value, 
string_value):
         el_present = java_property_value.isExpressionLanguagePresent()
         referenced_attribute = None
         if el_present:
@@ -339,12 +320,52 @@ class ProcessContext:
 
     def newPropertyValue(self, value):
         java_property_value = self.java_context.newPropertyValue(value)
-        return self.__create_python_property_value(True, java_property_value, 
value)
+        return self.create_python_property_value(True, java_property_value, 
value)
+
+
+class ProcessContext(PropertyContext):
+
+    def __init__(self, java_context):
+        self.java_context = java_context
+
+        descriptors = java_context.getProperties().keySet()
+        self.name = java_context.getName()
+        self.property_values = {}
+        self.descriptor_value_map = {}
+
+        for descriptor in descriptors:
+            property_value = java_context.getProperty(descriptor.getName())
+            string_value = property_value.getValue()
+
+            property_value = 
self.create_python_property_value(descriptor.isExpressionLanguageSupported(), 
property_value, string_value)
+            self.property_values[descriptor.getName()] = property_value
+
+            python_descriptor = 
PropertyDescriptor.from_java_descriptor(descriptor)
+            self.descriptor_value_map[python_descriptor] = string_value
 
     def getName(self):
         return self.name
 
 
+class ValidationContext(PropertyContext):
+
+    def __init__(self, java_context):
+        self.java_context = java_context
+
+        descriptors = java_context.getProperties().keySet()
+        self.property_values = {}
+        self.descriptor_value_map = {}
+
+        for descriptor in descriptors:
+            property_value = java_context.getProperty(descriptor)
+            string_value = property_value.getValue()
+
+            property_value = 
self.create_python_property_value(descriptor.isExpressionLanguageSupported(), 
property_value, string_value)
+            self.property_values[descriptor.getName()] = property_value
+
+            python_descriptor = 
PropertyDescriptor.from_java_descriptor(descriptor)
+            self.descriptor_value_map[python_descriptor] = string_value
+
 
 class TimeUnit(Enum):
     NANOSECONDS = "NANOSECONDS",
@@ -435,3 +456,18 @@ class PythonPropertyValue:
 
         return self
 
+
+class ValidationResult:
+    def __init__(self, subject="", explanation="", valid=False, input=None):
+        self.subject = subject
+        self.explanation = explanation
+        self.valid = valid
+        self.input = input
+
+    def to_java_validation_result(self):
+            return 
JvmHolder.gateway.jvm.org.apache.nifi.components.ValidationResult.Builder() \
+                .subject(self.subject) \
+                .explanation(self.explanation) \
+                .valid(self.valid) \
+                .input(self.input) \
+                .build()
diff --git 
a/nifi-extension-bundles/nifi-py4j-bundle/nifi-python-framework/src/main/python/framework/PythonProcessorAdapter.py
 
b/nifi-extension-bundles/nifi-py4j-bundle/nifi-python-framework/src/main/python/framework/PythonProcessorAdapter.py
index 44d46febb8..34e995b959 100644
--- 
a/nifi-extension-bundles/nifi-py4j-bundle/nifi-python-framework/src/main/python/framework/PythonProcessorAdapter.py
+++ 
b/nifi-extension-bundles/nifi-py4j-bundle/nifi-python-framework/src/main/python/framework/PythonProcessorAdapter.py
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from nifiapi.properties import ProcessContext
+from nifiapi.properties import ProcessContext, ValidationContext
 
 
 def is_method_defined(processor, method_name):
@@ -58,7 +58,12 @@ class PythonProcessorAdapter:
         if not self.hasCustomValidate:
             return None
 
-        return self.processor.customValidate(ProcessContext(context))
+        validation_results = 
self.processor.customValidate(ValidationContext(context))
+
+        result_list = self.gateway.jvm.java.util.ArrayList()
+        for result in validation_results:
+            result_list.add(result.to_java_validation_result())
+        return result_list
 
     def getRelationships(self):
         # If self.relationships is None, it means that the Processor has 
implemented the method, and we need

Reply via email to