Jim,

I'm not at my keyboard but I'm guessing it is a NullPointerException from 
returning None from getPropertyDescriptors(), try returning an empty PyMap 
instead.

Regards,
Matt

Sent from my iPhone

> On Apr 3, 2017, at 5:35 PM, James McMahon <[email protected]> wrote:
> 
> Good evening. I am trying to get this simple update attribute function to 
> work in an InvokeScriptedProcessor ....processor. I wish to initialize custom 
> logging to a distinct log file specifically associated with this processor. 
> While updating an attribute is (should be) a very simple case, it seems that 
> making the ISP work with this custom directed logging is not.
> 
> I was able to get a simple filename attribute change to work, but a 
> particular ERROR gets thrown each and every time the ISP wkaes up and checks 
> for flowfiles to process. The error is this:
> 
> 2017-04-03 10:59:31,370 ERROR [Timer-Driven Process Thread-4] 
> o.a.n.p.script.InvokeScriptedProcessor InvokeScriptedProcessor[id=1f379.....] 
> Unable to get property descriptors from Processor: 
> java.lang.reflect.UndeclaredThrowableException
> 
> I am running NiFi 0.7.1.
> 
> Either there is something obvious that I've done wrong in the following code 
> or I'm not using ISP properly. I did research this error and found a link 
> that appeared to be directly related (at Hortonworks), but unfortunately when 
> I incorporated the change to PySet it did not resolve my issue. Here is that 
> link in case you are interested:
> https://community.hortonworks.com/questions/75420/invokescriptedprocessor-in-python.html
> 
> I also want to point out that I found this approach documented here, and 
> referenced by Matt. B:
> https://github.com/apache/nifi/blob/master/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/resources/jython/test_update_attribute.py
> 
> Please note that I had to recreate my code here. Typos if found are not in 
> the code but are introduced by my mad typing "skills" here.
> 
> Anyone encounter and fix such a problem, eliminating this error? Thanks in 
> advance for any help. Code shown below. -Jim
> 
> # Approach:
> # First, get a simple attribute to update (DONE)
> # Second, add directed logging to a specific file (getting many of the ERRORs 
> detailed above)
> # Third, expand on the update attribute concept to select a small subset of 
> attributes, form them into a json object, and replace the existing flowfile 
> payload with that
> 
> import sys
> import traceback
> import logging
> from org.apache.nifi.processor import Processor
> from org.apache.nifi.processor import Relationship
> from org.apache.nifi.components import PropertyDescriptor
> from org.apache.nifi.processor.util import StandardValidators
> from org.python.core import PySet
> 
> class UpdateAttributes(Processor) :
>      #__rel_success = 
> Relationship.Builder().description("Success").name("success".build()
>      def __init__(self) :
>           self.__rel_success = 
> Relationship.Builder().description("Success").name("success".build()
>           self.log = None
> 
>      def initialize(self,context) :
>           try :
>                LOG_FILENAME='/home/nifi/latest/logs/TestLog.log'
>                # Still tbd:
>                # FORMAT='%(asctime)-15s %(message)s'
>                # formatter = logging.Formatter('%(asctime)-15s %(message)s)'
>                # self.log = context.getLogger()
>                # handler = context.FileHandler(LOG_FILENAME)
>                # handler.setFormatter(formatter)
>                #self.addHandler(handler)
>           except :
>                pass
> 
>      def getRelationships(self) :
>           return PySet([self.__rel_success])
> 
>      def validate(self,context) :
>           return None
> 
>      def getPropertyDescriptor(self) :
>           return None
>           # try :
>           #      descriptor = 
> PropertyDescriptor.Builder().name("filename").addValidators(StandardValidators.NON_EMPTY_VALIDATOR).build()
>           #      return [descriptor]
>           # except :
>           #      pass
> 
>      def getPropertyDescriptors(self) :
>           return None
> 
>      def onPropertyModified(self,descriptor,newValue,oldValue) :
>           pass
> 
>      def onTrigger(self,context,sessionFactory) :
>           session = sessionFactory.createSession()
>           try :
>                # ensure there is work to do
>                flowfile = session.,get()
>                if flowfile is None :
>                     return
> 
>                # extract some attribute value of interest
>                # fromPropertyValue = 
> context.getProperty("for-attributes").getValue()
>                fromAttributeValue = flowfile.getAttribute("filename")
> 
>                # set our attribute to the desired new value
>                # flowfile = session.putAttribute(flowfile, "from-property", 
> fromPropertyValue)
>                flowfile = session.putAttribute(flowfile, "filename", 
> "LARRY_CURLEY_MOE")
> 
>                # transfer
>                session.transfer(flowfile, self.__rel_success)
>                session.commit()
>           except:
>                session.rollback()
>                raise
> 
> processor = UpdateAttributes()

Reply via email to