MINIFI-537 Fix NPE in BootstrapTransformer

Also includes partial work towards MINIFI-536 by adding setters to ConfigSchema.

MINIFI-537 Add unit tests

Fix checkstlye errors
diff --git a/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformer.java b/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformer.java
index 3609426..fd1aa07 100644
--- a/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformer.java
+++ b/minifi-bootstrap/src/main/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformer.java
@@ -257,7 +257,9 @@
             orderedProperties.setProperty("nifi.web.jetty.working.directory", "./work/jetty");
             orderedProperties.setProperty("nifi.web.jetty.threads", "200");
 
-            orderedProperties.setProperty("nifi.sensitive.props.key", sensitiveProperties.getKey(), System.lineSeparator() + "# security properties #");
+            final String sensitivePropertiesKey = sensitiveProperties.getKey();
+            final String notnullSensitivePropertiesKey = sensitivePropertiesKey != null ? sensitivePropertiesKey : "";
+            orderedProperties.setProperty("nifi.sensitive.props.key", notnullSensitivePropertiesKey, System.lineSeparator() + "# security properties #");
             orderedProperties.setProperty("nifi.sensitive.props.algorithm", sensitiveProperties.getAlgorithm());
             orderedProperties.setProperty("nifi.sensitive.props.provider", sensitiveProperties.getProvider());
 
diff --git a/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformerTest.java b/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformerTest.java
index ae7ffa7..d9c6716 100644
--- a/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformerTest.java
+++ b/minifi-bootstrap/src/test/java/org/apache/nifi/minifi/bootstrap/util/ConfigTransformerTest.java
@@ -718,6 +718,17 @@
         }
     }
 
+    @Test
+    public void testNullSensitiveKey() throws IOException, ConfigurationChangeException, SchemaLoaderException {
+        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        try (final InputStream configStream = ConfigTransformerTest.class.getClassLoader().getResourceAsStream("MINIFI-537/config.yml")) {
+            ConfigTransformer.writeNiFiProperties(SchemaLoader.loadConfigSchemaFromYaml(configStream), outputStream);
+        }
+        final Properties properties = new Properties();
+        properties.load(new ByteArrayInputStream(outputStream.toByteArray()));
+        assertEquals("", properties.getProperty("nifi.sensitive.props.key"));
+    }
+
     private String getText(Element element, String path) throws XPathExpressionException {
         return (String) xPathFactory.newXPath().evaluate(path + "/text()", element, XPathConstants.STRING);
     }
diff --git a/minifi-bootstrap/src/test/resources/MINIFI-516/bootstrap.conf b/minifi-bootstrap/src/test/resources/MINIFI-516/bootstrap.conf
index 2fe540d..06b0497 100644
--- a/minifi-bootstrap/src/test/resources/MINIFI-516/bootstrap.conf
+++ b/minifi-bootstrap/src/test/resources/MINIFI-516/bootstrap.conf
@@ -36,7 +36,7 @@
 # Security Properties #
 # These properties take precedence over any equivalent properties specified in config.yml #
 nifi.minifi.security.keystore=
-nifi.minifi.security.keystoreType=
+nifi.minifi.security.keystoreType=jks
 nifi.minifi.security.keystorePasswd=
 nifi.minifi.security.keyPasswd=
 nifi.minifi.security.truststore=
diff --git a/minifi-bootstrap/src/test/resources/MINIFI-516/config.yml b/minifi-bootstrap/src/test/resources/MINIFI-516/config.yml
index 933e124..46da72c 100644
--- a/minifi-bootstrap/src/test/resources/MINIFI-516/config.yml
+++ b/minifi-bootstrap/src/test/resources/MINIFI-516/config.yml
@@ -46,7 +46,7 @@
   snapshot frequency: 1 min
 Security Properties:
   keystore: ''
-  keystore type: ''
+  keystore type: 'jks'
   keystore password: ''
   key password: ''
   truststore: ''
