Mark Payne created NIFI-1121:
--------------------------------
Summary: Allow components' properties to depend on one another
Key: NIFI-1121
URL: https://issues.apache.org/jira/browse/NIFI-1121
Project: Apache NiFi
Issue Type: Improvement
Components: Core Framework
Reporter: Mark Payne
Concept: A Processor developer (or Controller Service or Reporting Task
developer) should be able to indicate when building a PropertyDescriptor that
the property is "dependent on" another Property. If Property A depends on
Property B, then the following should happen:
Property A should not be shown in the Configure dialog unless a value is
selected for Property B. Additionally, if Property A is dependent on particular
values of Property B, then Property A should be shown only if Property B is set
to one of those values.
For example, in Compress Content, the "Compression Level" property should be
dependent on the "Mode" property being set to "Compress." This means that if
the "Mode" property is set to Decompress, then the UI would not show the
Compression Level property. This will be far less confusing for users, as it
will allow the UI to hide properties that irrelevant based on the configuration.
Additionally, if Property A depends on Property B and Property A is required,
then a valid value must be set for Property A ONLY if Property B is set to a
value that Property A depends on. I.e., in the example above, the Compression
Level property can be required, but if the Mode is not set to Compress, then it
doesn't matter if the Compression Level property is set to a valid value - the
Processor will still be valid, because Compression Level is not a relevant
property in this case.
This provides developers to provide validation much more easily, as many times
the developer currently must implement the customValidate method to ensure that
if Property A is set that Property B must also be set. In this case, it is
taken care of by the framework simply by adding a dependency.
>From an API perspective, it would manifest itself as having a new "dependsOn"
>method added to the PropertyDescriptor.Builder class:
{code}
/**
* Indicates that this Property is relevant if and only if the parent property
has some (any) value set.
**/
Builder dependsOn(PropertyDescriptor parent);
{code}
{code}
/**
* Indicates that this Property is relevant if and only if the parent property
is set to one of the values included in the 'relevantValues' Collection.
**/
Builder dependsOn(PropertyDescriptor parent, Collection<AllowableValue>
relevantValues);
{code}
In providing this capability, we will not only be able to hide properties that
are not valid based on the Processor's other configuration but will also make
the notion of "Strategy Properties" far more powerful/easy to use. This is
because we can now have a Property such as "My Capability Strategy" and then
have properties that are shown for each of the allowed strategies.
For example, in MergeContent, the Header, Footer, Demarcator could become
dependent on the "Bin-Packing Algorithm" Merge Strategy. These properties can
then be thought of logically as properties of that strategy itself.
This will require a few different parts of the application to be updated:
* nifi-api - must be updated to support the new methods.
* nifi-framework-core - must be updated to handle new validation logic for
components
* nifi-web - must be updated to show/hide properties based on other properties'
values
* nifi-mock - needs to handle the validation logic and ensure that developers
are using the API properly, throwing AssertionErrors if not
* nifi-docs - need to update the Developer Guide to explain how this works
* processors - many processors can be updated to take advantage of this new
capability
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)