You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by jo...@apache.org on 2016/11/29 12:03:35 UTC

svn commit: r1771892 [4/8] - in /nifi/site/trunk/docs/nifi-docs/html: ./ images/

Modified: nifi/site/trunk/docs/nifi-docs/html/developer-guide.html
URL: http://svn.apache.org/viewvc/nifi/site/trunk/docs/nifi-docs/html/developer-guide.html?rev=1771892&r1=1771891&r2=1771892&view=diff
==============================================================================
--- nifi/site/trunk/docs/nifi-docs/html/developer-guide.html (original)
+++ nifi/site/trunk/docs/nifi-docs/html/developer-guide.html Tue Nov 29 12:03:34 2016
@@ -455,92 +455,94 @@ body.book #toc,body.book #preamble,body.
 <div id="toc" class="toc">
 <div id="toctitle">Table of Contents</div>
 <ul class="sectlevel1">
-<li><a href="developer-guide.html#introduction">Introduction</a></li>
-<li><a href="developer-guide.html#components">NiFi Components</a></li>
-<li><a href="developer-guide.html#processor_api">Processor API</a>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#components">NiFi Components</a></li>
+<li><a href="#processor_api">Processor API</a>
 <ul class="sectlevel2">
-<li><a href="developer-guide.html#supporting_api">Supporting API</a></li>
-<li><a href="developer-guide.html#AbstractProcessor">AbstractProcessor API</a></li>
-<li><a href="developer-guide.html#component-lifecycle">Component Lifecycle</a></li>
-<li><a href="developer-guide.html#state_manager">State Manager</a></li>
-<li><a href="developer-guide.html#reporting-processor-activity">Reporting Processor Activity</a></li>
+<li><a href="#supporting_api">Supporting API</a></li>
+<li><a href="#AbstractProcessor">AbstractProcessor API</a></li>
+<li><a href="#component-lifecycle">Component Lifecycle</a></li>
+<li><a href="#restricted">Restricted</a></li>
+<li><a href="#state_manager">State Manager</a></li>
+<li><a href="#reporting-processor-activity">Reporting Processor Activity</a></li>
 </ul>
 </li>
-<li><a href="developer-guide.html#documenting-a-component">Documenting a Component</a>
+<li><a href="#documenting-a-component">Documenting a Component</a>
 <ul class="sectlevel2">
-<li><a href="developer-guide.html#documenting-properties">Documenting Properties</a></li>
-<li><a href="developer-guide.html#documenting-relationships">Documenting Relationships</a></li>
-<li><a href="developer-guide.html#documenting-capability-and-keywords">Documenting Capability and Keywords</a></li>
-<li><a href="developer-guide.html#documenting-flowfile-attribute-interaction">Documenting FlowFile Attribute Interaction</a></li>
-<li><a href="developer-guide.html#documenting-related-components">Documenting Related Components</a></li>
-<li><a href="developer-guide.html#advanced-documentation">Advanced Documentation</a></li>
+<li><a href="#documenting-properties">Documenting Properties</a></li>
+<li><a href="#documenting-relationships">Documenting Relationships</a></li>
+<li><a href="#documenting-capability-and-keywords">Documenting Capability and Keywords</a></li>
+<li><a href="#documenting-flowfile-attribute-interaction">Documenting FlowFile Attribute Interaction</a></li>
+<li><a href="#documenting-related-components">Documenting Related Components</a></li>
+<li><a href="#advanced-documentation">Advanced Documentation</a></li>
 </ul>
 </li>
-<li><a href="developer-guide.html#common-processor-patterns">Common Processor Patterns</a>
+<li><a href="#common-processor-patterns">Common Processor Patterns</a>
 <ul class="sectlevel2">
-<li><a href="developer-guide.html#ingress">Data Ingress</a></li>
-<li><a href="developer-guide.html#data-egress">Data Egress</a></li>
-<li><a href="developer-guide.html#route-based-on-content-one-to-one">Route Based on Content (One-to-One)</a></li>
-<li><a href="developer-guide.html#route-based-on-content-one-to-many">Route Based on Content (One-to-Many)</a></li>
-<li><a href="developer-guide.html#route-streams-based-on-content-one-to-many">Route Streams Based on Content (One-to-Many)</a></li>
-<li><a href="developer-guide.html#route-based-on-attributes">Route Based on Attributes</a></li>
-<li><a href="developer-guide.html#split-content-one-to-many">Split Content (One-to-Many)</a></li>
-<li><a href="developer-guide.html#update-attributes-based-on-content">Update Attributes Based on Content</a></li>
-<li><a href="developer-guide.html#enrich-modify-content">Enrich/Modify Content</a></li>
+<li><a href="#ingress">Data Ingress</a></li>
+<li><a href="#data-egress">Data Egress</a></li>
+<li><a href="#route-based-on-content-one-to-one">Route Based on Content (One-to-One)</a></li>
+<li><a href="#route-based-on-content-one-to-many">Route Based on Content (One-to-Many)</a></li>
+<li><a href="#route-streams-based-on-content-one-to-many">Route Streams Based on Content (One-to-Many)</a></li>
+<li><a href="#route-based-on-attributes">Route Based on Attributes</a></li>
+<li><a href="#split-content-one-to-many">Split Content (One-to-Many)</a></li>
+<li><a href="#update-attributes-based-on-content">Update Attributes Based on Content</a></li>
+<li><a href="#enrich-modify-content">Enrich/Modify Content</a></li>
 </ul>
 </li>
-<li><a href="developer-guide.html#error-handling">Error Handling</a>
+<li><a href="#error-handling">Error Handling</a>
 <ul class="sectlevel2">
-<li><a href="developer-guide.html#exceptions-within-the-processor">Exceptions within the Processor</a></li>
-<li><a href="developer-guide.html#exceptions-within-a-callback-ioexception-runtimeexception">Exceptions within a callback: IOException, RuntimeException</a></li>
-<li><a href="developer-guide.html#penalization-vs-yielding">Penalization vs. Yielding</a></li>
-<li><a href="developer-guide.html#session-rollback">Session Rollback</a></li>
+<li><a href="#exceptions-within-the-processor">Exceptions within the Processor</a></li>
+<li><a href="#exceptions-within-a-callback-ioexception-runtimeexception">Exceptions within a callback: IOException, RuntimeException</a></li>
+<li><a href="#penalization-vs-yielding">Penalization vs. Yielding</a></li>
+<li><a href="#session-rollback">Session Rollback</a></li>
 </ul>
 </li>
-<li><a href="developer-guide.html#general-design-considerations">General Design Considerations</a>
+<li><a href="#general-design-considerations">General Design Considerations</a>
 <ul class="sectlevel2">
-<li><a href="developer-guide.html#consider-the-user">Consider the User</a></li>
-<li><a href="developer-guide.html#cohesion-and-reusability">Cohesion and Reusability</a></li>
-<li><a href="developer-guide.html#naming-convensions">Naming Conventions</a></li>
-<li><a href="developer-guide.html#processor-behavior-annotations">Processor Behavior Annotations</a></li>
-<li><a href="developer-guide.html#data-buffering">Data Buffering</a></li>
+<li><a href="#consider-the-user">Consider the User</a></li>
+<li><a href="#cohesion-and-reusability">Cohesion and Reusability</a></li>
+<li><a href="#naming-convensions">Naming Conventions</a></li>
+<li><a href="#processor-behavior-annotations">Processor Behavior Annotations</a></li>
+<li><a href="#data-buffering">Data Buffering</a></li>
 </ul>
 </li>
