Merge pull request #2 from apache/develop

Merging latest Apache NiFi to fork
This commit is contained in:
Brian Ghigiarelli 2015-05-13 20:32:23 -04:00
commit 421ad8fb13
1392 changed files with 41979 additions and 31542 deletions

58
KEYS
View File

@ -144,3 +144,61 @@ lLqlJSFiuV7mNyu7u15/EO9S+ITRYdvsncRRYYdQdYZCyvgxP038P2WUeyRMtQSp
F9jzEw==
=IZsE
-----END PGP PUBLIC KEY BLOCK-----
pub 4096R/432AEE37 2015-05-04
uid Matt Gilman (CODE SIGNING KEY) <mcgilman@apache.org>
sig 3 432AEE37 2015-05-04 Matt Gilman (CODE SIGNING KEY) <mcgilman@apache.org>
sub 4096R/69B51990 2015-05-04
sig 432AEE37 2015-05-04 Matt Gilman (CODE SIGNING KEY) <mcgilman@apache.org>
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1
mQINBFVHcNsBEADbogfcroNIO8PbGENtCr4VISn2ZSW3XVBUv4xhiZeH/M/horu9
IwtQmWilbJi20nraEbYg4rxxuNDSt+EjN0zb1yVfISmfzIXrTclE2wbHWdUbjaRA
kdxkBKt2Gc7x0OEONfOFKP26hF24zMN7348iwzjML610P0yaMoDT1kwt36qpr5d7
dIy+e+6zJ4p6ypyqyG+scxPzC2QFQmwPtRAvgbnHRPwsef0zo3qLc7Otvw+0MiC8
qxFsdiCzc8yLnebHzWTyqZdkp/TRoVGi8m5OMrKRmiOBhcGwK31Z7cDlwfzHNt3O
wYEUFDw2cA/8k8S2ctkybJGiBXgDjZoGjGpocAbObrcZq9iCn0k8x3MY3yqTA+7h
BVNQXmydh1Sj0fAI/CUMDvSEdTPwSK93W4sj7p0fyL8eSunCXDAWtmfRFLsB8BPC
o4g5SH1Q8VvW4LRaFrrvWL//2v+y+klF3FMaInKPtHP96F5ZI2VMgQrL1UjX/bq5
ctEym6pH887eUcxR7OvpQEZZm3dw1/LAk7ZN18hGeJuoZ2R97Q9gdP4r8p09Rj6n
bzGPh1N4NuwTo2Xs20ESW5UiJh96O0mqJ2kB8GrvitxOVqnUwaAUQvUgFVR7m941
yNSddMbmCznj7eYngC8AGVsjzU2L1dJDjfHFHKNJ3pgZcjZkpIwT3imlBwARAQAB
tDRNYXR0IEdpbG1hbiAoQ09ERSBTSUdOSU5HIEtFWSkgPG1jZ2lsbWFuQGFwYWNo
ZS5vcmc+iQI3BBMBAgAhAhsDAh4BAheABQJVR3KCBQsJCAcDBRUKCQgLBRYCAwEA
AAoJEN9h7BlDKu432C4QAJ8y0lGgxIKiLEBAsmm/E/bh2Eaw8YeWj/zbQT3IGh/G
vFKCec2NZSGdObgD8mg4SieW6nYW/GZSMtlsVawCB4kavD6TKeYacq90E7nqeWJm
4oZxiWuQuPuJgPqJJMmk0aiUb9EiZRFQqYmDOsrXausxbcVzpzQwKTrKyzWIO7hT
79ii+D/bdDYL10bju/9gmFvzAABnolL98fstr/sJcoZBd4FmWXdEFR2oXONukqJB
rRGiAny1q+5QwQdHs7nNVewFjuu9AzibOY5omPGJLTsfH+aBgrpIAg4vFlG4H6tn
RnB5VcxtOfr8b0xIjPIV93HtlU4Vfft1pIJxULknbKDArpam3wVYLNmsyRmD1AKY
Xumii1Rzf10k6jxUJuK8EdvbrSjfNWuaZ1lVi9robKhpYZ3oVEikOmg8nD4aSMJ6
a2i16GgmZ+QHUbFdaSEtNftptlxtFI31LzjLRX3EOsQJ96J+frmzH9I+Vjxys6DH
TTPuvANQViaxgEJ8I73OntTsuywqXXOg67+Eyz4ieeYDdxGnKBK/n8pl1xLUvyN9
K55a9/Lk26mRNsRFxSp37gTHCcYDgDkC4BA4fxvakl/IAAdXxjXg92sQ9A27qNcw
OqzlnGd7yobwtgGqHXM9ORgnDXl6zuRLXjYMGjTrwuhbbSHxqt/huvpWISTEJe59
uQINBFVHcNsBEADFVADjCu8IZi/lNPRoTZv+QVqAuFfIVHaX2Niu1RUVvm1yIqCr
Kba5b88vQJjn2iDTMP+1Kcv/szhIli0TZENUE6hg/vZpbJVumDqb9QkdOlxVWzug
3jUIu4ZxY4sqfLLAawlYzgnm/Nl4URrUoh1bUEdTrfW+gaLLGgiUsDWHMDQVr7KU
sJtR0RVcFm7fCjfqDyaYPGsrRHftH585Ym9e72fj7E4C/9gYOwJqBMkvD8rClCKf
4GpJKYbD8/np3uhU/hE2T+Jso+z/9ROiFN1EsiqWyyPzClVFDdh65LERxZfFbQ3s
T1jml0vuW7szxoHWMh+ruivl+ojL27GtJ9QHMS83ie4XNDDG2NZiShi+dKb4/a3C
cKTcDtL0vlwUHHXEjwZXmG2ZcwkAiUC42cLYmgfucdG0oBLpWbvqH4GBEH6rzx3s
QVihhS30/U12dEBRZ/5emgzJ3NSuS3T/3JGrmB9sbY6GhmGM3O/8/R1rfOoO1Y1d
wak9GJhzvromLK70P9dfYy1u/rWbLDmoJf6xcqIVHlr7jWj1dhx0q1vsXwdGOCLZ
6NOpigrSxFTW+iHDPOxG7dQYbDfimCUdrF+eK+W9CjoIntdfUqJSivwpkhnfOYMZ
Jva7x84cxtKT2W5+flNiw448j30RQtDNhZwjAUvORbGiyWYm9boiPR5FMQARAQAB
iQIfBBgBAgAJBQJVR3DbAhsMAAoJEN9h7BlDKu43AR0P/A7ZJsEl/bwRZpENKPWB
Ynb0xEhZ0hDclKCEpT41c87Ft6gxEJ+mFofLdS+NCcGXDv+zQtkATLqRlrRXFTBS
VULtDFnTC0GpYFa/zVhVmPZERD2PexrSUs4YlmddYGNJODTiQ407jFQDLIYAzim6
r025MwzIvu8QLBJ+MJoysvZgzWCH9bq702LQm69ax/pj9LEvYQPLimCBpRzuwvCB
P/XuxMEyKt/3521SRTsmEQ75TPoApBMyds1ykT4uwUrxIu3e+Hov7WxHUYWT9hy5
1rETKu6/vMhmA3ivdFN06/sImJ3LZnJBp21CCj/kb9UjVFotiQaBsWW0nkaDQ9Nu
ndwQaGV6bgHlvFBryG44lYIVE5ZkETYSTXy66AeUZ4rOw5sEpJD29iYb8qqvxKIj
pUe0a2pG2z6V3hS/btgvvrojroBxs80DohaA9R46+g4KK5Pv6ps+CVCWigSW1S66
mhoQwhDC2CHObMDkywmFUOvJoEGFmNndnZmnLlH4mofjbH4zBbM7jldQGFW55j8p
qM3m3uQikpC5YAogpX6B1oMGTmqkFOKKkKjEmfngc4+BpGgMON/iw6Nq8DIjKRM7
iZTTlg8bBsOEKzTIpC6P0Dz/xTu2Ge9VoAi17ssGjYjXMbzrX7+NLjP8FafLezQx
xbKM3K7lORLPg4LK0hcG2ZaO
=gvH7
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -24,9 +24,42 @@ Apache NiFi is an easy to use, powerful, and reliable system to process and dist
## Getting Started
- Read through the [quickstart guide for development](http://nifi.incubator.apache.org/development/quickstart.html).
It will include information on getting a local copy of the source, give pointers on issue
tracking, and provide some warnings about common problems with development environments.
- Optional: Build supporting modules. This should only be needed if the current 'nifi' module is in
the process of updating to a new version of either the 'nifi-parent' or 'nifi-nar-maven-plugin'
artifacts.
If in doubt, just skip to building the main nifi project. If the build fails, come back here and
figure out which optional step you are missing; each entry below will give an example of the
errors you'll receive if that step needs to be followed. The version numbers may change but the
error text should still look very familiar.
- Install the nifi-parent pom. Change directory to 'nifi-parent' and follow the directions found
there in [README.md](nifi-parent/README.md).
If you don't build the nifi-parent pom and the main nifi code relies on an unreleased version
you'll see an erorr like the following:
[ERROR] Non-resolvable parent POM: Could not find artifact
org.apache.nifi:nifi-parent:pom:1.0.0-incubating-SNAPSHOT in example.snapshots.repo
(https://repository.example.com/content/repositories/snapshots) and
'parent.relativePath' points at no local POM @ line 18, column 13 -> [Help 2]
- Build the nifi-nar-maven-plugin. Change directory to 'nifi-nar-maven-plugin' and
follow the directions found there.
- Build nifi. Change directory to 'nifi' and follow the directions found there.
follow the directions found there in [README.md](nifi-nar-maven-plugin/README.md).
If you don't build the nifi-nar-maven-plugin and the main nifi code relies on an unreleased
version you'll see an error like the following:
[ERROR] Unresolveable build extension: Plugin
org.apache.nifi:nifi-nar-maven-plugin:1.0.1-incubating-SNAPSHOT or one of its
dependencies could not be resolved: Could not find artifact
org.apache.nifi:nifi-nar-maven-plugin:jar:1.0.1-incubating-SNAPSHOT -> [Help 2]
- Build nifi. Change directory to 'nifi' and follow the directions found there in
[README.md](nifi/README.md).
- Run NiFi. The directions found in the [README.md](nifi/README.md) file within the 'nifi' module
will also include how to run an instance of NiFi. For help on how to build your first data flow,
see the [NiFi User Guide](http://nifi.incubator.apache.org/docs/nifi-docs/user-guide.html).
## Documentation

View File

@ -18,16 +18,25 @@ Apache NiFi NAR Maven Plugin helps to build NiFi Archive bundles to support the
## Table of Contents
- [Requirements](#requirements)
- [Getting Started](#getting-started)
- [Getting Help](#getting-help)
- [Requirements](#requirements)
- [License](#license)
- [Disclaimer](#disclaimer)
## Requirements
* JDK 1.7 or higher
* Apache Maven 3.0.5 or higher
## Getting Started
To Build:
- Executed 'mvn clean install'
Building the nifi-nar-maven-plugin module should be rare since it will be released infrequently compared to
the main 'nifi' code tree.
- Build with `mvn clean install`
- Presuming you need to make use of changes to the nifi-nar-maven-plugin module, you should next
go to the [nifi](../nifi) directory and follow its instructions.
## Getting Help
If you have questions, you can reach out to our mailing list: dev@nifi.incubator.apache.org
@ -36,9 +45,6 @@ We're also often available in IRC: #nifi on
[irc.freenode.net](http://webchat.freenode.net/?channels=#nifi).
## Requirements
* JDK 1.7 or higher
## License
Except as otherwise noted this software is licensed under the

View File

@ -15,142 +15,22 @@
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>16</version>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-parent</artifactId>
<version>1.0.0-incubating-SNAPSHOT</version>
<relativePath />
</parent>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-nar-maven-plugin</artifactId>
<version>1.0.1-incubating-SNAPSHOT</version>
<packaging>maven-plugin</packaging>
<description>Apache NiFi Nar Plugin. It is currently a part of the Apache Incubator.</description>
<url>http://nifi.incubator.apache.org</url>
<organization>
<name>Apache NiFi (incubating)</name>
<url>http://nifi.incubator.apache.org/</url>
</organization>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0</url>
</license>
</licenses>
<mailingLists>
<mailingList>
<name>Dev</name>
<subscribe>dev-subscribe@nifi.incubator.apache.org</subscribe>
<unsubscribe>dev-unsubscribe@nifi.incubator.apache.org</unsubscribe>
<post>dev@nifi.incubator.apache.org</post>
<archive>http://mail-archives.apache.org/mod_mbox/incubator-nifi-dev</archive>
</mailingList>
<mailingList>
<name>Commits</name>
<subscribe>commits-subscribe@nifi.incubator.apache.org</subscribe>
<unsubscribe>commits-unsubscribe@nifi.incubator.apache.org</unsubscribe>
<post>commits@nifi.incubator.apache.org</post>
<archive>http://mail-archives.apache.org/mod_mbox/incubator-nifi-commits</archive>
</mailingList>
</mailingLists>
<scm>
<connection>scm:git:git://git.apache.org/incubator-nifi.git</connection>
<developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-nifi.git</developerConnection>
<url>https://git-wip-us.apache.org/repos/asf?p=incubator-nifi.git</url>
<tag>HEAD</tag>
</scm>
<issueManagement>
<system>JIRA</system>
<url>https://issues.apache.org/jira/browse/NIFI</url>
</issueManagement>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.min-version>3.0.5</maven.min-version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<prerequisites>
<maven>${maven.min-version}</maven>
</prerequisites>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<fork>true</fork>
<optimize>true</optimize>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18</version>
<configuration>
<argLine>-Xmx1G</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.2</version>
<configuration>
<tarLongFileMode>gnu</tarLongFileMode>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.4</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.1</version>
<configuration>
<failOnError>false</failOnError>
<quiet>true</quiet>
<show>private</show>
<encoding>UTF-8</encoding>
<quiet>true</quiet>
<javadocVersion>1.7</javadocVersion>
<additionalJOption>-J-Xmx512m</additionalJOption>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<useReleaseProfile>true</useReleaseProfile>
<releaseProfiles>apache-release</releaseProfiles>
<autoVersionSubmodules>true</autoVersionSubmodules>
<goals>deploy</goals>
<tagNameFormat>@{project.artifactId}-@{project.version}</tagNameFormat>
<pushChanges>false</pushChanges>
<localCheckout>true</localCheckout>
</configuration>
<executions>
<execution>
<id>default</id>
@ -158,29 +38,14 @@
<goal>perform</goal>
</goals>
<configuration>
<pomFileName>nar-maven-plugin/pom.xml</pomFileName>
<pomFileName>nifi-nar-maven-plugin/pom.xml</pomFileName>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.5</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.5</version>
<extensions>true</extensions>
<configuration>
<serverId>repository.apache.org</serverId>
<nexusUrl>https://repository.apache.org/</nexusUrl>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
@ -202,14 +67,10 @@
</executions>
</plugin>
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<excludes>
<exclude>nb-configuration.xml</exclude> <!-- convenience exclude for netbeans users -->
<exclude>nbactions.xml</exclude> <!-- convenience excludes for netbeans users -->
<exclude>DEPENDENCIES</exclude> <!-- auto generated by maven while building sources zip and more -->
</excludes>
<excludes>**/HelpMojo.java</excludes>
</configuration>
</plugin>
</plugins>
@ -240,27 +101,4 @@
<version>3.3</version>
</dependency>
</dependencies>
<profiles>
<profile>
<!-- Automatically check for licenses.
Activate with -P check-licenses -->
<id>check-licenses</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
<phase>verify</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

15
nifi-parent/DISCLAIMER Normal file
View File

@ -0,0 +1,15 @@
Apache NiFi is an effort undergoing incubation at the Apache Software
Foundation (ASF), sponsored by the Apache Incubator PMC.
Incubation is required of all newly accepted projects until a further review
indicates that the infrastructure, communications, and decision making process
have stabilized in a manner consistent with other successful ASF projects.
While incubation status is not necessarily a reflection of the completeness
or stability of the code, it does indicate that the project has yet to be
fully endorsed by the ASF.
For more information about the incubation status of the Apache NiFi project
you can go to the following page:
http://nifi.incubator.apache.org/

202
nifi-parent/LICENSE Normal file
View File

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed 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.

5
nifi-parent/NOTICE Normal file
View File

@ -0,0 +1,5 @@
Apache NiFi
Copyright 2014-2015 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

73
nifi-parent/README.md Normal file
View File

@ -0,0 +1,73 @@
<!--
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.
-->
# Apache NiFi Parent
Apache NiFi Parent provides a nice aggregation of shared concerns for all NiFi Poms to follow
## Table of Contents
- [Requirements](#requirements)
- [Getting Started](#getting-started)
- [License](#license)
- [Disclaimer](#disclaimer)
## Requirements
* JDK 1.7 or higher
* Apache Maven 3.0.5 or higher
## Getting Started
Building the nifi-parent module should be rare since it will be released infrequently compared to
the main 'nifi' code tree.
- Build the nifi-parent module using `mvn clean install`.
- Presuming you need to make use of changes to the nifi-parent module, you should next
go to the [nifi-nar-maven-plugin](../nifi-nar-maven-plugin) directory and follow its instructions
and finally the [nifi](../nifi) directory.
## Documentation
See http://nifi.incubator.apache.org/ for the latest documentation.
## License
Except as otherwise noted this software is licensed under the
[Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html)
Licensed 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.
## Disclaimer
Apache NiFi is an effort undergoing incubation at the Apache Software
Foundation (ASF), sponsored by the Apache Incubator PMC.
Incubation is required of all newly accepted projects until a further review
indicates that the infrastructure, communications, and decision making process
have stabilized in a manner consistent with other successful ASF projects.
While incubation status is not necessarily a reflection of the completeness
or stability of the code, it does indicate that the project has yet to be
fully endorsed by the ASF.

431
nifi-parent/pom.xml Normal file
View File

@ -0,0 +1,431 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>16</version>
<relativePath />
</parent>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-parent</artifactId>
<version>1.0.0-incubating-SNAPSHOT</version>
<packaging>pom</packaging>
<description>The nifi-parent enables each apache nifi project to ensure consistent approaches and DRY</description>
<url>http://nifi.incubator.apache.org</url>
<organization>
<name>Apache NiFi(incubating) Project</name>
<url>http://nifi.incubator.apache.org/</url>
</organization>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0</url>
</license>
</licenses>
<mailingLists>
<mailingList>
<name>Dev</name>
<subscribe>dev-subscribe@nifi.incubator.apache.org</subscribe>
<unsubscribe>dev-unsubscribe@nifi.incubator.apache.org</unsubscribe>
<post>dev@nifi.incubator.apache.org</post>
<archive>http://mail-archives.apache.org/mod_mbox/incubator-nifi-dev</archive>
</mailingList>
<mailingList>
<name>Commits</name>
<subscribe>commits-subscribe@nifi.incubator.apache.org</subscribe>
<unsubscribe>commits-unsubscribe@nifi.incubator.apache.org</unsubscribe>
<post>commits@nifi.incubator.apache.org</post>
<archive>http://mail-archives.apache.org/mod_mbox/incubator-nifi-commits</archive>
</mailingList>
</mailingLists>
<prerequisites>
<maven>${maven.min-version}</maven>
</prerequisites>
<scm>
<connection>scm:git:git://git.apache.org/incubator-nifi.git</connection>
<developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-nifi.git</developerConnection>
<url>https://git-wip-us.apache.org/repos/asf?p=incubator-nifi.git</url>
<tag>HEAD</tag>
</scm>
<issueManagement>
<system>JIRA</system>
<url>https://issues.apache.org/jira/browse/NIFI</url>
</issueManagement>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.min-version>3.0.5</maven.min-version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<inceptionYear>2014</inceptionYear>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<fork>true</fork>
<optimize>true</optimize>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.5</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.9</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18</version>
<configuration>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
<argLine>-Xmx1G</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.2</version>
<configuration>
<tarLongFileMode>gnu</tarLongFileMode>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.6</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.4</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.5</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.1</version>
<configuration>
<failOnError>false</failOnError>
<quiet>true</quiet>
<show>private</show>
<encoding>UTF-8</encoding>
<quiet>true</quiet>
<javadocVersion>1.7</javadocVersion>
<additionalJOption>-J-Xmx512m</additionalJOption>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<useReleaseProfile>true</useReleaseProfile>
<releaseProfiles>apache-release</releaseProfiles>
<autoVersionSubmodules>true</autoVersionSubmodules>
<goals>deploy</goals>
<tagNameFormat>@{project.artifactId}-@{project.version}</tagNameFormat>
<pushChanges>false</pushChanges>
<localCheckout>true</localCheckout>
</configuration>
<executions>
<execution>
<id>default</id>
<goals>
<goal>perform</goal>
</goals>
<configuration>
<pomFileName>nifi-parent/pom.xml</pomFileName>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>rpm-maven-plugin</artifactId>
<version>2.1.1</version>
</plugin>
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr3-maven-plugin</artifactId>
<version>3.5.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.15</version>
<dependencies>
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>6.5</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<xmlOutput>true</xmlOutput>
<effort>Max</effort>
<failOnError>true</failOnError>
<maxRank>14</maxRank>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.5</version>
<extensions>true</extensions>
<configuration>
<serverId>repository.apache.org</serverId>
<nexusUrl>https://repository.apache.org/</nexusUrl>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-maven</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireSameVersions>
<plugins>
<plugin>org.apache.maven.plugins:maven-surefire-plugin</plugin>
<plugin>org.apache.maven.plugins:maven-failsafe-plugin</plugin>
<plugin>org.apache.maven.plugins:maven-surefire-report-plugin</plugin>
</plugins>
</requireSameVersions>
<requireMavenVersion>
<version>${maven.min-version}</version>
</requireMavenVersion>
</rules>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<checkstyleRules>
<module name="Checker">
<property name="charset" value="UTF-8" />
<property name="severity" value="warning" />
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
<module name="FileTabCharacter">
<property name="eachLine" value="true" />
</module>
<module name="TreeWalker">
<module name="RegexpSinglelineJava">
<property name="format" value="\s+$" />
<property name="message" value="Line has trailing whitespace." />
</module>
<module name="RegexpSinglelineJava">
<property name="format" value="[@]see\s+[{][@]link" />
<property name="message" value="Javadoc @see does not need @link: pick one or the other." />
</module>
<module name="OuterTypeFilename" />
<module name="LineLength">
<!-- needs extra, because Eclipse formatter ignores the ending left brace -->
<property name="max" value="200" />
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://" />
</module>
<module name="AvoidStarImport" />
<module name="UnusedImports">
<property name="processJavadoc" value="true" />
</module>
<module name="NoLineWrap" />
<module name="LeftCurly">
<property name="maxLineLength" value="160" />
</module>
<module name="RightCurly" />
<module name="RightCurly">
<property name="option" value="alone" />
<property name="tokens" value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT" />
</module>
<module name="SeparatorWrap">
<property name="tokens" value="DOT" />
<property name="option" value="nl" />
</module>
<module name="SeparatorWrap">
<property name="tokens" value="COMMA" />
<property name="option" value="EOL" />
</module>
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-zA-Z0-9]*)*$" />
</module>
<module name="MethodTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)" />
</module>
<module name="MethodParamPad" />
<module name="OperatorWrap">
<property name="option" value="NL" />
<property name="tokens" value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, QUESTION, SL, SR, STAR " />
</module>
<module name="AnnotationLocation">
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF" />
</module>
<module name="AnnotationLocation">
<property name="tokens" value="VARIABLE_DEF" />
<property name="allowSamelineMultipleAnnotations" value="true" />
</module>
<module name="NonEmptyAtclauseDescription" />
<module name="JavadocMethod">
<property name="allowMissingJavadoc" value="true" />
<property name="allowMissingParamTags" value="true" />
<property name="allowMissingThrowsTags" value="true" />
<property name="allowMissingReturnTag" value="true" />
<property name="allowedAnnotations" value="Override,Test,BeforeClass,AfterClass,Before,After" />
<property name="allowThrowsTagsForSubclasses" value="true" />
</module>
<module name="SingleLineJavadoc" />
</module>
</module>
</checkstyleRules>
<violationSeverity>warning</violationSeverity>
<includeTestSourceDirectory>true</includeTestSourceDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
<configuration>
<excludes>
<exclude>nb-configuration.xml</exclude> <!-- courtesy excludes for netbeans users -->
<exclude>nbactions.xml</exclude> <!-- courtesy excludes for netbeans users -->
<exclude>DEPENDENCIES</exclude> <!-- auto generated file by apache's maven config while building sources.zip -->
</excludes>
</configuration>
<dependencies>
<!-- workaround for RAT-158 -->
<dependency>
<groupId>org.apache.maven.doxia</groupId>
<artifactId>doxia-core</artifactId>
<version>1.6</version>
<exclusions>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<!--
Checks style and licensing requirements. This is a good idea to
run for contributions and for the release process. While it
would be nice to run always these plugins can considerably slow
the build and have proven to create unstable builds in our
multi-module project and when building using multiple threads.
The stability issues seen with Checkstyle in multi-module builds
include false-positives and false negatives.-->
<id>contrib-check</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
<phase>verify</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<executions>
<execution>
<id>check-style</id>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<!-- Run findbugs. Activate with -Pfindbugs -->
<id>findbugs</id>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<executions>
<execution>
<id>run-findbugs</id>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>

View File

@ -1,17 +1,24 @@
/* global module */
module.exports = function (grunt) {
// Project configuration.
grunt.initConfig({
config: {
svn: {
url: 'https://svn.apache.org/repos/asf/incubator/nifi/site/trunk'
}
},
pkg: grunt.file.readJSON('package.json'),
clean: {
options: {
force: true
},
js: ['dist/js/'],
css: ['dist/css/'],
assets: ['dist/assets/*']
assets: ['dist/assets/*'],
generated: ['dist/docs'],
all: ['dist']
},
assemble: {
options: {
partials: 'src/includes/*.hbs',
@ -32,7 +39,6 @@ module.exports = function (grunt) {
}
}
},
compass: {
dist: {
options: {
@ -40,7 +46,6 @@ module.exports = function (grunt) {
}
}
},
concat: {
options: {
separator: ';'
@ -66,8 +71,29 @@ module.exports = function (grunt) {
dest: 'dist/js/app.js'
}
},
copy: {
generated: {
files: [{
expand: true,
cwd: '../nifi/nifi-docs/target/generated-docs',
src: ['*.html', 'images/*'],
dest: 'dist/docs/'
}, {
expand: true,
cwd: '../nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api',
src: ['target/nifi-web-api-*/docs/rest-api/index.html', 'target/nifi-web-api-*/docs/rest-api/images/*'],
dest: 'dist/docs/',
rename: function (dest, src) {
var path = require('path');
if (src.indexOf('images') > 0) {
return path.join(dest, 'rest-api/images', path.basename(src));
} else {
return path.join(dest, 'rest-api', path.basename(src));
}
}
}]
},
dist: {
files: [{
expand: true,
@ -97,7 +123,137 @@ module.exports = function (grunt) {
}]
}
},
prompt: {
username: {
options: {
questions: [{
config: 'config.svn.username',
type: 'input',
message: 'Enter SVN username if different from current user:'
}]
}
},
commit: {
options: {
questions: [{
config: 'config.svn.commit.confirmation',
type: 'list',
choices: ['Show diff', 'Commit', 'Abort'],
message: 'Commit the changes listed above?'
}],
then: function (results) {
if (results['config.svn.commit.confirmation'] === 'Commit') {
grunt.task.run('prompt:message');
} else if (results['config.svn.commit.confirmation'] === 'Show diff') {
grunt.task.run('exec:diff');
grunt.task.run('prompt:commit');
}
}
}
},
message: {
options: {
questions: [{
config: 'config.svn.commit.message',
type: 'input',
message: 'Commit message:'
}, {
config: 'config.svn.password',
type: 'password',
message: 'SVN password:'
}],
then: function () {
grunt.task.run('exec:commit');
}
}
}
},
exec: {
generateDocs: {
command: 'mvn clean package',
cwd: '../nifi/nifi-docs',
stdout: true,
stderr: true
},
generateRestApiDocs: {
command: 'mvn clean package -DskipTests',
cwd: '../nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api',
stdout: true,
stderr: true
},
checkout: {
command: function() {
var url = grunt.config('config.svn.url');
var username = grunt.config('config.svn.username');
if (username === '') {
return 'svn checkout ' + url + ' --trust-server-cert --non-interactive dist';
} else {
return 'svn checkout --username ' + username + ' ' + url + ' --trust-server-cert --non-interactive dist';
}
},
stdout: true,
stderr: true
},
status: {
cwd: 'dist',
command: 'svn status',
stdout: true,
stderr: true
},
diff: {
cwd: 'dist',
command: 'svn diff',
stdout: true,
stderr: true
},
commit: {
cwd: 'dist',
command: function() {
var username = grunt.config('config.svn.username');
var password = grunt.config('config.svn.password');
var message = grunt.config('config.svn.commit.message');
if (username === '') {
return 'svn commit --password "' + password + '" -m "' + message + '" --trust-server-cert --non-interactive .';
} else {
return 'svn commit --username ' + username + ' --password "' + password + '" -m "' + message + '" --trust-server-cert --non-interactive .';
}
}
}
},
replace: {
addGoogleAnalytics: {
src: ['dist/docs/*.html', 'dist/docs/rest-api/index.html'],
overwrite: true,
replacements: [{
from: /<\/head>/g,
to: "<script>\n" +
"(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n" +
"(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n" +
"m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n" +
"})(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n" +
"ga('create', 'UA-57264262-1', 'auto');\n" +
"ga('send', 'pageview');\n" +
"</script>\n" +
"</head>"
}]
},
moveTearDrop: {
src: ['dist/docs/rest-api/index.html'],
overwrite: true,
replacements: [{
from: /<img class="logo" src="images\/bgNifiLogo.png" alt="NiFi Logo"\/>/g,
to: '<img class="logo" src="images/bgNifiLogo.png" alt="NiFi Logo" style="float: right;"/>'
}]
},
removeVersion: {
src: ['dist/docs/rest-api/index.html'],
overwrite: true,
replacements: [{
from: /<div class="sub-title">.*<\/div>/g,
to: '<div class="sub-title">NiFi Rest Api</div>'
}]
}
},
watch: {
grunt: {
files: ['Gruntfile.js'],
@ -129,10 +285,18 @@ module.exports = function (grunt) {
grunt.loadNpmTasks('assemble');
grunt.loadNpmTasks('grunt-contrib-compass');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-exec');
grunt.loadNpmTasks('grunt-text-replace');
grunt.loadNpmTasks('grunt-prompt');
grunt.registerTask('img', ['newer:copy']);
grunt.registerTask('css', ['clean:css', 'compass']);
grunt.registerTask('js', ['clean:js', 'concat']);
grunt.registerTask('default', ['clean', 'assemble', 'css', 'js', 'img', 'copy']);
grunt.registerTask('generate-docs', ['clean:generated', 'exec:generateDocs', 'exec:generateRestApiDocs', 'copy:generated', 'replace:addGoogleAnalytics', 'replace:moveTearDrop', 'replace:removeVersion']);
grunt.registerTask('build', ['assemble', 'css', 'js', 'img', 'generate-docs', 'copy:dist']);
grunt.registerTask('deploy', ['clean:all', 'prompt:username', 'exec:checkout', 'build', 'exec:status', 'prompt:commit']);
grunt.registerTask('dev', ['default', 'watch']);
grunt.registerTask('default', ['clean:all', 'build']);
};

View File

@ -62,7 +62,13 @@ gem install compass
## Grunt Tasks
To build the site run the default grunt task. This will assemble the site and
place the resulting site in the dist folder.
place the resulting site in the dist folder. Part of this assembly is actually
building the various guides and Rest Api documentation bundled in the application.
Because of this, Maven must be installed and available on the PATH. Additionally Java
must be installed in order for the Maven build to succeed. Refer to the [NiFi][]
documentation for minimum requirements for Maven and Java.
[NiFi]: https://nifi.incubator.apache.org/quickstart.html
```bash
grunt
@ -76,6 +82,35 @@ files for changes. Any changes will cause the site to be rebuilt.
grunt dev
```
To deploy new changes to the live site, run the deploy task
```bash
grunt deploy
```
This will go through each step required to deploy changes to the site. Updates
are performed by committing to a SVN repository. This means that svn must be installed
and available on the PATH. Additionally, it requires SVN 1.6+. The deployment
process will show the files being committed and provide an option to view a diff,
proceed with the commit, or abort.
## Source overview
### src/includes
Contains fragments that will be included on all pages of the site. Most notably
here is the topbar.hbs that defines the Menus on the top of the site. If a new
page is being added or removed it is done here.
### src/pages/html
Contains pages that are written in HTML. Any new HTML based content should reside here.
### src/pages/markdown
Contains pages that are written in Markdown. Any new Markdown based content should
reside here.
## Application Style Properties
### Font
@ -115,5 +150,3 @@ 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.

View File

@ -1,6 +1,6 @@
{
"name": "apache-nifi-site",
"version": "0.0.2-incubating",
"version": "0.1.0-incubating",
"description": "The artifacts for the Apache NiFi site.",
"private": "true",
"repository": {
@ -15,10 +15,15 @@
"grunt-contrib-concat": "^0.5.0",
"grunt-contrib-copy": "^0.7.0",
"grunt-contrib-watch": "^0.6.1",
"grunt-newer": "^1.1.0"
"grunt-exec": "^0.4.6",
"grunt-newer": "^1.1.0",
"grunt-prompt": "^1.3.0",
"grunt-text-replace": "^0.4.0"
},
"licenses" : [{
"licenses": [
{
"type": "Apache",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
}]
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 492 KiB

After

Width:  |  Height:  |  Size: 925 KiB

View File

@ -20,7 +20,6 @@
<ul class="dropdown">
<li><a href="index.html">Home</a></li>
<li><a href="https://blogs.apache.org/nifi/"><i class="fa fa-external-link external-link"></i>Apache NiFi Blog</a></li>
<li><a href="roadmap.html">Roadmap</a></li>
<li><a href="http://www.apache.org/licenses/LICENSE-2.0"><i class="fa fa-external-link external-link"></i>License</a></li>
</ul>
</li>
@ -32,6 +31,8 @@
<li><a href="overview.html">NiFi Overview</a></li>
<li><a href="user-guide.html">User Guide</a></li>
<li><a href="developer-guide.html">Developer Guide</a></li>
<li><a href="administrator-guide.html">Admin Guide</a></li>
<li><a href="rest-api.html">Rest Api</a></li>
</ul>
</li>
<li class="has-dropdown">
@ -52,6 +53,8 @@
<ul class="dropdown">
<li><a href="quickstart.html">Quickstart</a></li>
<li><a href="release-guide.html">Release Guide</a></li>
<li><a href="licensing-guide.html">Licensing Guide</a></li>
<li><a href="developer-guide.html">Developer Guide</a></li>
<li><a href="https://git-wip-us.apache.org/repos/asf/incubator-nifi.git"><i class="fa fa-external-link external-link"></i>Source</a></li>
<li><a href="https://issues.apache.org/jira/browse/NIFI"><i class="fa fa-external-link external-link"></i>Issues</a></li>
</ul>

View File

@ -0,0 +1,7 @@
---
title: Apache NiFi Administrator Guide
---
<div class="external-guide">
<iframe src="docs/administration-guide.html"></iframe>
</div>

View File

@ -3,5 +3,5 @@ title: Apache NiFi Developer Guide
---
<div class="external-guide">
<iframe src="https://nifi.incubator.apache.org/docs/nifi-docs/developer-guide.html"></iframe>
<iframe src="docs/developer-guide.html"></iframe>
</div>

View File

@ -23,6 +23,24 @@ title: Apache NiFi Downloads
<div class="large-12 columns">
<h2>Releases</h2>
<ul>
<li>0.0.2-incubating
<ul>
<li><a href="https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12316020&version=12329373">Release Notes</a></li>
<li>
Sources:
<ul>
<li><a href="https://www.apache.org/dyn/closer.cgi?path=/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-source-release.zip">nifi-0.0.2-incubating-source-release.zip</a> ( <a href="https://dist.apache.org/repos/dist/release/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-source-release.zip.asc">asc</a>, <a href="https://dist.apache.org/repos/dist/release/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-source-release.zip.md5">md5</a>, <a href="https://dist.apache.org/repos/dist/release/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-source-release.zip.sha1">sha1</a> )</li>
</ul>
</li>
<li>
Binaries
<ul>
<li><a href="https://www.apache.org/dyn/closer.cgi?path=/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-bin.tar.gz">nifi-0.0.2-incubating-bin.tar.gz</a> ( <a href="https://dist.apache.org/repos/dist/release/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-bin.tar.gz.asc">asc</a>, <a href="https://dist.apache.org/repos/dist/release/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-bin.tar.gz.md5">md5</a>, <a href="https://dist.apache.org/repos/dist/release/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-bin.tar.gz.sha1">sha1</a> )</li>
<li><a href="https://www.apache.org/dyn/closer.cgi?path=/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-bin.zip">nifi-0.0.2-incubating-bin.zip</a> ( <a href="https://dist.apache.org/repos/dist/release/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-bin.zip.asc">asc</a>, <a href="https://dist.apache.org/repos/dist/release/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-bin.zip.md5">md5</a>, <a href="https://dist.apache.org/repos/dist/release/incubator/nifi/0.0.2-incubating/nifi-0.0.2-incubating-bin.zip.sha1">sha1</a> )</li>
</ul>
</li>
</ul>
</li>
<li>0.0.1-incubating
<ul>
<li><a href="https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12316020&amp;version=12329078">Release Notes</a></li>

View File

@ -29,6 +29,13 @@ title: Apache NiFi Mailing Lists
<th>Post</th>
<th>Archive</th>
</tr>
<tr>
<td>Users Mailing List</td>
<td><a class="externalLink" href="mailto:users-subscribe@nifi.incubator.apache.org">Subscribe</a></td>
<td><a class="externalLink" href="mailto:users-unsubscribe@nifi.incubator.apache.org">Unsubscribe</a></td>
<td><a class="externalLink" href="mailto:users@nifi.incubator.apache.org">Post</a></td>
<td><a class="externalLink" href="http://mail-archives.apache.org/mod_mbox/incubator-nifi-users/">mail-archives.apache.org</a></td>
</tr>
<tr>
<td>Developers Mailing List</td>
<td><a class="externalLink" href="mailto:dev-subscribe@nifi.incubator.apache.org">Subscribe</a></td>

View File

@ -3,5 +3,5 @@ title: Apache NiFi Overview
---
<div class="external-guide">
<iframe src="https://nifi.incubator.apache.org/docs/nifi-docs/overview.html"></iframe>
<iframe src="docs/overview.html"></iframe>
</div>

View File

@ -36,6 +36,11 @@ title: Apache NiFi Team
<th>Name</th>
<th>Affiliation</th>
</tr>
<tr>
<td>aldrin</td>
<td>Aldrin Piri</td>
<td></td>
</tr>
<tr>
<td>apurtell</td>
<td>Andrew Purtell</td>
@ -114,23 +119,3 @@ title: Apache NiFi Team
</table>
</div>
</div>
<div class="medium-space"></div>
<div class="row">
<div class="large-12 columns">
<h2 class="nifi-txt">
<span>
Committers
</span>
</h2>
</div>
</div>
<div class="row">
<div class="large-12 columns">
<table>
<tr>
<th>Id</th>
<th>Name</th>
</tr>
</table>
</div>
</div>

View File

@ -0,0 +1,7 @@
---
title: Apache NiFi Rest Api
---
<div class="external-guide">
<iframe src="docs/rest-api/index.html"></iframe>
</div>

View File

@ -1,30 +0,0 @@
---
title: Apache NiFi Roadmap
---
<div class="large-space"></div>
<div class="row">
<div class="large-12 columns">
<h1 class="nifi-txt">
<span>
Apache <span class="ni">ni</span><span class="fi">fi</span> Roadmap
</span>
</h1>
</div>
</div>
<div class="row">
<div class="large-12 columns">
<h3 class="nifi-txt">
<span>
First steps
</span>
</h3>
</div>
</div>
<div class="row">
<div class="large-12 columns">
<p class="description">
Initial work on Apache NiFi (incubating) will be focused on an initial incubating release. This means, migrating to apache infrastructure, using apache license compatible dependencies, developing developer documentation, and working out bugs introduced or discovered during this process.
</p>
</div>
</div>

View File

@ -15,7 +15,25 @@ title: Apache NiFi Screencasts
<div id="toolbar-overview" class="reveal-modal medium" data-reveal>
<h2>NiFi Toolbar Overview</h2>
<div class="flex-video widescreen" style="display: block;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/LGXRAVUzL4U" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/LGXRAVUzL4U?list=PLHre9pIBAgc4e-tiq9OIXkWJX8bVXuqlG" frameborder="0" allowfullscreen></iframe>
</div>
<a class="close-reveal-modal">&#215;</a>
</div>
<br/>
<a href="#" data-reveal-id="build-a-flow-1">Build a Simple Flow - Part 1</a>
<div id="build-a-flow-1" class="reveal-modal medium" data-reveal>
<h2>Build a Simple Flow - Part 1</h2>
<div class="flex-video widescreen" style="display: block;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/jctMMHTdTQI?list=PLHre9pIBAgc4e-tiq9OIXkWJX8bVXuqlG" frameborder="0" allowfullscreen></iframe>
</div>
<a class="close-reveal-modal">&#215;</a>
</div>
<br/>
<a href="#" data-reveal-id="build-a-flow-2">Build a Simple Flow - Part 2</a>
<div id="build-a-flow-2" class="reveal-modal medium" data-reveal>
<h2>Build a Simple Flow - Part 2</h2>
<div class="flex-video widescreen" style="display: block;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/X6bPFgaBDIo?list=PLHre9pIBAgc4e-tiq9OIXkWJX8bVXuqlG" frameborder="0" allowfullscreen></iframe>
</div>
<a class="close-reveal-modal">&#215;</a>
</div>
@ -24,7 +42,7 @@ title: Apache NiFi Screencasts
<div id="creating-process-groups" class="reveal-modal medium" data-reveal>
<h2>Creating Process Groups</h2>
<div class="flex-video widescreen" style="display: block;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/hAveiDgDj-8" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/hAveiDgDj-8?list=PLHre9pIBAgc4e-tiq9OIXkWJX8bVXuqlG" frameborder="0" allowfullscreen></iframe>
</div>
<a class="close-reveal-modal">&#215;</a>
</div>
@ -33,7 +51,25 @@ title: Apache NiFi Screencasts
<div id="creating-templates" class="reveal-modal medium" data-reveal>
<h2>Creating Templates</h2>
<div class="flex-video widescreen" style="display: block;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/PpmL-IMoCnU" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/PpmL-IMoCnU?list=PLHre9pIBAgc4e-tiq9OIXkWJX8bVXuqlG" frameborder="0" allowfullscreen></iframe>
</div>
<a class="close-reveal-modal">&#215;</a>
</div>
<br/>
<a href="#" data-reveal-id="summary-overview">Summary Overview</a>
<div id="summary-overview" class="reveal-modal medium" data-reveal>
<h2>Summary Overview</h2>
<div class="flex-video widescreen" style="display: block;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/XfY9AEOYLHI?list=PLHre9pIBAgc4e-tiq9OIXkWJX8bVXuqlG" frameborder="0" allowfullscreen></iframe>
</div>
<a class="close-reveal-modal">&#215;</a>
</div>
<br/>
<a href="#" data-reveal-id="provenance-overview">Provenance Overview</a>
<div id="provenance-overview" class="reveal-modal medium" data-reveal>
<h2>Summary Page Overview</h2>
<div class="flex-video widescreen" style="display: block;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/WUKXed_bLws?list=PLHre9pIBAgc4e-tiq9OIXkWJX8bVXuqlG" frameborder="0" allowfullscreen></iframe>
</div>
<a class="close-reveal-modal">&#215;</a>
</div>
@ -42,9 +78,10 @@ title: Apache NiFi Screencasts
<div id="managing-templates" class="reveal-modal medium" data-reveal>
<h2>Managing Templates</h2>
<div class="flex-video widescreen" style="display: block;">
<iframe width="560" height="315" src="https://www.youtube.com/embed/HU5_3PlNmtQ" frameborder="0" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/HU5_3PlNmtQ?list=PLHre9pIBAgc4e-tiq9OIXkWJX8bVXuqlG" frameborder="0" allowfullscreen></iframe>
</div>
<a class="close-reveal-modal">&#215;</a>
</div>
<br/>
</div>
</div>

View File

@ -3,5 +3,5 @@ title: Apache NiFi User Guide
---
<div class="external-guide">
<iframe src="https://nifi.incubator.apache.org/docs/nifi-docs/user-guide.html"></iframe>
<iframe src="docs/user-guide.html"></iframe>
</div>

View File

@ -0,0 +1,120 @@
---
title: Apache NiFi Licensing Guide
---
# Apache NiFi Release Guidelines
This document provides guidance to contributors of Apache NiFi (incubating) to help properly account for licensing, notice, and legal requirements.
#### Disclaimer:
This document is not written by lawyers. The guidance in this document is meant to compliment Apache Incubator and Apache Software Foundation guides and policies. If anything in this document is inconsistent with those then it is a defect in this document.
## Background Material
- [ASLv2](http://apache.org/licenses/LICENSE-2.0)
- [ASF License Apply](http://www.apache.org/dev/apply-license.html)
- [ASF Licensing How-To](http://www.apache.org/dev/licensing-howto.html)
- [ASF Legal Resolved](http://www.apache.org/legal/resolved.html)
- [ASF Release Policy](http://www.apache.org/dev/release.html)
- [ASF Incubator License and Notice Guidance](http://incubator.apache.org/guides/releasemanagement.html#note-license-and-notice)
## How to consistently apply licensing/legal notice information for Apache NiFi
### Apply the source header to each source file
Every source file for works submitted directly to the ASF must follow: http://apache.org/legal/src-headers.html#headers
Question: Every source file? What about test files and so on?
Answer: There are a few exceptions. Test files can be argued to have no degree of creativity. We also need our test materials at times to be exactly as they will be found in the wild. We should ensure test files have the license when possible but not to the point that it requires altering the test itself.
http://apache.org/legal/src-headers.html#faq-exceptions
Question: Do items which are generated from source during the build process require the header?
Answer: Taken directly from http://incubator.apache.org/guides/releasemanagement.html#notes-license-headers it reads:
"Copyright may not subsist in a document which is generated by an transformation from an original. In which case, the license header may be unnecessary. License headers should always be present in the original. Where it is reasonable to do so, the templates should also add the license header to the generated documents."
### Apply the proper NOTICE / LICENSE Information
For every addition or removal of a 3rd party work as a dependency or as pulled into our source directly we must ensure full
accounting of the correct LICENSE and NOTICE information.
Our source release must only account for the LICENSE/NOTICE of items that are actually in the source release itself.
Binary dependencies which are pulled in during the generation of a binary convenience package should not have their
LICENSE/NOTICE data in the source release. But, they must be accounted for in the binary package.
The LICENSE and NOTICE files found at the root of the Apache NiFi (nifi) component is considered 'The' LICENSE/NOTICE
covering the source release of 'nifi' and all subcomponents.
The LICENSE and NOTICE files found within the 'nifi-assembly' is considered 'The' LICENSE/NOTICE pair covering the binary
convenience package of 'nifi' (tar.gz, ZIP, etc..)
The Release Manager (RM) of a given release is responsible for checking all subcomponents for the presence of specific
LICENSE/NOTICE to gather all source dependency clauses as needed and place them into the overall LICENSE/NOTICE for the
source release. If generating a binary convenience package the RM will gather up a listing of all binary dependencies
as called out on subcomponents (including the assembly itself), which can contain binary dependencies, and promote
their specific NOTICE/LICENSE text to the binary package LICENSE/NOTICE associated with the assembly. The binary package
LICENSE/NOTICE then should be a combination of source license data and binary license data.
A binary artifact is any artifact which is created as the result of "compiling" or processing a source artifact.
For every subcomponent of nifi some binary artifact is produced because we make these things available as Maven artifacts. You must consider whether that artifact stands on its own as built from source or whether that artifact is comprised of materials built from source combined with other binary artifacts pulled in as dependencies.
In the case of subcomponents which produce binary artifacts which stand on their own (as would be typical in most Jar
files) then you must only account for any 3rd party works source dependencies. If you have any 3rd party works source
dependencies then you should create or edit the LICENSE and/or NOTICE local to that subcomponent AND modify the
NOTICE and/or LICENSE of the top level nifi source.
In the case of subcomponents which produce binary artifacts which themselves can bunde 3rd party works (as would be
typical in a NAR, WAR, tar.gz, zip bundle) then you must ensure that the subcomponent binary artifact itself includes
a full and complete LICENSE and/or NOTICE as needed to cover those 3rd party works. For every modification to the
subcomponent LICENSE/NOTICE for a given 3rd party work the overall Apache NiFi source and binary LICENSE/NOTICE pairs
need to be updated and/or verified as well.
To provide a subcomponent local LICENSE/NOTICE ensure there is a 'src/main/resources/META-INF/NOTICE' and
'src/main/resources/META-INF/LICENSE' as needed. During the build process Maven will place them in the customary
locations for the binary artifact. This way for every binary artifact produced from Apache NiFi there will be a
local and accurate LICENSE/NOTICE for that artifact.
### How to go about working with the LICENSE/NOTICE modifications
If the dependency is a source dependency (ie you copied in javascript, css, java source files from a website) then you
must ensure it is from [Category-A](http://www.apache.org/legal/resolved.html#category-a) licenses.
If the dependency is a binary dependency (ie maven pulled in a jar file) then you must ensure it is either from
[Category-A](http://www.apache.org/legal/resolved.html#category-a) or
[Category-B](http://www.apache.org/legal/resolved.html#category-b).
The key guides for how to apply the LICENSE/NOTICE is found in the following:
- [Source Headers](http://apache.org/legal/src-headers.html#3party)
- [Third Party Notices](http://apache.org/legal/resolved.html#required-third-party-notices.)
- [How to modify the NOTICE](http://www.apache.org/dev/licensing-howto.html#mod-notice)
Specific guidance for handling LICENSE/NOTICE application for typical MIT/BSD licenses is
described [here](http://www.apache.org/dev/licensing-howto.html#permissive-deps). For understanding what to put in the
LICENSE file look at the license of the 3rd party work. BSD licenses for instance have this statement "Redistributions
in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution." In the event you cannot find the actual
Copyright statement for a dependency then place a link to the license text they claim and indicate no copyright marks
found and provide a link to the project website.
Specific guidance for handling Apache Licensed dependencies is describe [here](http://www.apache.org/dev/licensing-howto.html#alv2-dep).
"If the dependency supplies a NOTICE file, its contents must be analyzed and the relevant portions bubbled up into the top-level NOTICE file."
Specific guidance for handling other ASF projects is found [here](http://www.apache.org/dev/licensing-howto.html#bundle-asf-product).
"It is not necessary to duplicate the line "This product includes software developed at the Apache Software
Foundation...", though the ASF copyright line and any other portions of NOTICE must be considered for propagation."
Specific guidance for handling LICENSE/NOTICE information for category-B licensed works is [here](http://apache.org/legal/resolved.html#category-b).
Place an entry in the notice indicating the work is included in binary distribution. Provide a link to the
homepage of the work. Indicate it's license. Group like licensed items together. "By attaching a prominent label to
the distribution and requiring an explicit action by the user to get the reciprocally-licensed source, users are less
likely to be unaware of restrictions significantly different from those of the Apache License. Please include the URL
to the product's homepage in the prominent label." You should not modify the LICENSE file to include the LICENSE
information of the 3rd party work in this case. That is explained nicely in http://opensource.org/faq#copyleft as
stated "Copyleft provisions apply only to actual derivatives, that is, cases where an existing copylefted work was
modified. Merely distributing a copyleft work alongside a non-copyleft work does not cause the latter to fall under
the copyleft terms."
Specific guidance for handling works in the public domain is [here](http://apache.org/legal/resolved.html#can-works-placed-in-the-public-domain-be-included-in-apache-products)

View File

@ -4,20 +4,11 @@ title: Apache NiFi Development Quickstart
# Apache NiFi Development Quickstart
This documentation is in progress, but should get many started at building Apache NiFi.
## Source Code
Apache NiFi source code is version controlled using [Git][git] version control ([browse][gitbrowse]|[checkout][gitrepo]).
The code is also mirrored to [Github][githubrepo]
The code as it was initially contributed and entered the incubator is on the 'master' branch.
To view the lastest codebase as we work toward an initial release checkout the 'develop' branch.
All guidance that follows assumes you are working on the 'develop' branch.
## Issue Tracking
Track issues on the "NIFI" Project on the Apache Jira ([browse][jira]).
@ -42,9 +33,13 @@ git checkout develop
1. You need a recent Java 7 (or newer) JDK.
2. You need Apache [Maven 3.X][maven]. We've successfully used 3.2.3 and as far back as 3.0.5
3. Build the maven plugins. In the root dir of the source tree cd to `nifi-nar-maven-plugin`.
3. Ensure your MAVEN_OPTS provides sufficient memory. Some build steps are fairly memory intensive
- These settings have worked well `MAVEN_OPTS="-Xms1024m -Xmx3076m -XX:MaxPermSize=256m"`
4. Build the nifi parent. In the root dir of the source tree cd to `nifi-parent`.
Run `mvn clean install`
4. Build the entire code base. In the root dir of the source tree cd to `nifi` and run `mvn -T C2.0 clean install`
5. Build the nifi nar maven plugin. In the root dir of the source tree cd to `nifi-nar-maven-plugin`.
Run `mvn clean install`
6. Build the entire code base. In the root dir of the source tree cd to `nifi` and run `mvn -T C2.0 clean install`
You can tweak the maven build settings as you like but the previous command will execute with 2 threads per core.
Now you should have a fully functioning build off the latest code in the develop branch.

View File

@ -50,20 +50,18 @@ There are two lists here: one of specific incubator requirements, and another of
- Specifically look in the *-sources.zip artifact and ensure these items are present at the root of the archive.
- Evaluate the sources and dependencies. Does the overall LICENSE and NOTICE appear correct? Do all licenses fit within the ASF approved licenses?
- Here is an example path to a sources artifact:
- `https://repository.apache.org/service/local/repositories/orgapachenifi-1011/content/org/apache/nifi/nifi-nar-maven-plugin/0.0.1-incubating/nifi-nar-maven-plugin-0.0.1-incubating-source-release.zip`
- `https://repository.apache.org/service/local/repositories/orgapachenifi-1011/content/org/apache/nifi/nifi/0.0.1-incubating/nifi-0.0.1-incubating-source-release.zip`
- Is there a README available that explains how to build the application and to execute it?
- Look in the *-sources.zip artifact root for the readme.
- Are the signatures and hashes correct for the source release?
- Validate the hashes of the sources artifact do in fact match:
- `https://repository.apache.org/service/local/repositories/orgapachenifi-1011/content/org/apache/nifi/nifi-nar-maven-plugin/0.0.1-incubating/nifi-nar-maven-plugin-0.0.1-incubating-source-release.zip.md5`
- `https://repository.apache.org/service/local/repositories/orgapachenifi-1011/content/org/apache/nifi/nifi-nar-maven-plugin/0.0.1-incubating/nifi-nar-maven-plugin-0.0.1-incubating-source-release.zip.sha1`
- Validate the signatures of the sources artifact and of each of the hashes. Here are example paths:
- `https://repository.apache.org/service/local/repositories/orgapachenifi-1011/content/org/apache/nifi/nifi-nar-maven-plugin/0.0.1-incubating/nifi-nar-maven-plugin-0.0.1-incubating-source-release.zip.asc`
- `https://repository.apache.org/service/local/repositories/orgapachenifi-1011/content/org/apache/nifi/nifi-nar-maven-plugin/0.0.1-incubating/nifi-nar-maven-plugin-0.0.1-incubating-source-release.zip.asc.md5`
- `https://repository.apache.org/service/local/repositories/orgapachenifi-1011/content/org/apache/nifi/nifi-nar-maven-plugin/0.0.1-incubating/nifi-nar-maven-plugin-0.0.1-incubating-source-release.zip.asc.sha1`
- `https://repository.apache.org/service/local/repositories/orgapachenifi-1011/content/org/apache/nifi/nifi/0.0.1-incubating/nifi-0.0.1-incubating-source-release.zip.md5`
- `https://repository.apache.org/service/local/repositories/orgapachenifi-1011/content/org/apache/nifi/nifi/0.0.1-incubating/nifi-0.0.1-incubating-source-release.zip.sha1`
- Validate the signature of the source artifact. Here is an example path:
- `https://repository.apache.org/service/local/repositories/orgapachenifi-1011/content/org/apache/nifi/nifi/0.0.1-incubating/nifi-0.0.1-incubating-source-release.zip.asc`
- Need a quick reminder on how to [verify a signature](http://www.apache.org/dev/release-signing.html#verifying-signature)?
- Do all sources have necessary headers?
- Unzip the sources file into a directory and execute `mvn install -Pcheck-licenses`
- Unzip the sources file into a directory and execute `mvn install -Pcontrib-check`
- Are there no unexpected binary files in the release?
- The only thing we'd expect would be potentially test resources files.
- Does the app (if appropriate) execute and function as expected?
@ -95,9 +93,9 @@ have in mind the release version you are planning for. For example we'll consid
Create the next version in JIRA if necessary so develop work can continue towards that release.
Create new branch off develop named after the JIRA ticket or just use the develop branch itself. Here we'll use a branch off of develop with
`git checkout -b NIFI-270`
`git checkout -b NIFI-270-RC1`
Change directory into that of the project you wish to release. For example either `cd nifi` or `cd nifi-nar-maven-plugin`
Change directory into that of the project you wish to release. For example `cd nifi`
Verify that Maven has sufficient heap space to perform the build tasks. Some plugins and parts of the build
consumes a surprisingly large amount of space. These settings have been shown to
@ -128,34 +126,34 @@ Ensure your settings.xml has been updated as shown below. There are other ways
Ensure the the full application build and tests all work by executing
`mvn -T 2.5C clean install` for a parallel build. Once that completes you can
startup and test the application by `cd assembly/target` then run `bin/nifi.sh start` in the nifi build.
startup and test the application by `cd nifi-assembly/target` then run `bin/nifi.sh start` in the nifi build.
The application should be up and running in a few seconds at `http://localhost:8080/nifi`
Evaluate and ensure the appropriate license headers are present on all source files. Ensure LICENSE and NOTICE files are complete and accurate.
Developers should always be keeping these up to date as they go along adding source and modifying dependencies to keep this burden manageable.
This command `mvn install -Pcheck-licenses` should be run as well to help validate. If that doesn't complete cleanly it must be addressed.
This command `mvn install -Pcontrib-check` should be run as well to help validate. If that doesn't complete cleanly it must be addressed.
Now its time to have maven prepare the release so execute `mvn release:prepare -Psigned_release -DscmCommentPrefix="NIFI-270 " -Darguments="-DskipTests"`.
Now its time to have maven prepare the release so execute `mvn release:prepare -Psigned_release -DscmCommentPrefix="NIFI-270-RC1 " -Darguments="-DskipTests"`.
Maven will ask:
`What is the release version for "Apache NiFi NAR Plugin"? (org.apache.nifi:nifi-nar-maven-plugin) 0.0.1-incubating: :`
`What is the release version for "Apache NiFi"? (org.apache.nifi:nifi) 0.0.1-incubating: :`
Just hit enter to accept the default.
Maven will then ask:
`What is SCM release tag or label for "Apache NiFi NAR Plugin"? (org.apache.nifi:nifi-nar-maven-plugin) nifi-nar-maven-plugin-0.0.1-incubating: : `
`What is SCM release tag or label for "Apache NiFi"? (org.apache.nifi:nifi) nifi-0.0.1-incubating: : `
Enter `nifi-nar-maven-plugin-0.0.1-incubating-RC1` or whatever the appropriate release candidate (RC) number is.
Enter `nifi-0.0.1-incubating-RC1` or whatever the appropriate release candidate (RC) number is.
Maven will then ask:
`What is the new development version for "Apache NiFi NAR Plugin"? (org.apache.nifi:nifi-nifi-nar-maven-plugin) 0.0.2-incubating-SNAPSHOT: :`
`What is the new development version for "Apache NiFi"? (org.apache.nifi:nifi) 0.0.2-incubating-SNAPSHOT: :`
Just hit enter to accept the default.
Now that preparation went perfectly it is time to perform the release and deploy artifacts to staging. To do that execute
`mvn release:perform -Psigned_release -DscmCommentPrefix="NIFI-270 " -Darguments="-DskipTests"`
`mvn release:perform -Psigned_release -DscmCommentPrefix="NIFI-270-RC1 " -Darguments="-DskipTests"`
That will complete successfully and this means the artifacts have been released to the Apache Nexus staging repository. You will see something like
@ -174,6 +172,11 @@ Validate that all the various aspects of the staged artifacts appear correct
If all looks good then push the branch to origin `git push origin NIFI-270`
If it is intended that convenience binaries will be provided for this release then the community has requested that
a copy it be made available for reviewing of the release candidate. The convenience binary, its hashes, and signature
should be placed here:
- https://dist.apache.org/repos/dist/dev/incubator/nifi
If anything isn't correct about the staged artifacts you can drop the staged repo from repository.apache.org and delete the
local tag in git. If you also delete the local branch and clear your local maven repository under org/apache/nifi then it is
as if the release never happened. Before doing that though try to figure out what went wrong. So as described here you see
@ -181,21 +184,21 @@ that you can pretty easily test the release process until you get it right. The
commands can come in handy to help do this so you can set versions to something clearly release test related.
Now it's time to initiate a vote within the PPMC. Send the vote request to `dev@nifi.incubator.apache.org`
with a subject of `[VOTE] Release Apache NiFi nifi-nar-maven-plugin-0.0.1-incubating`. The following template can be used:
with a subject of `[VOTE] Release Apache NiFi 0.0.1-incubating`. The following template can be used:
```
Hello
I am pleased to be calling this vote for the source release of Apache NiFi
nifi-nar-maven-plugin-0.0.1-incubating.
nifi-0.0.1-incubating.
The source zip, including signatures, digests, etc. can be found at:
https://repository.apache.org/content/repositories/orgapachenifi-1011
The Git tag is nifi-nar-maven-plugin-0.0.1-incubating-RC1
The Git tag is nifi-0.0.1-incubating-RC1
The Git commit ID is 72abf18c2e045e9ef404050e2bffc9cef67d2558
https://git-wip-us.apache.org/repos/asf?p=incubator-nifi.git;a=commit;h=72abf18c2e045e9ef404050e2bffc9cef67d2558
Checksums of nifi-nar-maven-plugin-0.0.1-incubating-source-release.zip:
Checksums of nifi-0.0.1-incubating-source-release.zip:
MD5: 5a580756a17b0573efa3070c70585698
SHA1: a79ff8fd0d2f81523b675e4c69a7656160ff1214
@ -211,19 +214,19 @@ https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12316020&versio
The vote will be open for 72 hours.
Please download the release candidate and evaluate the necessary items including checking hashes, signatures, build from source, and test. The please vote:
[ ] +1 Release this package as nifi-nar-maven-plugin-0.0.1-incubating
[ ] +1 Release this package as nifi-0.0.1-incubating
[ ] +0 no opinion
[ ] -1 Do not release this package because because...
```
<br/>
A release vote is majority rule. So wait 72 hours and see if there are at least 3 binding +1 votes and no more negative votes than positive.
A release vote is majority rule. So wait 72 hours and see if there are at least 3 binding (in the PPMC sense of binding) +1 votes and no more negative votes than positive.
If so forward the vote to the IPMC. Send the vote request to `general@incubator.apache.org` with a subject of
`[VOTE] Release Apache NiFi nifi-nar-maven-plugin-0.0.1-incubating`. The following template can be used:
`[VOTE] Release Apache NiFi 0.0.1-incubating`. The following template can be used:
```
Hello
The Apache NiFi PPMC has voted to release Apache NiFi nar-maven-plugin-0.0.1-incubating.
The Apache NiFi PPMC has voted to release Apache NiFi 0.0.1-incubating.
The vote was based on the release candidate and thread described below.
We now request the IPMC to vote on this release.
@ -236,11 +239,11 @@ Here is the PPMC vote thread: [URL TO PPMC Vote Thread]
The source zip, including signatures, digests, etc. can be found at:
https://repository.apache.org/content/repositories/orgapachenifi-1011
The Git tag is nar-maven-plugin-0.0.1-incubating-RC1
The Git tag is nifi-0.0.1-incubating-RC1
The Git commit ID is 72abf18c2e045e9ef404050e2bffc9cef67d2558
https://git-wip-us.apache.org/repos/asf?p=incubator-nifi.git;a=commit;h=72abf18c2e045e9ef404050e2bffc9cef67d2558
Checksums of nar-maven-plugin-0.0.1-incubating-source-release.zip:
Checksums of nifi-0.0.1-incubating-source-release.zip:
MD5: 5a580756a17b0573efa3070c70585698
SHA1: a79ff8fd0d2f81523b675e4c69a7656160ff1214
@ -256,13 +259,13 @@ https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12316020&versio
The vote will be open for 72 hours.
Please download the release candidate and evaluate the necessary items including checking hashes, signatures, build from source, and test. The please vote:
[ ] +1 Release this package as nar-maven-plugin-0.0.1-incubating
[ ] +1 Release this package as nifi-0.0.1-incubating
[ ] +0 no opinion
[ ] -1 Do not release this package because because...
```
<br/>
Wait 72 hours. If the vote passes then send a vote result email. Send the email to `general@incubator.apache.org, dev@nifi.incubator.apache.org`
with a subject of `[RESULT][VOTE] Release Apache NiFi nar-maven-plugin-0.0.1-incubating`. Use a template such as:
with a subject of `[RESULT][VOTE] Release Apache NiFi 0.0.1-incubating`. Use a template such as:
```
Hello
@ -277,12 +280,69 @@ Thanks to all who helped make this release possible.
Here is the IPMC vote thread: [INSERT URL OF IPMC Vote Thread]
```
<br/>
Now all the voting is done and the release is good to go. In repository.apache.org go to the staging repository
and select `release`. Then publish the source, hashes, and signatures to `https://dist.apache.org/repos/dist/release/incubator/nifi/`
Then merge the release git tag to develop and to master.
Now all the voting is done and the release is good to go.
Here are the steps of the release once the release is approved:
1. Upload source-release artifacts to dist. If the release version is 0.0.1-incubating then upload them (zip, asc, md5, sha1) to
`https://dist.apache.org/repos/dist/release/incubator/nifi/0.0.1-incubating`
2. To produce binary convenience release build the application from the raw source in staging. For each binary convenience artifact:
- Generate ascii armored detached signature by running `gpg -a -b nifi-0.0.1-incubating-bin.tar.gz`
- Generate md5 hash summary by running `md5sum nifi-0.0.1-incubating-bin.tar.gz | awk '{ printf substr($0,0,32)}' > nifi-0.0.1-incubating-bin.tar.gz.md5`
- Generate sha1 hash summary by running `sha1sum nifi-0.0.1-incubating-bin.tar.gz | awk '{ printf substr($0,0,40)}' > nifi-0.0.1-incubating-bin.tar.gz.sha1`
- Upload the bin, asc, sha1, md5 for each binary convenience build to the same location as the source release
3. In repository.apache.org go to the staging repository and select `release` and follow instructions on the site.
4. Merge the release branch into master
5. Merge the release branch into develop
6. Update the NiFi website to point to the new download(s)
7. Update the NiFi incubator status page to indicate NEWS of the release
8. In Jira mark the release version as 'Released' and 'Archived' through 'version' management in the 'administration' console.
9. Wait 24 hours then send release announcement.
- See [here][release-announce] for an understanding of why you need to wait 24 hours
- Then create an announcement like the one shown below addressed to 'announce@apache.org, general@incubator.apache.org, dev@nifi.incubator.apache.org' with a reply-to of 'general@incubator.apache.org'.
- The email has to be sent from an apache.org email address and should be by the release manager of the build.
```
SUBJECT: [ANNOUNCE] Apache NiFi 0.0.2-incubating release
BODY:
Hello
The Apache NiFi team would like to announce the release of Apache NiFi 0.0.2-incubating.
Apache NiFi is an easy to use, powerful, and reliable system to process and distribute data. Apache NiFi was made for dataflow. It supports highly configurable directed graphs of data routing, transformation, and system mediation logic.
More details on Apache NiFi can be found here:
http://nifi.incubator.apache.org/
The release artifacts can be downloaded from here:
http://nifi.incubator.apache.org/downloads/
Maven artifacts have been made available here:
https://repository.apache.org/content/repositories/releases/org/apache/nifi/
Release notes available here:
https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12316020&version=12329373
Thank you
The Apache NiFi team
----
DISCLAIMER
Apache NiFi is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
```
[quickstart-guide]: http://nifi.incubator.apache.org/development/quickstart.html
[release-manager]: http://www.apache.org/dev/release-publishing.html#release_manager
[release-announce]: http://www.apache.org/dev/release.html#release-announcements
[apache-license]: http://apache.org/licenses/LICENSE-2.0
[apache-license-apply]: http://www.apache.org/dev/apply-license.html
[apache-legal-resolve]: http://www.apache.org/legal/resolved.html

View File

@ -187,6 +187,8 @@ div.external-guide {
div.external-guide iframe {
width: 100%;
height: 100%;
border-width: 0;
display: block;
}
/*

View File

@ -455,3 +455,25 @@ This product bundles 'json2.js' which is available in the 'public domain'.
This product bundles 'reset.css' which is available in the 'public domain'.
For details see http://meyerweb.com/eric/tools/css/reset/
This product bundles HexViewJS available under an MIT License
Copyright (c) 2010 Nick McVeity <nmcveity@gmail.com>
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -19,9 +19,9 @@ Apache NiFi is an easy to use, powerful, and reliable system to process and dist
## Table of Contents
- [Features](#features)
- [Requirements](#requirements)
- [Getting Started](#getting-started)
- [Getting Help](#getting-help)
- [Requirements](#requirements)
- [License](#license)
- [Disclaimer](#disclaimer)
- [Export Control] (#export-control)
@ -47,17 +47,64 @@ Apache NiFi was made for dataflow. It supports highly configurable directed grap
- SSL, SSH, HTTPS, encrypted content, etc...
- Pluggable role-based authentication/authorization
## Requirements
* JDK 1.7 or higher
* Apache Maven 3.0.5 or higher
## Getting Started
To build:
- Execute 'mvn clean install' or for parallel build execute 'mvn -T 2.0C clean install'
- Change directory to 'nifi-assembly'. In the target directory, there should be a build of nifi.
- Unpack the build wherever you like or use the already unpacked build.
- Execute `mvn clean install` or for parallel build execute `mvn -T 2.0C clean install`. On a
modest development laptop that is a couple of years old, the latter build takes a bit under ten
minutes. After a large amount of output you should eventually see a success message.
To start NiFi:
- Change directory to the location where you installed NiFi
- '<install_location>/bin/nifi.sh start'
- Direct your browser to http://localhost:8080/nifi/
laptop:nifi fhampton$ mvn -T 2.0C clean install
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 115 modules...
...tens of thousands of lines elided...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 09:24 min (Wall Clock)
[INFO] Finished at: 2015-04-30T00:30:36-05:00
[INFO] Final Memory: 173M/1359M
[INFO] ------------------------------------------------------------------------
To deploy:
- Change directory to 'nifi-assembly'. In the target directory, there should be a build of nifi.
laptop:nifi fhampton$ cd nifi-assembly
laptop:nifi-assembly fhampton$ ls -lhd target/nifi*
drwxr-xr-x 3 fhampton staff 102B Apr 30 00:29 target/nifi-0.1.0-incubating-SNAPSHOT-bin
-rw-r--r-- 1 fhampton staff 144M Apr 30 00:30 target/nifi-0.1.0-incubating-SNAPSHOT-bin.tar.gz
-rw-r--r-- 1 fhampton staff 144M Apr 30 00:30 target/nifi-0.1.0-incubating-SNAPSHOT-bin.zip
- For testing ongoing development you could use the already unpacked build present in the directory
named "nifi-*version*-bin", where *version* is the current project version. To deploy in another
location make use of either the tarball or zipfile and unpack them wherever you like. The
distribution will be within a common parent directory named for the version.
laptop:nifi-assembly fhampton$ mkdir ~/example-nifi-deploy
laptop:nifi-assembly fhampton$ tar xzf target/nifi-*-bin.tar.gz -C ~/example-nifi-deploy
laptop:nifi-assembly fhampton$ ls -lh ~/example-nifi-deploy/
total 0
drwxr-xr-x 10 fhampton staff 340B Apr 30 01:06 nifi-0.1.0-incubating-SNAPSHOT
To run NiFi:
- Change directory to the location where you installed NiFi and run it.
laptop:~ fhampton$ cd ~/example-nifi-deploy/nifi-*
laptop:nifi-0.1.0-incubating-SNAPSHOT fhampton$ ./bin/nifi.sh start
- Direct your browser to http://localhost:8080/nifi/ and you should see a screen like this screenshot:
![image of a NiFi dataflow canvas](nifi-docs/src/main/asciidoc/images/nifi_first_launch_screenshot.png?raw=true)
- For help building your first data flow see the [NiFi User Guide](http://nifi.incubator.apache.org/docs/nifi-docs/user-guide.html)
- If you are testing ongoing development, you will likely want to stop your instance.
laptop:~ fhampton$ cd ~/example-nifi-deploy/nifi-*
laptop:nifi-0.1.0-incubating-SNAPSHOT fhampton$ ./bin/nifi.sh stop
## Getting Help
If you have questions, you can reach out to our mailing list: dev@nifi.incubator.apache.org
@ -65,9 +112,6 @@ If you have questions, you can reach out to our mailing list: dev@nifi.incubator
We're also often available in IRC: #nifi on
[irc.freenode.net](http://webchat.freenode.net/?channels=#nifi).
## Requirements
* JDK 1.7 or higher
## License
Except as otherwise noted this software is licensed under the

View File

@ -26,17 +26,12 @@ import java.lang.annotation.Target;
/**
* Indicates that a component has more than one dynamic property
*
* @author
*
*/
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface DynamicProperties {
/**
* A list of the dynamic properties supported by a component
* @return A list of the dynamic properties supported by a component
*/
public DynamicProperty[] value();
}

View File

@ -29,39 +29,18 @@ import org.apache.nifi.components.ConfigurableComponent;
* An annotation that may be placed on a {@link ConfigurableComponent} to
* indicate that it supports a dynamic property.
*
* @author
*
*/
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface DynamicProperty {
/**
* A description of what the name of the dynamic property may be
*
* @return A description of what the name of the dynamic property may be
*/
public String name();
/**
* Indicates whether or not the dynamic property supports expression
* language
*
* @return whether or not the dynamic property supports expression
* language
*/
public boolean supportsExpressionLanguage() default false;
/**
* A description of what the value of the dynamic property may be
* @return a description of what the value of the dynamic property may be
*/
public String value();
/**
* Provides a description of what the meaning of the property is, and what the expected values are
* @return a description of what the meaning of the property is, and what the expected values are
*/
public String description();
}

View File

@ -32,25 +32,14 @@ import org.apache.nifi.processor.Relationship;
* relationship. A dynamic {@link Relationship} is one where the relationship is
* generated based on a user defined {@link PropertyDescriptor}
*
* @author
*
*/
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface DynamicRelationship {
/**
* Describes the name(s) of the dynamic relationship(s)
*
* @return a description of the name(s) of the dynamic relationship(s)
*/
public String name();
/**
* Describes the data that should be routed to the dynamic relationship(s)
*
* @return a description the data that should be routed to the dynamic relationship(s)
*/
public String description();
}

View File

@ -38,7 +38,6 @@ import java.lang.annotation.Target;
* eligible to be scheduled in Event-Driven mode.
* </p>
*
* @author none
*/
@Documented
@Target({ElementType.TYPE})

View File

@ -24,27 +24,18 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Annotation that may be placed on a {@link org.apache.nifi.processor.Processor Processor}
* indicating that this processor reads a specific FlowFile attribute.
*
* @author
* Annotation that may be placed on a
* {@link org.apache.nifi.processor.Processor Processor} indicating that this
* processor reads a specific FlowFile attribute.
*
*/
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ReadsAttribute {
/**
* The FlowFile attribute that is being read
* @return
*/
public String attribute();
/**
* The description of how the attribute is being used
* @return
*/
public String description() default "";
}

View File

@ -16,7 +16,6 @@
*/
package org.apache.nifi.annotation.behavior;
import org.apache.nifi.annotation.behavior.ReadsAttribute;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
@ -25,10 +24,9 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Annotation that may be placed on a {@link org.apache.nifi.processor.Processor Processor}
* indicating that this processor reads specific FlowFile attributes.
*
* @author
* Annotation that may be placed on a
* {@link org.apache.nifi.processor.Processor Processor} indicating that this
* processor reads specific FlowFile attributes.
*
*/
@Documented
@ -36,9 +34,6 @@ import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ReadsAttributes {
/**
* A list of attributes that may be read
* @return
*/
public ReadsAttribute[] value();
}

View File

@ -25,19 +25,17 @@ import java.lang.annotation.Target;
/**
* Marker annotation a {@link org.apache.nifi.processor.Processor Processor}
* implementation can use to indicate that its
* operations on FlowFiles can be safely repeated across process sessions. If a
* processor has this annotation and it allows the framework to manage session
* commit and rollback then the framework may elect to cascade a
* implementation can use to indicate that its operations on FlowFiles can be
* safely repeated across process sessions. If a processor has this annotation
* and it allows the framework to manage session commit and rollback then the
* framework may elect to cascade a
* {@link org.apache.nifi.processor.ProcessSession ProcessSession} given to this
* processor's onTrigger method to the
* onTrigger method of another processor. It can do this knowing that if
* something fails along a series of processors using this same session that it
* can all be safely rolled back without any ill effects on external services
* which could not be rolled back and thus all the processes could be safely
* repeated (implied idempotent behavior).
* processor's onTrigger method to the onTrigger method of another processor. It
* can do this knowing that if something fails along a series of processors
* using this same session that it can all be safely rolled back without any ill
* effects on external services which could not be rolled back and thus all the
* processes could be safely repeated (implied idempotent behavior).
*
* @author none
*/
@Documented
@Target({ElementType.TYPE})

View File

@ -41,7 +41,6 @@ import java.lang.annotation.Target;
* ProcessSession.commit() to ensure data is persisted before deleting the data
* from a remote source.
*
* @author none
*/
@Documented
@Target({ElementType.TYPE})

View File

@ -25,12 +25,10 @@ import java.lang.annotation.Target;
/**
* Marker annotation a {@link org.apache.nifi.processor.Processor Processor}
* implementation can use to indicate that the
* Processor is not safe for concurrent execution of its onTrigger()
* method. By default, Processors are assumed to be safe for concurrent
* execution.
* implementation can use to indicate that the Processor is not safe for
* concurrent execution of its onTrigger() method. By default, Processors are
* assumed to be safe for concurrent execution.
*
* @author none
*/
@Documented
@Target({ElementType.TYPE})

View File

@ -25,13 +25,11 @@ import java.lang.annotation.Target;
/**
* Marker annotation a {@link org.apache.nifi.processor.Processor Processor}
* implementation can use to indicate that the
* Processor is to be triggered if any of its destinations has available space
* for incoming FlowFiles. By default, Processors are triggered only when all
* destinations report that they have available space (i.e., none of the outgoing
* Connections is full).
* implementation can use to indicate that the Processor is to be triggered if
* any of its destinations has available space for incoming FlowFiles. By
* default, Processors are triggered only when all destinations report that they
* have available space (i.e., none of the outgoing Connections is full).
*
* @author none
*/
@Documented
@Target({ElementType.TYPE})

View File

@ -25,14 +25,13 @@ import java.lang.annotation.Target;
/**
* Marker annotation a {@link org.apache.nifi.processor.Processor Processor}
* implementation can use to indicate that the
* Processor should still be triggered even when it has no data in its work
* queue. By default, Processors which have no non-self incoming edges will be
* triggered even if there is no work in its queue. However, Processors that
* have non-self incoming edges will only be triggered if they have work in
* their queue or they present this annotation.
* implementation can use to indicate that the Processor should still be
* triggered even when it has no data in its work queue. By default, Processors
* which have no non-self incoming edges will be triggered even if there is no
* work in its queue. However, Processors that have non-self incoming edges will
* only be triggered if they have work in their queue or they present this
* annotation.
*
* @author none
*/
@Documented
@Target({ElementType.TYPE})

View File

@ -24,28 +24,18 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Annotation that may be placed on a {@link org.apache.nifi.processor.Processor Processor}
* indicating that this processor writes/updates a specific FlowFile attribute.
*
* @author
* Annotation that may be placed on a
* {@link org.apache.nifi.processor.Processor Processor} indicating that this
* processor writes/updates a specific FlowFile attribute.
*
*/
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface WritesAttribute {
/**
* The FlowFile attribute that is being created or updated
* @return
*/
public String attribute();
/**
* A description of what is being written to the FlowFile attribute
* @return
*/
public String description() default "";
}

View File

@ -24,21 +24,16 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Annotation that may be placed on a {@link org.apache.nifi.processor.Processor Processor}
* indicating that this processor writes/updates specific FlowFile attributes.
*
* @author
* Annotation that may be placed on a
* {@link org.apache.nifi.processor.Processor Processor} indicating that this
* processor writes/updates specific FlowFile attributes.
*
*/
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface WritesAttributes {
/**
* A list of FlowFile attributes that may be written or updated
* @return
*/
public WritesAttribute[] value();
}

View File

@ -26,10 +26,10 @@ import java.lang.annotation.Target;
/**
* Annotation that may be placed on a {@link org.apache.nifi.processor.Processor Processor},
* {@link org.apache.nifi.controller.ControllerService ControllerService}, or
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask} allowing for a description to be
* provided. This description can be provided to a user in logs, UI, etc.
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask} allowing for a
* description to be provided. This description can be provided to a user in
* logs, UI, etc.
*
* @author none
*/
@Documented
@Target({ElementType.TYPE})

View File

@ -26,34 +26,19 @@ import java.lang.annotation.Target;
import org.apache.nifi.components.ConfigurableComponent;
/**
* Annotation that may be placed on a
* {@link org.apache.nifi.processor.Processor Processor},
* Annotation that may be placed on a null {@link org.apache.nifi.processor.Processor Processor},
* {@link org.apache.nifi.controller.ControllerService ControllerService}, or
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask} that indicates
* this component is related to the components listed.
*
* @author
*
*/
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface SeeAlso {
/**
* Classes you want to link to.
*
* @return
*/
public Class<? extends ConfigurableComponent>[] value() default {};
/**
* Fully qualified class names you want to link to. Use this when the class
* you want to link to is not in the class path of the component you are
* linking from.
*
* @return
*/
public String[] classNames() default {};
}

View File

@ -26,12 +26,11 @@ import java.lang.annotation.Target;
/**
* Annotation that can be applied to a {@link org.apache.nifi.processor.Processor Processor},
* {@link org.apache.nifi.controller.ControllerService ControllerService}, or
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask} in order to associate
* tags (keywords) with the component. These tags do not affect the component in
* any way but serve as additional documentation and can be used to sort/filter
* Processors.
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask} in order to
* associate tags (keywords) with the component. These tags do not affect the
* component in any way but serve as additional documentation and can be used to
* sort/filter Processors.
*
* @author none
*/
@Documented
@Target({ElementType.TYPE})
@ -39,8 +38,5 @@ import java.lang.annotation.Target;
@Inherited
public @interface Tags {
/**
* @return all tag values associated with the given processor
*/
public String[] value();
}

View File

@ -27,23 +27,22 @@ import java.lang.annotation.Target;
* <p>
* Marker annotation a {@link org.apache.nifi.processor.Processor Processor},
* {@link org.apache.nifi.controller.ControllerService ControllerService}, or
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask}
* implementation can use to indicate a method
* should be called whenever the component is added to the flow. This method
* will be called once for the entire life of a component instance.
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask} implementation
* can use to indicate a method should be called whenever the component is added
* to the flow. This method will be called once for the entire life of a
* component instance.
* </p>
*
* <p>
* Methods with this annotation are called without any arguments, as all settings
* and properties can be assumed to be the defaults.
* Methods with this annotation are called without any arguments, as all
* settings and properties can be assumed to be the defaults.
* </p>
*
* <p>
* If any method annotated with this annotation throws a Throwable, the component
* will not be added to the flow.
* If any method annotated with this annotation throws a Throwable, the
* component will not be added to the flow.
* </p>
*
* @author none
*/
@Documented
@Target({ElementType.METHOD})

View File

@ -27,26 +27,29 @@ import org.apache.nifi.controller.ConfigurationContext;
/**
* <p>
* Marker annotation a {@link org.apache.nifi.controller.ControllerService ControllerService}
* can use to indicate a method should be called whenever the service is disabled.
* Marker annotation a
* {@link org.apache.nifi.controller.ControllerService ControllerService} can
* use to indicate a method should be called whenever the service is disabled.
* </p>
*
* <p>
* Methods using this annotation are permitted to take zero arguments or to take a single
* argument of type {@link ConfigurationContext}. If a method with this annotation
* throws a Throwable, a log message and bulletin will be issued for the service, and the
* service will remain in a 'DISABLING' state. When this occurs, the method with this annotation
* will be called again after some period of time. This will continue until the method returns
* without throwing any Throwable. Until that time, the service will remain in a 'DISABLING' state
* and cannot be enabled again.
* Methods using this annotation are permitted to take zero arguments or to take
* a single argument of type {@link ConfigurationContext}. If a method with this
* annotation throws a Throwable, a log message and bulletin will be issued for
* the service, and the service will remain in a 'DISABLING' state. When this
* occurs, the method with this annotation will be called again after some
* period of time. This will continue until the method returns without throwing
* any Throwable. Until that time, the service will remain in a 'DISABLING'
* state and cannot be enabled again.
* </p>
*
* <p>
* 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.
* 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.
* </p>
*
*/

View File

@ -25,32 +25,37 @@ import java.lang.annotation.Target;
/**
* <p>
* Marker annotation a {@link org.apache.nifi.controller.ControllerService ControllerService}
* can use to indicate a method should be called whenever the 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.
* Marker annotation a
* {@link org.apache.nifi.controller.ControllerService ControllerService} can
* use to indicate a method should be called whenever the 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.
* </p>
*
* <p>
* Methods using this annotation must take either 0 arguments or a single argument of type
* Methods using this annotation must take either 0 arguments or a single
* argument of type
* {@link org.apache.nifi.controller.ConfigurationContext ConfigurationContext}.
* </p>
*
* <p>
* 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.
* 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.
* </p>
*
* <p>
* 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.
* 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.
* </p>
*
*

View File

@ -31,21 +31,21 @@ import org.apache.nifi.processor.ProcessContext;
* Marker annotation a {@link org.apache.nifi.processor.Processor Processor},
* {@link org.apache.nifi.controller.ControllerService ControllerService}, or
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask} implementation
* can use to indicate a method should be called whenever the component is removed
* from the flow. This method will be called once for the entire life of a
* component instance. If the method throw any Throwable, that Throwable will be
* caught and logged but will not prevent subsequent methods with this annotation
* or removal of the component from the flow.
* can use to indicate a method should be called whenever the component is
* removed from the flow. This method will be called once for the entire life of
* a component instance. If the method throw any Throwable, that Throwable will
* be caught and logged but will not prevent subsequent methods with this
* annotation or removal of the component from the flow.
* </p>
*
* <p>
* Methods with this annotation are permitted to take no arguments or to take a single
* argument. If using a single argument, that argument must be of type {@link ConfigurationContext}
* if the component is a ReportingTask or a ControllerService. If the component is a Processor,
* then the argument must be of type {@link ProcessContext}.
* Methods with this annotation are permitted to take no arguments or to take a
* single argument. If using a single argument, that argument must be of type
* {@link ConfigurationContext} if the component is a ReportingTask or a
* ControllerService. If the component is a Processor, then the argument must be
* of type {@link ProcessContext}.
* </p>
*
* @author none
*/
@Documented
@Target({ElementType.METHOD})

View File

@ -27,32 +27,37 @@ import java.lang.annotation.Target;
* <p>
* Marker annotation a {@link org.apache.nifi.processor.Processor Processor} or
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask} implementation
* can use to indicate a method should be called whenever the component is scheduled
* to run. This will be called before any call to 'onTrigger' and will be called once each time
* a Processor or Reporting Task is scheduled to run. This occurs in one of two ways: either
* a user clicks to schedule the component to run, or NiFi is restarted with the "auto-resume state"
* configuration set to true (the default value) and the component is already running.
* can use to indicate a method should be called whenever the component is
* scheduled to run. This will be called before any call to 'onTrigger' and will
* be called once each time a Processor or Reporting Task is scheduled to run.
* This occurs in one of two ways: either a user clicks to schedule the
* component to run, or NiFi is restarted with the "auto-resume state"
* configuration set to true (the default value) and the component is already
* running.
* </p>
*
* <p>
* Methods using this annotation must take either 0 arguments or a single argument.
* Methods using this annotation must take either 0 arguments or a single
* argument.
* </p>
*
* <p>
* If using 1 argument and the component using the annotation is a Processor, that argument must
* be of type {@link org.apache.nifi.processor.ProcessContext ProcessContext}.
* If using 1 argument and the component using the annotation is a Processor,
* that argument must be of type
* {@link org.apache.nifi.processor.ProcessContext ProcessContext}.
* </p>
*
* <p>
* If using 1 argument and the component using the annotation is a Reporting Task, that argument must
* be of type {@link org.apache.nifi.controller.ConfigurationContext ConfigurationContext}.
* If using 1 argument and the component using the annotation is a Reporting
* Task, that argument must be of type
* {@link org.apache.nifi.controller.ConfigurationContext ConfigurationContext}.
* </p>
*
* If any method annotated with this annotation throws any Throwable, the framework will wait a while
* and then attempt to invoke the method again. This will continue until the method succeeds, and the
* component will then be scheduled to run after this method return successfully.
* If any method annotated with this annotation throws any Throwable, the
* framework will wait a while and then attempt to invoke the method again. This
* will continue until the method succeeds, and the component will then be
* scheduled to run after this method return successfully.
*
* @author none
*/
@Documented
@Target({ElementType.METHOD})

View File

@ -31,19 +31,19 @@ import org.apache.nifi.processor.ProcessContext;
* Marker annotation a {@link org.apache.nifi.processor.Processor Processor},
* {@link org.apache.nifi.controller.ControllerService ControllerService}, or
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask} implementation
* can use to indicate a method should be called whenever the flow is being shutdown.
* This will be called at most once for each component in a JVM lifetime.
* It is not, however, guaranteed that this method will be called on shutdown, as
* the service may be killed suddenly.
* can use to indicate a method should be called whenever the flow is being
* shutdown. This will be called at most once for each component in a JVM
* lifetime. It is not, however, guaranteed that this method will be called on
* shutdown, as the service may be killed suddenly.
* </p>
*
* <p>
* Methods with this annotation are permitted to take either 0 or 1 argument. If an argument
* is used, it must be of type {@link ConfigurationContext} if the component is a ReportingTask
* or Controller Service, or of type {@link ProcessContext} if the component is a Processor.
* Methods with this annotation are permitted to take either 0 or 1 argument. If
* an argument is used, it must be of type {@link ConfigurationContext} if the
* component is a ReportingTask or Controller Service, or of type
* {@link ProcessContext} if the component is a Processor.
* </p>
*
* @author none
*/
@Documented
@Target({ElementType.METHOD})

View File

@ -29,12 +29,11 @@ import org.apache.nifi.processor.ProcessContext;
/**
* <p>
* Marker annotation a {@link org.apache.nifi.processor.Processor Processor} or
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask}
* implementation can use to indicate that a method
* should be called whenever the component is no longer scheduled to run.
* Methods marked with this annotation will be invoked each time the component
* is stopped and will be invoked only after the last thread has returned from
* the <code>onTrigger</code> method.
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask} implementation
* can use to indicate that a method should be called whenever the component is
* no longer scheduled to run. Methods marked with this annotation will be
* invoked each time the component is stopped and will be invoked only after the
* last thread has returned from the <code>onTrigger</code> method.
* </p>
*
* <p>
@ -47,17 +46,17 @@ import org.apache.nifi.processor.ProcessContext;
*
* <p>
* To indicate that a method should be called immediately when a component is no
* longer scheduled to run (as opposed to after all threads have returned from the
* <code>onTrigger</code> method), see the {@link OnUnscheduled} annotation.
* longer scheduled to run (as opposed to after all threads have returned from
* the <code>onTrigger</code> method), see the {@link OnUnscheduled} annotation.
* </p>
*
* <p>
* Methods with this annotation are permitted to take either 0 or 1 argument. If an argument
* is used, it must be of type {@link ConfigurationContext} if the component is a ReportingTask
* or of type {@link ProcessContext} if the component is a Processor.
* Methods with this annotation are permitted to take either 0 or 1 argument. If
* an argument is used, it must be of type {@link ConfigurationContext} if the
* component is a ReportingTask or of type {@link ProcessContext} if the
* component is a Processor.
* </p>
*
* @author none
*/
@Documented
@Target({ElementType.METHOD})

View File

@ -26,26 +26,29 @@ import java.lang.annotation.Target;
/**
* <p>
* Marker annotation a {@link org.apache.nifi.processor.Processor Processor} or
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask}
* should be called whenever the component is no longer scheduled to run.
* Methods marked with this annotation will be invoked each time the framework
* is notified to stop scheduling the component. This method is invoked as other
* threads are potentially running. To invoke a method after all threads have
* finished processing, see the {@link OnStopped} annotation.
* {@link org.apache.nifi.reporting.ReportingTask ReportingTask} should be
* called whenever the component is no longer scheduled to run. Methods marked
* with this annotation will be invoked each time the framework is notified to
* stop scheduling the component. This method is invoked as other threads are
* potentially running. To invoke a method after all threads have finished
* processing, see the {@link OnStopped} annotation.
* </p>
*
* <p>
* Methods using this annotation must take either 0 arguments or a single argument.
* Methods using this annotation must take either 0 arguments or a single
* argument.
* </p>
*
* <p>
* If using 1 argument and the component using the annotation is a Processor, that argument must
* be of type {@link org.apache.nifi.processor.ProcessContext ProcessContext}.
* If using 1 argument and the component using the annotation is a Processor,
* that argument must be of type
* {@link org.apache.nifi.processor.ProcessContext ProcessContext}.
* </p>
*
* <p>
* If using 1 argument and the component using the annotation is a Reporting Task, that argument must
* be of type {@link org.apache.nifi.controller.ConfigurationContext ConfigurationContext}.
* If using 1 argument and the component using the annotation is a Reporting
* Task, that argument must be of type
* {@link org.apache.nifi.controller.ConfigurationContext ConfigurationContext}.
* </p>
*/
@Documented

View File

@ -0,0 +1,44 @@
/*
* 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.
*/
package org.apache.nifi.annotation.notification;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* <p>
* Marker annotation that a component can use to indicate that a method should be
* called whenever the state of the Primary Node in a cluster has changed.
* </p>
*
* <p>
* Methods with this annotation should take either no arguments or one argument of type
* {@link PrimaryNodeState}. The {@link PrimaryNodeState} provides context about what changed
* so that the component can take appropriate action.
* </p>
*/
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface OnPrimaryNodeStateChange {
}

View File

@ -0,0 +1,33 @@
/*
* 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.
*/
package org.apache.nifi.annotation.notification;
/**
* Represents a state change that occurred for the Primary Node of a NiFi cluster.
*/
public enum PrimaryNodeState {
/**
* The node receiving this state has been elected the Primary Node of the NiFi cluster.
*/
ELECTED_PRIMARY_NODE,
/**
* The node receiving this state was the Primary Node but has now had its Primary Node
* role revoked.
*/
PRIMARY_NODE_REVOKED;
}

View File

@ -34,11 +34,9 @@ public enum Authority {
ROLE_NIFI;
/**
* Returns the matching role or null if the specified role does not match
* any roles.
*
* @param rawAuthority
* @return
* @param rawAuthority string form of authority
* @return the matching role or null if the specified role does not match
* any roles
*/
public static Authority valueOfAuthority(String rawAuthority) {
Authority desiredAuthority = null;
@ -54,9 +52,7 @@ public enum Authority {
}
/**
* Gets the string value of each authority.
*
* @return
* @return the string value of each authority
*/
public static Set<String> getRawAuthorities() {
Set<String> authorities = new LinkedHashSet<>();

View File

@ -31,11 +31,9 @@ import org.apache.nifi.authorization.exception.UnknownIdentityException;
public interface AuthorityProvider {
/**
* Returns whether the user with the specified DN is known to this authority
* provider. It is not necessary for the user to have any authorities.
*
* @param dn
* @return
* @param dn of the user
* @return whether the user with the specified DN is known to this authority
* provider. It is not necessary for the user to have any authorities
*/
boolean doesDnExist(String dn) throws AuthorityAccessException;
@ -43,29 +41,30 @@ public interface AuthorityProvider {
* Get the authorities for the specified user. If the specified user exists
* but does not have any authorities, an empty set should be returned.
*
* @param dn
* @return
* @throws UnknownIdentityException
* @throws AuthorityAccessException
* @param dn of the user to lookup
* @return the authorities for the specified user. If the specified user
* exists but does not have any authorities, an empty set should be returned
* @throws UnknownIdentityException if identity is not known
* @throws AuthorityAccessException if unable to access authorities
*/
Set<Authority> getAuthorities(String dn) throws UnknownIdentityException, AuthorityAccessException;
/**
* Sets the specified authorities for the specified user.
*
* @param dn
* @param authorities
* @throws UnknownIdentityException
* @throws AuthorityAccessException
* @param dn the specified user
* @param authorities the new authorities for the user
* @throws UnknownIdentityException if identity is not known
* @throws AuthorityAccessException if unable to access authorities
*/
void setAuthorities(String dn, Set<Authority> authorities) throws UnknownIdentityException, AuthorityAccessException;
/**
* Gets the users for the specified authority.
*
* @param authority
* @return
* @throws AuthorityAccessException
* @param authority for which to determine membership of
* @return all users with the specified authority
* @throws AuthorityAccessException if unable to access authorities
*/
Set<String> getUsers(Authority authority) throws AuthorityAccessException;
@ -73,19 +72,19 @@ public interface AuthorityProvider {
* Revokes the specified user. Its up to the implementor to determine the
* semantics of revocation.
*
* @param dn
* @throws UnknownIdentityException
* @throws AuthorityAccessException
* @param dn the dn of the user
* @throws UnknownIdentityException if the user is not known
* @throws AuthorityAccessException if unable to access the authorities
*/
void revokeUser(String dn) throws UnknownIdentityException, AuthorityAccessException;
/**
* Add the specified user.
*
* @param dn
* @param dn of the user
* @param group Optional
* @throws IdentityAlreadyExistsException
* @throws AuthorityAccessException
* @throws UnknownIdentityException if the user is not known
* @throws AuthorityAccessException if unable to access the authorities
*/
void addUser(String dn, String group) throws IdentityAlreadyExistsException, AuthorityAccessException;
@ -93,10 +92,10 @@ public interface AuthorityProvider {
* Gets the group for the specified user. Return null if the user does not
* belong to a group.
*
* @param dn
* @return
* @throws UnknownIdentityException
* @throws AuthorityAccessException
* @param dn the user
* @return the group of the given user
* @throws UnknownIdentityException if the user is not known
* @throws AuthorityAccessException if unable to access the authorities
*/
String getGroupForUser(String dn) throws UnknownIdentityException, AuthorityAccessException;
@ -104,26 +103,28 @@ public interface AuthorityProvider {
* Revokes all users for a specified group. Its up to the implementor to
* determine the semantics of revocation.
*
* @param group
* @throws AuthorityAccessException
* @param group to revoke the users of
* @throws UnknownIdentityException if the user is not known
* @throws AuthorityAccessException if unable to access the authorities
*/
void revokeGroup(String group) throws UnknownIdentityException, AuthorityAccessException;
/**
* Adds the specified users to the specified group.
*
* @param dn
* @param group
* @throws AuthorityAccessException
* @param dn the set of users to add to the group
* @param group to add users to
* @throws UnknownIdentityException if the user is not known
* @throws AuthorityAccessException if unable to access the authorities
*/
void setUsersGroup(Set<String> dn, String group) throws UnknownIdentityException, AuthorityAccessException;
/**
* Ungroups the specified user.
*
* @param dn
* @throws UnknownIdentityException
* @throws AuthorityAccessException
* @param dn of the user
* @throws UnknownIdentityException if the user is not known
* @throws AuthorityAccessException if unable to access the authorities
*/
void ungroupUser(String dn) throws UnknownIdentityException, AuthorityAccessException;
@ -133,8 +134,8 @@ public interface AuthorityProvider {
* does not exist. If an admin revoked this group before calling ungroup, it
* may or may not exist.
*
* @param group
* @throws AuthorityAccessException
* @param group to ungroup
* @throws AuthorityAccessException if unable to access the authorities
*/
void ungroup(String group) throws AuthorityAccessException;
@ -147,11 +148,11 @@ public interface AuthorityProvider {
* the user's request with the last being the proxy that sent the current
* request.
*
* @param dnChain
* @param attributes
* @return
* @throws UnknownIdentityException
* @throws AuthorityAccessException
* @param dnChain of the user
* @param attributes of the flowfile being requested
* @return the authorization result
* @throws UnknownIdentityException if the user is not known
* @throws AuthorityAccessException if unable to access the authorities
*/
DownloadAuthorization authorizeDownload(List<String> dnChain, Map<String, String> attributes) throws UnknownIdentityException, AuthorityAccessException;
@ -159,15 +160,15 @@ public interface AuthorityProvider {
* Called immediately after instance creation for implementers to perform
* additional setup
*
* @param initializationContext
* @param initializationContext in which to initialize
*/
void initialize(AuthorityProviderInitializationContext initializationContext) throws ProviderCreationException;
/**
* Called to configure the AuthorityProvider.
*
* @param configurationContext
* @throws ProviderCreationException
* @param configurationContext at the time of configuration
* @throws ProviderCreationException for any issues configuring the provider
*/
void onConfigured(AuthorityProviderConfigurationContext configurationContext) throws ProviderCreationException;

View File

@ -24,9 +24,7 @@ import java.util.Map;
public interface AuthorityProviderConfigurationContext {
/**
* The identifier for the authority provider.
*
* @return
* @return identifier for the authority provider
*/
String getIdentifier();
@ -41,12 +39,10 @@ public interface AuthorityProviderConfigurationContext {
Map<String, String> getProperties();
/**
* Retrieves the value the component currently understands for the given
* @param property to lookup the descriptor and value of
* @return the value the component currently understands for the given
* PropertyDescriptor. This method does not substitute default
* PropertyDescriptor values, so the value returned will be null if not set.
*
* @param property
* @return
* PropertyDescriptor values, so the value returned will be null if not set
*/
String getProperty(String property);
}

View File

@ -22,6 +22,7 @@ package org.apache.nifi.authorization;
public class DownloadAuthorization {
private static enum Result {
Approved,
Denied;
};
@ -32,10 +33,11 @@ public class DownloadAuthorization {
private final String explanation;
/**
* Creates a new DownloadAuthorization with the specified result and explanation.
* Creates a new DownloadAuthorization with the specified result and
* explanation.
*
* @param result
* @param explanation
* @param result of the authorization
* @param explanation for the authorization attempt
*/
private DownloadAuthorization(Result result, String explanation) {
if (Result.Denied.equals(result) && explanation == null) {
@ -47,37 +49,32 @@ public class DownloadAuthorization {
}
/**
* Whether or not the download request is approved.
*
* @return
* @return Whether or not the download request is approved
*/
public boolean isApproved() {
return Result.Approved.equals(result);
}
/**
* If the download request is denied, the reason why. Null otherwise.
*
* @return
* @return If the download request is denied, the reason why. Null otherwise
*/
public String getExplanation() {
return explanation;
}
/**
* Creates a new approved DownloadAuthorization.
*
* @return
* @return a new approved DownloadAuthorization
*/
public static DownloadAuthorization approved() {
return APPROVED;
}
/**
* Creates a new denied DownloadAuthorization with the specified explanation.
* Creates a new denied DownloadAuthorization with the specified
* explanation.
*
* @param explanation
* @return
* @param explanation for why it was denied
* @return a new denied DownloadAuthorization with the specified explanation
* @throws IllegalArgumentException if explanation is null
*/
public static DownloadAuthorization denied(String explanation) {

View File

@ -26,7 +26,6 @@ import java.lang.annotation.Target;
/**
*
*
* @author none
*/
@Documented
@Target({ElementType.FIELD, ElementType.METHOD})

View File

@ -19,7 +19,6 @@ package org.apache.nifi.authorization.exception;
/**
* Represents the exceptional case when an AuthorityProvider fails instantiated.
*
* @author unattributed
*/
public class ProviderCreationException extends RuntimeException {

View File

@ -19,7 +19,6 @@ package org.apache.nifi.authorization.exception;
/**
* Represents the exceptional case when an AuthorityProvider fails destruction.
*
* @author unattributed
*/
public class ProviderDestructionException extends RuntimeException {

View File

@ -46,11 +46,9 @@ public abstract class AbstractConfigurableComponent implements ConfigurableCompo
}
/**
* Returns a PropertyDescriptor for the name specified that is fully
* @param descriptorName to lookup the descriptor
* @return a PropertyDescriptor for the name specified that is fully
* populated
*
* @param descriptorName
* @return
*/
@Override
public final PropertyDescriptor getPropertyDescriptor(final String descriptorName) {
@ -141,11 +139,12 @@ public abstract class AbstractConfigurableComponent implements ConfigurableCompo
* method a processor may simply get the latest value whenever it needs it
* and if necessary lazily evaluate it.
*
* @param descriptor
* @param descriptor of the modified property
* @param oldValue non-null property value (previous)
* @param newValue the new property value or if null indicates the property
* was removed
*/
@Override
public void onPropertyModified(final PropertyDescriptor descriptor, final String oldValue, final String newValue) {
}
@ -168,7 +167,7 @@ public abstract class AbstractConfigurableComponent implements ConfigurableCompo
* <p>
* Default is null.
*
* @param propertyDescriptorName
* @param propertyDescriptorName used to lookup if any property descriptors exist for that name
* @return new property descriptor if supported
*/
protected PropertyDescriptor getSupportedDynamicPropertyDescriptor(final String propertyDescriptorName) {
@ -186,6 +185,7 @@ public abstract class AbstractConfigurableComponent implements ConfigurableCompo
return Collections.EMPTY_LIST;
}
@Override
public final List<PropertyDescriptor> getPropertyDescriptors() {
final List<PropertyDescriptor> supported = getSupportedPropertyDescriptors();
return supported == null ? Collections.<PropertyDescriptor>emptyList() : new ArrayList<>(supported);

View File

@ -33,7 +33,7 @@ public class AllowableValue {
* Constructs a new AllowableValue with the given value and and the same
* display name and no description.
*
* @param value
* @param value that is allowed
*/
public AllowableValue(final String value) {
this(value, value);
@ -43,8 +43,8 @@ public class AllowableValue {
* Constructs a new AllowableValue with the given value and display name and
* no description
*
* @param value
* @param displayName
* @param value that is allowed
* @param displayName to display for the value
*
* @throws NullPointerException if either argument is null
*/
@ -56,9 +56,9 @@ public class AllowableValue {
* Constructs a new AllowableValue with the given value, display name, and
* description
*
* @param value
* @param displayName
* @param description
* @param value that is valid
* @param displayName to show for the value
* @param description of the value
*
* @throws NullPointerException if identifier or value is null
*/
@ -69,40 +69,33 @@ public class AllowableValue {
}
/**
* Returns the value of this AllowableValue
*
* @return
* @return the value of this AllowableValue
*/
public String getValue() {
return value;
}
/**
* Returns a human-readable name for this AllowableValue
*
* @return
* @return a human-readable name for this AllowableValue
*/
public String getDisplayName() {
return displayName;
}
/**
* Returns a description for this value, or <code>null</code> if no
* @return a description for this value, or <code>null</code> if no
* description was provided
*
* @return
*/
public String getDescription() {
return description;
}
/**
* <code>this</code> is equal to <code>obj</code> of <code>obj</code> is the
* @return true if <code>this</code> is equal to <code>obj</code> of <code>obj</code> is the
* same object as <code>this</code> or if <code>obj</code> is an instance of
* <code>AllowableValue</code> and both have the same value, or if
* <code>obj</code> is a String and is equal to
* {@link #getValue() this.getValue()}.
* @return
*/
@Override
public boolean equals(final Object obj) {
@ -121,8 +114,7 @@ public class AllowableValue {
}
/**
* Hash Code is based solely off of the value
* @return
* @return based solely off of the value
*/
@Override
public int hashCode() {

View File

@ -27,7 +27,7 @@ public interface ConfigurableComponent {
* not included in the in the purposed configuration, the default value will
* be used.
*
* @param context
* @param context of validation
* @return Collection of validation result objects for any invalid findings
* only. If the collection is empty then the component is valid. Guaranteed
* non-null
@ -35,11 +35,9 @@ public interface ConfigurableComponent {
Collection<ValidationResult> validate(ValidationContext context);
/**
* Returns the PropertyDescriptor with the given name, if it exists;
* otherwise, returns <code>null</code>.
*
* @param name
* @return
* @param name to lookup the descriptor
* @return the PropertyDescriptor with the given name, if it exists;
* otherwise, returns <code>null</code>
*/
PropertyDescriptor getPropertyDescriptor(String name);
@ -51,7 +49,7 @@ public interface ConfigurableComponent {
* necessary lazily evaluate it. Any throwable that escapes this method will
* simply be ignored.
*
* @param descriptor
* @param descriptor the descriptor for the property being modified
* @param oldValue the value that was previously set, or null if no value
* was previously set for this property
* @param newValue the new property value or if null indicates the property
@ -68,10 +66,8 @@ public interface ConfigurableComponent {
List<PropertyDescriptor> getPropertyDescriptors();
/**
* Returns the unique identifier that the framework assigned to this
* @return the unique identifier that the framework assigned to this
* component
*
* @return
*/
String getIdentifier();
}

View File

@ -29,7 +29,6 @@ import org.apache.nifi.controller.ControllerService;
* An immutable object for holding information about a type of processor
* property.
*
* @author unattributed
*/
public final class PropertyDescriptor implements Comparable<PropertyDescriptor> {
@ -121,9 +120,9 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
* If this descriptor has a set of allowable values then the given value is
* only checked against the allowable values.
*
* @param input
* @param context
* @return
* @param input the value to validate
* @param context the context of validation
* @return the result of validating the input
*/
public ValidationResult validate(final String input, final ValidationContext context) {
ValidationResult lastResult = Validator.INVALID.validate(this.name, input, context);
@ -151,8 +150,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
}
final String serviceId = controllerService.getIdentifier();
if (!context.getControllerServiceLookup().isControllerServiceEnabled(serviceId) &&
!context.getControllerServiceLookup().isControllerServiceEnabling(serviceId)) {
if (!context.getControllerServiceLookup().isControllerServiceEnabled(serviceId)
&& !context.getControllerServiceLookup().isControllerServiceEnabling(serviceId)) {
return new ValidationResult.Builder()
.input(context.getControllerServiceLookup().getControllerServiceName(serviceId))
.subject(getName())
@ -235,8 +234,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
* This is beneficial because it allows a User Interface to represent
* the name differently.
*
* @param displayName
* @return
* @param displayName of the property
* @return the builder
*/
public Builder displayName(final String displayName) {
if (null != displayName) {
@ -249,8 +248,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
/**
* Sets the property name.
*
* @param name
* @return
* @param name of the property
* @return the builder
*/
public Builder name(final String name) {
if (null != name) {
@ -263,8 +262,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
* Sets the value indicating whether or not this Property will support
* the Attribute Expression Language.
*
* @param supported
* @return
* @param supported true if yes; false otherwise
* @return the builder
*/
public Builder expressionLanguageSupported(final boolean supported) {
this.expressionLanguageSupported = supported;
@ -272,9 +271,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
}
/**
*
* @param description
* @return
* @param description of the property
* @return the builder
*/
public Builder description(final String description) {
if (null != description) {
@ -294,8 +292,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
* should be set to the "Value" of the {@link AllowableValue} object
* (see {@link AllowableValue#getValue()}).
*
* @param value
* @return
* @param value default value
* @return the builder
*/
public Builder defaultValue(final String value) {
if (null != value) {
@ -310,9 +308,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
}
/**
*
* @param values
* @return
* @param values contrained set of values
* @return the builder
*/
public Builder allowableValues(final Set<String> values) {
if (null != values) {
@ -336,9 +333,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
}
/**
*
* @param values
* @return
* @param values constrained set of values
* @return the builder
*/
public Builder allowableValues(final String... values) {
if (null != values) {
@ -353,8 +349,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
/**
* Sets the Allowable Values for this Property
*
* @param values
* @return
* @param values contrained set of values
* @return the builder
*/
public Builder allowableValues(final AllowableValue... values) {
if (null != values) {
@ -364,9 +360,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
}
/**
*
* @param required
* @return
* @param required true if yes; false otherwise
* @return the builder
*/
public Builder required(final boolean required) {
this.required = required;
@ -374,9 +369,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
}
/**
*
* @param sensitive
* @return
* @param sensitive true if sensitive; false otherwise
* @return the builder
*/
public Builder sensitive(final boolean sensitive) {
this.sensitive = sensitive;
@ -384,9 +378,8 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
}
/**
*
* @param validator
* @return
* @param validator for the property
* @return the builder
*/
public Builder addValidator(final Validator validator) {
if (validator != null) {
@ -401,7 +394,7 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
*
* @param controllerServiceDefinition the interface that is implemented
* by the Controller Service
* @return
* @return the builder
*/
public Builder identifiesControllerService(final Class<? extends ControllerService> controllerServiceDefinition) {
if (controllerServiceDefinition != null) {
@ -525,7 +518,7 @@ public final class PropertyDescriptor implements Comparable<PropertyDescriptor>
* Constructs a validator that will check if the given value is in the
* given set.
*
* @param validValues
* @param validValues values which are acceptible
* @throws NullPointerException if the given validValues is null
*/
private ConstrainedSetValidator(final Collection<AllowableValue> validValues) {

View File

@ -89,25 +89,21 @@ public interface PropertyValue {
public Double asDataSize(DataUnit dataUnit);
/**
* Returns the ControllerService whose identifier is the raw value of
* @return the ControllerService whose identifier is the raw value of
* <code>this</code>, or <code>null</code> if either the value is not set or
* the value does not identify a ControllerService
*
* @return
*/
public ControllerService asControllerService();
/**
* Returns the ControllerService whose identifier is the raw value of the
* @param <T> the generic type of the controller service
* @param serviceType the class of the Controller Service
* @return the ControllerService whose identifier is the raw value of the
* <code>this</code>, or <code>null</code> if either the value is not set or
* the value does not identify a ControllerService. The object returned by
* this method is explicitly cast to type specified, if the type specified
* is valid. Otherwise, throws an IllegalArgumentException
*
* @param <T>
* @param serviceType
* @return
*
* @throws IllegalArgumentException if the value of <code>this</code> points
* to a ControllerService but that service is not of type
* <code>serviceType</code> or if <code>serviceType</code> references a
@ -116,11 +112,9 @@ public interface PropertyValue {
public <T extends ControllerService> T asControllerService(Class<T> serviceType) throws IllegalArgumentException;
/**
* Returns <code>true</code> if the user has configured a value, or if the
* @return <code>true</code> if the user has configured a value, or if the
* {@link PropertyDescriptor} for the associated property has a default
* value, <code>false</code> otherwise.
*
* @return
* value, <code>false</code> otherwise
*/
public boolean isSet();
@ -131,7 +125,8 @@ public interface PropertyValue {
* call chaining.
* </p>
*
* @return
* @return a PropertyValue with the new value is returned, supporting call
* chaining
*
* @throws ProcessException if the Query cannot be compiled or evaluating
* the query against the given attributes causes an Exception to be thrown
@ -145,8 +140,9 @@ public interface PropertyValue {
* call chaining.
* </p>
*
* @param flowFile
* @return
* @param flowFile to evaluate attributes of
* @return a PropertyValue with the new value is returned, supporting call
* chaining
*
* @throws ProcessException if the Query cannot be compiled or evaluating
* the query against the given attributes causes an Exception to be thrown
@ -161,8 +157,10 @@ public interface PropertyValue {
* supporting call chaining.
* </p>
*
* @param decorator
* @return
* @param decorator The supplied decorator is then given a chance to
* decorate the value
* @return a PropertyValue with the new value is then returned, supporting
* call chaining
*
* @throws ProcessException if the Query cannot be compiled or evaluating
* the query against the given attributes causes an Exception to be thrown
@ -177,10 +175,12 @@ public interface PropertyValue {
* supporting call chaining.
* </p>
*
* @param flowFile
* @param decorator
* @param flowFile to evaluate expressions against
* @param decorator The supplied decorator is then given a chance to
* decorate the value
*
* @return
* @return a PropertyValue with the new value is then returned, supporting
* call chaining
*
* @throws ProcessException if the Query cannot be compiled or evaluating
* the query against the given attributes causes an Exception to be thrown

View File

@ -25,86 +25,71 @@ import org.apache.nifi.expression.ExpressionLanguageCompiler;
public interface ValidationContext {
/**
* Returns the {@link ControllerServiceLookup} which can be used to obtain
* @return the {@link ControllerServiceLookup} which can be used to obtain
* Controller Services
*
* @return
*/
ControllerServiceLookup getControllerServiceLookup();
/**
* Returns a ValidationContext that is appropriate for validating the given
* @param controllerService to lookup the validation context of
* @return a ValidationContext that is appropriate for validating the given
* {@link ControllerService}
*
* @param controllerService
* @return
*/
ValidationContext getControllerServiceValidationContext(ControllerService controllerService);
/**
* Creates and returns a new {@link ExpressionLanguageCompiler} that can be
* used to compile & evaluate Attribute Expressions
*
* @return
* @return a new {@link ExpressionLanguageCompiler} that can be used to
* compile & evaluate Attribute Expressions
*/
ExpressionLanguageCompiler newExpressionLanguageCompiler();
/**
* Returns a PropertyValue that encapsulates the value configured for the
* @param property being validated
* @return a PropertyValue that encapsulates the value configured for the
* given PropertyDescriptor
*
* @param property
* @return
*/
PropertyValue getProperty(PropertyDescriptor property);
/**
* Returns a PropertyValue that represents the given value
*
* @param value
* @return
* @param value to make a PropertyValue object for
* @return a PropertyValue that represents the given value
*/
PropertyValue newPropertyValue(String value);
/**
* Returns a Map of all configured Properties.
*
* @return
* @return a Map of all configured Properties
*/
Map<PropertyDescriptor, String> getProperties();
/**
* Returns the currently configured Annotation Data
*
* @return
* @return the currently configured Annotation Data
*/
String getAnnotationData();
/**
* There are times when the framework needs to consider a component valid, even if it
* references an invalid ControllerService. This method will return <code>false</code>
* if the component is to be considered valid even if the given Controller Service is referenced
* and is invalid.
* @param service
* There are times when the framework needs to consider a component valid,
* even if it references an invalid ControllerService. This method will
* return <code>false</code> if the component is to be considered valid even
* if the given Controller Service is referenced and is invalid.
*
* @param service to check if validation is required
* @return <code>false</code> if the component is to be considered valid
* even if the given Controller Service is referenced and is invalid
*/
boolean isValidationRequired(ControllerService service);
/**
* Returns <code>true</code> if the given value contains a NiFi Expression Language expression,
* <code>false</code> if it does not
*
* @param value
* @return
* @param value to test whether expression language is present
* @return <code>true</code> if the given value contains a NiFi Expression
* Language expression, <code>false</code> if it does not
*/
boolean isExpressionLanguagePresent(String value);
/**
* Returns <code>true</code> if the property with the given name supports the NiFi Expression Language,
* <code>false</code> if the property does not support the Expression Language or is not a valid property
* name
*
* @param propertyName
* @return
* @param propertyName to test whether expression language is supported
* @return <code>true</code> if the property with the given name supports
* the NiFi Expression Language, <code>false</code> if the property does not
* support the Expression Language or is not a valid property name
*/
boolean isExpressionLanguageSupported(String propertyName);
}

View File

@ -22,7 +22,6 @@ import java.util.Objects;
*
* Immutable - thread safe
*
* @author unattributed
*/
public class ValidationResult {
@ -119,8 +118,8 @@ public class ValidationResult {
/**
* Defaults to false
*
* @param valid
* @return
* @param valid true if is valid; false otherwise
* @return the builder
*/
public Builder valid(final boolean valid) {
this.valid = valid;
@ -130,8 +129,8 @@ public class ValidationResult {
/**
* Defaults to empty string
*
* @param input
* @return
* @param input what was validated
* @return the builder
*/
public Builder input(final String input) {
if (null != input) {
@ -143,8 +142,8 @@ public class ValidationResult {
/**
* Defaults to empty string
*
* @param explanation
* @return
* @param explanation of validation result
* @return the builder
*/
public Builder explanation(final String explanation) {
if (null != explanation) {
@ -156,8 +155,8 @@ public class ValidationResult {
/**
* Defaults to empty string
*
* @param subject
* @return
* @param subject the thing that was validated
* @return the builder
*/
public Builder subject(final String subject) {
if (null != subject) {

View File

@ -18,7 +18,6 @@ package org.apache.nifi.components;
/**
*
* @author unattributed
*/
public interface Validator {

View File

@ -52,31 +52,25 @@ public abstract class AbstractControllerService extends AbstractConfigurableComp
}
/**
* Returns the currently configured value for the given
* @param descriptor to retrieve value of
* @return the currently configured value for the given
* {@link PropertyDescriptor}
*
* @param descriptor
* @return
*/
protected final PropertyValue getProperty(final PropertyDescriptor descriptor) {
return configContext.getProperty(descriptor);
}
/**
* Returns an unmodifiable map of all configured properties for this
* @return an unmodifiable map of all configured properties for this
* {@link ControllerService}
*
* @return
*/
protected final Map<PropertyDescriptor, String> getProperties() {
return configContext.getProperties();
}
/**
* Returns the {@link ControllerServiceLookup} that was passed to the
* @return the {@link ControllerServiceLookup} that was passed to the
* {@link #init(ProcessorInitializationContext)} method
*
* @return
*/
protected final ControllerServiceLookup getControllerServiceLookup() {
return serviceLookup;
@ -86,15 +80,15 @@ public abstract class AbstractControllerService extends AbstractConfigurableComp
* Provides a mechanism by which subclasses can perform initialization of
* the Reporting Task before it is scheduled to be run
*
* @param config
* @throws InitializationException
* @param config of initialization context
* @throws InitializationException if unable to init
*/
protected void init(final ControllerServiceInitializationContext config) throws InitializationException {
}
/**
* Returns the logger that has been provided to the component by the framework in its initialize method.
* @return
* @return the logger that has been provided to the component by the
* framework in its initialize method
*/
protected ComponentLog getLogger() {
return logger;

View File

@ -28,18 +28,14 @@ import org.apache.nifi.components.PropertyValue;
public interface ConfigurationContext {
/**
* Returns the configured value for the property with the given name
*
* @param property
* @return
* @param property to retrieve by name
* @return the configured value for the property with the given name
*/
PropertyValue getProperty(PropertyDescriptor property);
/**
* Returns an unmodifiable map of all configured properties for this
* @return an unmodifiable map of all configured properties for this
* {@link ControllerService}
*
* @return
*/
Map<PropertyDescriptor, String> getProperties();

View File

@ -75,7 +75,6 @@ import org.apache.nifi.reporting.ReportingTask;
* .build();
*
* ...
*
* public void onTrigger(ProcessContext context, ProcessSessionFactory sessionFactory) throws ProcessException {
* // Obtain the user-selected controller service
* final MyControllerServiceInterface service = context.getProperty(MY_PROPERTY).asControllerService( MyControllerServiceInterface.class );
@ -95,8 +94,7 @@ import org.apache.nifi.reporting.ReportingTask;
* <p>
* <code><pre>
* public void onTrigger(ProcessContext context, ProcessSessionFactory sessionFactory) throws ProcessException {
* final MyControllerServiceInterface service = (MyControllerServiceInterface)
* context.getControllerServiceLookup().getControllerService("service_identifier");
* final MyControllerServiceInterface service = (MyControllerServiceInterface) context.getControllerServiceLookup().getControllerService("service_identifier");
* }
* </pre></code></p>
* </li>
@ -174,8 +172,8 @@ public interface ControllerService extends ConfigurableComponent {
* throughout the life of the service. This method will be called before any
* properties are set
*
* @param context
* @throws org.apache.nifi.reporting.InitializationException
* @param context of initialization
* @throws org.apache.nifi.reporting.InitializationException if unable to init
*/
void initialize(ControllerServiceInitializationContext context) throws InitializationException;

View File

@ -21,26 +21,20 @@ import org.apache.nifi.logging.ComponentLog;
public interface ControllerServiceInitializationContext {
/**
* Returns the identifier associated with the {@link ControllerService} with
* @return the identifier associated with the {@link ControllerService} with
* which this context is associated
*
* @return
*/
String getIdentifier();
/**
* Returns the {@link ControllerServiceLookup} which can be used to obtain
* @return the {@link ControllerServiceLookup} which can be used to obtain
* Controller Services
*
* @return
*/
ControllerServiceLookup getControllerServiceLookup();
/**
* Returns a logger that can be used to log important events in a standard way and generate
* bulletins when appropriate
*
* @return
* @return a logger that can be used to log important events in a standard
* way and generate bulletins when appropriate
*/
ComponentLog getLogger();
}

View File

@ -18,68 +18,53 @@ package org.apache.nifi.controller;
import java.util.Set;
public interface ControllerServiceLookup {
/**
* Returns the ControllerService that is registered with the given
* @param serviceIdentifier of controller service
* @return the ControllerService that is registered with the given
* identifier
*
* @param serviceIdentifier
* @return
*/
ControllerService getControllerService(String serviceIdentifier);
/**
* Returns <code>true</code> if the Controller Service with the given
* @param serviceIdentifier identifier of service to check
* @return <code>true</code> if the Controller Service with the given
* identifier is enabled, <code>false</code> otherwise. If the given
* identifier is not known by this ControllerServiceLookup, returns
* <code>false</code>
*
* @param serviceIdentifier
* @return
*/
boolean isControllerServiceEnabled(String serviceIdentifier);
/**
* Returns <code>true</code> if the Controller Service with the given
* @param serviceIdentifier idenfitier of service to check
* @return <code>true</code> if the Controller Service with the given
* identifier has been enabled but is still in the transitioning state,
* otherwise returns <code>false</code>.
* If the given identifier is not known by this ControllerServiceLookup,
* returns <code>false</code>.
*
* @param serviceIdentifier
* @return
* otherwise returns <code>false</code>. If the given identifier is not
* known by this ControllerServiceLookup, returns <code>false</code>
*/
boolean isControllerServiceEnabling(String serviceIdentifier);
/**
* Returns <code>true</code> if the given Controller Service is enabled,
* @param service service to check
* @return <code>true</code> if the given Controller Service is enabled,
* <code>false</code> otherwise. If the given Controller Service is not
* known by this ControllerServiceLookup, returns <code>false</code>
*
* @param service
* @return
*/
boolean isControllerServiceEnabled(ControllerService service);
/**
* Returns the set of all Controller Service Identifiers whose Controller
* Service is of the given type. The class specified MUST be an interface,
* or an IllegalArgumentExcption will be thrown
*
* @param serviceType
* @return
*
* @param serviceType type of service to get identifiers for
* @return the set of all Controller Service Identifiers whose Controller
* Service is of the given type.
* @throws IllegalArgumentException if the given class is not an interface
*/
Set<String> getControllerServiceIdentifiers(Class<? extends ControllerService> serviceType) throws IllegalArgumentException;
/**
* Returns the name of the Controller service with the given identifier. If no service can be
* found with this identifier, returns {@code null}.
* @param serviceIdentifier
* @return
* @param serviceIdentifier identifier to look up
* @return the name of the Controller service with the given identifier. If
* no service can be found with this identifier, returns {@code null}
*/
String getControllerServiceName(String serviceIdentifier);
}

View File

@ -40,10 +40,8 @@ public interface FlowFileQueue {
List<FlowFilePrioritizer> getPriorities();
/**
* Returns the minimum number of FlowFiles that must be present in order for
* @return the minimum number of FlowFiles that must be present in order for
* FlowFiles to begin being swapped out of the queue
*
* @return
*/
int getSwapThreshold();
@ -71,9 +69,7 @@ public interface FlowFileQueue {
long getBackPressureObjectThreshold();
/**
* Establishes this queue's preferred maximum data size.
*
* @param maxDataSize
* @param maxDataSize Establishes this queue's preferred maximum data size.
*/
void setBackPressureDataSizeThreshold(String maxDataSize);
@ -117,21 +113,21 @@ public interface FlowFileQueue {
/**
* places the given file into the queue
*
* @param file
* @param file to place into queue
*/
void put(FlowFileRecord file);
/**
* places the given files into the queue
*
* @param files
* @param files to place into queue
*/
void putAll(Collection<FlowFileRecord> files);
/**
* Removes all records from the internal swap queue and returns them.
*
* @return
* @return all removed records from internal swap queue
*/
List<FlowFileRecord> pollSwappableRecords();
@ -139,7 +135,7 @@ public interface FlowFileQueue {
* Restores the records from swap space into this queue, adding the records
* that have expired to the given set instead of enqueuing them.
*
* @param records
* @param records that were swapped in
*/
void putSwappedRecords(Collection<FlowFileRecord> records);
@ -147,15 +143,13 @@ public interface FlowFileQueue {
* Updates the internal counters of how much data is queued, based on
* swapped data that is being restored.
*
* @param numRecords
* @param contentSize
* @param numRecords count of records swapped in
* @param contentSize total size of records being swapped in
*/
void incrementSwapCount(int numRecords, long contentSize);
/**
* Returns the number of FlowFiles that are enqueued and not swapped
*
* @return
* @return the number of FlowFiles that are enqueued and not swapped
*/
int unswappedSize();
@ -164,14 +158,14 @@ public interface FlowFileQueue {
int getSwapQueueSize();
/**
* @param expiredRecords
* @param expiredRecords expired records
* @return the next flow file on the queue; null if empty
*/
FlowFileRecord poll(Set<FlowFileRecord> expiredRecords);
/**
* @param maxResults
* @param expiredRecords
* @param maxResults limits how many results can be polled
* @param expiredRecords for expired records
* @return the next flow files on the queue up to the max results; null if
* empty
*/
@ -181,10 +175,10 @@ public interface FlowFileQueue {
* Drains flow files from the given source queue into the given destination
* list.
*
* @param sourceQueue
* @param destination
* @param sourceQueue queue to drain from
* @param destination Collection to drain to
* @param maxResults max number to drain
* @param expiredRecords
* @param expiredRecords for expired records
* @return size (bytes) of flow files drained from queue
*/
long drainQueue(Queue<FlowFileRecord> sourceQueue, List<FlowFileRecord> destination, int maxResults, Set<FlowFileRecord> expiredRecords);

View File

@ -24,89 +24,65 @@ import java.util.Set;
public interface Snippet {
/**
* The id of this snippet.
*
* @return
* @return id of this snippet
*/
public String getId();
/**
* Whether or not this snippet is linked to the data flow. If the Snippet is
* @return Whether or not this snippet is linked to the data flow. If the Snippet is
* deleted and is linked, then the underlying components will also be
* deleted. If the Snippet is deleted and is NOT linked, only the Snippet is
* removed
*
* @return
*/
public boolean isLinked();
/**
* The parent group id of the components in this snippet.
*
* @return
* @return parent group id of the components in this snippet
*/
public String getParentGroupId();
/**
* The connections in this snippet.
*
* @return
* @return connections in this snippet
*/
public Set<String> getConnections();
/**
* The funnels in this snippet.
*
* @return
* @return funnels in this snippet
*/
public Set<String> getFunnels();
/**
* The input ports in this snippet.
*
* @return
* @return input ports in this snippet
*/
public Set<String> getInputPorts();
/**
* The output ports in this snippet.
*
* @return
* @return output ports in this snippet
*/
public Set<String> getOutputPorts();
/**
* The labels in this snippet.
*
* @return
* @return labels in this snippet
*/
public Set<String> getLabels();
/**
* Returns the identifiers of all ProcessGroups in this Snippet
*
* @return
* @return the identifiers of all ProcessGroups in this Snippet
*/
public Set<String> getProcessGroups();
/**
* Returns the identifiers of all Processors in this Snippet
*
* @return
* @return the identifiers of all Processors in this Snippet
*/
public Set<String> getProcessors();
/**
* Returns the identifiers of all RemoteProcessGroups in this Snippet
*
* @return
* @return the identifiers of all RemoteProcessGroups in this Snippet
*/
public Set<String> getRemoteProcessGroups();
/**
* Determines if this snippet is empty.
*
* @return
* @return Determines if this snippet is empty
*/
public boolean isEmpty();

View File

@ -44,9 +44,9 @@ public interface Triggerable {
* be committed or the framework may use the session again for another
* processor down stream</p>
*
* @param context
* @param sessionFactory used to generate {@link ProcessSession}s to use
* for operating on flow files within the repository
* @param context in which the component is triggered
* @param sessionFactory used to generate {@link ProcessSession}s to use for
* operating on flow files within the repository
*
* @throws ProcessException if processing did not complete normally though
* indicates the problem is an understood potential outcome of processing.
@ -81,7 +81,7 @@ public interface Triggerable {
* <code>Triggerable</code> has any active threads, see
* {@link ProcessScheduler#getActiveThreadCount(nifi.connectable.Connectable)}.
*
* @return
* @return the schedule state
*/
ScheduledState getScheduledState();
@ -92,12 +92,12 @@ public interface Triggerable {
* invocation of {@link #onTrigger(ProcessContext, ProcessSessionFactory)}
* have not yet returned
*
* @return
* @return true if running;false otherwise
*/
boolean isRunning();
/**
* @param timeUnit
* @param timeUnit for the scheduling period of the component
* @return the amount of time between each scheduling period
*/
long getSchedulingPeriod(TimeUnit timeUnit);
@ -110,7 +110,8 @@ public interface Triggerable {
/**
* Updates how often this Triggerable should be triggered to run
* @param schedulingPeriod
*
* @param schedulingPeriod to set
*/
void setScheduldingPeriod(String schedulingPeriod);
}

View File

@ -30,9 +30,9 @@ import java.lang.annotation.Target;
* arguments or a single argument of type
* {@link nifi.controller.ConfigurationContext ConfigurationContext}.
*
* @author none
*
* @deprecated This annotation has been replaced by those in the {@link org.apache.nifi.annotation.lifecycle} package.
* @deprecated This annotation has been replaced by those in the
* {@link org.apache.nifi.annotation.lifecycle} package.
*/
@Documented
@Target({ElementType.METHOD})

View File

@ -31,7 +31,6 @@ import org.apache.nifi.controller.repository.claim.ContentClaimManager;
* available on the methods but a merge capability is provided which between
* that and creating new claims a merge is available.
*
* @author none
*/
public interface ContentRepository {
@ -40,46 +39,38 @@ public interface ContentRepository {
* ContentClaimManager that is to be used for interacting with Content
* Claims
*
* @param claimManager
* @throws java.io.IOException
* @param claimManager to handle claims
* @throws java.io.IOException if unable to init
*/
void initialize(ContentClaimManager claimManager) throws IOException;
/**
* Shuts down the Content Repository, freeing any resources that may be held.
* This is called when an administrator shuts down NiFi.
* Shuts down the Content Repository, freeing any resources that may be
* held. This is called when an administrator shuts down NiFi.
*/
void shutdown();
/**
* Returns the names of all Containers that exist for this Content
* @return the names of all Containers that exist for this Content
* Repository
*
* @return
*/
Set<String> getContainerNames();
/**
* Returns the maximum number of bytes that can be stored in the storage
* @param containerName name of container to check capacity on
* @return the maximum number of bytes that can be stored in the storage
* mechanism that backs the container with the given name
*
* @param containerName
* @return
* @throws java.io.IOException
*
* @throws java.io.IOException if unable to check capacity
* @throws IllegalArgumentException if no container exists with the given
* name
*/
long getContainerCapacity(String containerName) throws IOException;
/**
* Returns the number of bytes available to be used used by the storage
* @param containerName to check space on
* @return the number of bytes available to be used used by the storage
* mechanism that backs the container with the given name
*
* @param containerName
* @return
* @throws java.io.IOException
*
* @throws java.io.IOException if unable to check space
* @throws IllegalArgumentException if no container exists with the given
* name
*/
@ -92,14 +83,14 @@ public interface ContentRepository {
* loss tolerant. If true the repository might choose more volatile storage
* options which could increase performance for a tradeoff with reliability
* @return newly created claim
* @throws java.io.IOException
* @throws java.io.IOException if unable to create claim
*/
ContentClaim create(boolean lossTolerant) throws IOException;
/**
* Increments the number of claimants for the given claim
*
* @param claim
* @param claim to increment
* @return the number of claimants after incrementing
*/
int incrementClaimaintCount(ContentClaim claim);
@ -107,7 +98,7 @@ public interface ContentRepository {
/**
* Obtains the current number of claimants for the given claim
*
* @param claim
* @param claim to get count of
* @return the number of claimants
*/
int getClaimantCount(ContentClaim claim);
@ -117,15 +108,15 @@ public interface ContentRepository {
* claim is null or content cannot be found or removed no exception will be
* thrown.
*
* @param claim
* @return
* @param claim to decrement
* @return new claimant count for the given claim
*/
int decrementClaimantCount(ContentClaim claim);
/**
* Removes the content indicated by the given claim
*
* @param claim
* @param claim to remove
*
* @return a boolean indicating whether or not the destruction of the claim
* was successful
@ -136,9 +127,9 @@ public interface ContentRepository {
* Clones the content for the given content claim and returns content claim
* of the new object
*
* @param original
* @param lossTolerant
* @return
* @param original to clone
* @param lossTolerant if can be place in a loss tolerant repository
* @return new claim
* @throws IOException if an IO error occurs. Any content written to the new
* destination prior to the error will be destroyed
*/
@ -156,7 +147,7 @@ public interface ContentRepository {
* @param footer if supplied will be appended to the output
* @param demarcator if supplied will be placed in between each merged
* object
* @throws IOException
* @throws IOException if unable to merge
* @throws IllegalArgumentException if the given destination is included in
* the given claims
*/
@ -167,9 +158,9 @@ public interface ContentRepository {
* claim within the repository.
*
* @return the size of the claim
* @param content
* @param content to import from
* @param claim the claim to write imported content to
* @throws IOException
* @throws IOException if failure to read given content
*/
long importFrom(Path content, ContentClaim claim) throws IOException;
@ -179,11 +170,11 @@ public interface ContentRepository {
* argument
*
* @return the size of the claim
* @param content
* @param content to import from
* @param claim the claim to write imported content to
* @param append if true, the content will be appended to the claim; if
* false, the content will replace the contents of the claim
* @throws IOException
* @throws IOException if unable to read content
*/
long importFrom(Path content, ContentClaim claim, boolean append) throws IOException;
@ -192,9 +183,9 @@ public interface ContentRepository {
* claim within the repository.
*
* @return the size of the claim
* @param content
* @param content to import from
* @param claim the claim to write imported content to
* @throws IOException
* @throws IOException if unable to read content
*/
long importFrom(InputStream content, ContentClaim claim) throws IOException;
@ -202,11 +193,11 @@ public interface ContentRepository {
* Imports content from the given stream, appending or replacing the current
* claim, according to the value of the appen dargument
*
* @param content
* @param claim
* @param append
* @return
* @throws IOException
* @param content to import from
* @param claim to write to
* @param append whether to append or replace
* @return length of data imported in bytes
* @throws IOException if failure to read or write stream
*/
long importFrom(InputStream content, ContentClaim claim, boolean append) throws IOException;
@ -214,7 +205,7 @@ public interface ContentRepository {
* Exports the content of the given claim to the given destination.
*
* @return the size of the destination or the claim
* @param claim
* @param claim to export from
* @param destination where to export data
* @param append if true appends to the destination; false overwrites
* @throws IOException if an IO error occurs. The state of the content for
@ -227,7 +218,7 @@ public interface ContentRepository {
* Exports the content of the given claim to the given destination.
*
* @return the size of the destination or the claim
* @param claim
* @param claim to export from
* @param destination where to export data
* @param append if true appends to the destination; false overwrites
* @param offset the offset at which the claim should start being copied
@ -242,7 +233,7 @@ public interface ContentRepository {
* Exports the content of the given claim to the given destination.
*
* @return the size of the claim
* @param claim
* @param claim to export from
* @param destination where to export data
* @throws IOException if an IO error occurs.
*/
@ -253,7 +244,7 @@ public interface ContentRepository {
* and copying length bytes, to the given destination.
*
* @return the number of bytes copied
* @param claim
* @param claim to export from
* @param destination where to export data
* @param offset the offset into the claim at which the copy should begin
* @param length the number of bytes to copy
@ -262,27 +253,27 @@ public interface ContentRepository {
long exportTo(ContentClaim claim, OutputStream destination, long offset, long length) throws IOException;
/**
* @param claim
* @param claim to get size of
* @return size in bytes of content for given claim
* @throws IOException
* @throws IOException if size check failed
*/
long size(ContentClaim claim) throws IOException;
/**
* Provides access to the input stream for the given claim
*
* @param claim
* @param claim to read from
* @return InputStream over the content of the given claim
* @throws IOException
* @throws IOException if unable to read
*/
InputStream read(ContentClaim claim) throws IOException;
/**
* Obtains an OutputStream to the content for the given claim.
*
* @param claim
* @return
* @throws IOException
* @param claim to write to
* @return the stream to write to
* @throws IOException if unable to obtain stream
*/
OutputStream write(ContentClaim claim) throws IOException;
@ -300,15 +291,13 @@ public interface ContentRepository {
void cleanup();
/**
* Returns a boolean indicating whether or not the content specified by the
* given claim can be read, regardless of whether the content has been
* archived or not. If the ContentRepository does not implement archiving
* capabilities, this method will return <code>false</code>.
*
* @param contentClaim the Content Claim to check
* @return
* @return Returns a boolean indicating whether or not the content specified
* by the given claim can be read, regardless of whether the content has
* been archived or not. If the ContentRepository does not implement
* archiving capabilities, this method will return <code>false</code>
*
* @throws IOException
* @throws IOException if unable to determine accessibility
*/
boolean isAccessible(ContentClaim contentClaim) throws IOException;
}

View File

@ -27,28 +27,22 @@ import org.apache.nifi.flowfile.FlowFile;
public interface FlowFileRecord extends FlowFile {
/**
* Returns the time (in millis since epoch) at which this FlowFile should no
* longer be penalized.
*
* @return
* @return the time (in millis since epoch) at which this FlowFile should no
* longer be penalized
*/
long getPenaltyExpirationMillis();
/**
* Returns the {@link ContentClaim} that holds the FlowFile's content
*
* @return
* @return the {@link ContentClaim} that holds the FlowFile's content
*/
ContentClaim getContentClaim();
/**
* Returns the byte offset into the {@link ContentClaim} at which the
* @return the byte offset into the {@link ContentClaim} at which the
* FlowFile's content occurs. This mechanism allows multiple FlowFiles to
* have the same ContentClaim, which can be significantly more efficient for
* some implementations of
* {@link nifi.controller.repository.ContentRepository ContentRepository}
*
* @return
*/
long getContentClaimOffset();
}

View File

@ -27,7 +27,6 @@ import org.apache.nifi.controller.repository.claim.ContentClaimManager;
/**
* Implementations must be thread safe
*
* @author none
*/
public interface FlowFileRepository extends Closeable {
@ -36,28 +35,24 @@ public interface FlowFileRepository extends Closeable {
* ContentClaimManager that is to be used for interacting with Content
* Claims
*
* @param claimManager
* @throws java.io.IOException
* @param claimManager for handling claims
* @throws java.io.IOException if unable to initialize repository
*/
void initialize(ContentClaimManager claimManager) throws IOException;
/**
* Returns the maximum number of bytes that can be stored in the underlying
* @return the maximum number of bytes that can be stored in the underlying
* storage mechanism
*
* @return
*
* @throws IOException
* @throws IOException if computing capacity fails
*/
long getStorageCapacity() throws IOException;
/**
* Returns the number of bytes currently available for use by the underlying
* @return the number of bytes currently available for use by the underlying
* storage mechanism
*
* @return
*
* @throws IOException
* @throws IOException if computing usable space fails
*/
long getUsableStorageSpace() throws IOException;
@ -65,7 +60,7 @@ public interface FlowFileRepository extends Closeable {
* Updates the repository with the given RepositoryRecords.
*
* @param records the records to update the repository with
* @throws java.io.IOException
* @throws java.io.IOException if update fails
*/
void updateRepository(Collection<RepositoryRecord> records) throws IOException;
@ -79,7 +74,7 @@ public interface FlowFileRepository extends Closeable {
* returned by a call to {@link #getNextFlowFileSequence()}
*
* @return index of highest flow file identifier
* @throws IOException
* @throws IOException if load fails
*/
long loadFlowFiles(QueueProvider queueProvider, long minimumSequenceNumber) throws IOException;
@ -97,7 +92,7 @@ public interface FlowFileRepository extends Closeable {
/**
* @return the max ID of all <code>FlowFile</code>s that currently exist in
* the repository.
* @throws IOException
* @throws IOException if computing max identifier fails
*/
long getMaxFlowFileIdentifier() throws IOException;
@ -109,7 +104,7 @@ public interface FlowFileRepository extends Closeable {
* @param flowFileQueue the queue that the FlowFiles belong to
* @param swapLocation the location to which the FlowFiles were swapped
*
* @throws IOException
* @throws IOException if swap fails
*/
void swapFlowFilesOut(List<FlowFileRecord> swappedOut, FlowFileQueue flowFileQueue, String swapLocation) throws IOException;
@ -122,7 +117,7 @@ public interface FlowFileRepository extends Closeable {
* @param flowFileRecords the records that were swapped in
* @param flowFileQueue the queue that the FlowFiles belong to
*
* @throws IOException
* @throws IOException if swap fails
*/
void swapFlowFilesIn(String swapLocation, List<FlowFileRecord> flowFileRecords, FlowFileQueue flowFileQueue) throws IOException;
}

View File

@ -55,9 +55,9 @@ public interface FlowFileSwapManager {
* Notifies FlowFile queues of the number of FlowFiles and content size of
* all FlowFiles that are currently swapped out
*
* @param connectionProvider
* @param claimManager
* @return
* @param connectionProvider provider
* @param claimManager manager
* @return how many flowfiles have been recovered
*/
long recoverSwappedFlowFiles(QueueProvider connectionProvider, ContentClaimManager claimManager);
}

View File

@ -27,9 +27,7 @@ import org.apache.nifi.controller.FlowFileQueue;
public interface QueueProvider {
/**
* Returns all <code>FlowFileQueue</code>s that currently exist in the flow
*
* @return
* @return all <code>FlowFileQueue</code>s that currently exist in the flow
*/
Collection<FlowFileQueue> getAllQueues();
}

View File

@ -26,60 +26,44 @@ import org.apache.nifi.controller.repository.claim.ContentClaim;
public interface RepositoryRecord {
/**
* The FlowFileQueue to which the FlowFile is to be transferred
*
* @return
* @return FlowFileQueue to which the FlowFile is to be transferred
*/
FlowFileQueue getDestination();
/**
* The FlowFileQueue from which the record was pulled
*
* @return
* @return FlowFileQueue from which the record was pulled
*/
FlowFileQueue getOriginalQueue();
/**
* The type of update that this record encapsulates
*
* @return
* @return type of update that this record encapsulates
*/
RepositoryRecordType getType();
/**
* The current ContentClaim for the FlowFile
*
* @return
* @return current ContentClaim for the FlowFile
*/
ContentClaim getCurrentClaim();
/**
* The original ContentClaim for the FlowFile before any changes were made
*
* @return
* @return original ContentClaim for the FlowFile before any changes were made
*/
ContentClaim getOriginalClaim();
/**
* The byte offset into the Content Claim where this FlowFile's content
* @return byte offset into the Content Claim where this FlowFile's content
* begins
*
* @return
*/
long getCurrentClaimOffset();
/**
* The FlowFile being encapsulated by this record
*
* @return
* @return FlowFile being encapsulated by this record
*/
FlowFileRecord getCurrent();
/**
* Whether or not the FlowFile's attributes have changed since the FlowFile
* @return Whether or not the FlowFile's attributes have changed since the FlowFile
* was pulled from its queue (or created)
*
* @return
*/
boolean isAttributesChanged();
@ -90,11 +74,9 @@ public interface RepositoryRecord {
boolean isMarkedForAbort();
/**
* If the FlowFile is swapped out of the Java heap space, provides the
* @return If the FlowFile is swapped out of the Java heap space, provides the
* location of the swap file, or <code>null</code> if the FlowFile is not
* swapped out
*
* @return
*/
String getSwapLocation();
}

View File

@ -18,7 +18,6 @@ package org.apache.nifi.controller.repository;
/**
*
* @author none
*/
public enum RepositoryRecordType {

View File

@ -25,7 +25,6 @@ package org.apache.nifi.controller.repository.claim;
* <p>
* Must be thread safe</p>
*
* @author none
*/
public interface ContentClaim extends Comparable<ContentClaim> {
@ -45,11 +44,9 @@ public interface ContentClaim extends Comparable<ContentClaim> {
String getSection();
/**
* Specifies whether or not the Claim is loss-tolerant. If so, we will
* @return Indicates whether or not the Claim is loss-tolerant. If so, we will
* attempt to keep the content but will not sacrifice a great deal of
* performance to do so.
*
* @return
* performance to do so
*/
boolean isLossTolerant();
}

View File

@ -28,20 +28,18 @@ public interface ContentClaimManager {
* Creates a new Content Claim with the given id, container, section, and
* loss tolerance.
*
* @param id
* @param container
* @param section
* @param lossTolerant
* @return
* @param id of claim
* @param container of claim
* @param section of claim
* @param lossTolerant of claim
* @return new claim
*/
ContentClaim newContentClaim(String container, String section, String id, boolean lossTolerant);
/**
* Returns the number of FlowFiles that hold a claim to a particular piece
* @param claim to obtain reference count for
* @return the number of FlowFiles that hold a claim to a particular piece
* of FlowFile content
*
* @param claim
* @return
*/
int getClaimantCount(ContentClaim claim);
@ -49,8 +47,8 @@ public interface ContentClaimManager {
* Decreases by 1 the count of how many FlowFiles hold a claim to a
* particular piece of FlowFile content and returns the new count
*
* @param claim
* @return
* @param claim to decrement claimants on
* @return new claimaint count
*/
int decrementClaimantCount(ContentClaim claim);
@ -58,8 +56,8 @@ public interface ContentClaimManager {
* Increases by 1 the count of how many FlowFiles hold a claim to a
* particular piece of FlowFile content and returns the new count
*
* @param claim
* @return
* @param claim to increment claims on
* @return new claimant count
*/
int incrementClaimantCount(ContentClaim claim);
@ -73,9 +71,10 @@ public interface ContentClaimManager {
* optimize its tasks, knowing that the Content Claim cannot be referenced
* by any other component
*
* @param claim
* @param newClaim
* @return
* @param claim to increment
* @param newClaim provides a hint that no other process can have access to this
* claim right now
* @return new claim count
*/
int incrementClaimantCount(ContentClaim claim, boolean newClaim);
@ -105,7 +104,7 @@ public interface ContentClaimManager {
* unneeded claim. As such, it is now safe to destroy the contents.
* </p>
*
* @param claim
* @param claim to mark as now destructable
*/
void markDestructable(ContentClaim claim);
@ -114,8 +113,8 @@ public interface ContentClaimManager {
* of destructable content claims to the given {@code destination} so that
* they can be destroyed.
*
* @param destination
* @param maxElements
* @param destination to drain to
* @param maxElements max items to drain
*/
void drainDestructableClaims(Collection<ContentClaim> destination, int maxElements);
@ -128,10 +127,10 @@ public interface ContentClaimManager {
* ready to be destroyed, the method will return without having added
* anything to the given {@code destination}.
*
* @param destination
* @param maxElements
* @param timeout
* @param unit
* @param destination to drain to
* @param maxElements max items to drain
* @param timeout maximum time to wait
* @param unit unit of time to wait
*/
void drainDestructableClaims(Collection<ContentClaim> destination, int maxElements, long timeout, TimeUnit unit);

View File

@ -17,7 +17,6 @@
package org.apache.nifi.controller.status;
/**
* @author unattributed
*/
public class ConnectionStatus implements Cloneable {

View File

@ -23,7 +23,6 @@ import java.util.List;
import java.util.Map;
/**
* @author unattributed
*/
public class ProcessGroupStatus implements Cloneable {
@ -43,6 +42,8 @@ public class ProcessGroupStatus implements Cloneable {
private long bytesReceived;
private int flowFilesSent;
private long bytesSent;
private int flowFilesTransferred;
private long bytesTransferred;
private Collection<ConnectionStatus> connectionStatus = new ArrayList<>();
private Collection<ProcessorStatus> processorStatus = new ArrayList<>();
@ -227,6 +228,22 @@ public class ProcessGroupStatus implements Cloneable {
this.bytesSent = bytesSent;
}
public int getFlowFilesTransferred() {
return flowFilesTransferred;
}
public void setFlowFilesTransferred(int flowFilesTransferred) {
this.flowFilesTransferred = flowFilesTransferred;
}
public long getBytesTransferred() {
return bytesTransferred;
}
public void setBytesTransferred(long bytesTransferred) {
this.bytesTransferred = bytesTransferred;
}
@Override
public ProcessGroupStatus clone() {
@ -248,6 +265,8 @@ public class ProcessGroupStatus implements Cloneable {
clonedObj.bytesReceived = bytesReceived;
clonedObj.flowFilesSent = flowFilesSent;
clonedObj.bytesSent = bytesSent;
clonedObj.flowFilesTransferred = flowFilesTransferred;
clonedObj.bytesTransferred = bytesTransferred;
if (connectionStatus != null) {
final Collection<ConnectionStatus> statusList = new ArrayList<>();
@ -317,6 +336,18 @@ public class ProcessGroupStatus implements Cloneable {
builder.append(creationTimestamp);
builder.append(", activeThreadCount=");
builder.append(activeThreadCount);
builder.append(", flowFilesTransferred=");
builder.append(flowFilesTransferred);
builder.append(", bytesTransferred=");
builder.append(bytesTransferred);
builder.append(", flowFilesReceived=");
builder.append(flowFilesReceived);
builder.append(", bytesReceived=");
builder.append(bytesReceived);
builder.append(", flowFilesSent=");
builder.append(flowFilesSent);
builder.append(", bytesSent=");
builder.append(bytesSent);
builder.append(",\n\tconnectionStatus=");
for (final ConnectionStatus status : connectionStatus) {
@ -374,6 +405,12 @@ public class ProcessGroupStatus implements Cloneable {
target.setBytesRead(target.getBytesRead() + toMerge.getBytesRead());
target.setBytesWritten(target.getBytesWritten() + toMerge.getBytesWritten());
target.setActiveThreadCount(target.getActiveThreadCount() + toMerge.getActiveThreadCount());
target.setFlowFilesTransferred(target.getFlowFilesTransferred() + toMerge.getFlowFilesTransferred());
target.setBytesTransferred(target.getBytesTransferred() + toMerge.getBytesTransferred());
target.setFlowFilesReceived(target.getFlowFilesReceived() + toMerge.getFlowFilesReceived());
target.setBytesReceived(target.getBytesReceived() + toMerge.getBytesReceived());
target.setFlowFilesSent(target.getFlowFilesSent() + toMerge.getFlowFilesSent());
target.setBytesSent(target.getBytesSent() + toMerge.getBytesSent());
// connection status
// sort by id

View File

@ -19,7 +19,6 @@ package org.apache.nifi.controller.status;
import java.util.concurrent.TimeUnit;
/**
* @author unattributed
*/
public class ProcessorStatus implements Cloneable {

View File

@ -33,7 +33,7 @@ public interface ComponentStatusRepository {
/**
* Captures the status information provided in the given report
*
* @param rootGroupStatus
* @param rootGroupStatus status of root group
*/
void capture(ProcessGroupStatus rootGroupStatus);
@ -42,22 +42,17 @@ public interface ComponentStatusRepository {
* timestamp that indicates the time at which the status report was
* generated. This can be used to replay historical values.
*
* @param rootGroupStatus
* @param timestamp
* @param rootGroupStatus status
* @param timestamp timestamp of capture
*/
void capture(ProcessGroupStatus rootGroupStatus, Date timestamp);
/**
* Returns the Date at which the latest capture was performed
*
* @return
* @return the Date at which the latest capture was performed
*/
Date getLastCaptureDate();
/**
* Returns a {@link StatusHistory} that provides the status information
* about the Connection with the given ID during the given time period.
*
* @param connectionId the ID of the Connection for which the Status is
* desired
* @param start the earliest date for which status information should be
@ -70,15 +65,13 @@ public interface ComponentStatusRepository {
* If the date range is large, the total number of data points could be far
* too many to process. Therefore, this parameter allows the requestor to
* indicate how many samples to return.
* @return
* @return a {@link StatusHistory} that provides the status information
* about the Connection with the given ID during the given time period
*/
StatusHistory getConnectionStatusHistory(String connectionId, Date start, Date end, int preferredDataPoints);
/**
* Returns a {@link StatusHistory} that provides the status information
* about the Process Group with the given ID during the given time period.
*
* @param processGroupId
* @param processGroupId of group to get status of
* @param start the earliest date for which status information should be
* returned; if <code>null</code>, the start date should be assumed to be
* the beginning of time
@ -89,15 +82,13 @@ public interface ComponentStatusRepository {
* If the date range is large, the total number of data points could be far
* too many to process. Therefore, this parameter allows the requestor to
* indicate how many samples to return.
* @return
* @return a {@link StatusHistory} that provides the status information
* about the Process Group with the given ID during the given time period
*/
StatusHistory getProcessGroupStatusHistory(String processGroupId, Date start, Date end, int preferredDataPoints);
/**
* Returns a {@link StatusHistory} that provides the status information
* about the Processor with the given ID during the given time period.
*
* @param processorId
* @param processorId to get status of
* @param start the earliest date for which status information should be
* returned; if <code>null</code>, the start date should be assumed to be
* the beginning of time
@ -108,16 +99,13 @@ public interface ComponentStatusRepository {
* If the date range is large, the total number of data points could be far
* too many to process. Therefore, this parameter allows the requestor to
* indicate how many samples to return.
* @return
* @return a {@link StatusHistory} that provides the status information
* about the Processor with the given ID during the given time period
*/
StatusHistory getProcessorStatusHistory(String processorId, Date start, Date end, int preferredDataPoints);
/**
* Returns a {@link StatusHistory} that provides the status information
* about the Remote Process Group with the given ID during the given time
* period.
*
* @param remoteGroupId
* @param remoteGroupId to get history of
* @param start the earliest date for which status information should be
* returned; if <code>null</code>, the start date should be assumed to be
* the beginning of time
@ -128,39 +116,33 @@ public interface ComponentStatusRepository {
* If the date range is large, the total number of data points could be far
* too many to process. Therefore, this parameter allows the requestor to
* indicate how many samples to return.
* @return
* @return a {@link StatusHistory} that provides the status information
* about the Remote Process Group with the given ID during the given time
* period
*/
StatusHistory getRemoteProcessGroupStatusHistory(String remoteGroupId, Date start, Date end, int preferredDataPoints);
/**
* Returns a List of all {@link MetricDescriptor}s that are applicable to
* @return a List of all {@link MetricDescriptor}s that are applicable to
* Process Groups
*
* @return
*/
List<MetricDescriptor<ProcessGroupStatus>> getProcessGroupMetricDescriptors();
/**
* Returns a List of all {@link MetricDescriptor}s that are applicable to
* @return a List of all {@link MetricDescriptor}s that are applicable to
* Processors
*
* @return
*/
List<MetricDescriptor<ProcessorStatus>> getProcessorMetricDescriptors();
/**
* Returns a List of all {@link MetricDescriptor}s that are applicable to
* @return a List of all {@link MetricDescriptor}s that are applicable to
* Remote Process Groups
*
* @return
*/
List<MetricDescriptor<RemoteProcessGroupStatus>> getRemoteProcessGroupMetricDescriptors();
/**
* Returns a List of all {@link MetricDescriptor}s that are applicable to
* @return a List of all {@link MetricDescriptor}s that are applicable to
* Connections
*
* @return
*/
List<MetricDescriptor<ConnectionStatus>> getConnectionMetricDescriptors();

View File

@ -18,7 +18,8 @@ package org.apache.nifi.controller.status.history;
/**
* Describes a particular metric that is derived from a Status History
* @param <T>
*
* @param <T> type of metric
*/
public interface MetricDescriptor<T> {
@ -32,44 +33,34 @@ public interface MetricDescriptor<T> {
/**
* Specifies how the values should be formatted
*
* @return
* @return formatter for values
*/
Formatter getFormatter();
/**
* Returns a human-readable description of the field
*
* @return
* @return a human-readable description of the field
*/
String getDescription();
/**
* Returns a human-readable label for the field
*
* @return
* @return a human-readable label for the field
*/
String getLabel();
/**
* Returns the name of a field
*
* @return
* @return the name of a field
*/
String getField();
/**
* Returns a {@link ValueMapper} that can be used to extract a value for the
* @return a {@link ValueMapper} that can be used to extract a value for the
* status history
*
* @return
*/
ValueMapper<T> getValueFunction();
/**
* Returns a {@link ValueReducer} that can reduce multiple StatusSnapshots
* @return a {@link ValueReducer} that can reduce multiple StatusSnapshots
* into a single Long value
*
* @return
*/
ValueReducer<StatusSnapshot, Long> getValueReducer();
}

View File

@ -26,25 +26,19 @@ import java.util.Map;
public interface StatusHistory {
/**
* Returns a Date indicating when this report was generated
*
* @return
* @return a Date indicating when this report was generated
*/
Date getDateGenerated();
/**
* Returns a Map of component field names and their values. The order in
* @return a Map of component field names and their values. The order in
* which these values are displayed is dependent on the natural ordering of
* the Map returned.
*
* @return
* the Map returned
*/
Map<String, String> getComponentDetails();
/**
* A List of snapshots for a given component
*
* @return
* @return List of snapshots for a given component
*/
List<StatusSnapshot> getStatusSnapshots();
}

View File

@ -25,24 +25,18 @@ import java.util.Map;
public interface StatusSnapshot {
/**
* Rreturns the point in time for which the status values were obtained
*
* @return
* @return the point in time for which the status values were obtained
*/
Date getTimestamp();
/**
* Returns a Map of MetricDescriptor to value
*
* @return
* @return a Map of MetricDescriptor to value
*/
Map<MetricDescriptor<?>, Long> getStatusMetrics();
/**
* Returns a {@link ValueReducer} that is capable of merging multiple
* @return a {@link ValueReducer} that is capable of merging multiple
* StatusSnapshot objects into a single one
*
* @return
*/
ValueReducer<StatusSnapshot, StatusSnapshot> getValueReducer();
}

View File

@ -22,12 +22,10 @@ import org.apache.nifi.processor.exception.ProcessException;
public interface AttributeExpression {
/**
* Evaluates the expression without providing any FlowFile Attributes. This
* @return Evaluates the expression without providing any FlowFile Attributes. This
* will evaluate the expression based only on System Properties and JVM
* Environment properties
*
* @return
* @throws ProcessException
* @throws ProcessException if unable to evaluate
*/
String evaluate() throws ProcessException;
@ -36,9 +34,9 @@ public interface AttributeExpression {
* will evaluate the expression based only on System Properties and JVM
* Environment properties but allows the values to be decorated
*
* @param decorator
* @return
* @throws ProcessException
* @param decorator for attribute value
* @return evaluated value
* @throws ProcessException if failure in evaluation
*/
String evaluate(AttributeValueDecorator decorator) throws ProcessException;
@ -47,9 +45,9 @@ public interface AttributeExpression {
* id, etc. of the given FlowFile, as well as System Properties and JVM
* Environment properties
*
* @param flowFile
* @return
* @throws ProcessException
* @param flowFile to evaluate
* @return evaluated value
* @throws ProcessException if failure evaluating
*/
String evaluate(FlowFile flowFile) throws ProcessException;
@ -58,17 +56,15 @@ public interface AttributeExpression {
* id, etc. of the given FlowFile, as well as System Properties and JVM
* Environment properties and allows the values to be decorated
*
* @param flowFile
* @param decorator
* @return
* @throws ProcessException
* @param flowFile to evaluate
* @param decorator for evaluation
* @return evaluated value
* @throws ProcessException if failed to evaluate
*/
String evaluate(FlowFile flowFile, AttributeValueDecorator decorator) throws ProcessException;
/**
* Returns the type that is returned by the Expression
*
* @return
* @return the type that is returned by the Expression
*/
ResultType getResultType();

View File

@ -22,8 +22,8 @@ public interface AttributeValueDecorator {
* Decorates the value of a FlowFile Attribute or System/JVM property in
* some way
*
* @param attributeValue
* @return
* @param attributeValue to decorate
* @return decorated value
*/
String decorate(String attributeValue);
}

View File

@ -25,7 +25,7 @@ public interface ExpressionLanguageCompiler {
* AttributeExpression that can be evaluated
*
* @param expression the Attribute Expression to be compiled
* @return
* @return expression that can be evaluated
* @throws IllegalArgumentException if the given expression is not valid
*/
AttributeExpression compile(String expression) throws IllegalArgumentException;
@ -34,8 +34,8 @@ public interface ExpressionLanguageCompiler {
* Indicates whether or not the given string is a valid Attribute
* Expression.
*
* @param expression
* @return
* @param expression to validate
* @return if is value or not
*/
boolean isValidExpression(String expression);
@ -44,7 +44,7 @@ public interface ExpressionLanguageCompiler {
* if the expression is syntactically valid or a String indicating why the
* expression is invalid otherwise.
*
* @param expression
* @param expression to validate
* @param allowSurroundingCharacters if <code>true</code> allows characters
* to surround the Expression, otherwise the expression must be exactly
* equal to a valid Expression. E.g., <code>/${path}</code> is valid if and
@ -60,7 +60,7 @@ public interface ExpressionLanguageCompiler {
* Returns the ResultType that will be returned by the given Expression
*
* @param expression the Expression to evaluate
* @return
* @return result type for the given expression
* @throws IllegalArgumentException if the given Expression is not a valid
* Expression Language Expression; the message of this Exception will
* indicate the problem if the expression is not syntactically valid.

View File

@ -48,24 +48,22 @@ public interface FlowFile extends Comparable<FlowFile> {
long getLineageStartDate();
/**
* Returns the time at which the FlowFile was most recently added to a
* @return the time at which the FlowFile was most recently added to a
* FlowFile queue, or {@code null} if the FlowFile has never been enqueued.
* This value will always be populated before it is passed to a
* {@link FlowFilePrioritizer}.
*
* @return
* {@link FlowFilePrioritizer}
*/
Long getLastQueueDate();
/**
* @return a set of identifiers that are unique to this FlowFile's lineage.
* If FlowFile X is derived from FlowFile Y, both FlowFiles will have the
* same value for the Lineage Claim ID.
*
* <p>
* If a FlowFile is derived from multiple "parent" FlowFiles, all of the
* parents' Lineage Identifiers will be in the set.
* </p>
*
* @return a set of identifiers that are unique to this FlowFile's lineage.
* If FlowFile X is derived from FlowFile Y, both FlowFiles will have the
* same value for the Lineage Claim ID.
*/
Set<String> getLineageIdentifiers();
@ -77,7 +75,7 @@ public interface FlowFile extends Comparable<FlowFile> {
/**
* Obtains the attribute value for the given key
*
* @param key
* @param key of the attribute
* @return value if found; null otherwise
*/
String getAttribute(String key);

Some files were not shown because too many files have changed in this diff Show More