diff --git a/minifi-bootstrap/src/test/resources/MINIFI-537/config.yml b/minifi-bootstrap/src/test/resources/MINIFI-537/config.yml
new file mode 100644
index 0000000..7193843
--- /dev/null
+++ b/minifi-bootstrap/src/test/resources/MINIFI-537/config.yml
@@ -0,0 +1,43 @@
+# 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.
+
+MiNiFi Config Version: 3
+Flow Controller:
+  name: MiNiFi Flow
+  comment: ''
+Core Properties:
+  flow controller graceful shutdown period: 10 sec
+  flow service write delay interval: 500 ms
+  administrative yield duration: 30 sec
+  bored yield duration: 10 millis
+  max concurrent threads: 1
+  variable registry properties: additional.properties
+Security Properties:
+  keystore: /tmp/ssl/localhost-ks.jks
+  keystore type: JKS
+  keystore password: localtest
+  key password: localtest
+  truststore: /tmp/ssl/localhost-ts.jks
+  truststore type: JKS
+  truststore password: localtest
+  ssl protocol: TLS
+Processors: []
+Connections: []
+Remote Process Groups: []
+Provenance Reporting: {}
+FlowFile Repository: {}
+Content Repository: {}
+Provenance Repository: {}
+Component Status Repository: {}
diff --git a/minifi-commons/minifi-commons-schema/src/main/java/org/apache/nifi/minifi/commons/schema/ConfigSchema.java b/minifi-commons/minifi-commons-schema/src/main/java/org/apache/nifi/minifi/commons/schema/ConfigSchema.java
index d6b36ef..31577c9 100644
--- a/minifi-commons/minifi-commons-schema/src/main/java/org/apache/nifi/minifi/commons/schema/ConfigSchema.java
+++ b/minifi-commons/minifi-commons-schema/src/main/java/org/apache/nifi/minifi/commons/schema/ConfigSchema.java
@@ -186,18 +186,34 @@
         return flowControllerProperties;
     }
 
+    public void setFlowControllerProperties(final FlowControllerSchema flowControllerProperties) {
+        this.flowControllerProperties = flowControllerProperties;
+    }
+
     public CorePropertiesSchema getCoreProperties() {
         return coreProperties;
     }
 
+    public void setCoreProperties(final CorePropertiesSchema coreProperties) {
+        this.coreProperties = coreProperties;
+    }
+
     public FlowFileRepositorySchema getFlowfileRepositoryProperties() {
         return flowfileRepositoryProperties;
     }
 
+    public void setFlowfileRepositoryProperties(final FlowFileRepositorySchema flowfileRepositoryProperties) {
+        this.flowfileRepositoryProperties = flowfileRepositoryProperties;
+    }
+
     public ContentRepositorySchema getContentRepositoryProperties() {
         return contentRepositoryProperties;
     }
 
+    public void setContentRepositoryProperties(final ContentRepositorySchema contentRepositoryProperties) {
+        this.contentRepositoryProperties = contentRepositoryProperties;
+    }
+
     public SecurityPropertiesSchema getSecurityProperties() {
         return securityProperties;
     }
@@ -206,34 +222,54 @@
         this.securityProperties = securityProperties;
     }
 
-    public void setProvenanceReportingProperties(ProvenanceReportingSchema provenanceReportingProperties) {
-        this.provenanceReportingProperties = provenanceReportingProperties;
-    }
-
     public ProcessGroupSchema getProcessGroupSchema() {
         return processGroupSchema;
     }
 
+    public void setProcessGroupSchema(final ProcessGroupSchema processGroupSchema) {
+        this.processGroupSchema = processGroupSchema;
+    }
+
     public ProvenanceReportingSchema getProvenanceReportingProperties() {
         return provenanceReportingProperties;
     }
 
+    public void setProvenanceReportingProperties(ProvenanceReportingSchema provenanceReportingProperties) {
+        this.provenanceReportingProperties = provenanceReportingProperties;
+    }
+
     public List<ReportingSchema> getReportingTasksSchema() {
         return reportingTasks;
     }
 
+    public void setReportingTasks(final List<ReportingSchema> reportingTasks) {
+        this.reportingTasks = reportingTasks;
+    }
+
     public ComponentStatusRepositorySchema getComponentStatusRepositoryProperties() {
         return componentStatusRepositoryProperties;
     }
 
+    public void setComponentStatusRepositoryProperties(final ComponentStatusRepositorySchema componentStatusRepositoryProperties) {
+        this.componentStatusRepositoryProperties = componentStatusRepositoryProperties;
+    }
+
     public ProvenanceRepositorySchema getProvenanceRepositorySchema() {
         return provenanceRepositorySchema;
     }
 
+    public void setProvenanceRepositorySchema(final ProvenanceRepositorySchema provenanceRepositorySchema) {
+        this.provenanceRepositorySchema = provenanceRepositorySchema;
+    }
+
     public Map<String, String> getNifiPropertiesOverrides() {
         return nifiPropertiesOverrides;
     }
 
+    public void setNifiPropertiesOverrides(final Map<String, String> nifiPropertiesOverrides) {
+        this.nifiPropertiesOverrides = nifiPropertiesOverrides;
+    }
+
     @Override
     public int getVersion() {
         return CONFIG_VERSION;