//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License.  You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
= NiFi Developer's Guide
Apache NiFi Team <dev@nifi.apache.org>
:homepage: http://nifi.apache.org
:linkattrs:


== Introduction

The intent of this Developer Guide is to provide the reader with the information needed to understand how Apache NiFi
extensions are developed and help to explain the thought process behind developing the components. It provides an introduction to
and explanation of the API that is used to develop extensions. It does not, however, go into great detail about each
of the methods in the API, as this guide is intended to supplement the JavaDocs of the API rather than replace them.
This guide also assumes that the reader is familiar with Java 7 and Apache Maven.

This guide is written by developers for developers. It is expected that before reading this
guide, you have a basic understanding of NiFi and the concepts of dataflow. If not, please see the link:overview.html[NiFi Overview]
and the link:user-guide.html[NiFi User Guide] to familiarize yourself with the concepts of NiFi.


[[components]]
== NiFi Components

NiFi provides several extension points to provide developers the
ability to add functionality to the application to meet their needs. The following list provides a
high-level description of the most common extension points:

- Processor
    * The Processor interface is the mechanism through which NiFi exposes access to
      <<flowfile>>s, their attributes, and their content. The Processor is the basic building
      block used to comprise a NiFi dataflow. This interface is used to accomplish
      all of the following tasks:

        ** Create FlowFiles
        ** Read FlowFile content
        ** Write FlowFile content
        ** Read FlowFile attributes
        ** Update FlowFile attributes
        ** Ingest data
        ** Egress data
        ** Route data
        ** Extract data
        ** Modify data

- ReportingTask
    * The ReportingTask interface is a mechanism that NiFi exposes to allow metrics,
      monitoring information, and internal NiFi state to be published to external
      endpoints, such as log files, e-mail, and remote web services.

- ControllerService
    * A ControllerService provides shared state and functionality across Processors, other ControllerServices,
      and ReportingTasks within a single JVM. An example use case may include loading a very
      large dataset into memory. By performing this work in a ControllerService, the data
      can be loaded once and be exposed to all Processors via this service, rather than requiring
      many different Processors to load the dataset themselves.

- FlowFilePrioritizer
    * The FlowFilePrioritizer interface provides a mechanism by which <<flowfile>>s
      in a queue can be prioritized, or sorted, so that the FlowFiles can be processed in an order
      that is most effective for a particular use case.

- AuthorityProvider
    * An AuthorityProvider is responsible for determining which privileges and roles, if any,
      a given user should be granted.


[[processor_api]]
== Processor API

The Processor is the most widely used Component available in NiFi.
Processors are the only Component
to which access is given to create, remove, modify, or inspect
FlowFiles (data and attributes).

All Processors are loaded and instantiated using Java's ServiceLoader
mechanism. This means that all
Processors must adhere to the following rules:

    - The Processor must have a default constructor.
    - The Processor's JAR file must contain an entry in the META-INF/services directory named
      `org.apache.nifi.processor.Processor`. This is a text file where each line contains the
      fully-qualified class name of a Processor.

While `Processor` is an interface that can be implemented directly, it
will be extremely rare to do so, as
the `org.apache.nifi.processor.AbstractProcessor` is the base class
for almost all Processor implementations. The `AbstractProcessor` class provides a significant
amount of functionality, which makes the task of developing a Processor much easier and more convenient.
For the scope of this document, we will focus primarily on the `AbstractProcessor` class when dealing
with the Processor API.

.Concurrency Note
NiFi is a highly concurrent framework. This means that all extensions
must be thread-safe. If unfamiliar with writing concurrent software in Java, it is highly
recommended that you familiarize yourself with the principles of Java concurrency.


[[supporting_api]]
=== Supporting API

In order to understand the Processor API, we must first understand -
at least at a high level - several supporting classes and interfaces, which are discussed below.

[[flowfile]]
==== FlowFile
A FlowFile is a logical notion that correlates a piece of data with a
set of Attributes about that data.
Such attributes include a FlowFile's unique identifier, as well as its
name, size, and any number of other
flow-specific values. While the contents and attributes of a FlowFile
can change, the FlowFile object is
immutable. Modifications to a FlowFile are made possible by the ProcessSession.

The core attributes for FlowFiles are defined in the `org.apache.nifi.flowfile.attributes.CoreAttributes` enum.
The most common attributes you'll see are `filename`, `path` and `uuid`. The string in parentheses is the value of the
attribute within the `CoreAttributes` enum and how it appears in the UI/API.

- Filename (`filename`): The filename of the FlowFile. The filename should not contain any directory structure.

- UUID (`uuid`): A Universally Unique Identifier assigned to this FlowFile that distinguishes the FlowFile from other FlowFiles in the system.

- Path (`path`): The FlowFile's path indicates the relative directory to which a FlowFile belongs and does not contain the filename.

- Absolute Path (`absolute.path`): The FlowFile's absolute path indicates the absolute directory to which a FlowFile belongs and does not contain the filename.

- Priority (`priority`): A numeric value indicating the FlowFile priority.

- MIME Type (`mime.type`): The MIME Type of this FlowFile.

- Discard Reason (`discard.reason`): Specifies the reason that a FlowFile is being discarded.

- Alternate Identifier (`alternate.identifier`): Indicates an identifier other than the FlowFile's UUID that is known to refer to this FlowFile.

===== Additional Common Attributes

While these attributes are not members of the `CoreAttributes` enum, they are de facto standards across the system and found on most FlowFiles.

- File Size (`fileSize`): The size of the FlowFile content in bytes.

- Entry Date (`entryDate`): The date and time at which the FlowFile entered the system (i.e., was created). The value of this attribute is a number that represents the number of milliseconds since midnight, Jan. 1, 1970 (UTC).

- Lineage Start Date (`lineageStartDate`): Any time that a FlowFile is cloned, merged, or split, this results in a "child" FlowFile being created. As those children are then cloned, merged, or split, a chain of ancestors is built. This value represents the date and time at which the oldest ancestor entered the system. Another way to think about this is that this attribute represents the latency of the FlowFile through the system. The value is a number that represents the number of milliseconds since midnight, Jan. 1, 1970 (UTC).

[[process_session]]
==== ProcessSession
The ProcessSession, often referred to as simply a "session," provides
a mechanism by which FlowFiles can be created, destroyed, examined, cloned, and transferred to other
Processors. Additionally, a ProcessSession provides mechanism for creating modified versions of
FlowFiles, by adding or removing attributes, or by modifying the FlowFile's content. The ProcessSession
also exposes a mechanism for emitting <<provenance_events>> that provide for the ability to track the
lineage and history of a FlowFile. After operations are performed on one or more FlowFiles, a
ProcessSession can be either committed or rolled back.

[[process_context]]
==== ProcessContext
The ProcessContext provides a bridge between a Processor and the framework. It provides information
about how the Processor is currently configured and allows the Processor to perform
Framework-specific tasks, such as yielding its resources so that the framework will schedule other
Processors to run without consuming resources unnecessarily.


[[property_descriptor]]
==== PropertyDescriptor
PropertyDescriptor defines a property that is to be used by a
Processor, ReportingTask, or ControllerService.
The definition of a property includes its name, a description of the
property, an optional default value,
validation logic, and an indicator as to whether or not the property
is required in order for the Processor
to be valid. PropertyDescriptors are created by instantiating an
instance of the `PropertyDescriptor.Builder`
class, calling the appropriate methods to fill in the details about
the property, and finally calling
the `build` method.


[[validator]]
==== Validator
A PropertyDescriptor MUST specify one or more Validators that can be
used to ensure that the user-entered value
for a property is valid. If a Validator indicates that a property
value is invalid, the Component will not be
able to be run or used until the property becomes valid. If a
Validator is not specified, the Component will be assumed invalid and
NiFi will report that the property is not supported.

[[validation_context]]
==== ValidationContext
When validating property values, a ValidationContext can be used to
obtain ControllerServices,
create PropertyValue objects, and compile and evaluate property values
using the Expression Language.


[[property_value]]
==== PropertyValue
All property values returned to a Processor are returned in the form
of a PropertyValue object. This
object has convenience methods for converting the value from a String
to other forms, such as numbers
and time periods, as well as providing an API for evaluating the
Expression Language.


[[relationship]]
==== Relationship
Relationships define the routes to which a FlowFile may be transferred
from a Processor. Relationships
are created by instantiating an instance of the `Relationship.Builder`
class, calling the appropriate methods
to fill in the details of the Relationship, and finally calling the
`build` method.

[[supporting_api_state_manager]]
==== StateManager
The StateManager provides Processors, Reporting Tasks, and Controller Services a mechanism
for easily storing and retrieving state. The API is similar to that of ConcurrentHashMap
but requires a Scope for each operation. The Scope indicates whether the state is to be
retrieved/stored locally or in a cluster-wide manner. For more information, see the
<<state_manager>> section.

[[processor_initialization_context]]
==== ProcessorInitializationContext
After a Processor is created, its `initialize` method will be called
with an `InitializationContext` object.
This object exposes configuration to the Processor that will not
change throughout the life of the Processor,
such as the unique identifier of the Processor.

[[ComponentLog]]
==== ComponentLog
Processors are encouraged to perform their logging via the
`ComponentLog` interface, rather than obtaining
a direct instance of a third-party logger. This is because logging via
the ComponentLog allows the framework
to render log messages that exceeds a configurable severity level to
the User Interface, allowing those who
monitor the dataflow to be notified when important events occur.
Additionally, it provides a consistent logging
format for all Processors by logging stack traces when in DEBUG mode
and providing the Processor's unique
identifier in log messages.





[[AbstractProcessor]]
=== AbstractProcessor API

Since the vast majority of Processors will be created by extending the
AbstractProcessor, it is the
abstract class that we will examine in this section. The
AbstractProcessor provides several methods that
will be of interest to Processor developers.


==== Processor Initialization

When a Processor is created, before any other methods are invoked, the
`init` method of the
AbstractProcessor will be invoked. The method takes a single argument,
which is of type
`ProcessorInitializationContext`. The context object supplies the
Processor with a ComponentLog,
the Processor's unique identifier, and a ControllerServiceLookup that
can be used to interact with the
configured ControllerServices. Each of these objects is stored by the
AbstractProcessor and may be obtained by
subclasses via the `getLogger`, `getIdentifier`, and
`getControllerServiceLookup` methods, respectively.


==== Exposing Processor's Relationships

In order for a Processor to transfer a FlowFile to a new destination
for follow-on processing, the
Processor must first be able to expose to the Framework all of the
Relationships that it currently supports.
This allows users of the application to connect Processors to one
another by creating
Connections between Processors and assigning the appropriate
Relationships to those Connections.

A Processor exposes the valid set of Relationships by overriding the
`getRelationships` method.
This method takes no arguments and returns a `Set` of `Relationship`
objects. For most Processors, this Set
will be static, but other Processors will generate the Set
dynamically, based on user configuration.
For those Processors for which the Set is static, it is advisable to
create an immutable Set in the Processor's
constructor or init method and return that value, rather than
dynamically generating the Set. This
pattern lends itself to cleaner code and better performance.


==== Exposing Processor Properties

Most Processors will require some amount of user configuration before
they are able to be used. The properties
that a Processor supports are exposed to the Framework via the
`getSupportedPropertyDescriptors` method.
This method takes no arguments and returns a `List` of
`PropertyDescriptor` objects. The order of the objects in the
List is important in that it dictates the order in which the
properties will be rendered in the User Interface.

A `PropertyDescriptor` object is constructed by creating a new
instance of the `PropertyDescriptor.Builder` object,
calling the appropriate methods on the builder, and finally calling
the `build` method.

While this method covers most of the use cases, it is sometimes
desirable to allow users to configure
additional properties whose name are not known. This can be achieved
by overriding the
`getSupportedDynamicPropertyDescriptor` method. This method takes a
`String` as its only argument, which
indicates the name of the property. The method returns a
`PropertyDescriptor` object that can be used to validate
both the name of the property, as well as the value. Any
PropertyDescriptor that is returned from this method
should be built setting the value of `isDynamic` to true in the
`PropertyDescriptor.Builder` class. The default
behavior of AbstractProcessor is to not allow any dynamically created
properties.


==== Validating Processor Properties

A Processor is not able to be started if its configuration is not
valid. Validation of a Processor property can
be achieved by setting a Validator on a PropertyDescriptor or by
restricting the allowable values for a
property via the PropertyDescriptor.Builder's `allowableValues` method
or `identifiesControllerService` method.

In addition, if a property is dependent on another property (by means of the `PropertyDescriptor.Builder`'s
`dependsOn` method) and the dependency is not satisfied, then the Property will be validated.

For example, consider the following two Property Descriptors:
```
PropertyDescriptor USE_FILE = new PropertyDescriptor.Buildler()
    .name("Use File")
    .displayName("Use File")
    .required(true)
    .allowableValues("true", "false")
    .defaultValue("true")
    .build();
```
```
PropertyDescriptor FILE = new PropertyDescriptor.Builder()
    .name("File to Use")
    .displayName("File to Use")
    .required(true)
    .addValidator(StandardValidators.FILE_EXISTS_VALIDATOR)
    .dependsOn(USE_FILE, "true")
    .build();
```
In this case, if the "Use File" property is set to `true`, then the Processor will not be valid unless the "File to Use" property is
set to a valid filename. If "Use File" is set to `true` and "File to Use" does not have a value set, the Processor will be invalid
(because the "File to Use" property is required). If "Use File" is set to `true` and "File to Use" has a value set but the specified
file does not exist, the Processor will also be invalid because the "File to Use" property is invalid according to the Validator.

