Repository: nifi
Updated Branches:
  refs/heads/master 567535c3d -> d4bbd647c


NIFI-2586 - Javadocs, ExitCode cleanup, password generation improvement, 
setting cluster secure to true, making properties writer more flexible

This closes #879.

Signed-off-by: Bryan Bende <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/d4bbd647
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/d4bbd647
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/d4bbd647

Branch: refs/heads/master
Commit: d4bbd647c5df38da4e9b371fbd99d38ac7605957
Parents: 567535c
Author: Bryan Rosander <[email protected]>
Authored: Tue Aug 16 17:38:08 2016 -0400
Committer: Bryan Bende <[email protected]>
Committed: Thu Aug 18 09:26:32 2016 -0400

----------------------------------------------------------------------
 .../main/resources/classpath/overlay.properties | 22 +++++++-
 .../apache/nifi/toolkit/tls/TlsToolkitMain.java | 15 ++++-
 .../tls/commandLine/BaseCommandLine.java        | 46 +++++++++++++++-
 .../commandLine/CommandLineParseException.java  | 14 ++++-
 .../nifi/toolkit/tls/commandLine/ExitCode.java  | 42 ++++++++++++++
 .../tls/configuration/StandaloneConfig.java     |  3 +
 .../tls/configuration/TlsClientConfig.java      |  3 +
 .../toolkit/tls/configuration/TlsConfig.java    |  3 +
 .../toolkit/tls/manager/BaseTlsManager.java     | 58 ++++++++++++++++----
 .../manager/TlsCertificateAuthorityManager.java | 11 ++++
 .../toolkit/tls/manager/TlsClientManager.java   |  2 +-
 .../tls/manager/writer/ConfigurationWriter.java | 16 +++++-
 .../manager/writer/JsonConfigurationWriter.java | 11 ++--
 .../NifiPropertiesTlsClientConfigWriter.java    | 43 +++++++++------
 .../tls/properties/NiFiPropertiesWriter.java    | 17 ++++++
 .../properties/NiFiPropertiesWriterFactory.java |  8 +++
 .../BaseCertificateAuthorityCommandLine.java    |  3 +
 .../client/TlsCertificateAuthorityClient.java   |  2 +-
 ...lsCertificateAuthorityClientCommandLine.java |  5 +-
 .../server/TlsCertificateAuthorityService.java  |  2 +-
 ...sCertificateAuthorityServiceCommandLine.java |  5 +-
 .../tls/standalone/TlsToolkitStandalone.java    |  2 +-
 .../TlsToolkitStandaloneCommandLine.java        | 10 +++-
 .../nifi/toolkit/tls/util/PasswordUtil.java     |  6 +-
 .../nifi/toolkit/tls/TlsToolkitMainTest.java    | 17 ++++++
 ...NifiPropertiesTlsClientConfigWriterTest.java | 15 ++---
 ...rtificateAuthorityClientCommandLineTest.java |  4 +-
 .../TlsToolkitStandaloneCommandLineTest.java    | 10 ++--
 .../nifi/toolkit/tls/util/PasswordUtilTest.java |  5 +-
 .../src/test/resources/overlay.properties       | 22 +++++++-
 30 files changed, 354 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-assembly/src/main/resources/classpath/overlay.properties
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-assembly/src/main/resources/classpath/overlay.properties
 
b/nifi-toolkit/nifi-toolkit-assembly/src/main/resources/classpath/overlay.properties
index c4d02c2..2084bf3 100644
--- 
a/nifi-toolkit/nifi-toolkit-assembly/src/main/resources/classpath/overlay.properties
+++ 
b/nifi-toolkit/nifi-toolkit-assembly/src/main/resources/classpath/overlay.properties
@@ -15,9 +15,27 @@
 # limitations under the License.
 #
 
+# This properties file specifies how to update the provided nifi.properties
+
 # Comma separated list of properties to put the hostname into
-hostname.properties=nifi.remote.input.host,nifi.web.https.host,nifi.cluster.node.address
+hostname.properties= \
+  nifi.remote.input.host, \
+  nifi.web.https.host, \
+  nifi.cluster.node.address
+
+# Comma separated list of properties to increment (must also be defined in 
this file)
+incrementing.properties= \
+  nifi.web.https.port, \
+  nifi.remote.input.socket.port, \
+  nifi.cluster.node.protocol.port
 
 nifi.web.https.port=9443
 nifi.remote.input.socket.port=10443
-nifi.cluster.node.protocol.port=11443
\ No newline at end of file
+nifi.cluster.node.protocol.port=11443
+
+# Properties to set verbatim
+nifi.remote.input.secure=true
+nifi.cluster.protocol.is.secure=true
+
+nifi.web.http.host=
+nifi.web.http.port=
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/TlsToolkitMain.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/TlsToolkitMain.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/TlsToolkitMain.java
index 4614558..c0dc4b2 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/TlsToolkitMain.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/TlsToolkitMain.java
@@ -25,11 +25,12 @@ import 
org.apache.nifi.toolkit.tls.standalone.TlsToolkitStandaloneCommandLine;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
 /**
- * Command line entry point
+ * Command line entry point that looks through a map of possible services to 
delegate to
  */
 public class TlsToolkitMain {
     public static final String DESCRIPTION = "DESCRIPTION";
@@ -43,6 +44,11 @@ public class TlsToolkitMain {
         mainMap.put("client", TlsCertificateAuthorityClientCommandLine.class);
     }
 
+    /**
+     * Callthrough to doMain
+     *
+     * @param args the command line arguments
+     */
     public static void main(String[] args) {
         new TlsToolkitMain().doMain(args);
     }
@@ -85,6 +91,11 @@ public class TlsToolkitMain {
         }
     }
 