-<li><a href="developer-guide.html#controller-services">Controller Services</a>
+<li><a href="#controller-services">Controller Services</a>
 <ul class="sectlevel2">
-<li><a href="developer-guide.html#developing-controller-service">Developing a ControllerService</a></li>
-<li><a href="developer-guide.html#interacting-with-controller-service">Interacting with a ControllerService</a></li>
+<li><a href="#developing-controller-service">Developing a ControllerService</a></li>
+<li><a href="#interacting-with-controller-service">Interacting with a ControllerService</a></li>
 </ul>
 </li>
-<li><a href="developer-guide.html#reporting-tasks">Reporting Tasks</a>
+<li><a href="#reporting-tasks">Reporting Tasks</a>
 <ul class="sectlevel2">
-<li><a href="developer-guide.html#developing-a-reporting-task">Developing a Reporting Task</a></li>
+<li><a href="#developing-a-reporting-task">Developing a Reporting Task</a></li>
 </ul>
 </li>
-<li><a href="developer-guide.html#command-line-tools">Command Line Tools</a>
+<li><a href="#command-line-tools">Command Line Tools</a>
 <ul class="sectlevel2">
-<li><a href="developer-guide.html#tls-toolkit">tls-toolkit</a></li>
+<li><a href="#tls-toolkit">tls-toolkit</a></li>
 </ul>
 </li>
-<li><a href="developer-guide.html#testing">Testing</a>
+<li><a href="#testing">Testing</a>
 <ul class="sectlevel2">
-<li><a href="developer-guide.html#instantiate-testrunner">Instantiate TestRunner</a></li>
-<li><a href="developer-guide.html#add-controllerservices">Add ControllerServices</a></li>
-<li><a href="developer-guide.html#set-property-values">Set Property Values</a></li>
-<li><a href="developer-guide.html#enqueue-flowfiles">Enqueue FlowFiles</a></li>
-<li><a href="developer-guide.html#run-the-processor">Run the Processor</a></li>
-<li><a href="developer-guide.html#validate-output">Validate Output</a></li>
-<li><a href="developer-guide.html#mocking-external-resources">Mocking External Resources</a></li>
-<li><a href="developer-guide.html#additional-testing-capabilities">Additional Testing Capabilities</a></li>
+<li><a href="#instantiate-testrunner">Instantiate TestRunner</a></li>
+<li><a href="#add-controllerservices">Add ControllerServices</a></li>
+<li><a href="#set-property-values">Set Property Values</a></li>
+<li><a href="#enqueue-flowfiles">Enqueue FlowFiles</a></li>
+<li><a href="#run-the-processor">Run the Processor</a></li>
+<li><a href="#validate-output">Validate Output</a></li>
+<li><a href="#mocking-external-resources">Mocking External Resources</a></li>
+<li><a href="#additional-testing-capabilities">Additional Testing Capabilities</a></li>
 </ul>
 </li>
-<li><a href="developer-guide.html#nars">NiFi Archives (NARs)</a></li>
-<li><a href="developer-guide.html#how-to-contribute-to-apache-nifi">How to contribute to Apache NiFi</a>
+<li><a href="#nars">NiFi Archives (NARs)</a></li>
+<li><a href="#per-instance-classloading">Per-Instance ClassLoading</a></li>
+<li><a href="#how-to-contribute-to-apache-nifi">How to contribute to Apache NiFi</a>
 <ul class="sectlevel2">
-<li><a href="developer-guide.html#technologies">Technologies</a></li>
-<li><a href="developer-guide.html#where-to-start">Where to Start?</a></li>
-<li><a href="developer-guide.html#supplying-a-contribution">Supplying a contribution</a></li>
-<li><a href="developer-guide.html#contact-us">Contact Us</a></li>
+<li><a href="#technologies">Technologies</a></li>
+<li><a href="#where-to-start">Where to Start?</a></li>
+<li><a href="#supplying-a-contribution">Supplying a contribution</a></li>
+<li><a href="#contact-us">Contact Us</a></li>
 </ul>
 </li>
 </ul>
@@ -548,7 +550,7 @@ body.book #toc,body.book #preamble,body.
 </div>
 <div id="content">
 <div class="sect1">
-<h2 id="introduction"><a class="anchor" href="developer-guide.html#introduction"></a>Introduction</h2>
+<h2 id="introduction"><a class="anchor" href="#introduction"></a>Introduction</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>The intent of this Developer Guide is to provide the reader with the information needed to understand how Apache NiFi
@@ -565,7 +567,7 @@ and the <a href="user-guide.html">NiFi U
 </div>
 </div>
 <div class="sect1">
-<h2 id="components"><a class="anchor" href="developer-guide.html#components"></a>NiFi Components</h2>
+<h2 id="components"><a class="anchor" href="#components"></a>NiFi Components</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>NiFi provides several extension points to provide developers the
@@ -580,7 +582,7 @@ high-level description of the most commo
 <ul>
 <li>
 <p>The Processor interface is the mechanism through which NiFi exposes access to
-<a href="developer-guide.html#flowfile">FlowFile</a>s, their attributes, and their content. The Processor is the basic building
+<a href="#flowfile">FlowFile</a>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:</p>
 <div class="ulist">
@@ -652,7 +654,7 @@ many different Processors to load the da
 <div class="ulist">
 <ul>
 <li>
-<p>The FlowFilePrioritizer interface provides a mechanism by which <a href="developer-guide.html#flowfile">FlowFile</a>s
+<p>The FlowFilePrioritizer interface provides a mechanism by which <a href="#flowfile">FlowFile</a>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.</p>
 </li>
@@ -675,7 +677,7 @@ a given user should be granted.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="processor_api"><a class="anchor" href="developer-guide.html#processor_api"></a>Processor API</h2>
+<h2 id="processor_api"><a class="anchor" href="#processor_api"></a>Processor API</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>The Processor is the most widely used Component available in NiFi.
@@ -716,13 +718,13 @@ must be thread-safe. If unfamiliar with
 recommended that you familiarize yourself with the principles of Java concurrency.</p>
 </div>
 <div class="sect2">
-<h3 id="supporting_api"><a class="anchor" href="developer-guide.html#supporting_api"></a>Supporting API</h3>
+<h3 id="supporting_api"><a class="anchor" href="#supporting_api"></a>Supporting API</h3>
 <div class="paragraph">
 <p>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.</p>
 </div>
 <div class="sect3">
-<h4 id="flowfile"><a class="anchor" href="developer-guide.html#flowfile"></a>FlowFile</h4>
+<h4 id="flowfile"><a class="anchor" href="#flowfile"></a>FlowFile</h4>
 <div class="paragraph">
 <p>A FlowFile is a logical notion that correlates a piece of data with a
 set of Attributes about that data.
@@ -767,7 +769,7 @@ attribute within the <code>CoreAttribute
 </div>
 </div>
 <div class="sect3">
-<h4 id="process_session"><a class="anchor" href="developer-guide.html#process_session"></a>ProcessSession</h4>
+<h4 id="process_session"><a class="anchor" href="#process_session"></a>ProcessSession</h4>
 <div class="paragraph">
 <p>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
@@ -779,7 +781,7 @@ ProcessSession can be either committed o
 </div>
 </div>
 <div class="sect3">
-<h4 id="process_context"><a class="anchor" href="developer-guide.html#process_context"></a>ProcessContext</h4>
+<h4 id="process_context"><a class="anchor" href="#process_context"></a>ProcessContext</h4>
 <div class="paragraph">
 <p>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