However, if the "Use File" property is set to `false`, then the "File to Use" property is said to have a dependency that is not satisfied.
As a result, the "File to Use" property will not be considered in the validation. Therefore, if "Use File" is set to `false` and "File to Use"
has no value said, the Processor will still be valid (even though "File to Use" is required, it is only required if "Use File" is `true`).
Likewise, if "File to Use" is set to a non-existent filename such as `/file/that/does/not/exist`, the Processor will still be valid so long as
the "Use File" property is set to `false`.

Furthermore, the "File to Use" property will not even be shown in the NiFi UI unless "Use File" is set to `true`.

There are times, though, when validating a Processor's properties
individually is not sufficient. For this purpose,
the AbstractProcessor exposes a `customValidate` method. The method
takes a single argument of type `ValidationContext`.
The return value of this method is a `Collection` of
`ValidationResult` objects that describe any problems that were
found during validation. Only those ValidationResult objects whose
`isValid` method returns `false` should be returned.
This method will be invoked only if all properties are valid according
to their associated Validators and Allowable Values.
I.e., this method will be called only if all properties are valid
in-and-of themselves, and this method allows for
validation of a Processor's configuration as a whole.


==== Responding to Changes in Configuration

It is sometimes desirable to have a Processor eagerly react when its
properties are changed. The `onPropertyModified`
method allows a Processor to do just that. When a user changes the
property values for a Processor, the
`onPropertyModified` method will be called for each modified property.
The method takes three arguments: the PropertyDescriptor that
indicates which property was modified,
the old value, and the new value. If the property had no previous
value, the second argument will be `null`. If the property
was removed, the third argument will be `null`. It is important to
note that this method will be called regardless of whether
or not the values are valid. This method will be called only when a
value is actually modified, rather than being
called when a user updates a Processor without changing its value. At
the point that this method is invoked, it is guaranteed
that the thread invoking this method is the only thread currently
executing code in the Processor, unless the Processor itself
creates its own threads.


==== Performing the Work

When a Processor has work to do, it is scheduled to do so by having
its `onTrigger` method called by the framework.
The method takes two arguments: a `ProcessContext` and a
`ProcessSession`. The first step in the `onTrigger` method
is often to obtain a FlowFile on which the work is to be performed by
calling one of the `get` methods on the ProcessSession.
For Processors that ingest data into NiFi from external sources, this
step is skipped. The Processor is then free to examine
FlowFile attributes; add, remove, or modify attributes; read or modify
FlowFile content; and transfer FlowFiles to the appropriate
Relationships.


==== When Processors are Triggered

A Processor's `onTrigger` method will be called only when it is
scheduled to run and when work exists for the Processor.
Work is said to exist for a Processor if any of the following conditions is met:

- A Connection whose destination is the Processor has at least one
FlowFile in its queue
- The Processors has no incoming Connections
- The Processor is annotated with the @TriggerWhenEmpty annotation

Several factors exist that will contribute to when a Processor's
`onTrigger` method is invoked. First, the Processor will not
be triggered unless a user has configured the Processor to run. If a
Processor is scheduled to run, the Framework periodically
(the period is configured by users in the User Interface) checks if
there is work for the Processor to do, as described above.
If so, the Framework will check downstream destinations of the
Processor. If any of the Processor's outbound Connections is full,
by default, the Processor will not be scheduled to run.

However, the `@TriggerWhenAnyDestinationAvailable` annotation may be
added to the Processor's class. In this case, the requirement
is changed so that only one downstream destination must be "available"
(a destination is considered "available" if the Connection's
queue is not full), rather than requiring that all downstream
destinations be available.

Also related to Processor scheduling is the `@TriggerSerially`
annotation. Processors that use this Annotation will never have more
than one thread running the `onTrigger` method simultaneously. It is
crucial to note, though, that the thread executing the code
may change from invocation to invocation. Therefore, care must still
be taken to ensure that the Processor is thread-safe!



=== Component Lifecycle

The NiFi API provides lifecycle support through use of Java
Annotations. The `org.apache.nifi.annotation.lifecycle` package
contains
several annotations for lifecycle management. The following
Annotations may be applied to Java methods in a NiFi component to
indicate to
the framework when the methods should be called. For the discussion of
Component Lifecycle, we will define a NiFi component as a
Processor, ControllerServices, or ReportingTask.

==== @OnAdded

The `@OnAdded` annotation causes a method to be invoked as soon as a
component is created. The
component's `initialize` method (or `init` method, if subclasses
`AbstractProcessor`) will be invoked after the component is
constructed,
followed by methods that are annotated with `@OnAdded`. If any method
annotated with `@OnAdded` throws an Exception, an error will
be returned to the user, and that component will not be added to the
flow. Furthermore, other methods with this
Annotation will not be invoked. This method will be called only once
for the lifetime of a component.
Methods with this Annotation must take zero arguments.

==== @OnEnabled

The `@OnEnabled` annotation can be used to indicate a method should be called
whenever the Controller Service is enabled. Any method that has this annotation will be
called every time a user enables the service. Additionally, each time that NiFi
is restarted, if NiFi is configured to "auto-resume state" and the service
is enabled, the method will be invoked.

If a method with this annotation throws a Throwable, a log message and
bulletin will be issued for the component. In this event, the service will
remain in an 'ENABLING' state and will not be usable. All methods with this
annotation will then be called again after a delay. The service will not be
made available for use until all methods with this annotation have returned
without throwing anything.

Methods using this annotation must take either 0 arguments or a single argument
of type `org.apache.nifi.controller.ConfigurationContext`.

Note that this annotation will be ignored if applied to a ReportingTask or
Processor. For a Controller Service, enabling and disabling are considered
lifecycle events, as the action makes them usable or unusable by other
components. However, for a Processor and a Reporting Task, these are not
lifecycle events but rather a mechanism to allow a component to be excluded
when starting or stopping a group of components.

==== @OnRemoved

The `@OnRemoved` annotation causes a method to be invoked before a
component is removed from the flow.
This allows resources to be cleaned up before removing a component.
Methods with this annotation must take zero arguments.
If a method with this annotation throws an Exception, the component
will still be removed.

==== @OnScheduled

This annotation indicates that a method should be called every time
the component is scheduled to run. Because ControllerServices
are not scheduled, using this annotation on a ControllerService does
not make sense and will not be honored. It should be
used only for Processors and Reporting Tasks. If any method with this
annotation throws an Exception, other methods with this
annotation will not be invoked, and a notification will be presented
to the user. In this case, methods annotated with
`@OnUnscheduled` are then triggered, followed by methods with the
`@OnStopped` annotation (during this state, if any of these
methods throws an Exception, those Exceptions are ignored). The
component will then yield its execution for some period of time,
referred to as the "Administrative Yield Duration," which is a value
that is configured in the `nifi.properties` file. Finally, the
process will start again, until all of the methods annotated with
`@OnScheduled` have returned without throwing any Exception.
Methods with this annotation may take zero arguments or may take a
single argument. If the single argument variation is used,
the argument must be of type `ProcessContext` if the component is a
Processor or `ConfigurationContext` if the component
is a ReportingTask.

==== @OnUnscheduled

Methods with this annotation will be called whenever a Processor or
ReportingTask is no longer scheduled to run. At that time, many threads
may still be active in the Processor's `onTrigger` method. If such a method
throws an Exception, a log message will be generated, and the
Exception will be otherwise
ignored and other methods with this annotation will still be invoked.
Methods with this annotation may take zero arguments or may take a
single argument.
If the single argument variation is used, the argument must be of type
`ProcessContext` if the component is a Processor or
`ConfigurationContext` if the
component is a ReportingTask.


==== @OnStopped

Methods with this annotation will be called when a Processor or
ReportingTask is no longer scheduled to run
and all threads have returned from the `onTrigger` method. If such a
method throws an Exception,
a log message will be generated, and the Exception will otherwise be
ignored; other methods with
this annotation will still be invoked.
Methods with this annotation are permitted to take either 0 or 1 argument. If
an argument is used, it must be of type ConfigurationContext if the
component is a ReportingTask or of type ProcessContext if the
component is a Processor.


==== @OnShutdown

Any method that is annotated with the `@OnShutdown` annotation will be
called when NiFi is successfully
shut down. If such a method throws an Exception, a log message will be
generated, and the
Exception will be otherwise ignored and other methods with this
annotation will still be invoked.
Methods with this annotation must take zero arguments. Note: while
NiFi will attempt to invoke methods
with this annotation on all components that use it, this is not always
possible. For example, the process
may be killed unexpectedly, in which case it does not have a chance to
invoke these methods. Therefore,
while methods using this annotation can be used to clean up resources,
for instance, they should not be
relied upon for critical business logic.

=== Component Notification

The NiFi API provides notification support through use of Java
Annotations. The `org.apache.nifi.annotation.notification` package
contains several annotations for notification management. The following
annotations may be applied to Java methods in a NiFi component to
indicate to the framework when the methods should be called. For the
discussion of Component Notification, we will define a NiFi component
as a *Processor*, *Controller Service*, or *Reporting Task*.

==== @OnPrimaryNodeStateChange

The `@OnPrimaryNodeStateChange` annotation causes a method to be invoked
as soon as the state of the Primary Node in a cluster has changed.
Methods with this annotation should take either no arguments or one
argument of type `PrimaryNodeState`. The `PrimaryNodeState` provides
context about what changed so that the component can take appropriate
action. The `PrimaryNodeState` enumerator has two possible values:
`ELECTED_PRIMARY_NODE` (the node receiving this
state has been elected the Primary Node of the NiFi cluster), or
`PRIMARY_NODE_REVOKED` (the node receiving this state was the Primary
Node but has now had its Primary Node role revoked).

[[restricted]]
=== Restricted

A Restricted component is one that can be used to execute arbitrary unsanitized code provided by the operator
through the NiFi REST API/UI or can be used to obtain or alter data on the NiFi host system using the NiFi OS
credentials. These components could be used by an otherwise authorized NiFi user to go beyond the intended use of
the application, escalate privilege, or could expose data about the internals of the NiFi process or the host
system. All of these capabilities should be considered privileged, and admins should be aware of these
capabilities and explicitly enable them for a subset of trusted users.

A Processor, Controller Service, or Reporting Task can be marked with the @Restricted annotation. This
will result in the component being treated as restricted and will require a user to be explicitly added to the
list of users who can access restricted components. Once a user is permitted to access restricted components,
they will be allowed to create and modify those components assuming all other permissions are permitted.
Without access to restricted components, a user will still be aware these types of components exist but will
be unable to create or modify them even with otherwise sufficient permissions.

[[state_manager]]
=== State Manager

From the ProcessContext, ReportingContext, and ControllerServiceInitializationContext, components are
able to call the `getStateManager()` method. This State Manager is responsible for providing a simple API
for storing and retrieving state. This mechanism is intended to provide developers with the ability to
very easily store a set of key/value pairs, retrieve those values, and update them atomically. The state
can be stored local to the node or across all nodes in a cluster. It is important to note, however, that
this mechanism is intended only to provide a mechanism for storing very 'simple' state. As such, the API
simply allows a `Map<String, String>` to be stored and retrieved and for the entire Map to be atomically
replaced. Moreover, the only implementation that is currently supported for storing cluster-wide state is
backed by ZooKeeper. As such, the entire State Map must be less than 1 MB in size, after being serialized.
Attempting to store more than this will result in an Exception being thrown. If the interactions required
by the Processor for managing state are more complex than this (e.g., large amounts of data must be stored
and retrieved, or individual keys must be stored and fetched individually) than a different mechanism should
be used (e.g., communicating with an external database).


[[state_scope]]
==== Scope
When communicating with the State Manager, all method calls require that a Scope be provided. This Scope will
either be `Scope.LOCAL` or `Scope.CLUSTER`. If NiFi is run in a cluster, this Scope provides important information
to the framework about how the operation should occur.

If state as stored using `Scope.CLUSTER`, then all nodes in the cluster will be communicating with the same
state storage mechanism. If state is stored and retrieved using `Scope.LOCAL`, then each node will see a different
representation of the state.

It is also worth noting that if NiFi is configured to run as a standalone instance, rather than running in a cluster,
a scope of `Scope.LOCAL` is always used. This is done in order to allow the developer of a NiFi component to write the code
in one consistent way, without worrying about whether or not the NiFi instance is clustered. The developer should instead assume
that the instance is clustered and write the code accordingly.


==== Storing and Retrieving State

State is stored using the StateManager's `getState`, `setState`, `replace`, and `clear` methods. All of these methods
require that a Scope be provided. It should be noted that the state that is stored with the Local scope is entirely different
than state stored with a Cluster scope. If a Processor stores a value with the key of _My Key_ using the `Scope.CLUSTER` scope,
and then attempts to retrieve the value using the `Scope.LOCAL` scope, the value retrieved will be `null` (unless a value was
also stored with the same key using the `Scope.CLUSTER` scope). Each Processor's state is stored in isolation from other
Processors' state.

It follows, then, that two Processors cannot share the same state. There are, however, some circumstances in which it is very
necessary to share state between two Processors of different types, or two Processors of the same type. This can be accomplished
by using a Controller Service. By storing and retrieving state from a Controller Service, multiple Processors can use the same
Controller Service and the state can be exposed via the Controller Service's API.