+    /**
+     * Invokes the main of the relevant service
+     *
+     * @param args the command line arguments
+     */
     public void doMain(String[] args) {
         if (args.length < 1) {
             printUsageAndExit("Expected at least a service argument.", 
ExitCode.INVALID_ARGS);
@@ -93,7 +104,7 @@ public class TlsToolkitMain {
         String service = args[0].toLowerCase();
 
         try {
-            getMain(service).invoke(null, (Object) args);
+            getMain(service).invoke(null, (Object) Arrays.copyOfRange(args, 1, 
args.length, String[].class));
         } catch (IllegalAccessException e) {
             printUsageAndExit("Service " + service + " has invalid main 
method.", ExitCode.SERVICE_ERROR);
         } catch (InvocationTargetException e) {

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/BaseCommandLine.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/BaseCommandLine.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/BaseCommandLine.java
index 763f715..7905e0f 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/BaseCommandLine.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/BaseCommandLine.java
@@ -26,6 +26,9 @@ import org.apache.commons.cli.ParseException;
 import org.apache.nifi.toolkit.tls.TlsToolkitMain;
 import org.apache.nifi.toolkit.tls.configuration.TlsConfig;
 
+/**
+ * Base class with common CLI parsing functionality as well as arguments 
shared by multiple entry points
+ */
 public abstract class BaseCommandLine {
     public static final String HELP_ARG = "help";
     public static final String JAVA_HOME = "JAVA_HOME";
@@ -112,7 +115,7 @@ public abstract class BaseCommandLine {
 
     protected <T> T printUsageAndThrow(String errorMessage, ExitCode exitCode) 
throws CommandLineParseException {
         printUsage(errorMessage);
-        throw new CommandLineParseException(errorMessage, exitCode.ordinal());
+        throw new CommandLineParseException(errorMessage, exitCode);
     }
 
     protected int getIntValue(CommandLine commandLine, String arg, int 
defaultVal) throws CommandLineParseException {
@@ -123,30 +126,65 @@ public abstract class BaseCommandLine {
         }
     }
 
+    /**
+     * Returns the number of bits used when generating KeyPairs
+     *
+     * @return the number of bits used when generating KeyPairs
+     */
     public int getKeySize() {
         return keySize;
     }
 
+    /**
+     * Returns the algorithm used when generating KeyPairs
+     *
+     * @return the algorithm used when generating KeyPairs
+     */
     public String getKeyAlgorithm() {
         return keyAlgorithm;
     }
 
+    /**
+     * Returns the CA Hostname
+     *
+     * @return the CA Hostname
+     */
     public String getCertificateAuthorityHostname() {
         return certificateAuthorityHostname;
     }
 
+    /**
+     * Returns the type to use for KeyStores
+     *
+     * @return the type to use for KeyStores
+     */
     public String getKeyStoreType() {
         return keyStoreType;
     }
 
+    /**
+     * Returns the number of Certificates should be valid for
+     *
+     * @return the number of Certificates should be valid for
+     */
     public int getDays() {
         return days;
     }
 
+    /**
+     * Returns the signing algorithm to use for cryptographic operations
+     *
+     * @return the signing algorithm to use for cryptographic operations
+     */
     public String getSigningAlgorithm() {
         return signingAlgorithm;
     }
 
+    /**
+     * Returns true if different passwords should be used for KeyStore and 
individual Key entries
+     *
+     * @return true if different passwords should be used for KeyStore and 
individual Key entries
+     */
     public boolean differentPasswordForKeyAndKeystore() {
         return differentPasswordForKeyAndKeystore;
     }
@@ -172,6 +210,12 @@ public abstract class BaseCommandLine {
         return commandLine;
     }
 
+    /**
+     * Parses the command line arguments
+     *
+     * @param args the command line arguments
+     * @throws CommandLineParseException if the arguments cannot be parsed
+     */
     public void parse(String... args) throws CommandLineParseException {
         doParse(args);
     }

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/CommandLineParseException.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/CommandLineParseException.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/CommandLineParseException.java
index d09cc08..21d7083 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/CommandLineParseException.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/CommandLineParseException.java
@@ -17,15 +17,23 @@
 
 package org.apache.nifi.toolkit.tls.commandLine;
 
+/**
+ * Exception for errors while parsing the command line
+ */
 public class CommandLineParseException extends Exception {
-    private final int exitCode;
+    private final ExitCode exitCode;
 
-    public CommandLineParseException(String message, int exitCode) {
+    public CommandLineParseException(String message, ExitCode exitCode) {
         super(message);
         this.exitCode = exitCode;
     }
 
-    public int getExitCode() {
+    /**
+     * Returns the exit code to use
+     *
+     * @return the exit code to use
+     */
+    public ExitCode getExitCode() {
         return exitCode;
     }
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/ExitCode.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/ExitCode.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/ExitCode.java
index f06ac2d..6ff733c 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/ExitCode.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/commandLine/ExitCode.java
@@ -17,15 +17,57 @@
 
 package org.apache.nifi.toolkit.tls.commandLine;
 
+/**
+ * Possible exit codes
+ */
 public enum ExitCode {
+    /**
+     * Tool ran successfully
+     */
     SUCCESS,
+
+    /**
+     * Tool exited after printing help
+     */
     HELP,
+
+    /**
+     * Invalid arguments passed in via command line
+     */
     INVALID_ARGS,
+
+    /**
+     * Error invoking service
+     */
     SERVICE_ERROR,
+
+    /**
+     * Unable to parse command line
+     */
     ERROR_PARSING_COMMAND_LINE,
+
+    /**
+     * Unable to generate configuration
+     */
     ERROR_GENERATING_CONFIG,
+
+    /**
+     * Specified wrong number of passwords
+     */
     ERROR_INCORRECT_NUMBER_OF_PASSWORDS,
+
+    /**
+     * Expected an integer for an argument
+     */
     ERROR_PARSING_INT_ARG,
+
+    /**
+     * Did not specify token
+     */
     ERROR_TOKEN_ARG_EMPTY,
+
+    /**
+     * Unable to read nifi.properties
+     */
     ERROR_READING_NIFI_PROPERTIES
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/StandaloneConfig.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/StandaloneConfig.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/StandaloneConfig.java
index 740a9a2..7ac44a4 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/StandaloneConfig.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/StandaloneConfig.java
@@ -22,6 +22,9 @@ import 
org.apache.nifi.toolkit.tls.properties.NiFiPropertiesWriterFactory;
 import java.io.File;
 import java.util.List;
 
+/**
+ * Configuration object of the standalone service
+ */
 public class StandaloneConfig extends TlsConfig {
     private File baseDir;
     private NiFiPropertiesWriterFactory niFiPropertiesWriterFactory;

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsClientConfig.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsClientConfig.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsClientConfig.java
index 78ca9d6..927771d 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsClientConfig.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsClientConfig.java
@@ -22,6 +22,9 @@ import org.apache.nifi.util.StringUtils;
 
 import java.security.NoSuchAlgorithmException;
 
+/**
+ * Configuration object for CA client
+ */
 public class TlsClientConfig extends TlsConfig {
     private String trustStore;
     private String trustStorePassword;

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsConfig.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsConfig.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsConfig.java
index 8aa3e40..255a546 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsConfig.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/configuration/TlsConfig.java
@@ -20,6 +20,9 @@ package org.apache.nifi.toolkit.tls.configuration;
 import org.apache.nifi.security.util.CertificateUtils;
 import org.apache.nifi.util.StringUtils;
 
+/**
+ * Configuration object for CA server
+ */
 public class TlsConfig {
     public static final String DEFAULT_HOSTNAME = "localhost";
     public static final String DEFAULT_KEY_STORE_TYPE = "jks";

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/BaseTlsManager.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/BaseTlsManager.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/BaseTlsManager.java
index 6215fc0..965481e 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/BaseTlsManager.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/BaseTlsManager.java
@@ -34,13 +34,14 @@ import java.security.GeneralSecurityException;
 import java.security.KeyPair;
 import java.security.KeyStore;
 import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
 import java.security.NoSuchProviderException;
-import java.security.UnrecoverableEntryException;
 import java.security.cert.Certificate;
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * Base class for managing KeyStores and Certificates
+ */
 public class BaseTlsManager {
     public static final String PKCS_12 = "PKCS12";
     private final TlsConfig tlsConfig;
@@ -63,24 +64,47 @@ public class BaseTlsManager {
         this.configurationWriters = new ArrayList<>();
     }
 
+    /**
+     * Returns the KeyStore
+     *
+     * @return the KeyStore
+     */
     public KeyStore getKeyStore() {
         return keyStore;
     }
 
-    public KeyStore.Entry getEntry(String alias) throws 
UnrecoverableEntryException, NoSuchAlgorithmException, KeyStoreException {
+    /**
+     * Returns an entry from the KeyStore with the given alias
+     *
+     * @param alias the alias
+     * @return an entry from the KeyStore with the given alias
+     * @throws GeneralSecurityException if there is a problem retrieving the 
entry
+     */
+    public KeyStore.Entry getEntry(String alias) throws 
GeneralSecurityException {
         String keyPassword = getKeyPassword();
         return keyStore.getEntry(alias, new 
KeyStore.PasswordProtection(keyPassword == null ? null : 
keyPassword.toCharArray()));
     }
 
-    public KeyStore.Entry addPrivateKeyToKeyStore(KeyPair keyPair, String 
alias, Certificate... certificates) throws GeneralSecurityException, 
IOException {
-        return addPrivateKeyToKeyStore(keyStore, keyPair, alias, 
getKeyPassword(), certificates);
-    }
-
-    private KeyStore.Entry addPrivateKeyToKeyStore(KeyStore keyStore, KeyPair 
keyPair, String alias, String passphrase, Certificate... certificates) throws 
GeneralSecurityException, IOException {
+    /**
+     * Adds the private key of the KeyPair to the KeyStore and returns the 
entry
+     *
+     * @param keyPair the KeyPair
+     * @param alias the alias
+     * @param certificates the certificate chain
+     * @return the entry
+     * @throws GeneralSecurityException if there is a problem performing the 
operation
+     */
+    public KeyStore.Entry addPrivateKeyToKeyStore(KeyPair keyPair, String 
alias, Certificate... certificates) throws GeneralSecurityException {
+        String passphrase = getKeyPassword();
         keyStore.setKeyEntry(alias, keyPair.getPrivate(), passphrase == null ? 
null : passphrase.toCharArray(), certificates);
         return getEntry(alias);
     }
 
+    /**
+     * Sets a flag indicating whether to use a different key and keystore 
password
+     *
+     * @param differentKeyAndKeyStorePassword a flag indicating whether to use 
a different key and keystore password
+     */
     public void setDifferentKeyAndKeyStorePassword(boolean 
differentKeyAndKeyStorePassword) {
         this.differentKeyAndKeyStorePassword = differentKeyAndKeyStorePassword;
     }
@@ -134,24 +158,36 @@ public class BaseTlsManager {
         return result;
     }
 
+    /**
+     * Writes the KeyStore and configuration information
+     *
+     * @param outputStreamFactory factory interface for creating output streams
+     * @throws IOException if there is an IO problem while writing
+     * @throws GeneralSecurityException if there is a security problem while 
writing
+     */
     public void write(OutputStreamFactory outputStreamFactory) throws 
IOException, GeneralSecurityException {
         String keyStorePassword = getKeyStorePassword();
         tlsConfig.setKeyStorePassword(TlsHelper.writeKeyStore(keyStore, 
outputStreamFactory, new File(tlsConfig.getKeyStore()), keyStorePassword, 
keyStorePasswordGenerated));
 
         for (ConfigurationWriter<TlsConfig> configurationWriter : 
configurationWriters) {
-            configurationWriter.write(tlsConfig);
+            configurationWriter.write(tlsConfig, outputStreamFactory);
         }
     }
 
-    public PasswordUtil getPasswordUtil() {
+    protected PasswordUtil getPasswordUtil() {
         return passwordUtil;
     }
 
+    /**
+     * Adds a ConfigurationWriter which will have an opportunity to write 
configuration information
+     *
+     * @param configurationWriter a ConfigurationWriter which will have an 
opportunity to write configuration information
+     */
     public void addConfigurationWriter(ConfigurationWriter<TlsConfig> 
configurationWriter) {
         configurationWriters.add(configurationWriter);
     }
 
-    public TlsConfig getTlsConfig() {
+    protected TlsConfig getTlsConfig() {
         return tlsConfig;
     }
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsCertificateAuthorityManager.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsCertificateAuthorityManager.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsCertificateAuthorityManager.java
index 2fa0534..8352213 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsCertificateAuthorityManager.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsCertificateAuthorityManager.java
@@ -28,11 +28,22 @@ import java.security.KeyPair;
 import java.security.KeyStore;
 import java.security.cert.X509Certificate;
 
+/**
+ * KeyStore manager capable of reading or instantiating a CA Certificate
+ */
 public class TlsCertificateAuthorityManager extends BaseTlsManager {
     public TlsCertificateAuthorityManager(TlsConfig tlsConfig) throws 
GeneralSecurityException, IOException {
         super(tlsConfig);
     }
 
+    /**
+     * Reads the CA from the KeyStore, creating one and putting it into the 
KeyStore if not present
+     *
+     * @return the PrivateKeyEntry for the CA
+     *
+     * @throws GeneralSecurityException if there is a security problem
+     * @throws IOException if there is an IO problem
+     */
     public KeyStore.PrivateKeyEntry getOrGenerateCertificateAuthority() throws 
GeneralSecurityException, IOException {
         KeyStore.Entry entry = getEntry(TlsToolkitStandalone.NIFI_KEY);
         if (entry == null) {

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsClientManager.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsClientManager.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsClientManager.java
index 3113701..7df80ab 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsClientManager.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/TlsClientManager.java
@@ -86,7 +86,7 @@ public class TlsClientManager extends BaseTlsManager {
         tlsClientConfig.setTrustStorePassword(trustStorePassword);
 
         for (ConfigurationWriter<TlsClientConfig> configurationWriter : 
configurationWriters) {
-            configurationWriter.write(tlsClientConfig);
+            configurationWriter.write(tlsClientConfig, outputStreamFactory);
         }
 
         if (certificateAuthorityDirectory != null) {

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/ConfigurationWriter.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/ConfigurationWriter.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/ConfigurationWriter.java
index e669d7e..435bfd5 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/ConfigurationWriter.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/ConfigurationWriter.java
@@ -17,8 +17,22 @@
 
 package org.apache.nifi.toolkit.tls.manager.writer;
 
+import org.apache.nifi.toolkit.tls.util.OutputStreamFactory;
+
 import java.io.IOException;
 
+/**
+ * Class that can write out configuration information on the given object
+ *
+ * @param <T> the type of Object to write information about
+ */
 public interface ConfigurationWriter<T> {
-    void write(T t) throws IOException;
+    /**
+     * Writes configuration information about the given object
+     *
+     * @param t the object
+     * @param outputStreamFactory an OutputStreamFactory
+     * @throws IOException if there is an IO problem
+     */
+    void write(T t, OutputStreamFactory outputStreamFactory) throws 
IOException;
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/JsonConfigurationWriter.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/JsonConfigurationWriter.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/JsonConfigurationWriter.java
index 475553b..77bdc34 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/JsonConfigurationWriter.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/JsonConfigurationWriter.java
@@ -25,19 +25,22 @@ import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 
+/**
+ * Will write the object in JSON format
+ *
+ * @param <T> the type of object
+ */
 public class JsonConfigurationWriter<T> implements ConfigurationWriter<T> {
     private final ObjectWriter objectWriter;
-    private final OutputStreamFactory outputStreamFactory;
     private final File file;
 
-    public JsonConfigurationWriter(ObjectMapper objectMapper, 
OutputStreamFactory outputStreamFactory, File file) {
+    public JsonConfigurationWriter(ObjectMapper objectMapper, File file) {
         this.objectWriter = objectMapper.writerWithDefaultPrettyPrinter();
-        this.outputStreamFactory = outputStreamFactory;
         this.file = file;
     }
 
     @Override
-    public void write(T tlsConfig) throws IOException {
+    public void write(T tlsConfig, OutputStreamFactory outputStreamFactory) 
throws IOException {
         try (OutputStream stream = outputStreamFactory.create(file)) {
             objectWriter.writeValue(stream, tlsConfig);
         }

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriter.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriter.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriter.java
index c2ecca4..9d24c5a 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriter.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriter.java
@@ -37,34 +37,37 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+/**
+ * Will write a nifi.properties file appropriate for the given client config
+ */
 public class NifiPropertiesTlsClientConfigWriter implements 
ConfigurationWriter<TlsClientConfig> {
     public static final String HOSTNAME_PROPERTIES = "hostname.properties";
     public static final String OVERLAY_PROPERTIES = "overlay.properties";
+    public static final String INCREMENTING_PROPERTIES = 
"incrementing.properties";
     public static final String CONF = "./conf/";
     private final NiFiPropertiesWriterFactory niFiPropertiesWriterFactory;
-    private final OutputStreamFactory outputStreamFactory;
     private final File outputFile;
     private final String hostname;
     private final int hostNum;
     private final Properties overlayProperties;
-    private final Set<String> explicitProperties;
+    private final Set<String> metaProperties;
 
-    public NifiPropertiesTlsClientConfigWriter(NiFiPropertiesWriterFactory 
niFiPropertiesWriterFactory, OutputStreamFactory outputStreamFactory, File 
outputFile, String hostname, int hostNum)
-            throws IOException {
+    public NifiPropertiesTlsClientConfigWriter(NiFiPropertiesWriterFactory 
niFiPropertiesWriterFactory, File outputFile, String hostname, int hostNum) 
throws IOException {
         this.niFiPropertiesWriterFactory = niFiPropertiesWriterFactory;
-        this.outputStreamFactory = outputStreamFactory;
         this.outputFile = outputFile;
         this.hostname = hostname;
         this.hostNum = hostNum;
         this.overlayProperties = new Properties();
         
this.overlayProperties.load(getClass().getClassLoader().getResourceAsStream(OVERLAY_PROPERTIES));
-        HashSet<String> explicitProperties = new HashSet<>();
-        explicitProperties.add(HOSTNAME_PROPERTIES);
-        this.explicitProperties = 
Collections.unmodifiableSet(explicitProperties);
+        HashSet<String> metaProperties = new HashSet<>();
+        metaProperties.add(HOSTNAME_PROPERTIES);
+        metaProperties.add(INCREMENTING_PROPERTIES);
+        getIncrementingPropertiesStream().forEach(metaProperties::add);
+        this.metaProperties = Collections.unmodifiableSet(metaProperties);
     }
 
     @Override
-    public void write(TlsClientConfig tlsClientConfig) throws IOException {
+    public void write(TlsClientConfig tlsClientConfig, OutputStreamFactory 
outputStreamFactory) throws IOException {
         NiFiPropertiesWriter niFiPropertiesWriter = 
niFiPropertiesWriterFactory.create();
         updateProperties(niFiPropertiesWriter, tlsClientConfig);
         try (OutputStream stream = outputStreamFactory.create(outputFile)) {
@@ -82,21 +85,19 @@ public class NifiPropertiesTlsClientConfigWriter implements 
ConfigurationWriter<
         
niFiPropertiesWriter.setPropertyValue(NiFiProperties.SECURITY_TRUSTSTORE_TYPE, 
tlsClientConfig.getTrustStoreType());
         
niFiPropertiesWriter.setPropertyValue(NiFiProperties.SECURITY_TRUSTSTORE_PASSWD,
 tlsClientConfig.getTrustStorePassword());
 
-        niFiPropertiesWriter.setPropertyValue(NiFiProperties.WEB_HTTP_HOST, 
"");
-        niFiPropertiesWriter.setPropertyValue(NiFiProperties.WEB_HTTP_PORT, 
"");
-        
niFiPropertiesWriter.setPropertyValue(NiFiProperties.SITE_TO_SITE_SECURE, 
"true");
-
         getHostnamePropertyStream().forEach(s -> 
niFiPropertiesWriter.setPropertyValue(s, hostname));
 
-        getPropertyPortMap().entrySet().forEach(nameToPortEntry -> 
niFiPropertiesWriter.setPropertyValue(nameToPortEntry.getKey(), 
Integer.toString(nameToPortEntry.getValue())));
+        overlayProperties.stringPropertyNames().stream().filter(s -> 
!metaProperties.contains(s)).forEach(s -> 
niFiPropertiesWriter.setPropertyValue(s, overlayProperties.getProperty(s)));
+
+        getIncrementingPropertyMap().entrySet().forEach(nameToIntegerEntry -> 
niFiPropertiesWriter.setPropertyValue(nameToIntegerEntry.getKey(), 
Integer.toString(nameToIntegerEntry.getValue())));
     }
 
     protected Properties getOverlayProperties() {
         return overlayProperties;
     }
 
-    protected Map<String, Integer> getPropertyPortMap() {
-        return overlayProperties.stringPropertyNames().stream().filter(s -> 
!explicitProperties.contains(s)).collect(Collectors.toMap(Function.identity(), 
portProperty -> {
+    protected Map<String, Integer> getIncrementingPropertyMap() {
+        return 
getIncrementingPropertiesStream().collect(Collectors.toMap(Function.identity(), 
portProperty -> {
             String portVal = overlayProperties.getProperty(portProperty);
             int startingPort;
             try {
@@ -108,8 +109,16 @@ public class NifiPropertiesTlsClientConfigWriter 
implements ConfigurationWriter<
         }));
     }
 
+    protected Stream<String> getIncrementingPropertiesStream() {
+        return getCommaSeparatedPropertyStream(INCREMENTING_PROPERTIES);
+    }
+
     protected Stream<String> getHostnamePropertyStream() {
-        String hostnamePropertyString = 
overlayProperties.getProperty(HOSTNAME_PROPERTIES);
+        return getCommaSeparatedPropertyStream(HOSTNAME_PROPERTIES);
+    }
+
+    private Stream<String> getCommaSeparatedPropertyStream(String property) {
+        String hostnamePropertyString = 
overlayProperties.getProperty(property);
         if (!StringUtils.isEmpty(hostnamePropertyString)) {
             return 
Arrays.stream(hostnamePropertyString.split(",")).map(String::trim);
         }

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriter.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriter.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriter.java
index 61cbc67..1908461 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriter.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriter.java
@@ -28,6 +28,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+/**
+ * Class capable of writing out updated NiFi properties.  It keeps a list of 
original lines and a map of updates to apply.
+ *
+ * It first writes all the original properties (with updated values if they 
exist) and then adds any new properties at the end.
+ */
 public class NiFiPropertiesWriter {
     private final List<String> lines;
     private final Map<String, String> updatedValues;
@@ -37,10 +42,22 @@ public class NiFiPropertiesWriter {
         this.updatedValues = new HashMap<>();
     }
 
+    /**
+     * Sets a property value
+     *
+     * @param key the property key
+     * @param value the property value
+     */
     public void setPropertyValue(String key, String value) {
         updatedValues.put(key, value);
     }
 
+    /**
+     * Write an updated nifi.properties to the given OutputStream
+     *
+     * @param outputStream the output stream
+     * @throws IOException if there is an IO error
+     */
     public void writeNiFiProperties(OutputStream outputStream) throws 
IOException {
         try (BufferedWriter writer = new BufferedWriter(new 
OutputStreamWriter(outputStream))) {
             Map<String, String> remainingValues = new HashMap<>(updatedValues);

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriterFactory.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriterFactory.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriterFactory.java
index cf8212c..cf2383c 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriterFactory.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/properties/NiFiPropertiesWriterFactory.java
@@ -27,6 +27,9 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+/**
+ * Factory for creating NifiPropertiesWriters so that the lines only have to 
be read once
+ */
 public class NiFiPropertiesWriterFactory {
     private final List<String> lines;
 
@@ -45,6 +48,11 @@ public class NiFiPropertiesWriterFactory {
         this.lines = Collections.unmodifiableList(lines);
     }
 
+    /**
+     * Returns a NifiPropertiesWriter with based on the read nifi.properties
+     *
+     * @return a NifiPropertiesWriter with based on the read nifi.properties
+     */
     public NiFiPropertiesWriter create() {
         return new NiFiPropertiesWriter(lines);
     }

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/BaseCertificateAuthorityCommandLine.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/BaseCertificateAuthorityCommandLine.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/BaseCertificateAuthorityCommandLine.java
index 97fa45b..47ebd17 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/BaseCertificateAuthorityCommandLine.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/BaseCertificateAuthorityCommandLine.java
@@ -26,6 +26,9 @@ import org.apache.nifi.util.StringUtils;
 
 import java.io.File;
 
+/**
+ * Common base argument logic for the CA server and client
+ */
 public abstract class BaseCertificateAuthorityCommandLine extends 
BaseCommandLine {
     public static final String TOKEN_ARG = "token";
     public static final String CONFIG_JSON_ARG = "configJson";

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClient.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClient.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClient.java
index c0e2301..2068c98 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClient.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClient.java
@@ -66,7 +66,7 @@ public class TlsCertificateAuthorityClient {
         }
 
         if (!StringUtils.isEmpty(configJson)) {
-            tlsClientManager.addClientConfigurationWriter(new 
JsonConfigurationWriter<>(new ObjectMapper(), outputStreamFactory, new 
File(configJson)));
+            tlsClientManager.addClientConfigurationWriter(new 
JsonConfigurationWriter<>(new ObjectMapper(), new File(configJson)));
         }
 
         if (tlsClientManager.getEntry(TlsToolkitStandalone.NIFI_KEY) == null) {

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLine.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLine.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLine.java
index dd432c3..83b28be 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLine.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLine.java
@@ -35,6 +35,9 @@ import java.io.InputStream;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 
+/**
+ * Command line parser for a TlsClientConfig object and a main entry point to 
invoke the parser and run the CA client
+ */
 public class TlsCertificateAuthorityClientCommandLine extends 
BaseCertificateAuthorityCommandLine {
     public static final String DESCRIPTION = "Generates a private key and gets 
it signed by the certificate authority.";
     public static final String CERTIFICATE_DIRECTORY = "certificateDirectory";
@@ -61,7 +64,7 @@ public class TlsCertificateAuthorityClientCommandLine extends 
BaseCertificateAut
         try {
             tlsCertificateAuthorityClientCommandLine.parse(args);
         } catch (CommandLineParseException e) {
-            System.exit(e.getExitCode());
+            System.exit(e.getExitCode().ordinal());
         }
         new 
TlsCertificateAuthorityClient().generateCertificateAndGetItSigned(tlsCertificateAuthorityClientCommandLine.createClientConfig(),
                 
tlsCertificateAuthorityClientCommandLine.getCertificateDirectory(), 
tlsCertificateAuthorityClientCommandLine.getConfigJson(),

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java
index d21ea36..18c4f65 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityService.java
@@ -93,7 +93,7 @@ public class TlsCertificateAuthorityService {
                     BaseCertificateAuthorityCommandLine.USE_CONFIG_JSON_ARG);
             throw e;
         }
-        tlsManager.addConfigurationWriter(new 
JsonConfigurationWriter<>(objectMapper, outputStreamFactory, new 
File(configJson)));
+        tlsManager.addConfigurationWriter(new 
JsonConfigurationWriter<>(objectMapper, new File(configJson)));
 
         KeyStore.PrivateKeyEntry privateKeyEntry = 
tlsManager.getOrGenerateCertificateAuthority();
         KeyPair keyPair = new 
KeyPair(privateKeyEntry.getCertificate().getPublicKey(), 
privateKeyEntry.getPrivateKey());

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityServiceCommandLine.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityServiceCommandLine.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityServiceCommandLine.java
index 2b1db39..948409a 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityServiceCommandLine.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/service/server/TlsCertificateAuthorityServiceCommandLine.java
@@ -30,6 +30,9 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+/**
+ * Command line parser for a TlsConfig object and a main entry point to invoke 
the parser and run the CA server
+ */
 public class TlsCertificateAuthorityServiceCommandLine extends 
BaseCertificateAuthorityCommandLine {
     public static final String DESCRIPTION = "Acts as a Certificate Authority 
that can be used by clients to get Certificates";
     public static final String NIFI_CA_KEYSTORE = "nifi-ca-" + KEYSTORE;
@@ -51,7 +54,7 @@ public class TlsCertificateAuthorityServiceCommandLine 
extends BaseCertificateAu
         try {
             tlsCertificateAuthorityServiceCommandLine.parse(args);
         } catch (CommandLineParseException e) {
-            System.exit(e.getExitCode());
+            System.exit(e.getExitCode().ordinal());
         }
         TlsCertificateAuthorityService tlsCertificateAuthorityService = new 
TlsCertificateAuthorityService();
         
tlsCertificateAuthorityService.start(tlsCertificateAuthorityServiceCommandLine.createConfig(),
 tlsCertificateAuthorityServiceCommandLine.getConfigJson(),

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandalone.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandalone.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandalone.java
index 8dc5186..5129288 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandalone.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandalone.java
@@ -183,7 +183,7 @@ public class TlsToolkitStandalone {
             tlsClientManager.addPrivateKeyToKeyStore(keyPair, NIFI_KEY, 
CertificateUtils.generateIssuedCertificate(TlsConfig.calcDefaultDn(hostname),
                     keyPair.getPublic(), certificate, caKeyPair, 
signingAlgorithm, days), certificate);
             tlsClientManager.setCertificateEntry(NIFI_CERT, certificate);
-            tlsClientManager.addClientConfigurationWriter(new 
NifiPropertiesTlsClientConfigWriter(niFiPropertiesWriterFactory, 
outputStreamFactory, new File(hostDir, "nifi.properties"),
+            tlsClientManager.addClientConfigurationWriter(new 
NifiPropertiesTlsClientConfigWriter(niFiPropertiesWriterFactory, new 
File(hostDir, "nifi.properties"),
                     hostname, instanceDefinition.getNumber()));
             tlsClientManager.write(outputStreamFactory);
             if (logger.isInfoEnabled()) {

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLine.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLine.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLine.java
index 4ba0746..f6d761f 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLine.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLine.java
@@ -42,6 +42,9 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
+/**
+ * Command line parser for a StandaloneConfig object and a main entry point to 
invoke the parser and run the standalone generator
+ */
 public class TlsToolkitStandaloneCommandLine extends BaseCommandLine {
     public static final String OUTPUT_DIRECTORY_ARG = "outputDirectory";
     public static final String NIFI_PROPERTIES_FILE_ARG = "nifiPropertiesFile";
@@ -95,7 +98,7 @@ public class TlsToolkitStandaloneCommandLine extends 
BaseCommandLine {
         try {
             tlsToolkitStandaloneCommandLine.parse(args);
         } catch (CommandLineParseException e) {
-            System.exit(e.getExitCode());
+            System.exit(e.getExitCode().ordinal());
         }
         try {
             new 
TlsToolkitStandalone().createNifiKeystoresAndTrustStores(tlsToolkitStandaloneCommandLine.createConfig());
@@ -181,6 +184,11 @@ public class TlsToolkitStandaloneCommandLine extends 
BaseCommandLine {
         }
     }
 
+    /**
+     * Creates the StandaloneConfig for use in running TlsToolkitStandalone
+     *
+     * @return the StandaloneConfig for use in running TlsToolkitStandalone
+     */
     public StandaloneConfig createConfig() {
         StandaloneConfig standaloneConfig = new StandaloneConfig();
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/util/PasswordUtil.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/util/PasswordUtil.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/util/PasswordUtil.java
index 2c7a6aa..fb49455 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/util/PasswordUtil.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/main/java/org/apache/nifi/toolkit/tls/util/PasswordUtil.java
@@ -17,7 +17,6 @@
 
 package org.apache.nifi.toolkit.tls.util;
 
-import java.math.BigInteger;
 import java.security.SecureRandom;
 import java.util.Base64;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -35,8 +34,9 @@ public class PasswordUtil {
     }
 
     public String generatePassword() {
-        // [see 
http://stackoverflow.com/questions/41107/how-to-generate-a-random-alpha-numeric-string#answer-41156]
-        String string = Base64.getEncoder().encodeToString(new BigInteger(256, 
secureRandom).toByteArray());
+        byte[] bytes = new byte[32];
+        secureRandom.nextBytes(bytes);
+        String string = Base64.getEncoder().encodeToString(bytes);
         while (string.endsWith("=")) {
             string = string.substring(0, string.length() - 1);
         }

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/TlsToolkitMainTest.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/TlsToolkitMainTest.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/TlsToolkitMainTest.java
index c9a74dd..971b6f2 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/TlsToolkitMainTest.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/TlsToolkitMainTest.java
@@ -25,6 +25,7 @@ import org.junit.Test;
 
 import java.io.IOException;
 
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -96,6 +97,14 @@ public class TlsToolkitMainTest {
         systemExitCapturer.runAndAssertExitCode(() -> 
tlsToolkitMain.doMain(new String[]{noMain}), ExitCode.SERVICE_ERROR);
     }
 
+    @Test
+    public void testRemovesServiceArg() {
+        String storingMain = "storingmain";
+        tlsToolkitMain.getMainMap().put(storingMain, StoringMain.class);
+        tlsToolkitMain.doMain(new String[]{storingMain, "-h"});
+        assertArrayEquals(new String[]{"-h"}, StoringMain.args);
+    }
+
     private static class PrivateMain {
         private static void main(String[] args) {
 
@@ -111,4 +120,12 @@ public class TlsToolkitMainTest {
     private static class NoMain {
 
     }
+
+    private static class StoringMain {
+        private static String[] args;
+
+        public static void main(String[] args) {
+            StoringMain.args = args;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriterTest.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriterTest.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriterTest.java
index c96d906..29e39b6 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriterTest.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/manager/writer/NifiPropertiesTlsClientConfigWriterTest.java
@@ -92,27 +92,27 @@ public class NifiPropertiesTlsClientConfigWriterTest {
 
         niFiPropertiesWriter = new NiFiPropertiesWriter(new ArrayList<>());
         
when(niFiPropertiesWriterFactory.create()).thenReturn(niFiPropertiesWriter);
-        nifiPropertiesTlsClientConfigWriter = new 
NifiPropertiesTlsClientConfigWriter(niFiPropertiesWriterFactory, 
outputStreamFactory, outputFile, testHostname, hostNum);
+        nifiPropertiesTlsClientConfigWriter = new 
NifiPropertiesTlsClientConfigWriter(niFiPropertiesWriterFactory, outputFile, 
testHostname, hostNum);
         overlayProperties = 
nifiPropertiesTlsClientConfigWriter.getOverlayProperties();
     }
 
     @Test
     public void testDefaults() throws IOException {
-        nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig);
+        nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig, 
outputStreamFactory);
         testHostnamesAndPorts();
-        assertNotEquals(0, 
nifiPropertiesTlsClientConfigWriter.getPropertyPortMap().size());
+        assertNotEquals(0, 
nifiPropertiesTlsClientConfigWriter.getIncrementingPropertyMap().size());
     }
 
     @Test(expected = NumberFormatException.class)
     public void testBadPortNum() throws IOException {
-        
nifiPropertiesTlsClientConfigWriter.getOverlayProperties().setProperty(nifiPropertiesTlsClientConfigWriter.getPropertyPortMap().keySet().iterator().next(),
 "notAnInt");
-        nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig);
+        
nifiPropertiesTlsClientConfigWriter.getOverlayProperties().setProperty(nifiPropertiesTlsClientConfigWriter.getIncrementingPropertyMap().keySet().iterator().next(),
 "notAnInt");
+        nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig, 
outputStreamFactory);
     }
 
     @Test
     public void testNoHostnameProperties() throws IOException {
         
nifiPropertiesTlsClientConfigWriter.getOverlayProperties().setProperty(NifiPropertiesTlsClientConfigWriter.HOSTNAME_PROPERTIES,
 "");
-        nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig);
+        nifiPropertiesTlsClientConfigWriter.write(tlsClientConfig, 
outputStreamFactory);
         testHostnamesAndPorts();
         Properties nifiProperties = getNifiProperties();
         nifiProperties.stringPropertyNames().forEach(s -> 
assertNotEquals(testHostname, nifiProperties.getProperty(s)));
@@ -133,9 +133,10 @@ public class NifiPropertiesTlsClientConfigWriterTest {
         assertEquals("", 
nifiProperties.getProperty(NiFiProperties.WEB_HTTP_HOST));
         assertEquals("", 
nifiProperties.getProperty(NiFiProperties.WEB_HTTP_PORT));
         assertEquals(Boolean.toString(true), 
nifiProperties.getProperty(NiFiProperties.SITE_TO_SITE_SECURE));
+        assertEquals(Boolean.toString(true), 
nifiProperties.getProperty(NiFiProperties.CLUSTER_PROTOCOL_IS_SECURE));
 
         
nifiPropertiesTlsClientConfigWriter.getHostnamePropertyStream().forEach(s -> 
assertEquals(testHostname, nifiProperties.getProperty(s)));
-        
nifiPropertiesTlsClientConfigWriter.getPropertyPortMap().entrySet().forEach(propertyToPortEntry
 -> {
+        
nifiPropertiesTlsClientConfigWriter.getIncrementingPropertyMap().entrySet().forEach(propertyToPortEntry
 -> {
             assertEquals(Integer.toString(propertyToPortEntry.getValue()), 
nifiProperties.getProperty(propertyToPortEntry.getKey()));
             
assertEquals(Integer.parseInt(overlayProperties.getProperty(propertyToPortEntry.getKey()))
 + hostNum - 1, propertyToPortEntry.getValue().intValue());
         });

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLineTest.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLineTest.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLineTest.java
index 40a8268..3770cb7 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLineTest.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/service/client/TlsCertificateAuthorityClientCommandLineTest.java
@@ -49,7 +49,7 @@ public class TlsCertificateAuthorityClientCommandLineTest {
             tlsCertificateAuthorityClientCommandLine.parse(new String[0]);
             fail("Expected failure with no token argument");
         } catch (CommandLineParseException e) {
-            assertEquals(ExitCode.ERROR_TOKEN_ARG_EMPTY.ordinal(), 
e.getExitCode());
+            assertEquals(ExitCode.ERROR_TOKEN_ARG_EMPTY, e.getExitCode());
         }
     }
 
@@ -95,7 +95,7 @@ public class TlsCertificateAuthorityClientCommandLineTest {
             tlsCertificateAuthorityClientCommandLine.parse("-h");
             fail("Expected exception");
         } catch (CommandLineParseException e) {
-            assertEquals(ExitCode.HELP.ordinal(), e.getExitCode());
+            assertEquals(ExitCode.HELP, e.getExitCode());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLineTest.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLineTest.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLineTest.java
index a284318..d174748 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLineTest.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/standalone/TlsToolkitStandaloneCommandLineTest.java
@@ -69,7 +69,7 @@ public class TlsToolkitStandaloneCommandLineTest {
             tlsToolkitStandaloneCommandLine.parse("-h");
             fail("Expected usage and help exit");
         } catch (CommandLineParseException e) {
-            Assert.assertEquals(ExitCode.HELP.ordinal(), e.getExitCode());
+            Assert.assertEquals(ExitCode.HELP, e.getExitCode());
         }
     }
 
@@ -79,7 +79,7 @@ public class TlsToolkitStandaloneCommandLineTest {
             tlsToolkitStandaloneCommandLine.parse("--unknownArg");
             fail("Expected error parsing command line");
         } catch (CommandLineParseException e) {
-            assertEquals(ExitCode.ERROR_PARSING_COMMAND_LINE.ordinal(), 
e.getExitCode());
+            assertEquals(ExitCode.ERROR_PARSING_COMMAND_LINE, e.getExitCode());
         }
     }
 
@@ -96,7 +96,7 @@ public class TlsToolkitStandaloneCommandLineTest {
             tlsToolkitStandaloneCommandLine.parse("-k", "badVal");
             fail("Expected bad keysize exit code");
         } catch (CommandLineParseException e) {
-            assertEquals(ExitCode.ERROR_PARSING_INT_ARG.ordinal(), 
e.getExitCode());
+            assertEquals(ExitCode.ERROR_PARSING_INT_ARG, e.getExitCode());
         }
     }
 
@@ -119,7 +119,7 @@ public class TlsToolkitStandaloneCommandLineTest {
         try {
             tlsToolkitStandaloneCommandLine.parse("-d", "badVal");
         } catch (CommandLineParseException e) {
-            assertEquals(ExitCode.ERROR_PARSING_INT_ARG.ordinal(), 
e.getExitCode());
+            assertEquals(ExitCode.ERROR_PARSING_INT_ARG, e.getExitCode());
         }
     }
 
@@ -175,7 +175,7 @@ public class TlsToolkitStandaloneCommandLineTest {
             tlsToolkitStandaloneCommandLine.parse("-f", 
"/this/file/should/not/exist.txt");
             fail("Expected error when unable to read file");
         } catch (CommandLineParseException e) {
-            assertEquals(ExitCode.ERROR_READING_NIFI_PROPERTIES.ordinal(), 
e.getExitCode());
+            assertEquals(ExitCode.ERROR_READING_NIFI_PROPERTIES, 
e.getExitCode());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/util/PasswordUtilTest.java
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/util/PasswordUtilTest.java
 
b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/util/PasswordUtilTest.java
index f08c32c..b4cbf7d 100644
--- 
a/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/util/PasswordUtilTest.java
+++ 
b/nifi-toolkit/nifi-toolkit-tls/src/test/java/org/apache/nifi/toolkit/tls/util/PasswordUtilTest.java
@@ -45,7 +45,10 @@ public class PasswordUtilTest {
             System.arraycopy(val, 0, bytes, bytes.length - val.length, 
val.length);
             return null;
         }).when(secureRandom).nextBytes(any(byte[].class));
-        String expected = 
Base64.getEncoder().encodeToString(BigInteger.valueOf(Integer.valueOf(value).longValue()).toByteArray()).split("=")[0];
+        byte[] expectedBytes = new byte[32];
+        byte[] numberBytes = 
BigInteger.valueOf(Integer.valueOf(value).longValue()).toByteArray();
+        System.arraycopy(numberBytes, 0, expectedBytes, expectedBytes.length - 
numberBytes.length, numberBytes.length);
+        String expected = 
Base64.getEncoder().encodeToString(expectedBytes).split("=")[0];
         String actual = passwordUtil.generatePassword();
         assertEquals(expected, actual);
     }

http://git-wip-us.apache.org/repos/asf/nifi/blob/d4bbd647/nifi-toolkit/nifi-toolkit-tls/src/test/resources/overlay.properties
----------------------------------------------------------------------
diff --git 
a/nifi-toolkit/nifi-toolkit-tls/src/test/resources/overlay.properties 
b/nifi-toolkit/nifi-toolkit-tls/src/test/resources/overlay.properties
index c4d02c2..2084bf3 100644
--- a/nifi-toolkit/nifi-toolkit-tls/src/test/resources/overlay.properties
+++ b/nifi-toolkit/nifi-toolkit-tls/src/test/resources/overlay.properties
@@ -15,9 +15,27 @@
 # limitations under the License.
 #
 
+# This properties file specifies how to update the provided nifi.properties
+
 # Comma separated list of properties to put the hostname into
-hostname.properties=nifi.remote.input.host,nifi.web.https.host,nifi.cluster.node.address
+hostname.properties= \
+  nifi.remote.input.host, \
+  nifi.web.https.host, \
+  nifi.cluster.node.address
+
+# Comma separated list of properties to increment (must also be defined in 
this file)
+incrementing.properties= \
+  nifi.web.https.port, \
+  nifi.remote.input.socket.port, \
+  nifi.cluster.node.protocol.port
 
 nifi.web.https.port=9443
 nifi.remote.input.socket.port=10443
-nifi.cluster.node.protocol.port=11443
\ No newline at end of file
+nifi.cluster.node.protocol.port=11443
+
+# Properties to set verbatim
+nifi.remote.input.secure=true
+nifi.cluster.protocol.is.secure=true
+
+nifi.web.http.host=
+nifi.web.http.port=
\ No newline at end of file

Reply via email to