@@ -788,7 +790,7 @@ Processors to run without consuming reso
 </div>
 </div>
 <div class="sect3">
-<h4 id="property_descriptor"><a class="anchor" href="developer-guide.html#property_descriptor"></a>PropertyDescriptor</h4>
+<h4 id="property_descriptor"><a class="anchor" href="#property_descriptor"></a>PropertyDescriptor</h4>
 <div class="paragraph">
 <p>PropertyDescriptor defines a property that is to be used by a
 Processor, ReportingTask, or ControllerService.
@@ -804,7 +806,7 @@ the <code>build</code> method.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="validator"><a class="anchor" href="developer-guide.html#validator"></a>Validator</h4>
+<h4 id="validator"><a class="anchor" href="#validator"></a>Validator</h4>
 <div class="paragraph">
 <p>A PropertyDescriptor MUST specify one or more Validators that can be
 used to ensure that the user-entered value
@@ -816,7 +818,7 @@ NiFi will report that the property is no
 </div>
 </div>
 <div class="sect3">
-<h4 id="validation_context"><a class="anchor" href="developer-guide.html#validation_context"></a>ValidationContext</h4>
+<h4 id="validation_context"><a class="anchor" href="#validation_context"></a>ValidationContext</h4>
 <div class="paragraph">
 <p>When validating property values, a ValidationContext can be used to
 obtain ControllerServices,
@@ -825,7 +827,7 @@ using the Expression Language.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="property_value"><a class="anchor" href="developer-guide.html#property_value"></a>PropertyValue</h4>
+<h4 id="property_value"><a class="anchor" href="#property_value"></a>PropertyValue</h4>
 <div class="paragraph">
 <p>All property values returned to a Processor are returned in the form
 of a PropertyValue object. This
@@ -836,7 +838,7 @@ Expression Language.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="relationship"><a class="anchor" href="developer-guide.html#relationship"></a>Relationship</h4>
+<h4 id="relationship"><a class="anchor" href="#relationship"></a>Relationship</h4>
 <div class="paragraph">
 <p>Relationships define the routes to which a FlowFile may be transfered
 from a Processor. Relationships
@@ -847,17 +849,17 @@ to fill in the details of the Relationsh
 </div>
 </div>
 <div class="sect3">
-<h4 id="supporting_api_state_manager"><a class="anchor" href="developer-guide.html#supporting_api_state_manager"></a>StateManager</h4>
+<h4 id="supporting_api_state_manager"><a class="anchor" href="#supporting_api_state_manager"></a>StateManager</h4>
 <div class="paragraph">
 <p>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
-<a href="developer-guide.html#state_manager">State Manager</a> section.</p>
+<a href="#state_manager">State Manager</a> section.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="processor_initialization_context"><a class="anchor" href="developer-guide.html#processor_initialization_context"></a>ProcessorInitializationContext</h4>
+<h4 id="processor_initialization_context"><a class="anchor" href="#processor_initialization_context"></a>ProcessorInitializationContext</h4>
 <div class="paragraph">
 <p>After a Processor is created, its <code>initialize</code> method will be called
 with an <code>InitializationContext</code> object.
@@ -867,7 +869,7 @@ such as the unique identifier of the Pro
 </div>
 </div>
 <div class="sect3">
-<h4 id="ComponentLog"><a class="anchor" href="developer-guide.html#ComponentLog"></a>ComponentLog</h4>
+<h4 id="ComponentLog"><a class="anchor" href="#ComponentLog"></a>ComponentLog</h4>
 <div class="paragraph">
 <p>Processors are encouraged to perform their logging via the
 <code>ComponentLog</code> interface, rather than obtaining
@@ -884,7 +886,7 @@ identifier in log messages.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="AbstractProcessor"><a class="anchor" href="developer-guide.html#AbstractProcessor"></a>AbstractProcessor API</h3>
+<h3 id="AbstractProcessor"><a class="anchor" href="#AbstractProcessor"></a>AbstractProcessor API</h3>
 <div class="paragraph">
 <p>Since the vast majority of Processors will be created by extending the
 AbstractProcessor, it is the
@@ -893,7 +895,7 @@ AbstractProcessor provides several metho
 will be of interest to Processor developers.</p>
 </div>
 <div class="sect3">
-<h4 id="processor-initialization"><a class="anchor" href="developer-guide.html#processor-initialization"></a>Processor Initialization</h4>
+<h4 id="processor-initialization"><a class="anchor" href="#processor-initialization"></a>Processor Initialization</h4>
 <div class="paragraph">
 <p>When a Processor is created, before any other methods are invoked, the
 <code>init</code> method of the
@@ -910,7 +912,7 @@ subclasses via the <code>getLogger</code
 </div>
 </div>
 <div class="sect3">
-<h4 id="exposing-processor-s-relationships"><a class="anchor" href="developer-guide.html#exposing-processor-s-relationships"></a>Exposing Processor&#8217;s Relationships</h4>
+<h4 id="exposing-processor-s-relationships"><a class="anchor" href="#exposing-processor-s-relationships"></a>Exposing Processor&#8217;s Relationships</h4>
 <div class="paragraph">
 <p>In order for a Processor to transfer a FlowFile to a new destination
 for follow-on processing, the
@@ -936,7 +938,7 @@ pattern lends itself to cleaner code and
 </div>
 </div>
 <div class="sect3">
-<h4 id="exposing-processor-properties"><a class="anchor" href="developer-guide.html#exposing-processor-properties"></a>Exposing Processor Properties</h4>
+<h4 id="exposing-processor-properties"><a class="anchor" href="#exposing-processor-properties"></a>Exposing Processor Properties</h4>
 <div class="paragraph">
 <p>Most Processors will require some amount of user configuration before
 they are able to be used. The properties
@@ -971,7 +973,7 @@ properties.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="validating-processor-properties"><a class="anchor" href="developer-guide.html#validating-processor-properties"></a>Validating Processor Properties</h4>
+<h4 id="validating-processor-properties"><a class="anchor" href="#validating-processor-properties"></a>Validating Processor Properties</h4>
 <div class="paragraph">
 <p>A Processor is not able to be started if its configuration is not
 valid. Validation of a Processor property can
@@ -997,7 +999,7 @@ validation of a Processor&#8217;s config
 </div>
 </div>
 <div class="sect3">
-<h4 id="responding-to-changes-in-configuration"><a class="anchor" href="developer-guide.html#responding-to-changes-in-configuration"></a>Responding to Changes in Configuration</h4>
+<h4 id="responding-to-changes-in-configuration"><a class="anchor" href="#responding-to-changes-in-configuration"></a>Responding to Changes in Configuration</h4>
 <div class="paragraph">
 <p>It is sometimes desirable to have a Processor eagerly react when its
 properties are changed. The <code>onPropertyModified</code>
@@ -1020,7 +1022,7 @@ creates its own threads.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="performing-the-work"><a class="anchor" href="developer-guide.html#performing-the-work"></a>Performing the Work</h4>
+<h4 id="performing-the-work"><a class="anchor" href="#performing-the-work"></a>Performing the Work</h4>
 <div class="paragraph">
 <p>When a Processor has work to do, it is scheduled to do so by having
 its <code>onTrigger</code> method called by the framework.