==== Unit Tests
NiFi's Mock Framework provides an extensive collection of tools to perform unit testing of Processors. Processor unit tests typically
begin with the `TestRunner` class. As a result, the `TestRunner` class contains a `getStateManager` method of its own. The StateManager
that is returned, however, is of a specific type: `MockStateManager`. This implementation provides several methods in addition to those
defined by the `StateManager` interface, that help developers to more easily develop unit tests.

First, the `MockStateManager` implements the `StateManager` interface, so all of the state can be examined from within a unit test.
Additionally, the `MockStateManager` exposes a handful of `assert*` methods to perform assertions that the State is set as expected.
The `MockStateManager` also provides the ability to indicate that the unit test should immediately fail if state is updated for a particular
`Scope`.




=== Reporting Processor Activity

Processors are responsible for reporting their activity so that users
are able to understand what happens
to their data. Processors should log events via the ComponentLog,
which is accessible via the InitializationContext
or by calling the `getLogger` method of `AbstractProcessor`.

Additionally, Processors should use the `ProvenanceReporter`
interface, obtained via the ProcessSession's
`getProvenanceReporter` method. The ProvenanceReporter should be used
to indicate any time that content is
received from an external source or sent to an external location. The
ProvenanceReporter also has methods for
reporting when a FlowFile is cloned, forked, or modified, and when
multiple FlowFiles are merged into a single FlowFile
as well as associating a FlowFile with some other identifier. However,
these functions are less critical to report, as
the framework is able to detect these things and emit appropriate
events on the Processor's behalf. Yet, it is a best practice
for the Processor developer to emit these events, as it becomes
explicit in the code that these events are being emitted, and
the developer is able to provide additional details to the events,
such as the amount of time that the action took or
pertinent information about the action that was taken. If the
Processor emits an event, the framework will not emit a duplicate
event. Instead, it always assumes that the Processor developer knows
what is happening in the context of the Processor
better than the framework does. The framework may, however, emit a
different event. For example, if a Processor modifies both the
content of a FlowFile and its attributes and then emits only an
ATTRIBUTES_MODIFIED event, the framework will emit a CONTENT_MODIFIED
event. The framework will not emit an ATTRIBUTES_MODIFIED event if any
other event is emitted for that FlowFile (either by the
Processor or the framework). This is due to the fact that all
<<provenance_events>> know about the attributes of the FlowFile before the
event occurred as well as those attributes that occurred as a result
of the processing of that FlowFile, and as a result the
ATTRIBUTES_MODIFIED is generally considered redundant and would result
in a rendering of the FlowFile lineage being very verbose.
It is, however, acceptable for a Processor to emit this event along
with others, if the event is considered pertinent from the
perspective of the Processor.







== Documenting a Component

NiFi attempts to make the user experience as simple and convenient as
possible by providing significant amount of documentation
to the user from within the NiFi application itself via the User
Interface. In order for this to happen, of course, Processor
developers must provide that documentation to the framework. NiFi
exposes a few different mechanisms for supplying documentation to
the framework.


=== Documenting Properties

Individual properties can be documented by calling the `description`
method of a PropertyDescriptor's builder as such:

[source,java]
----
public static final PropertyDescriptor MY_PROPERTY = new PropertyDescriptor.Builder()
  .name("My Property")
  .description("Description of the Property")
  ...
  .build();
----

If the property is to provide a set of allowable values, those values
are presented to the user in a drop-down field in the UI.
Each of those values can also be given a description:

[source,java]
----
public static final AllowableValue EXTENSIVE = new AllowableValue("Extensive", "Extensive",
  "Everything will be logged - use with caution!");
public static final AllowableValue VERBOSE = new AllowableValue("Verbose", "Verbose",
  "Quite a bit of logging will occur");
public static final AllowableValue REGULAR = new AllowableValue("Regular", "Regular",
  "Typical logging will occur");

public static final PropertyDescriptor LOG_LEVEL = new PropertyDescriptor.Builder()
  .name("Amount to Log")
  .description("How much the Processor should log")
  .allowableValues(REGULAR, VERBOSE, EXTENSIVE)
  .defaultValue(REGULAR.getValue())
  ...
  .build();
----


=== Documenting Relationships

Processor Relationships are documented in much the same way that
properties are - by calling the `description` method of a
Relationship's builder:

[source,java]
----
public static final Relationship MY_RELATIONSHIP = new Relationship.Builder()
  .name("My Relationship")
  .description("This relationship is used only if the Processor fails to process the data.")
  .build();
----


=== Documenting Capability and Keywords

The `org.apache.nifi.annotation.documentation` package provides Java
annotations that can be used to document components. The
CapabilityDescription
annotation can be added to a Processor, Reporting Task, or Controller
Service and is intended to provide a brief description of the
functionality
provided by the component. The Tags annotation has a `value` variable
that is defined to be an Array of Strings. As such, it is used
by providing multiple values as a comma-separated list of ++String++s
with curly braces. These values are then incorporated into the UI by
allowing
users to filter the components based on a tag (i.e., a keyword).
Additionally, the UI provides a tag cloud that allows users to select
the tags that
they want to filter by. The tags that are largest in the cloud are
those tags that exist the most on the components in that instance of
NiFi. An
example of using these annotations is provided below:

[source, java]
----
@Tags({"example", "documentation", "developer guide", "processor", "tags"})
@CapabilityDescription("Example Processor that provides no real functionality but is provided" +
  " for an example in the Developer Guide")
public static final ExampleProcessor extends Processor {
    ...
}
----

=== Documenting FlowFile Attribute Interaction

Many times a processor will expect certain FlowFile attributes be set on in-bound FlowFiles in order
for the processor to function properly.  In other cases a processor may update or
create FlowFile attributes on the out-bound FlowFile.  Processor developers may document both of these
behaviors using the `ReadsAttribute` and `WritesAttribute` documentation annotations.  These attributes are used to generate documentation
that gives users a better understanding of how a processor will interact with the flow.

Note: Because Java 7 does not support
repeated annotations on a type, you may need to use `ReadsAttributes` and `WritesAttributes` to indicate
that a processor reads or writes multiple FlowFile attributes.  This annotation can only be applied to Processors.  An example is listed below:

[source, java]
----
@WritesAttributes({ @WritesAttribute(attribute = "invokehttp.status.code", description = "The status code that is returned"),
        @WritesAttribute(attribute = "invokehttp.status.message", description = "The status message that is returned"),
        @WritesAttribute(attribute = "invokehttp.response.body", description = "The response body"),
        @WritesAttribute(attribute = "invokehttp.request.url", description = "The request URL"),
        @WritesAttribute(attribute = "invokehttp.tx.id", description = "The transaction ID that is returned after reading the response"),
        @WritesAttribute(attribute = "invokehttp.remote.dn", description = "The DN of the remote server") })
