Sorry empty List. Sent from my iPhone
> On Apr 3, 2017, at 5:52 PM, Matt Burgess <[email protected]> wrote: > > 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()