@@ -1036,7 +1038,7 @@ Relationships.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="when-processors-are-triggered"><a class="anchor" href="developer-guide.html#when-processors-are-triggered"></a>When Processors are Triggered</h4>
+<h4 id="when-processors-are-triggered"><a class="anchor" href="#when-processors-are-triggered"></a>When Processors are Triggered</h4>
 <div class="paragraph">
 <p>A Processor&#8217;s <code>onTrigger</code> method will be called only when it is
 scheduled to run and when work exists for the Processor.
@@ -1086,7 +1088,7 @@ be taken to ensure that the Processor is
 </div>
 </div>
 <div class="sect2">
-<h3 id="component-lifecycle"><a class="anchor" href="developer-guide.html#component-lifecycle"></a>Component Lifecycle</h3>
+<h3 id="component-lifecycle"><a class="anchor" href="#component-lifecycle"></a>Component Lifecycle</h3>
 <div class="paragraph">
 <p>The NiFi API provides lifecycle support through use of Java
 Annotations. The <code>org.apache.nifi.annotations.lifecycle</code> package
@@ -1099,7 +1101,7 @@ Component Lifecycle, we will define a Ni
 Processor, ControllerServices, or ReportingTask.</p>
 </div>
 <div class="sect3">
-<h4 id="onadded"><a class="anchor" href="developer-guide.html#onadded"></a>@OnAdded</h4>
+<h4 id="onadded"><a class="anchor" href="#onadded"></a>@OnAdded</h4>
 <div class="paragraph">
 <p>The <code>@OnAdded</code> annotation causes a method to be invoked as soon as a
 component is created. The
@@ -1116,7 +1118,7 @@ Methods with this Annotation must take z
 </div>
 </div>
 <div class="sect3">
-<h4 id="onenabled"><a class="anchor" href="developer-guide.html#onenabled"></a>@OnEnabled</h4>
+<h4 id="onenabled"><a class="anchor" href="#onenabled"></a>@OnEnabled</h4>
 <div class="paragraph">
 <p>The <code>@OnEnabled</code> 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
@@ -1146,7 +1148,7 @@ when starting or stopping a group of com
 </div>
 </div>
 <div class="sect3">
-<h4 id="onremoved"><a class="anchor" href="developer-guide.html#onremoved"></a>@OnRemoved</h4>
+<h4 id="onremoved"><a class="anchor" href="#onremoved"></a>@OnRemoved</h4>
 <div class="paragraph">
 <p>The <code>@OnRemoved</code> annotation causes a method to be invoked before a
 component is removed from the flow.
@@ -1157,7 +1159,7 @@ will still be removed.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="onscheduled"><a class="anchor" href="developer-guide.html#onscheduled"></a>@OnScheduled</h4>
+<h4 id="onscheduled"><a class="anchor" href="#onscheduled"></a>@OnScheduled</h4>
 <div class="paragraph">
 <p>This annotation indicates that a method should be called every time
 the component is scheduled to run. Because ControllerServices
@@ -1183,7 +1185,7 @@ is a ReportingTask.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="onunscheduled"><a class="anchor" href="developer-guide.html#onunscheduled"></a>@OnUnscheduled</h4>
+<h4 id="onunscheduled"><a class="anchor" href="#onunscheduled"></a>@OnUnscheduled</h4>
 <div class="paragraph">
 <p>Methods with this annotation will be called whenever a Processor or
 ReportingTask is no longer scheduled to run. At that time, many threads
@@ -1200,7 +1202,7 @@ component is a ReportingTask.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="onstopped"><a class="anchor" href="developer-guide.html#onstopped"></a>@OnStopped</h4>
+<h4 id="onstopped"><a class="anchor" href="#onstopped"></a>@OnStopped</h4>
 <div class="paragraph">
 <p>Methods with this annotation will be called when a Processor or
 ReportingTask is no longer scheduled to run
@@ -1216,7 +1218,7 @@ component is a Processor.</p>
 </div>
 </div>
 <div class="sect3">
-<h4 id="onshutdown"><a class="anchor" href="developer-guide.html#onshutdown"></a>@OnShutdown</h4>
+<h4 id="onshutdown"><a class="anchor" href="#onshutdown"></a>@OnShutdown</h4>
 <div class="paragraph">
 <p>Any method that is annotated with the <code>@OnShutdown</code> annotation will be
 called when NiFi is successfully
@@ -1237,7 +1239,26 @@ relied upon for critical business logic.
 </div>
 </div>
 <div class="sect2">
-<h3 id="state_manager"><a class="anchor" href="developer-guide.html#state_manager"></a>State Manager</h3>
+<h3 id="restricted"><a class="anchor" href="#restricted"></a>Restricted</h3>
+<div class="paragraph">
+<p>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.</p>
+</div>
+<div class="paragraph">
+<p>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 be still be aware these types of components exist but will
+be unable to create or modify them even with otherwise sufficient permissions.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="state_manager"><a class="anchor" href="#state_manager"></a>State Manager</h3>
 <div class="paragraph">
 <p>From the ProcessContext, ReportingContext, and ControllerServiceInitializationContext, components are
 able to call the <code>getStateManager()</code> method. This State Manager is responsible for providing a simple API
@@ -1254,7 +1275,7 @@ and retrieved, or individual keys must b
 be used (e.g., communicating with an external database).</p>
 </div>
 <div class="sect3">
-<h4 id="state_scope"><a class="anchor" href="developer-guide.html#state_scope"></a>Scope</h4>
+<h4 id="state_scope"><a class="anchor" href="#state_scope"></a>Scope</h4>
 <div class="paragraph">
 <p>When communicating with the State Manager, all method calls require that a Scope be provided. This Scope will
 either be <code>Scope.NODE</code> or <code>Scope.CLUSTER</code>. If NiFi is run in a cluster, this Scope provides important information
@@ -1273,7 +1294,7 @@ that the instance is clustered and write
 </div>
 </div>
 <div class="sect3">
-<h4 id="storing-and-retrieving-state"><a class="anchor" href="developer-guide.html#storing-and-retrieving-state"></a>Storing and Retrieving State</h4>
+<h4 id="storing-and-retrieving-state"><a class="anchor" href="#storing-and-retrieving-state"></a>Storing and Retrieving State</h4>
 <div class="paragraph">
 <p>State is stored using the StateManager&#8217;s <code>getState</code>, <code>setState</code>, <code>replace</code>, and <code>clear</code> 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
@@ -1290,7 +1311,7 @@ Controller Service and the state can be
 </div>
 </div>
 <div class="sect3">
-<h4 id="unit-tests"><a class="anchor" href="developer-guide.html#unit-tests"></a>Unit Tests</h4>
+<h4 id="unit-tests"><a class="anchor" href="#unit-tests"></a>Unit Tests</h4>
 <div class="paragraph">
 <p>NiFi&#8217;s Mock Framework provides an extensive collection of tools to perform unit testing of Processors. Processor unit tests typically
 begin with the <code>TestRunner</code> class. As a result, the <code>TestRunner</code> class contains a <code>getStateManager</code> method of its own. The StateManager
@@ -1306,7 +1327,7 @@ The <code>MockStateManager</code> also p
 </div>
 </div>
 <div class="sect2">
-<h3 id="reporting-processor-activity"><a class="anchor" href="developer-guide.html#reporting-processor-activity"></a>Reporting Processor Activity</h3>
+<h3 id="reporting-processor-activity"><a class="anchor" href="#reporting-processor-activity"></a>Reporting Processor Activity</h3>
 <div class="paragraph">
 <p>Processors are responsible for reporting their activity so that users
 are able to understand what happens