public final class InvokeHTTP extends AbstractProcessor {
----

=== Documenting Related Components
Often Processors and ControllerServices are related to one another.  Sometimes it is a put/get relation as in `PutFile` and `GetFile`.
Sometimes a Processor uses a ControllerService like `InvokeHTTP` and `StandardSSLContextService`.  Sometimes one ControllerService uses another
like `DistributedMapCacheClientService` and `DistributedMapCacheServer`.  Developers of these extension points may relate these
different components using the `SeeAlso` tag.  This annotation links these components in the documentation.
`SeeAlso` can be applied to Processors, ControllerServices and ReportingTasks.  An example of how to do this is listed below:

[source, java]
----
@SeeAlso(GetFile.class)
public class PutFile extends AbstractProcessor {
----

=== Advanced Documentation

When the documentation methods above are not sufficient, NiFi provides
the ability to expose more advanced documentation to the user via the
"Usage" documentation. When a user right-clicks on a Processor, NiFi
provides a "Usage" menu item in the context menu. Additionally, the
UI exposes a "Help" link in the top-right corner, from which the same
Usage information can be found.

The advanced documentation of a Processor is provided as an HTML file named `additionalDetails.html`.
This file should exist within a directory whose name is the
fully-qualified
name of the Processor, and this directory's parent should be named
`docs` and exist in the root of the Processor's jar.
This file will be linked from a generated HTML file that will contain
all the Capability, Keyword, PropertyDescription and Relationship information,
so it will not be necessary to duplicate that.  This is a place
to provide a rich explanation of what this Processor is doing, what kind of
data it expects and produces, and what FlowFile attributes it expects and produces.
Because this documentation is in an HTML format, you may include images and tables
to best describe this component.  The same methods can be used to provide advanced
documentation for Processors, ControllerServices and ReportingTasks.

[[provenance_events]]
== Provenance Events

The different event types for provenance reporting are:

[options="header"]
|======================
|Provenance Event        |Description
|ADDINFO                 |Indicates a provenance event for adding additional information such as new linkage to a new URI or UUID
|ATTRIBUTES_MODIFIED     |Indicates that a FlowFile's attributes were modified in some way. This event is not needed when another event is reported at the same time, as the other event will already contain all FlowFile attributes
|CLONE                   |Indicates that a FlowFile is an exact duplicate of its parent FlowFile
|CONTENT_MODIFIED        |Indicates that a FlowFile's content was modified in some way. When using this Event Type, it is advisable to provide details about how the content is modified
|CREATE                  |Indicates that a FlowFile was generated from data that was not received from a remote system or external process
|DOWNLOAD                |Indicates that the contents of a FlowFile were downloaded by a user or external entity
|DROP                    |Indicates a provenance event for the conclusion of an object's life for some reason other than object expiration
|EXPIRE                  |Indicates a provenance event for the conclusion of an object's life due to the object not being processed in a timely manner
|FETCH                   |Indicates that the contents of a FlowFile were overwritten using the contents of some external resource. This is similar to the RECEIVE event but varies in that RECEIVE events are intended to be used as the event that introduces the FlowFile into the system, whereas FETCH is used to indicate that the contents of an existing FlowFile were overwritten
|FORK                    |Indicates that one or more FlowFiles were derived from a parent FlowFile
|JOIN                    |Indicates that a single FlowFile is derived from joining together multiple parent FlowFiles
|RECEIVE                 |Indicates a provenance event for receiving data from an external process. This Event Type is expected to be the first event for a FlowFile. As such, a Processor that receives data from an external source and uses that data to replace the content of an existing FlowFile should use the FETCH event type, rather than the RECEIVE event type
|REMOTE_INVOCATION       |Indicates that a remote invocation was requested to an external endpoint (e.g. deleting a remote resource). The external endpoint may exist in a remote or a local system, but is external to NiFi
|REPLAY                  |Indicates a provenance event for replaying a FlowFile. The UUID of the event indicates the UUID of the original FlowFile that is being replayed. The event contains one Parent UUID that is also the UUID of the FlowFile that is being replayed and one Child UUID that is the UUID of the a newly created FlowFile that will be re-queued for processing
|ROUTE                   |Indicates that a FlowFile was routed to a specified relationship and provides information about why the FlowFile was routed to this relationship
|SEND                    |Indicates a provenance event for sending data to an external process
|UNKNOWN                 |Indicates that the type of provenance event is unknown because the user who is attempting to access the event is not authorized to know the type
|======================


== Common Processor Patterns

While there are many different Processors available to NiFi users, the
vast majority of them fall into
one of several common design patterns. Below, we discuss these
patterns, when the patterns are appropriate,
reasons we follow these patterns, and things to watch out for when
applying such patterns. Note that the patterns
and recommendations discussed below are general guidelines and not
hardened rules.


[[ingress]]
=== Data Ingress

A Processor that ingests data into NiFi has a single Relationship
named `success`. This Processor generates
new FlowFiles via the ProcessSession `create` method and does not pull
FlowFiles from incoming Connections.
The Processor name starts with "Get" or "Listen," depending on whether
it polls an external source or exposes
some interface to which external sources can connect. The name ends
with the protocol used for communications.
Processors that follow this pattern include `GetFile`, `GetSFTP`,
`ListenHTTP`, and `GetHTTP`.

This Processor may create or initialize a Connection Pool in a method
that uses the  `@OnScheduled` annotation.
However, because communications problems may prevent connections from
being established or cause connections
to be terminated, connections themselves are not created at this
point. Rather, the connections are
created or leased from the pool in the `onTrigger` method.

The `onTrigger` method of this Processor begins by leasing a
connection from the Connection Pool, if possible,
or otherwise creates a connection to the external service. When no
data is available from the
external source, the `yield` method of the ProcessContext is called by
the Processor and the method returns so
that this Processor avoids continually running and depleting resources
without benefit. Otherwise, this
Processor then creates a FlowFile via the ProcessSession's `create`
method and assigns an appropriate
filename and path to the FlowFile (by adding the `filename` and `path`
attributes), as well as any other
attributes that may be appropriate. An OutputStream to the FlowFile's content is
obtained via the ProcessSession's `write` method, passing a new
OutputStreamCallback (which is usually
an anonymous inner class). From within this callback, the Processor is
able to write to the FlowFile and streams
the content from the external resource to the FlowFile's OutputStream.
If the desire is to write the entire contents
of an InputStream to the FlowFile, the `importFrom` method of
ProcessSession may be more convenient to use than the
`write` method.

When this Processor expects to receive many small files, it may be
advisable to create several FlowFiles from a
single session before committing the session. Typically, this allows
the Framework to treat the content of the
newly created FlowFiles much more efficiently.

This Processor generates a Provenance event indicating that it has
received data and specifies from
where the data came. This Processor should log the creation of the
FlowFile so that the FlowFile's
origin can be determined by analyzing logs, if necessary.

This Processor acknowledges receipt of the data and/or removes the
data from the external source in order
to prevent receipt of duplicate files. *This is done only after the
ProcessSession by which the FlowFile was
created has been committed!* Failure to adhere to this principle may
result in data loss, as restarting NiFi
before the session has been committed will result in the temporary
file being deleted. Note, however, that it
is possible using this approach to receive duplicate data because the
application could be restarted after
committing the session and before acknowledging or removing the data
from the external source. In general, though,
potential data duplication is preferred over potential data loss. The
connection is finally returned or added to
the Connection Pool, depending on whether the connection was leased
from the Connection Pool to begin with or
was created in the `onTrigger` method.

If there is a communications problem, the connection is typically
terminated and not returned (or added) to
the Connection Pool. Connections to remote systems are torn down and
the Connection Pool shutdown in a method
annotated with the `@OnStopped` annotation so that resources can be reclaimed.


=== Data Egress

A Processor that publishes data to an external source has two
Relationships: `success` and `failure`. The
Processor name starts with "Put" followed by the protocol that is used
for data transmission. Processors
that follow this pattern include `PutEmail`, `PutSFTP`, and
`PostHTTP` (note that the name does not
begin with "Put" because this would lead to confusion, since PUT and
POST have special meanings when dealing with
HTTP).

This Processor may create or initialize a Connection Pool in a method
that uses the  `@OnScheduled` annotation.
However, because communications problems may prevent connections from
being established or cause connections
to be terminated, connections themselves are not created at this
point. Rather, the connections are
created or leased from the pool in the `onTrigger` method.

The `onTrigger` method first obtains a FlowFile from the
ProcessSession via the `get` method. If no FlowFile is
available, the method returns without obtaining a connection to the
remote resource.

If at least one FlowFile is available, the Processor obtains a
connection from the Connection Pool, if possible,
or otherwise creates a new connection. If the Processor is neither
able to lease a connection from the Connection Pool
nor create a new connection, the FlowFile is routed to `failure`, the
event is logged, and the method returns.

If a connection was obtained, the Processor obtains an InputStream to
the FlowFile's content by invoking the
`read` method on the ProcessSession and passing an InputStreamCallback
(which is often an anonymous inner class)
and from within that callback transmits the contents of the FlowFile
to the destination. The event is logged
along with the amount of time taken to transfer the file and the data
rate at which the file was transferred.
A SEND event is reported to the ProvenanceReporter by obtaining the
reporter from the ProcessSession via the
`getProvenanceReporter` method and calling the `send` method on the
reporter. The connection is returned or added
to the Connection Pool, depending on whether the connection was leased
from the pool or newly created by the
`onTrigger` method.

If there is a communications problem, the connection is typically
terminated and not returned (or added) to
the Connection Pool. If there is an issue sending the data to the
remote resource, the desired approach for handling the
error depends on a few considerations. If the issue is related to a
network condition, the FlowFile is generally
routed to `failure`. The FlowFile is not penalized because there is
not necessary a problem with the data. Unlike the
case of the <<ingress>> Processor, we typically do not call `yield` on
the ProcessContext. This is because in the case of
ingest, the FlowFile does not exist until the Processor is able to
perform its function. However, in the case of a Put Processor,
the DataFlow Manager may choose to route `failure` to a different
Processor. This can allow for a "backup" system to be
used in the case of problems with one system or can be used for load
distribution across many systems.

If a problem occurs that is data-related, one of two approaches should
be taken. First, if the problem is likely to
sort itself out, the FlowFile is penalized and then routed to
`failure`. This is the case, for instance, with PutFTP,
when a FlowFile cannot be transferred because of a file naming
conflict. The presumption is that the file will eventually
be removed from the directory so that the new file can be transferred.
As a result, we penalize the FlowFile and route to
`failure` so that we can try again later. In the other case, if there
is an actual problem with the data (such as the data does
not conform to some required specification), a different approach may
be taken. In this case, it may be advantageous
to break apart the `failure` relationship into a `failure` and a
`communications failure` relationship. This allows the
DataFlow Manager to determine how to handle each of these cases
individually. It is important in these situations to document
well the differences between the two Relationships by clarifying it in
the "description" when creating the Relationship.

Connections to remote systems are torn down and the Connection Pool
shutdown in a method
annotated with `@OnStopped` so that resources can be reclaimed.


=== Route Based on Content (One-to-One)

A Processor that routes data based on its content will take one of two
forms: Route an incoming FlowFile to exactly
one destination, or route incoming data to 0 or more destinations.
Here, we will discuss the first case.

This Processor has two relationships: `matched` and `unmatched`. If a
particular data format is expected, the Processor
will also have a `failure` relationship that is used when the input is
not of the expected format. The Processor exposes
a Property that indicates the routing criteria.

If the Property that specifies routing criteria requires processing,
such as compiling a Regular Expression, this processing
is done in a method annotated with `@OnScheduled`, if possible. The
result is then stored in a member variable that is marked
as `volatile`.

The `onTrigger` method obtains a single FlowFile. The method reads the
contents of the FlowFile via the ProcessSession's `read`
method, evaluating the Match Criteria as the data is streamed. The
Processor then determines whether the FlowFile should be
routed to `matched` or `unmatched` based on whether or not the
criteria matched, and routes the FlowFile to the appropriate
relationship.

The Processor then emits a Provenance ROUTE event indicating which
Relationship to which the Processor routed the FlowFile.

This Processor is annotated with the `@SideEffectFree` and
`@SupportsBatching` annotations from the `org.apache.nifi.annotation.behavior`
package.


=== Route Based on Content (One-to-Many)

If a Processor will route a single FlowFile to potentially many
relationships, this Processor will be slightly different than
the above-described Processor for Routing Data Based on Content. This
Processor typically has Relationships that are dynamically
defined by the user as well as an `unmatched` relationship.

In order for the user to be able to define additionally Properties,
the `getSupportedDynamicPropertyDescriptor` method must be
overridden. This method returns a PropertyDescriptor with the supplied
name and an applicable Validator to ensure that the
user-specified Matching Criteria is valid.

In this Processor, the Set of Relationships that is returned by the
`getRelationships` method is a member variable that is
marked `volatile`. This Set is initially constructed with a single
Relationship named `unmatched`. The `onPropertyModified` method
is overridden so that when a Property is added or removed, a new
Relationship is created with the same name. If the Processor has
Properties that are not user-defined, it is important to check if the
specified Property is user-defined. This can be achieved by
calling the `isDynamic` method of the PropertyDescriptor that is
passed to this method. If this Property is dynamic,
a new Set of Relationships is then created, and the previous set of
Relationships is copied into it. This new Set
either has the newly created Relationship added to it or removed from
it, depending on whether a new Property was added
to the Processor or a Property was removed (Property removal is
detected by check if the third argument to this function is `null`).
The member variable holding the Set of Relationships is then updated
to point to this new Set.

If the Properties that specify routing criteria require processing,
such as compiling a Regular Expression, this processing is done
in a method annotated with `@OnScheduled`, if possible. The result is
then stored in a member variable that is marked as `volatile`.
This member variable is generally of type `Map` where the key is of
type `Relationship` and the value's type is defined by the result of
processing the property value.

The `onTrigger` method obtains a FlowFile via the `get` method of
ProcessSession. If no FlowFile is available, it returns immediately.
Otherwise, a Set of type Relationship is created. The method reads the
contents of the FlowFile via the ProcessSession's `read` method,
evaluating each of the Match Criteria as the data is streamed. For any
criteria that matches, the relationship associated with that Match
Criteria is added to the Set of Relationships.

After reading the contents of the FlowFile, the method checks if the
Set of Relationships is empty. If so, the original FlowFile has
an attribute added to it to indicate the Relationship to which it was
routed and is routed to the `unmatched`. This is logged, a
Provenance ROUTE event is emitted, and the method returns. If the size
of the Set is equal to 1, the original FlowFile has an attribute
added to it to indicate the Relationship  to which it was routed and
is routed to the Relationship specified by the entry in the Set.
This is logged, a Provenance ROUTE event is emitted for the FlowFile,
and the method returns.

In the event that the Set contains more than 1 Relationship, the
Processor creates a clone of the FlowFile for each Relationship,
except
for the first. This is done via the `clone` method of the
ProcessSession. There is no need to report a CLONE Provenance Event,
as the
framework will handle this for you. The original FlowFile and each
clone are routed to their appropriate Relationship with attribute
indicating the name of the Relationship. A Provenance ROUTE event is
emitted for each FlowFile. This is logged, and the method returns.

This Processor is annotated with the `@SideEffectFree` and
`@SupportsBatching` annotations from the
`org.apache.nifi.annotation.behavior`
package.


=== Route Streams Based on Content (One-to-Many)

The previous description of Route Based on Content (One-to-Many)
provides an abstraction
for creating a very powerful Processor. However, it assumes that each
FlowFile will be routed
in its entirety to zero or more Relationships. What if the incoming
data format is a "stream" of
many different pieces of information - and we want to send different
pieces of this stream to
different Relationships? For example, imagine that we want to have a
RouteCSV Processor such that
it is configured with multiple Regular Expressions. If a line in the
CSV file matches a Regular
Expression, that line should be included in the outbound FlowFile to
the associated relationship.
If a Regular Expression is associated with the Relationship
"has-apples" and that Regular Expression
matches 1,000 of the lines in the FlowFile, there should be one outbound
FlowFile for the "has-apples" relationship that has 1,000 lines in it.
If a different Regular Expression
is associated with the Relationship "has-oranges" and that Regular
Expression matches 50 lines in the
FlowFile, there should be one outbound FlowFile for the "has-oranges"
relationship that has 50 lines in it.
I.e., one FlowFile comes in and two FlowFiles come out. The two
FlowFiles may contain some of the same lines
of text from the original FlowFile, or they may be entirely different.
This is the type of Processor that
we will discuss in this section.

This Processor's name starts with "Route" and ends with the name of
the data type that it routes. In our
example here, we are routing CSV data, so the Processor is named
RouteCSV. This Processor supports dynamic
properties. Each user-defined property has a name that maps to the
name of a Relationship. The value of
the Property is in the format necessary for the "Match Criteria." In
our example, the value of the property
must be a valid Regular Expression.

This Processor maintains an internal `ConcurrentMap` where the key is
a `Relationship` and the value is of
a type dependent on the format of the Match Criteria. In our example,
we would maintain a
`ConcurrentMap<Relationship, Pattern>`. This Processor overrides the
`onPropertyModified` method.
If the new value supplied to this method (the third argument) is null,
the Relationship whose name is
defined by the property name (the first argument) is removed from the
ConcurrentMap. Otherwise, the new value
is processed (in our example, by calling `Pattern.compile(newValue)`)
and this value is added to the ConcurrentMap
with the key again being the Relationship whose name is specified by
the property name.

This Processor will override the `customValidate` method. In this
method, it will retrieve all Properties from
the `ValidationContext` and count the number of PropertyDescriptors
that are dynamic (by calling `isDynamic()`
on the PropertyDescriptor). If the number of dynamic
PropertyDescriptors is 0, this indicates that the user
has not added any Relationships, so the Processor returns a
`ValidationResult` indicating that the Processor
is not valid because it has no Relationships added.

The Processor returns all of the Relationships specified by the user
when its `getRelationships` method is
called and will also return an `unmatched` Relationship. Because this
Processor will have to read and write to the
Content Repository (which can be relatively expensive), if this
Processor is expected to be used for very high
data volumes, it may be advantageous to add a Property that allows the
user to specify whether or not they care
about the data that does not match any of the Match Criteria.

When the `onTrigger` method is called, the Processor obtains a
FlowFile via `ProcessSession.get`. If no data
is available, the Processor returns. Otherwise, the Processor creates
a `Map<Relationship, FlowFile>`. We will
refer to this Map as `flowFileMap`. The Processor reads the incoming
FlowFile by calling `ProcessSession.read`
and provides an `InputStreamCallback`.
From within the Callback, the Processor reads the first piece of data
from the FlowFile. The Processor then
evaluates each of the Match Criteria against this piece of data. If a
particular criteria (in our example,
a Regular Expression) matches, the Processor obtains the FlowFile from
`flowFileMap` that belongs to the appropriate
Relationship. If no FlowFile yet exists in the Map for this
Relationship, the Processor creates a new FlowFile
by calling `session.create(incomingFlowFile)` and then adds the new
FlowFile to `flowFileMap`. The Processor then
writes this piece of data to the FlowFile by calling `session.append`
with an `OutputStreamCallback`. From within
this OutputStreamCallback, we have access to the new FlowFile's
OutputStream, so we are able to write the data
to the new FlowFile. We then return from the OutputStreamCallback.
After iterating over each of the Match Criteria,
if none of them match, we perform the same routines as above for the
`unmatched` relationship (unless the user
configures us to not write out unmatched data). Now that we have
called `session.append`, we have a new version of
the FlowFile. As a result, we need to update our `flowFileMap` to
associate the Relationship with the new FlowFile.

If at any point, an Exception is thrown, we will need to route the
incoming FlowFile to `failure`. We will also
need to remove each of the newly created FlowFiles, as we won't be
transferring them anywhere. We can accomplish
this by calling `session.remove(flowFileMap.values())`. At this point,
we will log the error and return.

Otherwise, if all is successful, we can now iterate through the
`flowFileMap` and transfer each FlowFile to the
corresponding Relationship. The original FlowFile is then either
removed or routed to an `original` relationship.
For each of the newly created FlowFiles, we also emit a Provenance
ROUTE event indicating which Relationship
the FlowFile went to. It is also helpful to include in the details of
the ROUTE event how many pieces of information
were included in this FlowFile. This allows DataFlow Managers to
easily see when looking at the Provenance
Lineage view how many pieces of information went to each of the
relationships for a given input FlowFile.

Additionally, some Processors may need to "group" the data that is
sent to each Relationship so that each FlowFile
that is sent to a relationship has the same value. In our example, we
may want to allow the Regular Expression
to have a Capturing Group and if two different lines in the CSV match
the Regular Expression but have different
values for the Capturing Group, we want them to be added to two
different FlowFiles. The matching value could then
be added to each FlowFile as an Attribute. This can be accomplished by
modifying the `flowFileMap` such that
it is defined as `Map<Relationship, Map<T, FlowFile>>` where `T` is
the type of the Grouping Function (in our
example, the Group would be a `String` because it is the result of
evaluating a Regular Expression's
Capturing Group).



=== Route Based on Attributes

This Processor is almost identical to the Route Data Based on Content
Processors described above. It takes two different forms: One-to-One
and
One-to-Many, as do the Content-Based Routing Processors. This
Processor, however, does not make any call to ProcessSession's `read`
method,
as it does not read FlowFile content. This Processor is typically very
fast, so the `@SupportsBatching` annotation can be very important
in this case.



=== Split Content (One-to-Many)

This Processor generally requires no user configuration, with the
exception of the size of each Split to create. The `onTrigger` method
obtains
a FlowFile from its input queues. A List of type FlowFile is created.
The original FlowFile is read via the ProcessSession's `read` method,
and an InputStreamCallback is used. Within the InputStreamCallback,
the content is read until a point is reached at which the FlowFile
should be
split. If no split is needed, the Callback returns, and the original
FlowFile is routed to `success`. In this case, a Provenance ROUTE
event
is emitted. Typically, ROUTE events are not emitted when routing a
FlowFile to `success` because this generates a very verbose lineage
that
becomes difficult to navigate. However, in this case, the event is
useful because we would otherwise expect a FORK event and the absence
of
any event is likely to cause confusion. The fact that the FlowFile was
not split but was instead transferred to `success` is logged, and the
method returns.

If a point is reached at which a FlowFile needs to be split, a new
FlowFile is created via the ProcessSession's `create(FlowFile)` method
or the
`clone(FlowFile, long, long)` method. The next section of code depends
on whether the `create` method is used or the `clone` method is used.
Both methods are described below. Which solution is appropriate must
be determined on a case-by-case basis.

The Create Method is most appropriate when the data will not be
directly copied from the original FlowFile to the new FlowFile.
For example, if only some of the data will be copied, or if the data
will be modified in some way before being copied to the new
FlowFile, this method is necessary. However, if the content of the new
FlowFile will be an exact copy of a portion of the original
FlowFile, the Clone Method is much preferred.

*Create Method*
If using the `create` method, the method is called with the original
FlowFile as the argument so that the newly created FlowFile will
inherit
the attributes of the original FlowFile and a Provenance FORK event
will be created by the framework.

The code then enters a `try/finally` block. Within the `finally`
block, the newly created FlowFile is added to the List of FlowFiles
that have
been created. This is done within a `finally` block so that if an
Exception is thrown, the newly created FlowFile will be appropriately
cleaned up.
Within the `try` block, the callback initiates a new callback by
calling the ProcessSession's `write` method with an
OutputStreamCallback.
The appropriate data is then copied from the InputStream of the
original FlowFile to the OutputStream for the new FlowFile.

*Clone Method*
If the content of the newly created created FlowFile is to be only a
contiguous subset of the bytes of the original FlowFile, it is
preferred
to use the `clone(FlowFile, long, long)` method instead of the
`create(FlowFile)` method of the ProcessSession. In this case, the
offset
of the original FlowFile at which the new FlowFile's content should
begin is passed as the second argument to the `clone` method. The
length
of the new FlowFile is passed as the third argument to the `clone`
method. For example, if the original FlowFile was 10,000 bytes
and we called `clone(flowFile, 500, 100)`, the FlowFile that would be
returned to us would be identical to `flowFile` with respect to its
attributes. However, the content of the newly created FlowFile would
be 100 bytes in length and would start at offset 500 of the original
FlowFile. That is, the contents of the newly created FlowFile would be
the same as if you had copied bytes 500 through 599 of the original
FlowFile.

After the clone has been created, it is added to the List of FlowFiles.

This method is much more highly preferred than the Create method, when
applicable,
because no disk I/O is required. The framework is able to simply
create a new FlowFile
that references a subset of the original FlowFile's content, rather
than actually copying
the data. However, this is not always possible. For example, if header
information must be copied
from the beginning of the original FlowFile and added to the beginning
of each Split,
then this method is not possible.


*Both Methods*
Regardless of whether the Clone Method or the Create Method is used,
the following is applicable:

If at any point in the InputStreamCallback, a condition is reached in
which processing cannot continue
(for example, the input is malformed), a `ProcessException` should be
thrown. The call to the
ProcessSession's `read` method is wrapped in a `try/catch` block
where `ProcessException` is
caught. If an Exception is caught, a log message is generated
explaining the error. The List of
newly created FlowFiles is removed via the ProcessSession's `remove`
method. The original FlowFile
is routed to `failure`.

If no problems arise, the original FlowFile is routed to `original`
and all newly created FlowFiles
are updated to include the following attributes:

[options="header"]
|===
| Attribute Name | Description
| `split.parent.uuid` | The UUID of the original FlowFile
| `split.index` | A one-up number indicating which FlowFile in the list this is (the first FlowFile
          created will have a value `0`, the second will have a value `1`, etc.)
| `split.count` | The total number of split FlowFiles that were created
|===

The newly created FlowFiles are routed to `success`; this event is
logged; and the method returns.


=== Update Attributes Based on Content

This Processor is very similar to the Route Based on Content
Processors discussed above. Rather than
routing a FlowFile to `matched` or `unmatched`, the FlowFile is
generally routed to `success` or `failure`
and attributes are added to the FlowFile as appropriate. The
attributes to be added are configured in a
manner similar to that of the Route Based on Content (One-to-Many),
with the user defining their own
properties. The name of the property indicates the name of an
attribute to add. The value of the
property indicates some Matching Criteria to be applied to the data.
If the Matching Criteria matches
the data, an attribute is added with the name the same as that of the
Property. The value of the
attribute is the criteria from the content that matched.

For example, a Processor that evaluates XPath Expressions may allow
user-defined XPaths to be
entered. If the XPath matches the content of a FlowFile, that FlowFile
will have an attribute added with
the name being equal to that of the Property name and a value equal to
the textual content of the XML Element or
Attribute that matched the XPath. The `failure` relationship would
then be used if the incoming FlowFile
was not valid XML in this example. The `success` relationship would be
used regardless of whether or not
any matches were found. This can then be used to route the FlowFile
when appropriate.

This Processor emits a Provenance Event of type ATTRIBUTES_MODIFIED.


=== Enrich/Modify Content

The Enrich/Modify Content pattern is very common and very generic.
This pattern is responsible for any
general content modification. For the majority of cases, this
Processor is marked with the
`@SideEffectFree` and `@SupportsBatching` annotations. The Processor
has any number of required and optional
Properties, depending on the Processor's function. The Processor
generally has a `success` and `failure` relationship.
The `failure` relationship is generally used when the input file is
not in the expected format.

This Processor obtains a FlowFile and updates it using the
ProcessSession's `write(StreamCallback)` method
so that it is able to both read from the FlowFile's content and write
to the next version of the FlowFile's
content. If errors are encountered during the callback, the callback
will throw a `ProcessException`. The
call to the ProcessSession's `write` method is wrapped in a
`try/catch` block that catches `ProcessException`
and routes the FlowFile to failure.

If the callback succeeds, a CONTENT_MODIFIED Provenance Event is emitted.



== Error Handling

When writing a Processor, there are several different unexpected cases that can occur.
It is important that Processor developers understand the mechanics of how the NiFi framework
behaves if Processors do not handle errors themselves, and it's important to understand
what error handling is expected of Processors. Here, we will discuss how Processors should
handle unexpected errors during the course of their work.


=== Exceptions within the Processor

During the execution of the `onTrigger` method of a Processor, many things can potentially go
awry. Common failure conditions include:

  - Incoming data is not in the expected format.
  - Network connections to external services fail.
  - Reading or writing data to a disk fails.
  - There is a bug in the Processor or a dependent library.

Any of these conditions can result in an Exception being thrown from the Processor. From the framework
perspective, there are two types of Exceptions that can escape a Processor: `ProcessException` and
all others.

If a ProcessException is thrown from the Processor, the framework will assume that this is a failure that
is a known outcome. Moreover, it is a condition where attempting to process the data again later may
be successful. As a result, the framework will roll back the session that was being processed and penalize
the FlowFiles that were being processed.

If any other Exception escapes the Processor, though, the framework will assume that it is a failure that
was not taken into account by the developer. In this case, the framework will also roll back the session
and penalize the FlowFiles. However, in this case, we can get into some very problematic cases. For example,
the Processor may be in a bad state and may continually run, depleting system resources, without providing
any useful work. This is fairly common, for instance, when a NullPointerException is thrown continually.
In order to avoid this case, if an Exception other than ProcessException is able to escape the Processor's
`onTrigger` method, the framework will also "Administratively Yield" the Processor. This means that the
Processor will not be triggered to run again for some amount of time. The amount of time is configured
in the `nifi.properties` file but is 10 seconds by default.


=== Exceptions within a callback: IOException, RuntimeException

More often than not, when an Exception occurs in a Processor, it occurs from within a callback (I.e.,
`InputStreamCallback`, `OutputStreamCallback`, or `StreamCallback`). That is, during the processing of a
FlowFile's content. Callbacks are allowed to throw either `RuntimeException` or `IOException`. In the case
of RuntimeException, this Exception will propagate back to the `onTrigger` method. In the case of an
`IOException`, the Exception will be wrapped within a ProcessException and this ProcessException will then
be thrown from the Framework.

For this reason, it is recommended that Processors that use callbacks do so within a `try/catch` block
and catch `ProcessException` as well as any other `RuntimeException` that they expect their callback to
throw. It is *not* recommended that Processors catch the general `Exception` or `Throwable` cases, however.
This is discouraged for two reasons.

First, if an unexpected RuntimeException is thrown, it is likely a bug
and allowing the framework to rollback the session will ensure no data loss and ensures that DataFlow Managers
are able to deal with the data as they see fit by keeping the data queued up in place.

Second, when an IOException is thrown from a callback, there really are two types of IOExceptions: those thrown
from Processor code (for example, the data is not in the expected format or a network connection fails), and
those that are thrown from the Content Repository (where the FlowFile content is stored). If the latter is the case,
the framework will catch this IOException and wrap it into a `FlowFileAccessException`, which extends `RuntimeException`.
This is done explicitly so that the Exception will escape the `onTrigger` method and the framework can handle this
condition appropriately. Catching the general Exception prevents this from happening.


=== Penalization vs. Yielding

When an issue occurs during processing, the framework exposes two methods to allow Processor developers to avoid performing
unnecessary work: "penalization" and "yielding." These two concepts can become confusing for developers new to the NiFi API.
A developer is able to penalize a FlowFile by calling the `penalize(FlowFile)` method of ProcessSession. This causes the
FlowFile itself to be inaccessible to downstream Processors for a period of time. The amount of time that the FlowFile is
inaccessible is determined by the DataFlow Manager by setting the "Penalty Duration" setting in the Processor Configuration
dialog. The default value is 30 seconds. Typically, this is done when a Processor determines that the data cannot be processed
due to environmental reasons that are expected to sort themselves out. A great example of this is the PutSFTP processor, which
will penalize a FlowFile if a file already exists on the SFTP server that has the same filename. In this case, the Processor
penalizes the FlowFile and routes it to failure. A DataFlow Manager can then route failure back to the same PutSFTP Processor.
This way, if a file exists with the same filename, the Processor will not attempt to send the file again for 30 seconds
(or whatever period the DFM has configured the Processor to use). In the meantime, it is able to continue to process other
FlowFiles.

On the other hand, yielding allows a Processor developer to indicate to the framework that it will not be able to perform
any useful function for some period of time. This commonly happens with a Processor that is communicating with a remote
resource. If the Processor cannot connect to the remote resource, or if the remote resource is expected to provide data
but reports that it has none, the Processor should call `yield` on the `ProcessContext` object and then return. By doing
this, the Processor is telling the framework that it should not waste resources triggering this Processor to run, because
there's nothing that it can do - it's better to use those resources to allow other Processors to run.


=== Session Rollback

Thus far, when we have discussed the `ProcessSession`, we have typically referred to it simply as a mechanism for accessing
FlowFiles. However, it provides another very important capability, which is transactionality. All methods that are called
on a ProcessSession happen as a transaction. When we decided to end the transaction, we can do so either by calling
`commit()` or by calling `rollback()`. Typically, this is handled by the `AbstractProcessor` class: if the `onTrigger` method
throws an Exception, the AbstractProcessor will catch the Exception, call `session.rollback()`, and then re-throw the Exception.
Otherwise, the AbstractProcessor will call `commit()` on the ProcessSession.

There are times, however, that developers will want to roll back a session explicitly. This can be accomplished at any time
by calling the `rollback()` or `rollback(boolean)` method. If using the latter, the boolean indicates whether or not those
FlowFiles that have been pulled from queues (via the ProcessSession `get` methods) should be penalized before being added
back to their queues.

When `rollback` is called, any modification that has occurred to the FlowFiles in that session are discarded, this includes
both content and attribute modifications. Additionally, all Provenance Events are rolled back (with the exception
of any SEND event that was emitted by passing a value of `true` for the `force` argument). The FlowFiles that were pulled from
the input queues are then transferred back to the input queues (and optionally penalized) so that they can be processed again.

On the other hand, when the `commit` method is called, the FlowFile's new state is persisted in the FlowFile Repository, and
any Provenance Events that occurred are persisted in the Provenance Repository. The previous content is destroyed (unless
another FlowFile references the same piece of content), and the FlowFiles are transferred to the outbound queues so that the
next Processors can operate on the data.

It is also important to note how this behavior is affected by using the `org.apache.nifi.annotation.behavior.SupportsBatching`
annotation. If a Processor utilizes this annotation, calls to `ProcessSession.commit` may not take effect immediately. Rather,
these commits may be batched together in order to provide higher throughput. However, if at any point, the Processor rolls back
the ProcessSession, all changes since the last call to `commit` will be discarded and all "batched" commits will take effect.
These "batched" commits are not rolled back.




== General Design Considerations

When designing a Processor, there are a few important design considering to keep in mind. This section of the Developer Guide
brings to the forefront some of the ideas that a developer should be thinking about when creating a Processor.

=== Consider the User

One of the most important concepts to keep in mind when developing a Processor (or any other component) is the user
experience that you are creating. It's important to remember that as the developer of such a component, you may have
important knowledge about the context that others do not have. Documentation should always be supplied so that those
less familiar with the process are able to use it with ease.

When thinking about the user experience, it is also important to note that consistency is very important. It is best
to stick with the standard <<naming-conventions>>. This is true for Processor names, Property names and value, Relationship
names, and any other aspect that the user will experience.

Simplicity is crucial! Avoid adding properties that you don't expect users to understand or change. As developers, we are
told that hard-coding values is bad. But this sometimes results in developers exposing properties that, when asked for clarification,
tell users to just leave the default value. This leads to confusion and complexity.


=== Cohesion and Reusability

For the sake of making a single, cohesive unit, developers are sometimes tempted to combine several functions into a single Processor.
This is very true for the case when a Processor expects input data to be in format X so that the Processor can convert the data into
format Y and send the newly-formatted data to some external service.

Taking this approach of formatting the data for a particular endpoint and then sending the data to that endpoint within the same Processor
has several drawbacks:

  - The Processor becomes very complex, as it has to perform the data translation task as well as the task of
    sending the data to the remote service.
  - If the Processor is unable to communicate with the remote service, it will route the data to a `failure` Relationship. In this case,
    the Processor will be responsible to perform the data translation again. And if it fails again, the translation is done yet again.
  - If we have five different Processors that translate the incoming data into this new format before sending the data, we have a great
    deal of duplicated code. If the schema changes, for instance, many Processors must be updated.
  - This intermediate data is thrown away when the Processor finishes sending to the remote service. The intermediate data format
    may well be useful to other Processors.

In order to avoid these issues, and make Processors more reusable, a Processor should always stick to the principal of "do one thing and do
it well." Such a Processor should be broken into two separate Processors: one to convert the data from Format X to Format Y, and another
Processor to send data to the remote resource.


[[naming-conventions]]
=== Naming Conventions

In order to deliver a consistent look and feel to users, it is advisable that Processors keep with standard naming conventions. The following
is a list of standard conventions that are used:

  - Processors that pull data from a remote system are named Get<Service> or Get<Protocol>, depending on if they poll data from arbitrary
    sources over a known Protocol (such as GetHTTP or GetFTP) or if they pull data from a known service (such as GetKafka)
  - Processors that push data to a remote system are named Put<Service> or Put<Protocol>.
  - Relationship names are lower-cased and use spaces to delineated words.
  - Property names capitalize significant words, as would be done with the title of a book.



=== Processor Behavior Annotations

When creating a Processor, the developer is able to provide hints to the framework about how to utilize the Processor most
effectively. This is done by applying annotations to the Processor's class. The annotations that can be applied to a
Processor exist in three sub-packages of `org.apache.nifi.annotation`. Those in the `documentation` sub-package are used
to provide documentation to the user. Those in the `lifecycle` sub-package instruct the framework which methods should
be called on the Processor in order to respond to the appropriate life-cycle events. Those in the `behavior` package
help the framework understand how to interact with the Processor in terms of scheduling and general behavior.

The following annotations from the `org.apache.nifi.annotation.behavior` package can be used to modify how the framework
will handle your Processor:

  - `EventDriven`: Instructs the framework that the Processor can be scheduled using the Event-Driven scheduling
    strategy. This strategy is still experimental at this point, but can result in reduced resource utilization
    on dataflows that do not handle extremely high data rates.

  - `SideEffectFree`: Indicates that the Processor does not have any side effects external to NiFi. As a result, the
    framework is free to invoke the Processor many times with the same input without causing any unexpected
    results to occur. This implies idempotent behavior. This can be used by the framework to improve efficiency by
    performing actions such as transferring a ProcessSession from one Processor to another, such that if
    a problem occurs many Processors' actions can be rolled back and performed again.

  - `SupportsBatching`: This annotation indicates that it is okay for the framework to batch together multiple
    ProcessSession commits into a single commit. If this annotation is present, the user will be able to choose
    whether they prefer high throughput or lower latency in the Processor's Scheduling tab. This annotation should
    be applied to most Processors, but it comes with a caveat: if the Processor calls `ProcessSession.commit`,
    there is no guarantee that the data has been safely stored in NiFi's Content, FlowFile, and Provenance Repositories.
    As a result, it is not appropriate for those Processors that receive data from an external source, commit the session,
    and then delete the remote data or confirm a transaction with a remote resource.

  - `TriggerSerially`: When this annotation is present, the framework will not allow the user to schedule more than one
    concurrent thread to execute the `onTrigger` method at a time. Instead, the number of thread ("Concurrent Tasks")
    will always be set to `1`. This does *not*, however, mean that the Processor does not have to be thread-safe,
    as the thread that is executing `onTrigger` may change between invocations.

    - `PrimaryNodeOnly`: Apache NiFi, when clustered, offers two modes of execution for Processors: "Primary Node" and
        "All Nodes". Although running in all the nodes offers better parallelism, some Processors are known to cause unintended
        behaviors when run in multiple nodes. For instance, some Processors list or read files from remote filesystems. If such
        Processors are scheduled to run on "All Nodes", it will cause unnecessary duplication and even errors. Such Processors
        should use this annotation. Applying this annotation will restrict the Processor to run only on the "Primary Node".

  - `TriggerWhenAnyDestinationAvailable`: By default, NiFi will not schedule a Processor to run if any of its outbound
    queues is full. This allows back-pressure to be applied all the way a chain of Processors. However, some Processors
    may need to run even if one of the outbound queues is full. This annotation indicates that the Processor should run
    if any Relationship is "available." A Relationship is said to be "available" if none of the connections that use
    that Relationship is full. For example, the DistributeLoad Processor makes use of this annotation. If the "round robin"
    scheduling strategy is used, the Processor will not run if any outbound queue is full. However, if the "next available"
    scheduling strategy is used, the Processor will run if any Relationship at all is available and will route FlowFiles
    only to those relationships that are available.

  - `TriggerWhenEmpty`: The default behavior is to trigger a Processor to run only if its input queue has at least one
    FlowFile or if the Processor has no input queues (which is typical of a "source" Processor). Applying this annotation
    will cause the framework to ignore the size of the input queues and trigger the Processor regardless of whether or
    not there is any data on an input queue. This is useful, for example, if the Processor needs to be triggered to run
    periodically to time out a network connection.