@@ -1317,7 +1338,7 @@ or by calling the <code>getLogger</code>
 <div class="paragraph">
 <p>Additionally, Processors should use the <code>ProvenanceReporter</code>
 interface, obtained via the ProcessSession&#8217;s
-<code>getProvenanceReporter</code> method. The ProvenanceReoprter should be used
+<code>getProvenanceReporter</code> 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
@@ -1355,7 +1376,7 @@ perspective of the Processor.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="documenting-a-component"><a class="anchor" href="developer-guide.html#documenting-a-component"></a>Documenting a Component</h2>
+<h2 id="documenting-a-component"><a class="anchor" href="#documenting-a-component"></a>Documenting a Component</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>NiFi attempts to make the user experience as simple and convenient as
@@ -1367,7 +1388,7 @@ exposes a few different mechanisms for s
 the framework.</p>
 </div>
 <div class="sect2">
-<h3 id="documenting-properties"><a class="anchor" href="developer-guide.html#documenting-properties"></a>Documenting Properties</h3>
+<h3 id="documenting-properties"><a class="anchor" href="#documenting-properties"></a>Documenting Properties</h3>
 <div class="paragraph">
 <p>Individual properties can be documented by calling the <code>description</code>
 method of a PropertyDescriptor&#8217;s builder as such:</p>
@@ -1406,7 +1427,7 @@ public static final PropertyDescriptor L
 </div>
 </div>
 <div class="sect2">
-<h3 id="documenting-relationships"><a class="anchor" href="developer-guide.html#documenting-relationships"></a>Documenting Relationships</h3>
+<h3 id="documenting-relationships"><a class="anchor" href="#documenting-relationships"></a>Documenting Relationships</h3>
 <div class="paragraph">
 <p>Processor Relationships are documented in much the same way that
 properties are - by calling the <code>description</code> method of a
@@ -1422,7 +1443,7 @@ Relationship&#8217;s builder:</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="documenting-capability-and-keywords"><a class="anchor" href="developer-guide.html#documenting-capability-and-keywords"></a>Documenting Capability and Keywords</h3>
+<h3 id="documenting-capability-and-keywords"><a class="anchor" href="#documenting-capability-and-keywords"></a>Documenting Capability and Keywords</h3>
 <div class="paragraph">
 <p>The <code>org.apache.nifi.annotations.documentation</code> package provides Java
 annotations that can be used to document components. The
@@ -1455,7 +1476,7 @@ public static final ExampleProcessor ext
 </div>
 </div>
 <div class="sect2">
-<h3 id="documenting-flowfile-attribute-interaction"><a class="anchor" href="developer-guide.html#documenting-flowfile-attribute-interaction"></a>Documenting FlowFile Attribute Interaction</h3>
+<h3 id="documenting-flowfile-attribute-interaction"><a class="anchor" href="#documenting-flowfile-attribute-interaction"></a>Documenting FlowFile Attribute Interaction</h3>
 <div class="paragraph">
 <p>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
@@ -1481,7 +1502,7 @@ public final class InvokeHTTP extends Ab
 </div>
 </div>
 <div class="sect2">
-<h3 id="documenting-related-components"><a class="anchor" href="developer-guide.html#documenting-related-components"></a>Documenting Related Components</h3>
+<h3 id="documenting-related-components"><a class="anchor" href="#documenting-related-components"></a>Documenting Related Components</h3>
 <div class="paragraph">
 <p>Often Processors and ControllerServices are related to one another.  Sometimes it is a put/get relation as in <code>PutFile</code> and <code>GetFile</code>.
 Sometimes a Processor uses a ControllerService like <code>InvokeHTTP</code> and <code>StandardSSLContextService</code>.  Sometimes one ControllerService uses another
@@ -1497,7 +1518,7 @@ public class PutFile extends AbstractPro
 </div>
 </div>
 <div class="sect2">
-<h3 id="advanced-documentation"><a class="anchor" href="developer-guide.html#advanced-documentation"></a>Advanced Documentation</h3>
+<h3 id="advanced-documentation"><a class="anchor" href="#advanced-documentation"></a>Advanced Documentation</h3>
 <div class="paragraph">
 <p>When the documentation methods above are not sufficient, NiFi provides
 the ability to expose more advanced documentation to the user via the
@@ -1525,7 +1546,7 @@ documentation for Processors, Controller
 </div>
 </div>
 <div class="sect1">
-<h2 id="common-processor-patterns"><a class="anchor" href="developer-guide.html#common-processor-patterns"></a>Common Processor Patterns</h2>
+<h2 id="common-processor-patterns"><a class="anchor" href="#common-processor-patterns"></a>Common Processor Patterns</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>While there are many different Processors available to NiFi users, the
@@ -1538,7 +1559,7 @@ and recommendations discussed below are
 hardened rules.</p>
 </div>
 <div class="sect2">
-<h3 id="ingress"><a class="anchor" href="developer-guide.html#ingress"></a>Data Ingress</h3>
+<h3 id="ingress"><a class="anchor" href="#ingress"></a>Data Ingress</h3>
 <div class="paragraph">
 <p>A Processor that ingests data into NiFi has a single Relationship
 names <code>success</code>. This Processor generates
@@ -1626,7 +1647,7 @@ annotated with the <code>@OnStopped</cod
 </div>
 </div>
 <div class="sect2">
-<h3 id="data-egress"><a class="anchor" href="developer-guide.html#data-egress"></a>Data Egress</h3>
+<h3 id="data-egress"><a class="anchor" href="#data-egress"></a>Data Egress</h3>
 <div class="paragraph">
 <p>A Processor that publishes data to an external source has two
 Relationships: <code>success</code> and <code>failure</code>. The
@@ -1687,7 +1708,7 @@ error depends on a few considerations. I
 network condition, the FlowFile is generally
 routed to <code>failure</code>. The FlowFile is not penalized because there is
 not necessary a problem with the data. Unlike the
-case of the <a href="developer-guide.html#ingress">Data Ingress</a> Processor, we typically do not call <code>yield</code> on
+case of the <a href="#ingress">Data Ingress</a> Processor, we typically do not call <code>yield</code> 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,
@@ -1723,7 +1744,7 @@ annotated with <code>@OnStopped</code> s
 </div>
 </div>
 <div class="sect2">
-<h3 id="route-based-on-content-one-to-one"><a class="anchor" href="developer-guide.html#route-based-on-content-one-to-one"></a>Route Based on Content (One-to-One)</h3>
+<h3 id="route-based-on-content-one-to-one"><a class="anchor" href="#route-based-on-content-one-to-one"></a>Route Based on Content (One-to-One)</h3>
 <div class="paragraph">
 <p>A Processor that routes data based on its content will take one of two
 forms: Route an incoming FlowFile to exactly
@@ -1764,7 +1785,7 @@ package.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="route-based-on-content-one-to-many"><a class="anchor" href="developer-guide.html#route-based-on-content-one-to-many"></a>Route Based on Content (One-to-Many)</h3>
+<h3 id="route-based-on-content-one-to-many"><a class="anchor" href="#route-based-on-content-one-to-many"></a>Route Based on Content (One-to-Many)</h3>
 <div class="paragraph">
 <p>If a Processor will route a single FlowFile to potentially many
 relationships, this Processor will be slightly different than
@@ -1849,7 +1870,7 @@ package.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="route-streams-based-on-content-one-to-many"><a class="anchor" href="developer-guide.html#route-streams-based-on-content-one-to-many"></a>Route Streams Based on Content (One-to-Many)</h3>
+<h3 id="route-streams-based-on-content-one-to-many"><a class="anchor" href="#route-streams-based-on-content-one-to-many"></a>Route Streams Based on Content (One-to-Many)</h3>
 <div class="paragraph">
 <p>The previous description of Route Based on Content (One-to-Many)
 provides an abstraction
@@ -2001,7 +2022,7 @@ Capturing Group).</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="route-based-on-attributes"><a class="anchor" href="developer-guide.html#route-based-on-attributes"></a>Route Based on Attributes</h3>
+<h3 id="route-based-on-attributes"><a class="anchor" href="#route-based-on-attributes"></a>Route Based on Attributes</h3>
 <div class="paragraph">
 <p>This Processor is almost identical to the Route Data Based on Content
 Processors described above. It takes two different forms: One-to-One
@@ -2015,7 +2036,7 @@ in this case.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="split-content-one-to-many"><a class="anchor" href="developer-guide.html#split-content-one-to-many"></a>Split Content (One-to-Many)</h3>
+<h3 id="split-content-one-to-many"><a class="anchor" href="#split-content-one-to-many"></a>Split Content (One-to-Many)</h3>
 <div class="paragraph">
 <p>This Processor generally requires no user configuration, with the
 exception of the size of each Split to create. The <code>onTrigger</code> method
@@ -2124,7 +2145,7 @@ the following is applicable:</p>
 which processing cannot continue
 (for example, the input is malformed), a <code>ProcessException</code> should be
 thrown. The call to the
-ProcesssSession&#8217;s <code>read</code> method is wrapped in a <code>try/catch</code> block
+ProcessSession&#8217;s <code>read</code> method is wrapped in a <code>try/catch</code> block
 where <code>ProcessException</code> is
 caught. If an Exception is caught, a log message is generated
 explaining the error. The List of
@@ -2170,7 +2191,7 @@ logged; and the method returns.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="update-attributes-based-on-content"><a class="anchor" href="developer-guide.html#update-attributes-based-on-content"></a>Update Attributes Based on Content</h3>
+<h3 id="update-attributes-based-on-content"><a class="anchor" href="#update-attributes-based-on-content"></a>Update Attributes Based on Content</h3>
 <div class="paragraph">
 <p>This Processor is very similar to the Route Based on Content
 Processors discussed above. Rather than
@@ -2207,7 +2228,7 @@ when appropriate.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="enrich-modify-content"><a class="anchor" href="developer-guide.html#enrich-modify-content"></a>Enrich/Modify Content</h3>
+<h3 id="enrich-modify-content"><a class="anchor" href="#enrich-modify-content"></a>Enrich/Modify Content</h3>
 <div class="paragraph">
 <p>The Enrich/Modify Content pattern is very common and very generic.
 This pattern is responsible for any
@@ -2238,7 +2259,7 @@ and routes the FlowFile to failure.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="error-handling"><a class="anchor" href="developer-guide.html#error-handling"></a>Error Handling</h2>
+<h2 id="error-handling"><a class="anchor" href="#error-handling"></a>Error Handling</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>When writing a Processor, there are several different unexpected cases that can occur.
@@ -2248,7 +2269,7 @@ what error handling is expected of Proce
 handle unexpected errors during the course of their work.</p>
 </div>
 <div class="sect2">
-<h3 id="exceptions-within-the-processor"><a class="anchor" href="developer-guide.html#exceptions-within-the-processor"></a>Exceptions within the Processor</h3>
+<h3 id="exceptions-within-the-processor"><a class="anchor" href="#exceptions-within-the-processor"></a>Exceptions within the Processor</h3>
 <div class="paragraph">
 <p>During the execution of the <code>onTrigger</code> method of a Processor, many things can potentially go
 awry. Common failure conditions include:</p>
@@ -2293,7 +2314,7 @@ in the <code>nifi.properties</code> file
 </div>
 </div>
 <div class="sect2">
-<h3 id="exceptions-within-a-callback-ioexception-runtimeexception"><a class="anchor" href="developer-guide.html#exceptions-within-a-callback-ioexception-runtimeexception"></a>Exceptions within a callback: IOException, RuntimeException</h3>
+<h3 id="exceptions-within-a-callback-ioexception-runtimeexception"><a class="anchor" href="#exceptions-within-a-callback-ioexception-runtimeexception"></a>Exceptions within a callback: IOException, RuntimeException</h3>
 <div class="paragraph">
 <p>More often than not, when an Exception occurs in a Processor, it occurs from within a callback (I.e.,
 <code>InputStreamCallback</code>, <code>OutputStreamCallback</code>, or <code>StreamCallback</code>). That is, during the processing of a
@@ -2323,7 +2344,7 @@ condition appropriately. Catching the ge
 </div>
 </div>
 <div class="sect2">
-<h3 id="penalization-vs-yielding"><a class="anchor" href="developer-guide.html#penalization-vs-yielding"></a>Penalization vs. Yielding</h3>
+<h3 id="penalization-vs-yielding"><a class="anchor" href="#penalization-vs-yielding"></a>Penalization vs. Yielding</h3>
 <div class="paragraph">
 <p>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.
@@ -2348,7 +2369,7 @@ there&#8217;s nothing that it can do - i
 </div>
 </div>
 <div class="sect2">
-<h3 id="session-rollback"><a class="anchor" href="developer-guide.html#session-rollback"></a>Session Rollback</h3>
+<h3 id="session-rollback"><a class="anchor" href="#session-rollback"></a>Session Rollback</h3>
 <div class="paragraph">
 <p>Thus far, when we have discussed the <code>ProcessSession</code>, 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
@@ -2386,14 +2407,14 @@ These "batched" commits are not rolled b
 </div>
 </div>
 <div class="sect1">
-<h2 id="general-design-considerations"><a class="anchor" href="developer-guide.html#general-design-considerations"></a>General Design Considerations</h2>
+<h2 id="general-design-considerations"><a class="anchor" href="#general-design-considerations"></a>General Design Considerations</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>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.</p>
 </div>
 <div class="sect2">
-<h3 id="consider-the-user"><a class="anchor" href="developer-guide.html#consider-the-user"></a>Consider the User</h3>
+<h3 id="consider-the-user"><a class="anchor" href="#consider-the-user"></a>Consider the User</h3>
 <div class="paragraph">
 <p>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&#8217;s important to remember that as the developer of such a component, you may have
@@ -2402,7 +2423,7 @@ less familiar with the process are able
 </div>
 <div class="paragraph">
 <p>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 <a href="developer-guide.html#naming-convensions">Naming Conventions</a>. This is true for Processor names, Property names and value, Relationship
+to stick with the standard <a href="#naming-convensions">Naming Conventions</a>. This is true for Processor names, Property names and value, Relationship
 names, and any other aspect that the user will experience.</p>
 </div>
 <div class="paragraph">
@@ -2412,7 +2433,7 @@ tell users to just leave the default val
 </div>
 </div>
 <div class="sect2">
-<h3 id="cohesion-and-reusability"><a class="anchor" href="developer-guide.html#cohesion-and-reusability"></a>Cohesion and Reusability</h3>
+<h3 id="cohesion-and-reusability"><a class="anchor" href="#cohesion-and-reusability"></a>Cohesion and Reusability</h3>
 <div class="paragraph">
 <p>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
@@ -2449,7 +2470,7 @@ Processor to send data to the remote res
 </div>
 </div>
 <div class="sect2">