    - `InputRequirement`: By default, all Processors will allow users to create incoming connections for the Processor, but
        if the user does not create an incoming connection, the Processor is still valid and can be scheduled to run. For Processors
        that are expected to be used as a "Source Processor," though, this can be confusing to the user, and the user may attempt to
        send FlowFiles to that Processor, only for the FlowFiles to queue up without being processed. Conversely, if the Processor
        expects incoming FlowFiles but does not have an input queue, the Processor will be scheduled to run but will perform no work,
        as it will receive no FlowFile, and this leads to confusion as well. As a result, we can use the `@InputRequirement` annotation
        and provide it a value of `INPUT_REQUIRED`, `INPUT_ALLOWED`, or `INPUT_FORBIDDEN`. This provides information to the framework
        about when the Processor should be made invalid, or whether or not the user should even be able to draw a Connection to the
        Processor. For instance, if a Processor is annotated with `InputRequirement(Requirement.INPUT_FORBIDDEN)`, then the user will
        not even be able to create a Connection with that Processor as the destination.


=== Data Buffering

An important point to keep in mind is that NiFi provides a generic data processing capability. Data can be in any format. Processors
are generally scheduled with several threads. A common mistake that developers new to NiFi make is to buffer all the contents of a
FlowFile in memory. While there are cases when this is required, it should be avoided if at all possible, unless it is well-known
what format the data is in. For example, a Processor responsible for executing XPath against an XML document will need to load the
entire contents of the data into memory. This is generally acceptable, as XML is not expected to be extremely large. However, a Processor
that searches for a specific byte sequence may be used to search files that are hundreds of gigabytes or more. Attempting to load this
into memory can cause a lot of problems - especially if multiple threads are processing different FlowFiles simultaneously.

Instead of buffering this data into memory, it is advisable to instead evaluate the data as it is streamed from the Content Repository
(i.e., scan the content from the `InputStream` that is provided to your callback by `ProcessSession.read`). Of course, in this case,
we don't want to read from the Content Repository for each byte, so we would use a BufferedInputStream or somehow buffer some small
amount of data, as appropriate.





[[controller-services]]
== Controller Services

The `ControllerService` interface allows developers to share
functionality and state across the JVM in a clean
and consistent manner. The interface resembles that of the `Processor`
interface but does not
have an `onTrigger` method because Controller Services are not
scheduled to run periodically, and
Controller Services do not have Relationships because they are not
integrated into the flow directly. Rather,
they are used by Processors, Reporting Tasks, and
other Controller Services.

[[developing-controller-service]]
=== Developing a ControllerService

Just like with the Processor interface, the ControllerService
interface exposes methods for configuration,
validation, and initialization. These methods are all identical to
those of the Processor interface
except that the `initialize` method is passed a
`ControllerServiceInitializationContext`, rather
than a `ProcessorInitializationContext`.

Controller Services come with an additional constraint that Processors
do not have. A Controller Service
must be comprised of an interface that extends `ControllerService`.
Implementations can then be interacted
with only through their interface.  A Processor, for instance, will
never be given a concrete implementation of
a ControllerService and therefore must reference the service only via
interfaces that extends `ControllerService`.

This constraint is in place mainly because a Processor can exist in
one NiFi Archive (NAR) while the implementation
of the Controller Service that the Processor lives in can exist in a
different NAR. This is accomplished by
the framework by dynamically implementing the exposed interfaces in
such a way that the framework can
switch to the appropriate ClassLoader and invoke the desired method on
the concrete implementation. However,
in order to make this work, the Processor and the Controller Service
implementation must share the same definition
of the Controller Service interface. Therefore, both of these NARs
must depend on the NAR that houses the
Controller Service's interface. See <<nars>> for more information.


[[interacting-with-controller-service]]
=== Interacting with a ControllerService

ControllerServices may be obtained by a Processor, another
ControllerService, or a ReportingTask
by means of the ControllerServiceLookup or by using the
`identifiesControllerService` method of the
PropertyDescriptor's Builder class. The ControllerServiceLookup can be
obtained by a Processor from the
ProcessorInitializationContext that is passed to the `initialize`
method. Likewise, it is obtained by
a ControllerService from the ControllerServiceInitializationContext
and by a ReportingTask via the
ReportingConfiguration object passed to the `initialize` method.

For most use cases, though, using the `identifiesControllerService`
method of a PropertyDescriptor Builder
is preferred and is the least complicated method. In order to use this
method, we create a PropertyDescriptor
that references a Controller Service as such:

[source,java]
----
public static final PropertyDescriptor SSL_CONTEXT_SERVICE = new PropertyDescriptor.Builder()
  .name("SSL Context Service")
  .description("Specified the SSL Context Service that can be used to create secure connections")
  .required(true)
  .identifiesControllerService(SSLContextService.class)
  .build();
----

Using this method, the user will be prompted to supply the SSL Context
Service that should be used. This is
done by providing the user with a drop-down menu from which they are
able to choose any of the SSLContextService
configurations that have been configured, regardless of the implementation.

In order to make use of this service, the Processor can use code such as:

[source,java]
----
final SSLContextService sslContextService = context.getProperty(SSL_CONTEXT_SERVICE)
  .asControllerService(SSLContextService.class);
----

Note here that `SSLContextService` is an interface that extends
ControllerService. The only implementation
at this time is the `StandardSSLContextService`. However, the
Processor developer need not worry about this
detail.







== Reporting Tasks

So far, we have mentioned little about how to convey to the outside
world how NiFi and its components
are performing. Is the system able to keep up with the incoming data
rate? How much more can
the system handle? How much data is processed at the peak time of day
versus the least busy time of day?

In order to answer these questions, and many more, NiFi provides a
capability for reporting status,
statistics, metrics, and monitoring information to external services
by means of the `ReportingTask`
interface. ReportingTasks are given access to a host of information to
determine how the system is performing.


=== Developing a Reporting Task

Just like with the Processor and ControllerService interfaces, the
ReportingTask interface exposes methods for
configuration, validation, and initialization. These methods are all
identical to those of the
Processor and ControllerService interfaces except that the
`initialize` method is passed a `ReportingConfiguration`
object, as opposed to the initialization objects received by the other
Components. The ReportingTask also has
an `onTrigger` method that is invoked by the framework to trigger the
task to perform its job.

Within the `onTrigger` method, the ReportingTask is given access to a
ReportingContext, from which configuration
and information about the NiFi instance can be obtained. The
BulletinRepository allows Bulletins to be queried
and allows the ReportingTask to submit its own Bulletins, so that
information will be rendered to users. The
ControllerServiceLookup that is accessible via the Context provides
access to ControllerServices that have been
configured. However, this method of obtaining Controller Services is
not the preferred method. Rather, the
preferred method for obtaining a Controller Service is to reference
the Controller Service in a PropertyDescriptor,
as is discussed in the <<interacting-with-controller-service>> section.

The `EventAccess` object that is exposed via the ReportingContext
provides access to the `ProcessGroupStatus`,
which exposes statistics about the amount of data processed in the
past five minutes by Process Groups,
Processors, Connections, and other Components. Additionally, the
EventAccess object provides access to
the ++ProvenanceEventRecord++s
that have been stored in the `ProvenanceEventRepository`. These
Provenance Events are emitted by Processors when
data is received from external sources, emitted to external services,
removed from the system, modified,
or routed according to some decision that was made.

Each ProvenanceEvent has the ID of the FlowFile, the type of Event,
the creation time of the Event, and
all FlowFile attributes associated with the FlowFile at the time that
the FlowFile was accessed by the component
as well as the FlowFile attributes that were associated with the
FlowFile as a result of the processing that the
event describes. This provides a great deal of information to
ReportingTasks, allowing reports to be generated
in many different ways to expose metrics and monitoring capabilities
needed for any number of operational concerns.

== UI Extensions

There are two UI extension points that are available in NiFi:

- Custom Processor UIs
- Content Viewers

Custom UIs can be created to provide configuration options beyond the standard property/value tables available in most processor settings.  Examples of processors with Custom UIs are link:https://github.com/apache/nifi/tree/main/nifi-nar-bundles/nifi-update-attribute-bundle[UpdateAttribute^] and link:https://github.com/apache/nifi/tree/main/nifi-nar-bundles/nifi-standard-bundle[JoltTransformJSON^].

Content Viewers can be created to extend the types of data that can be viewed within NiFi. NiFi comes with NARs in the lib directory which contain content viewers for data types such as csv, xml, avro, json (standard-nar) and image types such as png, jpeg and gif (media-nar).

=== Custom Processor UIs

To add a Custom UI to a processor:

1. Create your UI.
2. Build and bundle your WAR in a processor NAR.
3. The WAR needs to contain a `nifi-processor-configuration` file in the META-INF directory, which associates the Custom UI with that processor.
4. Place the NAR in the lib directory and it will be discovered when NiFi starts up.
5. In the Configure Processor window for the processor, the Properties tab should now have an `Advanced` button, which will access the Custom UI.

As an example, here is the NAR layout for UpdateAttribute:

.Update Attribute NAR Layout
------------------------------------------------------------------------------------------------
nifi-update-attribute-bundle
│
├── nifi-update-attribute-model
│
├── nifi-update-attribute-nar
│
├── nifi-update-attribute-processor
│
├── nifi-update-attribute-ui
│   ├── pom.xml
│   └── src
│       └── main
│           ├── java
│           ├── resources
│           └── webapp
│               └── css
│               └── images
│               └── js
│               └── META-INF
│               │   └── nifi-processor-configuration
│               └── WEB-INF
│
└── pom.xml
------------------------------------------------------------------------------------------------

with the contents of the `nifi-processor-configuration` as follows:

`org.apache.nifi.processors.attributes.UpdateAttribute:${project.groupId}:nifi-update-attribute-nar:${project.version}`

NOTE:  Custom UIs can also be implemented for Controller Services and Reporting Tasks.


=== Content Viewers

To add a Content Viewer:

1. Build and bundle your WAR in a processor NAR.
2. The WAR needs to contain a `nifi-content-viewer` file in the META-INF directory, which lists the supported content types.
3. Place the NAR in the lib directory and it will be discovered when NiFi starts up.
4. When a matching content type is encountered, the content viewer will generate the appropriate view.

A good example to follow is the NAR layout for the Standard Content Viewer:

.Standard Content Viewer NAR Layout
------------------------------------------------------------------------------------------------
nifi-standard-bundle
│
├── nifi-jolt-transform-json-ui
│
├── nifi-standard-content-viewer
│   ├── pom.xml
│   └── src
│       └── main
│           ├── java
│           ├── resources
│           └── webapp
│               └── css
│               └── META-INF
│               │   └── nifi-content-viewer
│               └── WEB-INF
│
├── nifi-standard-nar
│
├── nifi-standard-prioritizers
│
├── nifi-standard-processors
│
├── nifi-standard-reporting-tasks
│
├── nifi-standard-utils
│
└── pom.xml
------------------------------------------------------------------------------------------------

with the contents of `nifi-content-viewer` as follows:
------------------------------------------------------------------------------------------------
application/xml
application/json
text/plain
text/csv
avro/binary
application/avro-binary
application/avro+binary
------------------------------------------------------------------------------------------------


== Command Line Tools

=== tls-toolkit

The Client/Server mode of operation came about from the desire to automatically generate required TLS configuration artifacts without needing to perform that generation in a centralized place.  This simplifies configuration in a clustered environment.  Since we don’t necessarily have a central place to run the generation logic or a trusted Certificate Authority, a shared secret is used to authenticate the clients and server to each other.

The tls-toolkit prevents man in the middle attacks using HMAC verification of the public keys of the CA server and the CSR the client sends. A shared secret (the token) is used as the HMAC key.

The basic process goes as follows:

1. The client generates a KeyPair.
2. The client generates a request json payload containing a CSR and an HMAC with the token as the key and the CSR’s public key fingerprint as the data.
3. The client connects to the CA Hostname at the https port specified and validates that the CN of the CA’s certificate matches the hostname (NOTE: because we don’t trust the CA at this point, this adds NO security, it is just a way to error out early if possible).
4. The server validates the HMAC from the client payload using the token as the key and the CSR’s public key fingerprint as the data.  This proves that the client knows the shared secret and that it wanted a CSR with that public key to be signed.  (NOTE: a man in the middle could forward this on but wouldn’t be able to change the CSR without invalidating the HMAC, defeating the purpose).
5. The server signs the CSR and sends back a response json payload containing the certificate and an HMAC with the token as the key and a fingerprint of its public key as the data.
6. The client validates the response HMAC using the token as the key and a fingerprint of the certificate public key supplied by the TLS session.  This validates that a CA that knows the shared secret is the one we are talking to over TLS.
7. The client verifies that the CA certificate from the TLS session signed the certificate in the payload.
8. The client adds the generated KeyPair to its keystore with the certificate chain and adds the CA certificate from the TLS connection to its truststore.
9. The client writes out the configuration json containing keystore, truststore passwords and other details about the exchange.


== Testing

Testing the components that will be used within a larger framework can often be very cumbersome
and tricky. With NiFi, we strive to make testing components as easy as possible. In order to do this,
we have created a `nifi-mock` module that can be used in conjunction with JUnit to provide extensive
testing of components.

The Mock Framework is mostly aimed at testing Processors, as these are by far the most commonly
developed extension point. However, the framework does provide the ability to test Controller Services
as well.

Components have typically been tested by creating functional tests to verify component behavior. This is
done because often a Processor will consist of a handful of helper methods but the logic will largely be
encompassed within the `onTrigger` method. The `TestRunner` interface allows us to test Processors
and Controller Services by converting more "primitive" objects such as files and byte arrays into
FlowFiles and handles creating the ProcessSessions and ProcessContexts needed for a Processor to do its job,
as well as invoking the necessary lifecycle methods in order to ensure that the Processor behaves the
same way in the unit tests as it does in production.


=== Instantiate TestRunner

Most unit tests for a Processor or a Controller Service start by creating an instance of the `TestRunner`
class. In order to add the necessary classes to your Processor,
you can use the Maven dependency:

[source]
----
<dependency>
  <groupId>org.apache.nifi</groupId>
  <artifactId>nifi-mock</artifactId>
  <version>${nifi version}</version>
</dependency>
----

We create a new `TestRunner` by calling one of the static `newTestRunner` methods of the `TestRunners` class
(located in the `org.apache.nifi.util` package). These methods take an argument for the Processor under test (can
either be the class of the Processor to test or can be an instance of a Processor), and allow the setting of
the processor name as well.

=== Add ControllerServices

After creating a new Test Runner, we can add any Controller Services to the Test Runner that our Processor
will need in order to perform its job. We do this by calling the `addControllerService` method and supply
both an identifier for the Controller Service and an instance of the Controller Service.

If the Controller Service needs to be configured, its properties can be set by
calling the `setProperty(ControllerService, PropertyDescriptor, String)`, `setProperty(ControllerService, String, String)`,
or `setProperty(ControllerService, PropertyDescriptor, AllowableValue)` method. Each of these methods returns a
`ValidationResult`. This object can then be inspected to ensure that the property is valid by calling `isValid`.
Annotation data can be set by calling the `setAnnotationData(ControllerService, String)` method.

We can now ensure that the Controller Service is valid by calling `assertValid(ControllerService)` - or ensure
that the configured values are not valid, if testing the Controller Service itself, by calling
`assertNotValid(ControllerService)`.

Once a Controller Service has been added to the Test Runner and configured, it can now be enabled by calling the
`enableControllerService(ControllerService)` method. If the Controller Service is not valid, this method
will throw an IllegalStateException. Otherwise, the service is now ready to use.



=== Set Property Values

After configuring any necessary Controller Services, we need to configure our Processor. We can do this by
calling the same methods as we do for Controller Services, without specifying any Controller Service. I.e.,
we can call `setProperty(PropertyDescriptor, String)`, and so on. Each of the `setProperty` methods again
returns a `ValidationResult` property that can be used to ensure that the property value is valid.

Similarly, we can also call `assertValid()` and `assertNotValid()` to ensure that the configuration of the
Processor is valid or not, according to our expectations.


=== Enqueue FlowFiles

Before triggering a Processor to run, it is usually necessary to enqueue FlowFiles for the Processor to process.
This can be achieved by using the `enqueue` methods of the `TestRunner` class. The `enqueue` method has several
different overrides, and allows data to be added in the form of a `byte[]`, `InputStream`, or `Path`. Each of these
methods also supports a variation that allows a `Map<String, String>` to be added to support FlowFile attributes.

Additionally, there is an `enqueue` method that takes a var-args of FlowFile objects. This can be useful, for example,
to obtain the output of a Processor and then feed this to the input of the Processor.


=== Run the Processor

After configuring the Controller Services and enqueuing the necessary FlowFiles, the Processor can be triggered
to run by calling the `run` method of `TestRunner`. If this method is called without any arguments, it will
invoke any method in the Processor with an `@OnScheduled` annotation, call the Processor's `onTrigger` method once,
and then run the `@OnUnscheduled` and finally `@OnStopped` methods.

If it is desirable to run several iterations of the `onTrigger` method before the other `@OnUnscheduled` and
`@OnStopped` life-cycle events are triggered, the `run(int)` method can be used to specify how many iterations
of `onTrigger` should be called.

There are times when we want to trigger the Processor to run but not trigger the `@OnUnscheduled` and `@OnStopped`
life-cycle events. This is useful, for instance, to inspect the Processor's state before these events occur. This
can be achieved using the `run(int, boolean)` and passing `false` as the second argument. After doing this, though,
calling the `@OnScheduled` life-cycle methods could cause an issue. As a result, we can now run `onTrigger` again
without causing these events to occur by using the `run(int,boolean,boolean)` version of the `run` method and
passing `false` as the third argument.

If it is useful to test behavior that occurs with multiple threads, this can also be achieved by calling the
`setThreadCount` method of `TestRunner`. The default is 1 thread. If using multiple threads, it is important
to remember that the `run` call of `TestRunner` specifies how many times the Processor should be triggered, not
the number of times that the Processor should be triggered per thread. So, if the thread count is set to 2 but
`run(1)` is called, only a single thread will be used.


=== Validate Output

After a Processor has finished running, a unit test will generally want to validate that the FlowFiles went where
they were expected to go. This can be achieved using the `TestRunners` `assertAllFlowFilesTransferred` and
`assertTransferCount` methods. The former method takes as arguments a Relationship and an integer to dictate how many
FlowFiles should have been transferred to that Relationship. The method will fail the unit test unless this number of
FlowFiles were transferred to the given Relationship *or* if any FlowFile was transferred to any other Relationship.
The `assertTransferCount` method validates only that the FlowFile count was the expected number for the given Relationship.

After validating the counts, we can then obtain the actual output FlowFiles via the `getFlowFilesForRelationship` method.
This method returns a `List<MockFlowFile>`. It's important to note that the type of the List is `MockFlowFile`, rather
than the `FlowFile` interface. This is done because `MockFlowFile` comes with many methods for validating the contents.

For example, `MockFlowFile` has methods for asserting that FlowFile Attributes exist (`assertAttributeExists`), asserting
that other attributes are not present (`assertAttributeNotExists`), or that Attributes have the correct value
(`assertAttributeEquals`, `assertAttributeNotEquals`). Similar methods exist for verifying the contents of the FlowFile.
The contents of a FlowFile can be compared to a `byte[]`, and `InputStream`, a file, or a String. If the data is expected
to be textual, the String version is preferred, as it provides a more intuitive error message if the output is not
as expected.



=== Mocking External Resources

One of the biggest problems when testing a NiFi processor that connects to a remote resource is that we don't want to
actually connect to some remote resource from a unit test. We can stand up a simple server ourselves in the unit test
and configure the Processor to communicate with it, but then we have to understand and implement the server-specific
specification and may not be able to properly send back error messages, etc. that we would like for testing.

Generally, the approach taken here is to have a method in the Processor that is responsible for obtaining a connection
or a client to a remote resource. We generally mark this method as protected. In the unit test, instead of creating
the `TestRunner` by calling `TestRunners.newTestRunner(Class)` and providing the Processor class, we instead create
a subclass of the Processor in our unit test and use this:

[source,java]
----
@Test
public void testConnectionFailure() {
  final TestRunner runner = TestRunners.newTestRunner(new MyProcessor() {
    protected Client getClient() {
      // Return a mocked out client here.
      return new Client() {
        public void connect() throws IOException {
          throw new IOException();
        }

        // ...
        // other client methods
        // ...
      };
    }
  });

  // rest of unit test.
}
----

This allows us to implement a Client that mocks out all of the network communications and returns the different
error results that we want to test, as well as ensure that our logic is correct for handling successful calls
to the client.


=== Additional Testing Capabilities

In addition to the above-mentioned capabilities provided by the
testing framework, the TestRunner provides several
convenience methods for verifying the behavior of a Processor. Methods
are provided for ensuring that the Processor's
Input Queue has been emptied. Unit Tests are able to obtain the
ProcessContext, ProcessSessionFactory, ProvenanceReporter,
and other framework-specific entities that will be used by the
TestRunner. The `shutdown` method provides the ability to
test Processor methods that are annotated to be run only on shutdown
of NiFi. Annotation Data can be set for Processors
that make use of Custom User Interfaces. Finally, the number of
threads that should be used to run the Processor can
be set via the `setThreadCount(int)` method.






[[nars]]
== NiFi Archives (NARs)

When software from many different organizations is all hosted within
the same environment, Java ClassLoaders quickly
become a concern. If multiple components have a dependency on the same
library but each depends on a different
version, many problems arise, typically resulting in unexpected
behavior or `NoClassDefFoundError` errors occurring.
In order to prevent these issues from becoming problematic, NiFi
introduces the notion of a NiFi Archive, or NAR.

A NAR allows several components and their dependencies to be packaged
together into a single package.
The NAR package is then provided ClassLoader isolation from other NAR
packages. Developers should always deploy
their NiFi components as NAR packages.

To achieve this, a developer creates a new Maven Artifact, which we
refer to as the NAR artifact. The packaging is
set to `nar`. The `dependencies` section of the POM is then created so
that the NAR has a dependency on all NiFi Components that are to be included within the NAR.

In order to use a packaging of `nar`, we must use the `nifi-nar-maven-plugin` module.
This is included by adding the following snippet to the NAR's pom.xml:

[source,xml]
----
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.nifi</groupId>
            <artifactId>nifi-nar-maven-plugin</artifactId>
            <version>1.1.0</version>
            <extensions>true</extensions>
        </plugin>
    </plugins>
</build>
----

In the Apache NiFi codebase, this exists in the NiFi root POM from which all other NiFi artifacts
(with the exception of the nifi-nar-maven-plugin itself) inherit, so that we do not need to include
this in any of our other POM files.

The NAR is able to have one dependency that is of type `nar`. If more
than one dependency is specified that is of type
`nar`, then the nifi-nar-maven-plugin will error. If NAR A adds a
dependency on NAR B, this will *not* result in
NAR B packaging all of the components of NAR A. Rather, this will add
a `Nar-Dependency-Id` element to the `MANIFEST.MF`
file of NAR A. This will result in setting the ClassLoader of NAR B as
the Parent ClassLoader of NAR A. In this case,
we refer to NAR B as the _Parent_ of NAR A.

This linkage of Parent ClassLoaders is the mechanism that NiFi uses in
order to enable Controller Services to be shared
across all NARs. As mentioned in the <<developing-controller-service>>
section, A Controller Service must be separated
into an interface that extends `ControllerService` and an
implementation that implements that interface. Controller Services
can be referenced from any Processor, regardless of which NAR it is
in, as long as both the Controller Service Implementation
and the Processor share the same definition of the Controller Service interface.

In order to share this same definition, both the Processor's NAR and
the Controller Service Implementation's NAR must have
as a Parent the Controller Service definition's NAR. An example
hierarchy may look like this:

.Controller Service NAR Layout
------------------------------------------------------------------------------------------------
root
├── my-controller-service-api
│   ├── pom.xml
│   └── src
│       └── main
│           └── java
│               └── org
│                   └── my
│                       └── services
│                           └── MyService.java
│
├── my-controller-service-api-nar
│   └── pom.xml <1>
│
│
│
├── my-controller-service-impl
│   ├── pom.xml <2>
│   └── src
│       ├── main
│       │   ├── java
│       │   │   └── org
│       │   │       └── my
│       │   │           └── services
│       │   │                 └── MyServiceImpl.java
│       │   └── resources
│       │       └── META-INF
│       │           └── services
│       │               └── org.apache.nifi.controller.ControllerService
│       └── test
│           └── java
│               └── org
│                   └── my
│                       └── services
│                             └── TestMyServiceImpl.java
│
│
├── my-controller-service-nar
│   └── pom.xml <3>
│
│
└── other-processor-nar
    └── pom.xml <3>




------------------------------------------------------------------------------------------------
<1> This POM file has a type of `nar`. It has a dependency on
`nifi-standard-services-api-nar`.
<2> This POM file is of type `jar`. It has a dependency on
`my-controller-service-api`. It does *not* have a dependency on any
`nar` artifacts.
<3> This POM file has a type of `nar`. It has a dependency on
`my-controller-service-api-nar`.


While these may seem very complex at first, after creating such a
hierarchy once or twice, it becomes
far less complicated. Note here that the
`my-controller-service-api-nar` has a dependency on
`nifi-standard-services-api-nar`.
This is done so that any NAR that has a dependency on
`my-controller-service-api-nar` will also be able to access
all of the Controller Services that are provided by the
`nifi-standard-services-api-nar`, such as the SSLContextService.
In this same vein, it is not necessary to create a different
"service-api" NAR for each service. Instead, it often
makes sense to have a single "service-api" NAR that encapsulates the
APIs for many different Controller Services,
as is done by the `nifi-standard-services-api-nar`. Generally, the API
will not include extensive dependencies, and as a result,
ClassLoader isolation may be less important, so lumping together many
API artifacts into the same NAR is often acceptable.




[[per-instance-classloading]]
== Per-Instance ClassLoading

A component developer may wish to add additional resources to the component’s classpath at runtime.
For example, you may want to provide the location of a JDBC driver to a processor that interacts with a
relational database, thus allowing the processor to work with any driver rather than trying to bundle a
driver into the NAR.

This may be accomplished by declaring one or more PropertyDescriptor instances with
`dynamicallyModifiesClasspath` set to true. For example:


[source,java]
----
PropertyDescriptor EXTRA_RESOURCE = new PropertyDescriptor.Builder()
   .name("Extra Resources")
   .description("The path to one or more resources to add to the classpath.")
   .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
   .expressionLanguageSupported(true)
   .dynamicallyModifiesClasspath(true)
   .build();
----

When these properties are set on a component, the framework identifies all properties where
`dynamicallyModifiesClasspath` is set to true. For each of these properties, the framework
attempts to resolve filesystem resources from the value of the property. The value may be a
comma-separated list of one or more directories or files, where any paths that do not exist are
skipped. If the resource represents a directory, the directory is listed, and all of the files
in that directory are added to the classpath individually.
These directories also will be scanned for native libraries. If a library is found in one of these
directories, an OS-handled temporary copy is created and cached before loading it to maintain consistency
and classloader isolation.

Each property may impose further restrictions on the format of the value through the validators.
For example, using StandardValidators.FILE_EXISTS_VALIDATOR restricts the property to accepting a
single file. Using StandardValidators.NON_EMPTY_VALIDATOR allows any combination of comma-separated
files or directories.

Resources are added to the instance ClassLoader by adding them to an inner ClassLoader that is always
checked first. Anytime the value of these properties change, the inner ClassLoader is closed and
re-created with the new resources.

NiFi provides the `@RequiresInstanceClassLoading` annotation to further expand and isolate the libraries
available on a component’s classpath. You can annotate a component with `@RequiresInstanceClassLoading`
to indicate that the instance ClassLoader for the component requires a copy of all the resources in the
component's NAR ClassLoader. When `@RequiresInstanceClassLoading` is not present, the
instance ClassLoader simply has its parent ClassLoader set to the NAR ClassLoader, rather than
copying resources.

The `@RequiresInstanceClassLoading` annotation also provides an optional flag `cloneAncestorResources'. If
set to true, the instance ClassLoader will include ancestor resources up to the first ClassLoader containing a
controller service API referenced by the component, or up to the Jetty NAR. If set to false, or not specified,
only the resources from the component's NAR will be included.

Because @RequiresInstanceClassLoading copies resources from the NAR ClassLoader for each instance of the
component, use this capability judiciously. If ten instances of one component are created, all classes
from the component's NAR ClassLoader are loaded into memory ten times. This could eventually increase the
memory footprint significantly when enough instances of the component are created.

Additionally, there are some restrictions when using @RequiresInstanceClassLoading when using Controller
Services. Processors, Reporting Tasks, and Controller Services can reference a Controller Service API
in one of its Property Descriptors. An issue may arise when the Controller Service API is bundled in the same
NAR with a component that references it or with the Controller Service implementation. If either of these cases
are encountered and the extension requires instance classloading, the extension will be skipped and an appropriate
ERROR will be logged. To address this issue, the Controller Service API should be bundled in a parent NAR. The
service implementation and extensions that reference that service should depend on the Controller Service API NAR.
Please refer to the Controller Service NAR Layout in the <<nars>> section. Anytime a Controller Service API is
bundled with an extension that requires it, even if @RequiresInstanceClassLoading isn't used, a WARNING will be
logged to help avoid this bad practice.


[[deprecation]]
== Deprecating a Component
Sometimes it may be desirable to deprecate a component. Whenever this occurs the developer may use the
 @DeprecationNotice annotation to indicate that a component has been deprecated, allowing the developer
 to describe a reason for the deprecation and suggest alternative components. An example of how to do this can
 be found below:

[source, java]
----
 @DeprecationNotice(alternatives = {ListenSyslog.class}, classNames = {"org.apache.nifi.processors.standard.ListenRELP"}, reason = "Technology has been superseded",  )
 public class ListenOldProtocol extends AbstractProcessor {
----
As you can see, the alternatives can be used to define and array of alternative Components, while classNames can be
used to represent the similar content through an array of strings.


== How to contribute to Apache NiFi

We are always excited to have contributions from the community - especially from new contributors!
We are interested in accepting contributions of code, as well as documentation and even artwork that
can be applied as icons or styling to the application.


=== Technologies

The back end of Apache NiFi is written in Java. The web tier makes use of JAX-RS and JavaScript is extensively
used to provide a user interface. We depend on several third-party JavaScript libraries, including D3 and JQuery,
among others. We make use of Apache Maven for our builds and Git for our version control system.

Documentation is created in link:http://asciidoctor.org[AsciiDoc^].


=== Where to Start?

link:http://issues.apache.org/jira/browse/NIFI[NiFi's JIRA page^] can be used to find tickets that are tagged as "beginner",
or you can dig into any of the tickets for creating Processors. Processors should be self-contained and not rely on other
outside components (except for Controller Services), so they make for excellent starting points for new NiFi developers to
get started. This exposes the developer to the NiFi API and is the most extensible part of the dataflow system.

System-level and overview documentation is located in '<code checkout location>/nifi/nifi-docs/src/main/asciidoc'.
Tools available to facilitate documentation generation are available at link:http://asciidoctor.org/docs/editing-asciidoc-with-live-preview/[Editing AsciiDoc with Live Preview^].


=== Supplying a contribution

Contributions can be provided either by creating a patch:

`git format-patch`

and attaching that patch to a ticket, or by generating a Pull Request.

For further details regarding contributions, refer to the relevant sections of the link:https://cwiki.apache.org/confluence/display/NIFI/Contributor+Guide#ContributorGuide-providingCodeOrDocumentationContributionProvidingcodeordocumentationcontributions[contributor guide^].

=== Contact Us

The developer mailing list (dev@nifi.apache.org) is monitored pretty closely, and we tend to respond pretty
quickly. If you have a question, don't hesitate to shoot us an e-mail - we're here to help! Unfortunately, though, e-mails
can get lost in the shuffle, so if you do send an e-mail and don't get a response within a day or two, it's our fault - don't
worry about bothering us. Just ping the mailing list again.