-<h3 id="naming-convensions"><a class="anchor" href="developer-guide.html#naming-convensions"></a>Naming Conventions</h3>
+<h3 id="naming-convensions"><a class="anchor" href="#naming-convensions"></a>Naming Conventions</h3>
 <div class="paragraph">
 <p>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:</p>
@@ -2473,7 +2494,7 @@ sources over a known Protocol (such as G
 </div>
 </div>
 <div class="sect2">
-<h3 id="processor-behavior-annotations"><a class="anchor" href="developer-guide.html#processor-behavior-annotations"></a>Processor Behavior Annotations</h3>
+<h3 id="processor-behavior-annotations"><a class="anchor" href="#processor-behavior-annotations"></a>Processor Behavior Annotations</h3>
 <div class="paragraph">
 <p>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&#8217;s class. The annotations that can be applied to a
@@ -2548,7 +2569,7 @@ not even be able to create a Connection
 </div>
 </div>
 <div class="sect2">
-<h3 id="data-buffering"><a class="anchor" href="developer-guide.html#data-buffering"></a>Data Buffering</h3>
+<h3 id="data-buffering"><a class="anchor" href="#data-buffering"></a>Data Buffering</h3>
 <div class="paragraph">
 <p>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
@@ -2568,7 +2589,7 @@ amount of data, as appropriate.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="controller-services"><a class="anchor" href="developer-guide.html#controller-services"></a>Controller Services</h2>
+<h2 id="controller-services"><a class="anchor" href="#controller-services"></a>Controller Services</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>The <code>ControllerService</code> interface allows developers to share
@@ -2579,10 +2600,11 @@ have an <code>onTrigger</code> method be
 scheduled to run periodically, and
 Controller Services do not have Relationships because they are not
 integrated into the flow directly. Rather,
-they are used Processors, Reporting Tasks, and other Controller Services.</p>
+they are used by Processors, Reporting Tasks, and
+other Controller Services.</p>
 </div>
 <div class="sect2">
-<h3 id="developing-controller-service"><a class="anchor" href="developer-guide.html#developing-controller-service"></a>Developing a ControllerService</h3>
+<h3 id="developing-controller-service"><a class="anchor" href="#developing-controller-service"></a>Developing a ControllerService</h3>
 <div class="paragraph">
 <p>Just like with the Processor interface, the ControllerService
 interface exposes methods for configuration,
@@ -2615,11 +2637,11 @@ in order to make this work, the Processo
 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&#8217;s interface. See <a href="developer-guide.html#nars">NiFi Archives (NARs)</a> for more information.</p>
+Controller Service&#8217;s interface. See <a href="#nars">NiFi Archives (NARs)</a> for more information.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="interacting-with-controller-service"><a class="anchor" href="developer-guide.html#interacting-with-controller-service"></a>Interacting with a ControllerService</h3>
+<h3 id="interacting-with-controller-service"><a class="anchor" href="#interacting-with-controller-service"></a>Interacting with a ControllerService</h3>
 <div class="paragraph">
 <p>ControllerServices may be obtained by a Processor, another
 ControllerService, or a ReportingTask
@@ -2677,7 +2699,7 @@ detail.</p>
 </div>
 </div>
 <div class="sect1">
-<h2 id="reporting-tasks"><a class="anchor" href="developer-guide.html#reporting-tasks"></a>Reporting Tasks</h2>
+<h2 id="reporting-tasks"><a class="anchor" href="#reporting-tasks"></a>Reporting Tasks</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>So far, we have mentioned little about how to convey to the outside
@@ -2696,7 +2718,7 @@ interface. ReportingTasks are given acce
 determine how the system is performing.</p>
 </div>
 <div class="sect2">
-<h3 id="developing-a-reporting-task"><a class="anchor" href="developer-guide.html#developing-a-reporting-task"></a>Developing a Reporting Task</h3>
+<h3 id="developing-a-reporting-task"><a class="anchor" href="#developing-a-reporting-task"></a>Developing a Reporting Task</h3>
 <div class="paragraph">
 <p>Just like with the Processor and ControllerService interfaces, the
 ReportingTask interface exposes methods for
@@ -2722,7 +2744,7 @@ configured. However, this method of obta
 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 <a href="developer-guide.html#interacting-with-controller-service">Interacting with a ControllerService</a> section.</p>
+as is discussed in the <a href="#interacting-with-controller-service">Interacting with a ControllerService</a> section.</p>
 </div>
 <div class="paragraph">
 <p>The <code>EventAccess</code> object that is exposed via the ReportingContext
@@ -2754,10 +2776,10 @@ needed for any number of operational con
 </div>
 </div>
 <div class="sect1">
-<h2 id="command-line-tools"><a class="anchor" href="developer-guide.html#command-line-tools"></a>Command Line Tools</h2>
+<h2 id="command-line-tools"><a class="anchor" href="#command-line-tools"></a>Command Line Tools</h2>
 <div class="sectionbody">
 <div class="sect2">
-<h3 id="tls-toolkit"><a class="anchor" href="developer-guide.html#tls-toolkit"></a>tls-toolkit</h3>
+<h3 id="tls-toolkit"><a class="anchor" href="#tls-toolkit"></a>tls-toolkit</h3>
 <div class="paragraph">
 <p>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.</p>
 </div>
@@ -2802,7 +2824,7 @@ needed for any number of operational con
 </div>
 </div>
 <div class="sect1">
-<h2 id="testing"><a class="anchor" href="developer-guide.html#testing"></a>Testing</h2>
+<h2 id="testing"><a class="anchor" href="#testing"></a>Testing</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>Testing the components that will be used within a larger framework can often be very cumbersome
@@ -2825,7 +2847,7 @@ as well as invoking the necessary lifecy
 same way in the unit tests as it does in production.</p>
 </div>
 <div class="sect2">
-<h3 id="instantiate-testrunner"><a class="anchor" href="developer-guide.html#instantiate-testrunner"></a>Instantiate TestRunner</h3>
+<h3 id="instantiate-testrunner"><a class="anchor" href="#instantiate-testrunner"></a>Instantiate TestRunner</h3>
 <div class="paragraph">
 <p>Most unit tests for a Processor or a Controller Service start by creating an instance of the <code>TestRunner</code>
 class. In order to add the necessary classes to your Processor,
@@ -2847,7 +2869,7 @@ either be the class of the Processor to
 </div>
 </div>
 <div class="sect2">
-<h3 id="add-controllerservices"><a class="anchor" href="developer-guide.html#add-controllerservices"></a>Add ControllerServices</h3>
+<h3 id="add-controllerservices"><a class="anchor" href="#add-controllerservices"></a>Add ControllerServices</h3>
 <div class="paragraph">
 <p>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 <code>addControllerService</code> method and supply
@@ -2872,7 +2894,7 @@ will throw an IllegalStateException. Oth
 </div>
 </div>
 <div class="sect2">
-<h3 id="set-property-values"><a class="anchor" href="developer-guide.html#set-property-values"></a>Set Property Values</h3>
+<h3 id="set-property-values"><a class="anchor" href="#set-property-values"></a>Set Property Values</h3>
 <div class="paragraph">
 <p>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.,
@@ -2885,7 +2907,7 @@ Processor is valid or not, according to
 </div>
 </div>
 <div class="sect2">
-<h3 id="enqueue-flowfiles"><a class="anchor" href="developer-guide.html#enqueue-flowfiles"></a>Enqueue FlowFiles</h3>
+<h3 id="enqueue-flowfiles"><a class="anchor" href="#enqueue-flowfiles"></a>Enqueue FlowFiles</h3>
 <div class="paragraph">
 <p>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 <code>enqueue</code> methods of the <code>TestRunner</code> class. The <code>enqueue</code> method has several
@@ -2898,7 +2920,7 @@ to obtain the output of a Processor and
 </div>
 </div>
 <div class="sect2">
-<h3 id="run-the-processor"><a class="anchor" href="developer-guide.html#run-the-processor"></a>Run the Processor</h3>
+<h3 id="run-the-processor"><a class="anchor" href="#run-the-processor"></a>Run the Processor</h3>
 <div class="paragraph">
 <p>After configuring the Controller Services and enqueuing the necessary FlowFiles, the Processor can be triggered
 to run by calling the <code>run</code> method of <code>TestRunner</code>. If this method is called without any arguments, it will
@@ -2927,7 +2949,7 @@ the number of times that the Processor s
 </div>
 </div>
 <div class="sect2">
-<h3 id="validate-output"><a class="anchor" href="developer-guide.html#validate-output"></a>Validate Output</h3>
+<h3 id="validate-output"><a class="anchor" href="#validate-output"></a>Validate Output</h3>
 <div class="paragraph">
 <p>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 <code>TestRunners</code> <code>assertAllFlowFilesTransferred</code> and
@@ -2951,7 +2973,7 @@ as expected.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="mocking-external-resources"><a class="anchor" href="developer-guide.html#mocking-external-resources"></a>Mocking External Resources</h3>
+<h3 id="mocking-external-resources"><a class="anchor" href="#mocking-external-resources"></a>Mocking External Resources</h3>
 <div class="paragraph">
 <p>One of the biggest problems when testing a NiFi processor that connects to a remote resource is that we don&#8217;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
@@ -2994,7 +3016,7 @@ to the client.</p>
 </div>
 </div>
 <div class="sect2">
-<h3 id="additional-testing-capabilities"><a class="anchor" href="developer-guide.html#additional-testing-capabilities"></a>Additional Testing Capabilities</h3>
+<h3 id="additional-testing-capabilities"><a class="anchor" href="#additional-testing-capabilities"></a>Additional Testing Capabilities</h3>
 <div class="paragraph">
 <p>In addition to the above-mentioned capabilities provided by the
 testing framework, the TestRunner provides several
@@ -3014,7 +3036,7 @@ be set via the <code>setThreadCount(int)
 </div>
 </div>
 <div class="sect1">
-<h2 id="nars"><a class="anchor" href="developer-guide.html#nars"></a>NiFi Archives (NARs)</h2>
+<h2 id="nars"><a class="anchor" href="#nars"></a>NiFi Archives (NARs)</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>When software from many different organizations is all hosted within
@@ -3076,7 +3098,7 @@ we refer to NAR B as the <em>Parent</em>
 <div class="paragraph">
 <p>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 <a href="developer-guide.html#developing-controller-service">Developing a ControllerService</a>
+across all NARs. As mentioned in the <a href="#developing-controller-service">Developing a ControllerService</a>
 section, A Controller Service must be separated
 into an interface that extends <code>ControllerService</code> and an
 implementation that implements that interface. Controller Services
@@ -3180,7 +3202,66 @@ API artifacts into the same NAR is often
 </div>
 </div>
 <div class="sect1">
-<h2 id="how-to-contribute-to-apache-nifi"><a class="anchor" href="developer-guide.html#how-to-contribute-to-apache-nifi"></a>How to contribute to Apache NiFi</h2>
+<h2 id="per-instance-classloading"><a class="anchor" href="#per-instance-classloading"></a>Per-Instance ClassLoading</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>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.</p>
+</div>
+<div class="paragraph">
+<p>This may be accomplished by declaring one or more PropertyDescriptor instances with
+<code>dynamicallyModifiesClasspath</code> set to true. For example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlight"><code class="language-java" data-lang="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();</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When these properties are set on a component, the framework identifies all properties where
+<code>dynamicallyModifiesClasspath</code> 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.</p>
+</div>
+<div class="paragraph">
+<p>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.</p>
+</div>
+<div class="paragraph">
+<p>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.</p>
+</div>
+<div class="paragraph">
+<p>NiFi provides the <code>@RequiresInstanceClassLoading</code> annotation to further expand and isolate the libraries
+available on a component’s classpath. You can annotate a component with <code>@RequiresInstanceClassLoading</code>
+to indicate that the instance ClassLoader for the component requires a copy of all the resources in the
+component&#8217;s NAR ClassLoader. When <code>@RequiresInstanceClassLoading</code> is not present, the
+instance ClassLoader simply has it&#8217;s parent ClassLoader set to the NAR ClassLoader, rather than
+copying resources.</p>
+</div>
+<div class="paragraph">
+<p>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&#8217;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.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="how-to-contribute-to-apache-nifi"><a class="anchor" href="#how-to-contribute-to-apache-nifi"></a>How to contribute to Apache NiFi</h2>
 <div class="sectionbody">
 <div class="paragraph">
 <p>We are always excited to have contributions from the community - especially from new contributors!
@@ -3188,7 +3269,7 @@ We are interested in accepting contribut
 can be applied as icons or styling to the application.</p>
 </div>
 <div class="sect2">
-<h3 id="technologies"><a class="anchor" href="developer-guide.html#technologies"></a>Technologies</h3>
+<h3 id="technologies"><a class="anchor" href="#technologies"></a>Technologies</h3>
 <div class="paragraph">
 <p>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,
@@ -3199,7 +3280,7 @@ among others. We make use of Apache Mave
 </div>
 </div>
 <div class="sect2">
-<h3 id="where-to-start"><a class="anchor" href="developer-guide.html#where-to-start"></a>Where to Start?</h3>
+<h3 id="where-to-start"><a class="anchor" href="#where-to-start"></a>Where to Start?</h3>
 <div class="paragraph">
 <p><a href="http://issues.apache.org/jira/browse/NIFI">NiFi&#8217;s JIRA page</a> 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
@@ -3212,7 +3293,7 @@ Tools available to facilitate documentat
 </div>
 </div>
 <div class="sect2">
-<h3 id="supplying-a-contribution"><a class="anchor" href="developer-guide.html#supplying-a-contribution"></a>Supplying a contribution</h3>
+<h3 id="supplying-a-contribution"><a class="anchor" href="#supplying-a-contribution"></a>Supplying a contribution</h3>
 <div class="paragraph">
 <p>Contributions can be provided either by creating a patch:</p>
 </div>
@@ -3224,7 +3305,7 @@ Tools available to facilitate documentat
 </div>
 </div>
 <div class="sect2">
-<h3 id="contact-us"><a class="anchor" href="developer-guide.html#contact-us"></a>Contact Us</h3>
+<h3 id="contact-us"><a class="anchor" href="#contact-us"></a>Contact Us</h3>
 <div class="paragraph">
 <p>The developer mailing list (<a href="mailto:dev@nifi.apache.org">dev@nifi.apache.org</a>) is monitored pretty closely, and we tend to respond pretty
 quickly. If you have a question, don&#8217;t hesitate to shoot us an e-mail - we&#8217;re here to help! Unfortunately, though, e-mails
@@ -3237,7 +3318,7 @@ worry about bothering us. Just ping the
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2016-08-29 08:05:44 -04:00
+Last updated 2016-11-26 01:07:10 -05:00
 </div>
 </div>
 </body>