Merge "[OOM-CPMv2] Edit cert-service docs"
authorBogumil Zebek <bogumil.zebek@nokia.com>
Thu, 17 Sep 2020 05:14:31 +0000 (05:14 +0000)
committerGerrit Code Review <gerrit@onap.org>
Thu, 17 Sep 2020 05:14:31 +0000 (05:14 +0000)
86 files changed:
certService/pom.xml
certServiceClient/pom.xml
docs/sections/release-notes.rst
pom.xml
releases/2.0.0-container.yaml [new file with mode: 0644]
trustStoreMerger/README.md
trustStoreMerger/pom.xml
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/AppExecutor.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/AppExitHandler.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/AppExitHandler.java with 87% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/CertificatePostProcessor.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/MainApp.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/MainApp.java with 86% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/api/CertificateConstants.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/api/CertificateConstants.java with 87% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/api/ExitStatus.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/api/ExitStatus.java with 82% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/api/ExitableException.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/api/ExitableException.java with 92% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/common/ExtensionResolver.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/FileManager.java with 85% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/common/FileTools.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/common/PasswordReader.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/PasswordReader.java with 83% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/AppConfigurationLoader.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/TruststoresPathsProviderException.java with 58% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/AppConfigurationProvider.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/exception/CertificatesPathsValidationException.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/exception/ConfigurationException.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/model/AppConfiguration.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfiguration.java with 65% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/model/EnvVariable.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/path/DelimitedPathsSplitter.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/path/env/EnvReader.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/EnvProvider.java with 80% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/path/validation/ValidationFunctions.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/copier/KeystoreCopier.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/copier/exception/KeystoreFileCopyException.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/copier/exception/KeystoreNotExistException.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/TruststoreFilesProvider.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoreFilesListProvider.java with 56% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/TruststoreMerger.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/exception/AliasConflictException.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/exception/AliasConflictException.java with 76% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/exception/CreateBackupException.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/exception/CreateBackupException.java with 77% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/exception/KeystoreInstanceException.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/exception/KeystoreInstanceException.java with 76% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/exception/LoadTruststoreException.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/exception/LoadTruststoreException.java with 76% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/exception/MissingTruststoreException.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/exception/MissingTruststoreException.java with 76% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/exception/PasswordReaderException.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/exception/PasswordReaderException.java with 76% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/exception/TruststoreDataOperationException.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/exception/TruststoreDataOperationException.java with 76% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/exception/TruststoreFileFactoryException.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/exception/TruststoreFileFactoryException.java with 75% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/exception/WriteTruststoreFileException.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/exception/WriteTruststoreFileException.java with 76% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/JavaTruststore.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/JavaCertificateStoreController.java with 70% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/JavaTruststoreFactory.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/PemTruststore.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/PemCertificateController.java with 80% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/Truststore.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/model/Truststore.java with 50% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/TruststoreFactory.java [new file with mode: 0644]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/certificate/CertificateWithAlias.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/entry/CertificateWithAlias.java with 95% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/certificate/CertificateWithAliasFactory.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/entry/CertificateWithAliasFactory.java with 95% similarity]
trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/certificate/PemAliasGenerator.java [moved from trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/entry/PemAliasGenerator.java with 95% similarity]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/TrustStoreMerger.java [deleted file]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/api/ConfigurationEnvs.java [deleted file]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoreFileFactory.java [deleted file]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/model/JavaTruststore.java [deleted file]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/model/PemTruststore.java [deleted file]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/CertificateController.java [deleted file]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/CertificateStoreControllerFactory.java [deleted file]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/PathValidator.java [deleted file]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/TruststoresPathsProvider.java [deleted file]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationException.java [deleted file]
trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactory.java [deleted file]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/AppExecutorTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/common/ExtensionResolverTest.java [moved from trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/FileManagerTest.java with 87% similarity]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/common/FileToolsTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/common/PasswordReaderTest.java [moved from trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/PasswordReaderTest.java with 79% similarity]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/AppConfigurationProviderTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/path/DelimitedPathsSplitterTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/path/env/EnvReaderTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/path/validation/ValidationFunctionsTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/copier/KeystoreCopierTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/TruststoreFilesProviderTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/model/JavaTruststoreTest.java [moved from trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/JavaCertificateStoreControllerTest.java with 56% similarity]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/model/PemTruststoreTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/model/TestCertificateProvider.java [moved from trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/TestCertificateProvider.java with 50% similarity]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/model/TruststoreFactoryTest.java [moved from trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFactoryTest.java with 60% similarity]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/model/TruststoreTest.java [new file with mode: 0644]
trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/model/certificate/PemAliasGeneratorTest.java [moved from trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/entry/PemAliasGeneratorTest.java with 93% similarity]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/TrustStoreMergerTest.java [deleted file]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/model/JavaTruststoreTest.java [deleted file]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/model/PemTruststoreTest.java [deleted file]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/model/TruststoreTest.java [deleted file]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/PemCertificateControllerTest.java [deleted file]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFilesListProviderTest.java [deleted file]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/path/PathValidatorTest.java [deleted file]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/path/TruststoresPathsProviderTest.java [deleted file]
trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactoryTest.java [deleted file]
trustStoreMerger/src/test/resources/keystore.pass [new file with mode: 0644]
version.properties

index 4d75fe9..8c8a487 100644 (file)
     <parent>
         <groupId>org.onap.oom.platform.cert-service</groupId>
         <artifactId>oom-certservice</artifactId>
-        <version>1.2.0-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
     <artifactId>oom-certservice-api</artifactId>
-    <version>1.2.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
     <name>oom-certservice-api</name>
     <description>OOM Certification Service Api</description>
     <packaging>jar</packaging>
index 8c15641..0a1bd29 100644 (file)
     <parent>
         <artifactId>oom-certservice</artifactId>
         <groupId>org.onap.oom.platform.cert-service</groupId>
-        <version>1.2.0-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>oom-certservice-client</artifactId>
-    <version>1.2.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
     <name>oom-certservice-client</name>
     <description>OOM Certification Service Api Client</description>
     <packaging>jar</packaging>
index daeab0f..b3eb398 100644 (file)
@@ -6,6 +6,47 @@
 Release Notes
 ==============
 
+Version: 2.0.0
+--------------
+
+:Release Date:
+
+**New Features**
+
+        - The same functionality as in aaf-certservice 1.2.0
+
+**Bug Fixes**
+
+        N/A
+
+**Known Issues**
+
+        N/A
+
+**Security Notes**
+
+        N/A
+
+*Fixed Security Issues*
+
+        N/A
+
+*Known Security Issues*
+
+        N/A
+
+*Known Vulnerabilities in Used Modules*
+
+        N/A
+
+**Upgrade Notes**
+
+**Deprecation Notes**
+
+**Other**
+
+===========
+
 Version: 1.2.0
 --------------
 
diff --git a/pom.xml b/pom.xml
index 5b582f3..793439d 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
     </parent>
     <groupId>org.onap.oom.platform.cert-service</groupId>
     <artifactId>oom-certservice</artifactId>
-    <version>1.2.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
     <name>oom-certservice</name>
     <description>OOM Certification Service</description>
     <packaging>pom</packaging>
diff --git a/releases/2.0.0-container.yaml b/releases/2.0.0-container.yaml
new file mode 100644 (file)
index 0000000..ce7c1e1
--- /dev/null
@@ -0,0 +1,12 @@
+distribution_type: 'container'
+container_release_tag: '2.0.0'
+container_pull_registry: nexus3.onap.org:10003
+container_push_registry: nexus3.onap.org:10002
+project: 'oom-platform-cert-service'
+log_dir: 'oom-platform-cert-service-maven-docker-stage-master/40'
+ref: fedbe9461dbc5667f35651e6211f025989578e50
+containers:
+  - name: 'org.onap.oom.platform.cert-service.oom-certservice-api'
+    version: '2.0.0-20200903T201647Z'
+  - name: 'org.onap.oom.platform.cert-service.oom-certservice-client'
+    version: '2.0.0-20200903T201647Z'
\ No newline at end of file
index dff8a14..5a2c2b4 100644 (file)
@@ -26,12 +26,18 @@ Exemplary config.env file with necessary envs
 ```
 TRUSTSTORES_PATHS=/var/certs/truststore.jks:/var/certs/truststore.pem
 TRUSTSTORES_PASSWORDS_PATHS=/var/certs/truststoreJks.pass:
+KEYSTORE_SOURCE_PATHS=/var/certs/external/keystore.jks:/var/certs/external/keystore.pass
+KEYSTORE_DESTINATION_PATHS=/var/certs/cert.jks:/var/certs/jks.pass
 ```
 TRUSTSTORES_PATHS env indicates paths (separated by ":") where truststores files are located.
 
 TRUSTSTORES_PASSWORDS_PATHS env indicates paths (separated by ":") where files with passwords to truststores are located.
 PEM is not protected by password so its value should be empty
 
+KEYSTORE_SOURCE_PATHS env (optional) indicates paths (separated by ":") where files to copy are located.
+
+KEYSTORE_DESTINATION_PATHS env (optional) indicates paths (separated by ":") to files which should be replaced. Before keystore files override, destination files will be copied with addition of .bak extension.
+
 Execute below command in order to run app as docker container
 ```
 docker run \
@@ -42,9 +48,10 @@ onap/org.onap.oom.platform.cert-service.oom-truststore-merger:latest
 ```
 Before run replace <src_path> with absolute path where you located truststores to merge (eg. /certs/resources/)
 
-Output from merger (when pointed more than one truststore to merge in TRUSTSTORES_PATHS env) success execution should be:
+Output from merger (when pointed more than one truststore to merge in TRUSTSTORES_PATHS env and provided optional envs) success execution should be:
 1. Created backup file (with .bak ext) of first truststore pointed in TRUSTSTORES_PATHS env
-2. First truststore pointed in TRUSTSTORES_PATHS env contains merged certificates from all truststores mentioned in TRUSTSTORES_PATHS env
+2. Keystores files listed in KEYSTORE_SOURCE_PATHS env overrides corresponding to them files defined in KEYSTORE_DESTINATION_PATHS env.
+3. Keystores listed in KEYSTORE_SOURCE_PATHS env are in locations taken from KEYSTORE_DESTINATION_PATHS env. Files listed in KEYSTORE_DESTINATION_PATHS env before application run, still exist with appended .bak extension.
 
 Remove docker container:
 ```
@@ -75,3 +82,6 @@ docker logs oom-merger
 9   Missing truststore certificates in provided file
 10  Alias conflict detected
 11  Cannot save truststore file
+12  Cannot copy keystore file
+13  Keystore file does not exist
+99  Application exited abnormally
index fd2aff0..d150a9b 100644 (file)
@@ -5,12 +5,12 @@
     <parent>
         <artifactId>oom-certservice</artifactId>
         <groupId>org.onap.oom.platform.cert-service</groupId>
-        <version>1.2.0-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>oom-truststore-merger</artifactId>
-    <version>1.2.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
     <name>oom-truststore-merger</name>
     <description>Truststore merging application</description>
     <packaging>jar</packaging>
@@ -70,7 +70,7 @@
                                     <transformers>
                                         <transformer
                                                 implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                            <mainClass>org.onap.oom.truststoremerger.MainApp</mainClass>
+                                            <mainClass>org.onap.oom.certservice.postprocessor.MainApp</mainClass>
                                         </transformer>
                                     </transformers>
                                 </configuration>
 
 
     <dependencies>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.assertj</groupId>
             <artifactId>assertj-core</artifactId>
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/AppExecutor.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/AppExecutor.java
new file mode 100644 (file)
index 0000000..2ef30b6
--- /dev/null
@@ -0,0 +1,54 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor;
+
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AppExecutor {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AppExecutor.class);
+
+    private AppExitHandler exitHandler;
+
+    AppExecutor() {
+        this(new AppExitHandler());
+    }
+
+    AppExecutor(AppExitHandler exitHandler) {
+        this.exitHandler = exitHandler;
+    }
+
+
+    public void execute(Runnable logic) {
+        try {
+            logic.run();
+            exitHandler.exit(ExitStatus.SUCCESS);
+        } catch (ExitableException e) {
+            LOGGER.error("Application failed: ", e);
+            exitHandler.exit(e.applicationExitStatus());
+        } catch (Exception e) {
+            LOGGER.error("Application failed (unexpected error): ", e);
+            exitHandler.exit(ExitStatus.UNEXPECTED_EXCEPTION);
+        }
+    }
+}
@@ -17,9 +17,9 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger;
+package org.onap.oom.certservice.postprocessor;
 
-import org.onap.oom.truststoremerger.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,7 +27,7 @@ public class AppExitHandler {
     private static final Logger LOGGER = LoggerFactory.getLogger(AppExitHandler.class);
 
     public void exit(ExitStatus exitStatus) {
-        LOGGER.info("Application exits with following exit code: {} and message: {}",
+        LOGGER.info("Application exits with code [{}] and message: {}",
                 exitStatus.getExitCodeValue(), exitStatus.getMessage());
         System.exit(exitStatus.getExitCodeValue());
     }
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/CertificatePostProcessor.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/CertificatePostProcessor.java
new file mode 100644 (file)
index 0000000..b903822
--- /dev/null
@@ -0,0 +1,47 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor;
+
+import org.onap.oom.certservice.postprocessor.common.FileTools;
+import org.onap.oom.certservice.postprocessor.configuration.AppConfigurationLoader;
+import org.onap.oom.certservice.postprocessor.configuration.model.AppConfiguration;
+import org.onap.oom.certservice.postprocessor.copier.KeystoreCopier;
+import org.onap.oom.certservice.postprocessor.merger.TruststoreMerger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class CertificatePostProcessor implements Runnable {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(CertificatePostProcessor.class);
+
+    private AppConfigurationLoader config = new AppConfigurationLoader();
+    private TruststoreMerger merger = new TruststoreMerger();
+    private KeystoreCopier copier = new KeystoreCopier(new FileTools());
+
+    public void run() {
+        LOGGER.debug("Loading configuration...");
+        AppConfiguration configuration = config.loadConfiguration();
+        LOGGER.debug("Starting TruststoreMerger...");
+        merger.mergeTruststores(configuration);
+        LOGGER.debug("Starting KeystoreCopier...");
+        copier.copyKeystores(configuration);
+        LOGGER.debug("Certificate post processing finished successfully.");
+    }
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger;
+package org.onap.oom.certservice.postprocessor;
 
 public class MainApp {
 
     public static void main(String[] args) {
-        TrustStoreMerger trustStoreMerger = new TrustStoreMerger(new AppExitHandler());
-        trustStoreMerger.run();
+        new AppExecutor().execute(new CertificatePostProcessor());
     }
 }
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.api;
+package org.onap.oom.certservice.postprocessor.api;
 
 public class CertificateConstants {
 
-    public static final String JKS_INSTANCE = "JKS";
-    public static final String PKCS12_INSTANCE = "PKCS12";
+    public static final String JKS_TYPE = "JKS";
+    public static final String PKCS12_TYPE = "PKCS12";
     public static final String X_509_CERTIFICATE = "X.509";
     public static final String BOUNCY_CASTLE_PROVIDER = "BC";
 
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.api;
+package org.onap.oom.certservice.postprocessor.api;
 
 public enum ExitStatus {
 
     SUCCESS(0, "Success"),
-    TRUSTSTORES_PATHS_PROVIDER_EXCEPTION(1, "Invalid paths in environment variables"),
-    MERGER_CONFIGURATION_EXCEPTION(2, "Invalid merger configuration"),
+    CERTIFICATES_PATHS_VALIDATION_EXCEPTION(1, "Invalid paths in environment variables"),
+    CONFIGURATION_EXCEPTION(2, "Invalid merger configuration"),
     TRUSTSTORE_FILE_FACTORY_EXCEPTION(3, "Invalid truststore file-password pair"),
     PASSWORD_READER_EXCEPTION(4, "Cannot read password from file"),
     CREATE_BACKUP_EXCEPTION(5, "Cannot create backup file"),
@@ -32,7 +32,10 @@ public enum ExitStatus {
     TRUSTSTORE_DATA_OPERATION_EXCEPTION(8, "Cannot operate on truststore data"),
     MISSING_TRUSTSTORE_EXCEPTION(9, "Missing truststore certificates in provided file"),
     ALIAS_CONFLICT_EXCEPTION(10, "Alias conflict detected"),
-    WRITE_TRUSTSTORE_FILE_EXCEPTION(11, "Cannot save truststore file");
+    WRITE_TRUSTSTORE_FILE_EXCEPTION(11, "Cannot save truststore file"),
+    KEYSTORE_FILE_COPY_EXCEPTION(12, "Cannot copy keystore file"),
+    KEYSTORE_NOT_EXIST_EXCEPTION(13, "Keystore file does not exist"),
+    UNEXPECTED_EXCEPTION(99, "Application exited abnormally");
 
 
     private final int value;
@@ -17,9 +17,9 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.api;
+package org.onap.oom.certservice.postprocessor.api;
 
-public class ExitableException extends Exception {
+public class ExitableException extends RuntimeException {
 
     private final ExitStatus exitStatus;
 
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.provider;
+package org.onap.oom.certservice.postprocessor.common;
 
 import java.io.File;
 
-public class FileManager {
+public final class ExtensionResolver {
 
     private static final int INDEX_NOT_FOUND = -1;
 
-    public String getExtension(File file) {
+    private ExtensionResolver() {}
+
+    public static String get(File file) {
         int extStartIndex = file.getName().lastIndexOf(".");
         if (extStartIndex == INDEX_NOT_FOUND) {
             return "";
@@ -33,7 +35,7 @@ public class FileManager {
         return file.getName().substring(extStartIndex).toLowerCase();
     }
 
-    public boolean checkIfFileExists(File file) {
+    public static boolean checkIfFileExists(File file) {
         return file.exists();
     }
 
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/common/FileTools.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/common/FileTools.java
new file mode 100644 (file)
index 0000000..620d808
--- /dev/null
@@ -0,0 +1,52 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.common;
+
+import java.io.File;
+import java.io.IOException;
+import org.apache.commons.io.FileUtils;
+import org.onap.oom.certservice.postprocessor.merger.exception.CreateBackupException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class FileTools {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(FileTools.class);
+    private static final String BACKUP_EXTENSION = ".bak";
+
+    public void createBackup(File file) throws CreateBackupException {
+        LOGGER.debug("Try to create a backup of the file: {}", file.getPath());
+        File backupFile = new File(file.getAbsolutePath() + BACKUP_EXTENSION);
+        try  {
+            copy(file, backupFile);
+        } catch (IOException e) {
+            LOGGER.error("Could not create backup of the file: '{}'", file.getPath());
+            throw new CreateBackupException(e);
+        }
+        LOGGER.debug("Backup file created: '{}'", backupFile.getAbsolutePath());
+    }
+
+    public void copy(File source, File destination) throws IOException {
+        LOGGER.debug("Try to copy from '{}' to '{}'.", source.getAbsolutePath(), destination.getAbsolutePath());
+        FileUtils.copyFile(source, destination);
+        LOGGER.debug("File copied from '{}' to '{}'.", source.getAbsolutePath(),
+            destination.getAbsolutePath());
+    }
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.provider;
+package org.onap.oom.certservice.postprocessor.common;
 
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
-import org.onap.oom.truststoremerger.certification.file.exception.PasswordReaderException;
+import org.onap.oom.certservice.postprocessor.merger.exception.PasswordReaderException;
+
+public final class PasswordReader {
 
-public class PasswordReader {
     private static final String COULD_NOT_READ_PASSWORD_FROM_FILE_MSG_TEMPLATE = "Could not read password from file: %s";
 
-    public String readPassword(File file) throws PasswordReaderException {
+    private PasswordReader() {
+    }
+
+    public static String readPassword(File file) {
         try {
             return Files.readString(file.toPath());
         } catch (IOException e) {
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.path;
+package org.onap.oom.certservice.postprocessor.configuration;
 
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.configuration.model.AppConfiguration;
+import org.onap.oom.certservice.postprocessor.configuration.path.DelimitedPathsSplitter;
+import org.onap.oom.certservice.postprocessor.configuration.path.env.EnvReader;
 
-public class TruststoresPathsProviderException extends ExitableException {
+public class AppConfigurationLoader {
 
-    TruststoresPathsProviderException(String message) {
-        super(message, ExitStatus.TRUSTSTORES_PATHS_PROVIDER_EXCEPTION);
+    public AppConfiguration loadConfiguration() throws ExitableException {
+        DelimitedPathsSplitter pathsSplitter = new DelimitedPathsSplitter();
+        AppConfigurationProvider factory = new AppConfigurationProvider(pathsSplitter, new EnvReader());
+        return factory.createConfiguration();
     }
 }
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/AppConfigurationProvider.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/AppConfigurationProvider.java
new file mode 100644 (file)
index 0000000..79e223c
--- /dev/null
@@ -0,0 +1,85 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.configuration;
+
+
+import static org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable.KEYSTORE_DESTINATION_PATHS;
+import static org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable.KEYSTORE_SOURCE_PATHS;
+import static org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable.TRUSTSTORES_PASSWORDS_PATHS;
+import static org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable.TRUSTSTORES_PATHS;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import org.onap.oom.certservice.postprocessor.configuration.path.env.EnvReader;
+import org.onap.oom.certservice.postprocessor.configuration.exception.CertificatesPathsValidationException;
+import org.onap.oom.certservice.postprocessor.configuration.exception.ConfigurationException;
+import org.onap.oom.certservice.postprocessor.configuration.model.AppConfiguration;
+import org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable;
+import org.onap.oom.certservice.postprocessor.configuration.path.DelimitedPathsSplitter;
+
+public class AppConfigurationProvider {
+
+    private final EnvReader envReader;
+    private final DelimitedPathsSplitter pathsSplitter;
+
+    public AppConfigurationProvider(DelimitedPathsSplitter pathsSplitter, EnvReader envReader) {
+        this.envReader = envReader;
+        this.pathsSplitter = pathsSplitter;
+    }
+
+    public AppConfiguration createConfiguration()
+        throws ConfigurationException, CertificatesPathsValidationException {
+
+        List<String> truststoresPaths = getPaths(TRUSTSTORES_PATHS);
+        List<String> truststoresPasswordsPaths = getPaths(TRUSTSTORES_PASSWORDS_PATHS);
+        List<String> sourceKeystorePaths = getPaths(KEYSTORE_SOURCE_PATHS);
+        List<String> destinationKeystorePaths = getPaths(KEYSTORE_DESTINATION_PATHS);
+
+        ensureSameSize(truststoresPaths, truststoresPasswordsPaths, TRUSTSTORES_PATHS.name(),
+            TRUSTSTORES_PASSWORDS_PATHS.name());
+        ensureSameSize(sourceKeystorePaths, destinationKeystorePaths, KEYSTORE_SOURCE_PATHS.name(),
+            KEYSTORE_DESTINATION_PATHS.name());
+
+        return new AppConfiguration(truststoresPaths, truststoresPasswordsPaths, sourceKeystorePaths,
+            destinationKeystorePaths);
+    }
+
+    private List<String> getPaths(EnvVariable envVariable) throws ConfigurationException {
+        Optional<String> envValue = envReader.getEnv(envVariable.name());
+        isMandatoryEnvPresent(envVariable, envValue);
+        return envValue.isPresent() ? pathsSplitter.getValidatedPaths(envVariable, envValue) : Collections.emptyList();
+    }
+
+    private void isMandatoryEnvPresent(EnvVariable envVariable, Optional<String> envValue) {
+        if (envVariable.isMandatory() && envValue.isEmpty()) {
+            throw new ConfigurationException(envVariable + " mandatory environment variable is not defined");
+        }
+    }
+
+    private void ensureSameSize(List<String> firstList, List<String> secondList, String firstListEnvName,
+        String secondListEnvName) throws ConfigurationException {
+        if (firstList.size() != secondList.size()) {
+            throw new ConfigurationException(
+                "Size of " + firstListEnvName
+                    + " does not match size of " + secondListEnvName + " environment variables");
+        }
+    }
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/exception/CertificatesPathsValidationException.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/exception/CertificatesPathsValidationException.java
new file mode 100644 (file)
index 0000000..fb62101
--- /dev/null
@@ -0,0 +1,30 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.configuration.exception;
+
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+
+public class CertificatesPathsValidationException extends ExitableException {
+
+    public CertificatesPathsValidationException(String errorMessage) {
+        super(errorMessage, ExitStatus.CERTIFICATES_PATHS_VALIDATION_EXCEPTION);
+    }
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/exception/ConfigurationException.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/exception/ConfigurationException.java
new file mode 100644 (file)
index 0000000..c9f9a41
--- /dev/null
@@ -0,0 +1,30 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.configuration.exception;
+
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+
+public class ConfigurationException extends ExitableException {
+
+    public ConfigurationException(String errorMessage) {
+        super(errorMessage, ExitStatus.CONFIGURATION_EXCEPTION);
+    }
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.configuration;
+package org.onap.oom.certservice.postprocessor.configuration.model;
 
 import java.util.Collections;
 import java.util.List;
 
-public class MergerConfiguration {
+public final class AppConfiguration {
     private final List<String> truststoreFilePaths;
     private final List<String> truststoreFilePasswordPaths;
+    private final List<String> sourceKeystorePaths;
+    private final List<String> destinationKeystorePaths;
 
-    public MergerConfiguration(List<String> truststoreFilePaths,
-                               List<String> truststoreFilePasswordPaths) {
+    public AppConfiguration(List<String> truststoreFilePaths,
+        List<String> truststoreFilePasswordPaths, List<String> sourceKeystorePaths,
+        List<String> destinationKeystorePaths) {
         this.truststoreFilePaths = List.copyOf(truststoreFilePaths);
         this.truststoreFilePasswordPaths = List.copyOf(truststoreFilePasswordPaths);
+        this.sourceKeystorePaths = List.copyOf(sourceKeystorePaths);
+        this.destinationKeystorePaths = List.copyOf(destinationKeystorePaths);
     }
 
     public List<String> getTruststoreFilePaths() {
         return Collections.unmodifiableList(truststoreFilePaths);
     }
 
-
     public List<String> getTruststoreFilePasswordPaths() {
         return Collections.unmodifiableList(truststoreFilePasswordPaths);
     }
 
+
+    public List<String> getDestinationKeystorePaths() {
+        return Collections.unmodifiableList(destinationKeystorePaths);
+    }
+
+    public List<String> getSourceKeystorePaths() {
+        return Collections.unmodifiableList(sourceKeystorePaths);
+    }
 }
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/model/EnvVariable.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/model/EnvVariable.java
new file mode 100644 (file)
index 0000000..4202852
--- /dev/null
@@ -0,0 +1,52 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.configuration.model;
+
+import static org.onap.oom.certservice.postprocessor.configuration.path.validation.ValidationFunctions.doesItContainValidCertificatesPaths;
+import static org.onap.oom.certservice.postprocessor.configuration.path.validation.ValidationFunctions.doesItContainValidPasswordPaths;
+import static org.onap.oom.certservice.postprocessor.configuration.path.validation.ValidationFunctions.doesItContainValidPathsToCopy;
+
+import java.util.List;
+import java.util.function.Predicate;
+import org.onap.oom.certservice.postprocessor.configuration.path.validation.ValidationFunctions;
+
+public enum EnvVariable {
+    TRUSTSTORES_PATHS(true, doesItContainValidCertificatesPaths()),
+    TRUSTSTORES_PASSWORDS_PATHS(true, doesItContainValidPasswordPaths()),
+    KEYSTORE_SOURCE_PATHS(false, doesItContainValidPathsToCopy()),
+    KEYSTORE_DESTINATION_PATHS(false, doesItContainValidPathsToCopy());
+
+    boolean isMandatory;
+
+    Predicate<List<String>> validationFunction;
+
+    EnvVariable(boolean isMandatory, Predicate<List<String>> validationFunction) {
+        this.isMandatory = isMandatory;
+        this.validationFunction = validationFunction;
+    }
+
+    public boolean isMandatory() {
+        return isMandatory;
+    }
+
+    public Predicate<List<String>> getValidationFunction() {
+        return validationFunction;
+    }
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/path/DelimitedPathsSplitter.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/path/DelimitedPathsSplitter.java
new file mode 100644 (file)
index 0000000..b2e71cb
--- /dev/null
@@ -0,0 +1,49 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.configuration.path;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import org.onap.oom.certservice.postprocessor.configuration.exception.CertificatesPathsValidationException;
+import org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable;
+
+public class DelimitedPathsSplitter {
+
+    private static final String DELIMITER = ":";
+    private static final int NEGATIVE_SPLIT_LIMIT = -1;
+
+    public List<String> getValidatedPaths(EnvVariable envVariable, Optional<String> envValue)
+        throws CertificatesPathsValidationException {
+        return envValue.filter(this::hasValue)
+            .map(this::splitToList)
+            .filter(envVariable.getValidationFunction())
+            .orElseThrow(() -> new CertificatesPathsValidationException(
+                envVariable + " environment variable does not contain valid paths"));
+    }
+
+    private boolean hasValue(String envValue) {
+        return !envValue.isEmpty();
+    }
+
+    private List<String> splitToList(String stringToSplit) {
+        return Arrays.asList(stringToSplit.split(DELIMITER, NEGATIVE_SPLIT_LIMIT));
+    }
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.path;
+package org.onap.oom.certservice.postprocessor.configuration.path.env;
 
 import java.util.Optional;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class EnvProvider {
+public class EnvReader {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(EnvReader.class);
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(EnvProvider.class);
+    public Optional<String> getEnv(String name) {
+        return getSystemEnv(name);
+    }
 
-    Optional<String> getEnv(String name) {
+    Optional<String> getSystemEnv(String name) {
         String value = System.getenv(name);
         LOGGER.info("Read variable: {} , value: {}", name, value);
-        return Optional.ofNullable(System.getenv(name));
+        return Optional.ofNullable(value);
     }
 }
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/path/validation/ValidationFunctions.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/configuration/path/validation/ValidationFunctions.java
new file mode 100644 (file)
index 0000000..f65a21a
--- /dev/null
@@ -0,0 +1,57 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.configuration.path.validation;
+
+import java.util.List;
+import java.util.function.Predicate;
+
+public final class ValidationFunctions {
+
+    private static final String CERTIFICATE_PATH_REGEX = "^(/[a-zA-Z0-9_-]+)+\\.(pem|jks|p12)";
+    private static final String CERTIFICATE_PASSWORD_PATH_REGEX = "^(/[a-zA-Z0-9_-]+)+\\.pass";
+
+    private ValidationFunctions() {
+    }
+
+    public static Predicate<List<String>> doesItContainValidPasswordPaths() {
+        return paths -> paths.stream().allMatch(ValidationFunctions::isCertificatePasswordPathValid);
+    }
+
+    public static Predicate<List<String>> doesItContainValidCertificatesPaths() {
+        return paths -> paths.stream().allMatch(ValidationFunctions::isCertificatePathValid);
+    }
+
+    public static Predicate<List<String>> doesItContainValidPathsToCopy() {
+        return paths -> paths.stream().allMatch(path ->
+            doesMatch(path, CERTIFICATE_PASSWORD_PATH_REGEX) || isCertificatePathValid(path));
+    }
+
+    private static boolean isCertificatePathValid(String path) {
+        return doesMatch(path, CERTIFICATE_PATH_REGEX);
+    }
+
+    private static boolean isCertificatePasswordPathValid(String path) {
+        return path.isEmpty() || doesMatch(path, CERTIFICATE_PASSWORD_PATH_REGEX);
+    }
+
+    private static boolean doesMatch(String path, String regex) {
+        return path.matches(regex);
+    }
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/copier/KeystoreCopier.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/copier/KeystoreCopier.java
new file mode 100644 (file)
index 0000000..eba59fd
--- /dev/null
@@ -0,0 +1,74 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.copier;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import org.onap.oom.certservice.postprocessor.common.FileTools;
+import org.onap.oom.certservice.postprocessor.configuration.model.AppConfiguration;
+import org.onap.oom.certservice.postprocessor.copier.exception.KeystoreFileCopyException;
+import org.onap.oom.certservice.postprocessor.copier.exception.KeystoreNotExistException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KeystoreCopier {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(KeystoreCopier.class);
+    private final FileTools fileTools;
+
+    public KeystoreCopier(FileTools fileTools) {
+        this.fileTools = fileTools;
+    }
+
+    public void copyKeystores(AppConfiguration configuration) {
+        final List<String> sources = configuration.getSourceKeystorePaths();
+        final List<String> destinations = configuration.getDestinationKeystorePaths();
+        containsPaths(sources);
+        try {
+            for (int i = 0; i < sources.size(); i++) {
+                copy(sources.get(i), destinations.get(i));
+            }
+        } catch (IOException e) {
+            throw new KeystoreFileCopyException(e);
+        }
+    }
+
+    private void containsPaths(List<String> sources) {
+        if (sources.size() == 0) {
+            LOGGER.info("No Keystore files to copy");
+        }
+    }
+
+    private void copy(String sourcePath, String destinationPath) throws IOException {
+        final File source = new File(sourcePath);
+        final File destination = new File(destinationPath);
+
+        if (!source.exists()) {
+            throw new KeystoreNotExistException("Keystore file does not exist '" + source.getAbsolutePath() + "'!");
+        }
+
+        if (destination.exists()) {
+            fileTools.createBackup(destination);
+        }
+        fileTools.copy(source, destination);
+    }
+
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/copier/exception/KeystoreFileCopyException.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/copier/exception/KeystoreFileCopyException.java
new file mode 100644 (file)
index 0000000..6619096
--- /dev/null
@@ -0,0 +1,31 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.copier.exception;
+
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+
+public class KeystoreFileCopyException extends ExitableException {
+
+    public KeystoreFileCopyException(Exception e) {
+        super(e, ExitStatus.KEYSTORE_FILE_COPY_EXCEPTION);
+    }
+
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/copier/exception/KeystoreNotExistException.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/copier/exception/KeystoreNotExistException.java
new file mode 100644 (file)
index 0000000..37f2f53
--- /dev/null
@@ -0,0 +1,31 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.copier.exception;
+
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+
+public class KeystoreNotExistException extends ExitableException {
+
+    public KeystoreNotExistException(String message) {
+        super(message, ExitStatus.KEYSTORE_NOT_EXIST_EXCEPTION);
+    }
+
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file;
-
-import org.onap.oom.truststoremerger.certification.file.model.Truststore;
+package org.onap.oom.certservice.postprocessor.merger;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.onap.oom.truststoremerger.certification.file.exception.KeystoreInstanceException;
-import org.onap.oom.truststoremerger.certification.file.exception.LoadTruststoreException;
-import org.onap.oom.truststoremerger.certification.file.exception.PasswordReaderException;
-import org.onap.oom.truststoremerger.certification.file.exception.TruststoreFileFactoryException;
+import org.onap.oom.certservice.postprocessor.merger.exception.KeystoreInstanceException;
+import org.onap.oom.certservice.postprocessor.merger.exception.LoadTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.PasswordReaderException;
+import org.onap.oom.certservice.postprocessor.merger.exception.TruststoreFileFactoryException;
+import org.onap.oom.certservice.postprocessor.merger.model.Truststore;
+import org.onap.oom.certservice.postprocessor.merger.model.TruststoreFactory;
 
-public class TruststoreFilesListProvider {
+public class TruststoreFilesProvider {
 
-    private final TruststoreFileFactory truststoreFileFactory;
 
-    public TruststoreFilesListProvider(TruststoreFileFactory truststoreFileFactory) {
-        this.truststoreFileFactory = truststoreFileFactory;
+    private TruststoreFilesProvider() {
     }
 
-    public List<Truststore> getTruststoreFilesList(List<String> truststoreFilePaths,
+    public static List<Truststore> getTruststoreFiles(List<String> truststoreFilePaths,
         List<String> truststoreFilePasswordPaths)
         throws LoadTruststoreException, PasswordReaderException, TruststoreFileFactoryException, KeystoreInstanceException {
-        List<Truststore> truststoreFilesList = new ArrayList<>();
+        List<Truststore> truststoreFiles = new ArrayList<>();
         for (int i = 0; i < truststoreFilePaths.size(); i++) {
             String truststorePath = truststoreFilePaths.get(i);
             String passwordPath = truststoreFilePasswordPaths.get(i);
 
-            Truststore truststore = truststoreFileFactory.create(truststorePath, passwordPath);
-            truststoreFilesList.add(truststore);
+            Truststore truststore = TruststoreFactory.create(truststorePath, passwordPath);
+            truststoreFiles.add(truststore);
         }
 
-        return truststoreFilesList;
+        return truststoreFiles;
     }
 }
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/TruststoreMerger.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/TruststoreMerger.java
new file mode 100644 (file)
index 0000000..9bc3dd8
--- /dev/null
@@ -0,0 +1,55 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.merger;
+
+import java.util.List;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.configuration.model.AppConfiguration;
+import org.onap.oom.certservice.postprocessor.merger.model.Truststore;
+import org.onap.oom.certservice.postprocessor.merger.model.certificate.CertificateWithAlias;
+
+public class TruststoreMerger {
+
+    private static final int FIRST_TRUSTSTORE_INDEX = 0;
+    private static final int SECOND_TRUSTSTORE_INDEX = 1;
+
+    public void mergeTruststores(AppConfiguration configuration) throws ExitableException {
+        List<Truststore> truststoreFilesList = getTruststoreFiles(configuration);
+
+        Truststore baseFile = truststoreFilesList.get(FIRST_TRUSTSTORE_INDEX);
+        baseFile.createBackup();
+
+        for (int i = SECOND_TRUSTSTORE_INDEX; i < truststoreFilesList.size(); i++) {
+            Truststore truststore = truststoreFilesList.get(i);
+            List<CertificateWithAlias> certificateWrappers = truststore.getCertificates();
+            baseFile.addCertificates(certificateWrappers);
+        }
+
+        baseFile.saveFile();
+    }
+
+    private List<Truststore> getTruststoreFiles(AppConfiguration configuration) throws ExitableException {
+        return TruststoreFilesProvider
+            .getTruststoreFiles(
+                configuration.getTruststoreFilePaths(),
+                configuration.getTruststoreFilePasswordPaths()
+            );
+    }
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.exception;
+package org.onap.oom.certservice.postprocessor.merger.exception;
 
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
 
 public class AliasConflictException extends ExitableException {
 
-    public AliasConflictException(String message) {
-        super(message, ExitStatus.ALIAS_CONFLICT_EXCEPTION);
+    public AliasConflictException(String errorMessage) {
+        super(errorMessage, ExitStatus.ALIAS_CONFLICT_EXCEPTION);
     }
 
 }
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.exception;
+package org.onap.oom.certservice.postprocessor.merger.exception;
 
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
 
 public class CreateBackupException extends ExitableException {
 
-    public CreateBackupException(Exception e) {
-        super(e, ExitStatus.CREATE_BACKUP_EXCEPTION);
+    public CreateBackupException(Exception cause) {
+        super(cause, ExitStatus.CREATE_BACKUP_EXCEPTION);
     }
 }
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.exception;
+package org.onap.oom.certservice.postprocessor.merger.exception;
 
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
 
 public class KeystoreInstanceException extends ExitableException {
 
-    public KeystoreInstanceException(Throwable e) {
-        super(e, ExitStatus.KEYSTORE_INSTANCE_EXCEPTION);
+    public KeystoreInstanceException(Exception cause) {
+        super(cause, ExitStatus.KEYSTORE_INSTANCE_EXCEPTION);
     }
 }
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.exception;
+package org.onap.oom.certservice.postprocessor.merger.exception;
 
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
 
 public class LoadTruststoreException extends ExitableException {
 
-    public LoadTruststoreException(Throwable e) {
-        super(e, ExitStatus.TRUSTSTORE_LOAD_FILE_EXCEPTION);
+    public LoadTruststoreException(Exception cause) {
+        super(cause, ExitStatus.TRUSTSTORE_LOAD_FILE_EXCEPTION);
     }
 }
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.exception;
+package org.onap.oom.certservice.postprocessor.merger.exception;
 
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
 
 public class MissingTruststoreException extends ExitableException {
 
-    public MissingTruststoreException(String message) {
-        super(message, ExitStatus.MISSING_TRUSTSTORE_EXCEPTION);
+    public MissingTruststoreException(String errorMessage) {
+        super(errorMessage, ExitStatus.MISSING_TRUSTSTORE_EXCEPTION);
     }
 }
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.exception;
+package org.onap.oom.certservice.postprocessor.merger.exception;
 
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
 
 public class PasswordReaderException extends ExitableException {
-    public PasswordReaderException(String message) {
-        super(message, ExitStatus.PASSWORD_READER_EXCEPTION);
+    public PasswordReaderException(String errorMessage) {
+        super(errorMessage, ExitStatus.PASSWORD_READER_EXCEPTION);
     }
 }
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.exception;
+package org.onap.oom.certservice.postprocessor.merger.exception;
 
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
 
 public class TruststoreDataOperationException extends ExitableException {
 
-    public TruststoreDataOperationException(Exception e) {
-        super(e, ExitStatus.TRUSTSTORE_DATA_OPERATION_EXCEPTION);
+    public TruststoreDataOperationException(Exception cause) {
+        super(cause, ExitStatus.TRUSTSTORE_DATA_OPERATION_EXCEPTION);
     }
 }
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.exception;
+package org.onap.oom.certservice.postprocessor.merger.exception;
 
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
 
 public class TruststoreFileFactoryException extends ExitableException {
-    public TruststoreFileFactoryException(String message) {
-        super(message, ExitStatus.TRUSTSTORE_FILE_FACTORY_EXCEPTION);
+    public TruststoreFileFactoryException(String errorMessage) {
+        super(errorMessage, ExitStatus.TRUSTSTORE_FILE_FACTORY_EXCEPTION);
     }
 
 }
  */
 
 
-package org.onap.oom.truststoremerger.certification.file.exception;
+package org.onap.oom.certservice.postprocessor.merger.exception;
 
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.api.ExitStatus;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
 
 public class WriteTruststoreFileException extends ExitableException {
 
-    public WriteTruststoreFileException(Exception e) {
-        super(e, ExitStatus.WRITE_TRUSTSTORE_FILE_EXCEPTION);
+    public WriteTruststoreFileException(Exception cause) {
+        super(cause, ExitStatus.WRITE_TRUSTSTORE_FILE_EXCEPTION);
     }
 }
@@ -17,7 +17,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.provider;
+package org.onap.oom.certservice.postprocessor.merger.model;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -27,35 +27,43 @@ import java.security.KeyStoreException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.onap.oom.truststoremerger.api.ExitableException;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAlias;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAliasFactory;
-import org.onap.oom.truststoremerger.certification.file.exception.AliasConflictException;
-import org.onap.oom.truststoremerger.certification.file.exception.TruststoreDataOperationException;
-import org.onap.oom.truststoremerger.certification.file.exception.LoadTruststoreException;
-import org.onap.oom.truststoremerger.certification.file.exception.MissingTruststoreException;
-import org.onap.oom.truststoremerger.certification.file.exception.WriteTruststoreFileException;
+import org.onap.oom.certservice.postprocessor.merger.exception.AliasConflictException;
+import org.onap.oom.certservice.postprocessor.merger.exception.LoadTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.MissingTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.TruststoreDataOperationException;
+import org.onap.oom.certservice.postprocessor.merger.exception.WriteTruststoreFileException;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.common.FileTools;
+import org.onap.oom.certservice.postprocessor.merger.model.certificate.CertificateWithAlias;
+import org.onap.oom.certservice.postprocessor.merger.model.certificate.CertificateWithAliasFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class JavaCertificateStoreController implements CertificateController {
+public final class JavaTruststore extends Truststore {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(JavaCertificateStoreController.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(JavaTruststore.class);
 
     private final CertificateWithAliasFactory factory = new CertificateWithAliasFactory();
     private final KeyStore keyStore;
-    private final File storeFile;
     private final String password;
 
 
-    public JavaCertificateStoreController(KeyStore keyStore, File storeFile, String password) {
+    private JavaTruststore(KeyStore keyStore, File storeFile, String password) {
+        super(storeFile, new FileTools());
         this.keyStore = keyStore;
-        this.storeFile = storeFile;
         this.password = password;
     }
 
-    public List<CertificateWithAlias> getNotEmptyCertificateList() throws ExitableException {
-        List<String> aliases = getTruststoreAliasesList();
+    public static JavaTruststore createWithLoadingFile(KeyStore keyStore, File storeFile, String password)
+        throws LoadTruststoreException {
+        JavaTruststore javaTruststore = new JavaTruststore(keyStore, storeFile, password);
+        javaTruststore.loadFile();
+        return javaTruststore;
+    }
+
+    public List<CertificateWithAlias> getCertificates() throws ExitableException {
+        LOGGER.debug("Attempt to read certificates from file: {}", storeFile.getPath());
+        List<String> aliases = getTruststoreAliases();
         if (aliases.isEmpty()) {
             throw new MissingTruststoreException("Missing certificate aliases in file: " + storeFile.getPath());
         }
@@ -64,7 +72,8 @@ public class JavaCertificateStoreController implements CertificateController {
 
     public void addCertificates(List<CertificateWithAlias> certificatesWithAliases)
         throws ExitableException {
-        if (getTruststoreAliasesList().isEmpty()){
+        LOGGER.debug("Attempt to add certificates for saving to file");
+        if (getTruststoreAliases().isEmpty()) {
             throw new MissingTruststoreException("Missing certificate aliases in file: " + storeFile.getPath());
         }
         for (CertificateWithAlias certificate : certificatesWithAliases) {
@@ -73,7 +82,8 @@ public class JavaCertificateStoreController implements CertificateController {
     }
 
     public void saveFile() throws WriteTruststoreFileException {
-        try (FileOutputStream outputStream = new FileOutputStream(this.storeFile)) {
+        LOGGER.debug("Attempt to save file: {}", storeFile.getPath());
+        try (FileOutputStream outputStream = new FileOutputStream(storeFile)) {
             keyStore.store(outputStream, this.password.toCharArray());
         } catch (Exception e) {
             LOGGER.error("Cannot write truststore file");
@@ -81,11 +91,11 @@ public class JavaCertificateStoreController implements CertificateController {
         }
     }
 
-    public void loadFile() throws LoadTruststoreException {
+    private void loadFile() throws LoadTruststoreException {
         try {
-            keyStore.load(new FileInputStream(this.storeFile), this.password.toCharArray());
+            keyStore.load(new FileInputStream(storeFile), this.password.toCharArray());
         } catch (Exception e) {
-            LOGGER.error("Cannot load file: {}", this.storeFile.getPath());
+            LOGGER.error("Cannot load file: {}", storeFile.getPath());
             throw new LoadTruststoreException(e);
         }
     }
@@ -133,7 +143,7 @@ public class JavaCertificateStoreController implements CertificateController {
         }
     }
 
-    private List<String> getTruststoreAliasesList() throws TruststoreDataOperationException {
+    private List<String> getTruststoreAliases() throws TruststoreDataOperationException {
         try {
             List<String> aliases = Collections.list(keyStore.aliases());
             return getFilteredAlias(aliases);
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/JavaTruststoreFactory.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/JavaTruststoreFactory.java
new file mode 100644 (file)
index 0000000..c36510c
--- /dev/null
@@ -0,0 +1,51 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.merger.model;
+
+import java.io.File;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.KeystoreInstanceException;
+import org.onap.oom.certservice.postprocessor.merger.exception.LoadTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.PasswordReaderException;
+import org.onap.oom.certservice.postprocessor.common.PasswordReader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JavaTruststoreFactory {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(JavaTruststoreFactory.class);
+
+    private JavaTruststoreFactory() {
+    }
+
+    public static Truststore create(File certFile, String truststorePasswordPath, String keystoreType)
+        throws LoadTruststoreException, KeystoreInstanceException, PasswordReaderException {
+        String password = PasswordReader.readPassword(new File(truststorePasswordPath));
+        try {
+            return JavaTruststore
+                .createWithLoadingFile(KeyStore.getInstance(keystoreType), certFile, password);
+        } catch (KeyStoreException e) {
+            LOGGER.error("Cannot initialize Java Keystore instance");
+            throw new KeystoreInstanceException(e);
+        }
+    }
+}
+
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.provider;
+package org.onap.oom.certservice.postprocessor.merger.model;
 
-import static org.onap.oom.truststoremerger.api.CertificateConstants.BOUNCY_CASTLE_PROVIDER;
-import static org.onap.oom.truststoremerger.api.CertificateConstants.X_509_CERTIFICATE;
+import static org.onap.oom.certservice.postprocessor.api.CertificateConstants.BOUNCY_CASTLE_PROVIDER;
+import static org.onap.oom.certservice.postprocessor.api.CertificateConstants.X_509_CERTIFICATE;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -37,30 +37,31 @@ import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.bouncycastle.openssl.jcajce.JcaMiscPEMGenerator;
 import org.bouncycastle.util.io.pem.PemObjectGenerator;
 import org.bouncycastle.util.io.pem.PemWriter;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAlias;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAliasFactory;
-import org.onap.oom.truststoremerger.certification.file.exception.MissingTruststoreException;
-import org.onap.oom.truststoremerger.certification.file.exception.TruststoreDataOperationException;
-import org.onap.oom.truststoremerger.certification.file.exception.WriteTruststoreFileException;
+import org.onap.oom.certservice.postprocessor.merger.exception.MissingTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.TruststoreDataOperationException;
+import org.onap.oom.certservice.postprocessor.merger.exception.WriteTruststoreFileException;
+import org.onap.oom.certservice.postprocessor.common.FileTools;
+import org.onap.oom.certservice.postprocessor.merger.model.certificate.CertificateWithAlias;
+import org.onap.oom.certservice.postprocessor.merger.model.certificate.CertificateWithAliasFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class PemCertificateController implements CertificateController {
+public class PemTruststore extends Truststore {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(PemCertificateController.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(PemTruststore.class);
 
     private static final boolean APPEND_TO_FILE = true;
 
     private final CertificateWithAliasFactory factory = new CertificateWithAliasFactory();
     private final List<CertificateWithAlias> certificatesToBeSaved = new ArrayList<>();
-    private final File file;
 
-    public PemCertificateController(File file) {
-        this.file = file;
+    public PemTruststore(File storeFile) {
+        super(storeFile, new FileTools());
     }
 
-    public List<CertificateWithAlias> getNotEmptyCertificateList()
+    public List<CertificateWithAlias> getCertificates()
         throws TruststoreDataOperationException, MissingTruststoreException {
+        LOGGER.debug("Attempt to read certificates from file: {}", storeFile.getPath());
         if (isFileWithoutPemCertificate()) {
             throw new MissingTruststoreException("File does not contain any certificate");
         }
@@ -70,14 +71,16 @@ public class PemCertificateController implements CertificateController {
 
     public void addCertificates(List<CertificateWithAlias> certificates)
         throws TruststoreDataOperationException, MissingTruststoreException {
+        LOGGER.debug("Attempt to add certificates for saving to file");
         if (isFileWithoutPemCertificate()) {
-            LOGGER.error("File does not contain any certificate. File path: {} ", this.file.getPath());
+            LOGGER.error("File does not contain any certificate. File path: {} ", storeFile.getPath());
             throw new MissingTruststoreException("File does not contain any certificate");
         }
         certificatesToBeSaved.addAll(certificates);
     }
 
     public void saveFile() throws WriteTruststoreFileException, TruststoreDataOperationException {
+        LOGGER.debug("Attempt to save file: {}", storeFile.getPath());
         List<Certificate> certificates = certificatesToBeSaved.stream()
             .map(CertificateWithAlias::getCertificate)
             .collect(Collectors.toList());
@@ -104,19 +107,17 @@ public class PemCertificateController implements CertificateController {
         return sw.toString();
     }
 
-
     private List<Certificate> extractCertificatesFromFile() throws TruststoreDataOperationException {
-        try (FileInputStream inputStream = new FileInputStream(this.file)) {
+        try (FileInputStream inputStream = new FileInputStream(storeFile)) {
             Security.addProvider(new BouncyCastleProvider());
             CertificateFactory factory = CertificateFactory.getInstance(X_509_CERTIFICATE, BOUNCY_CASTLE_PROVIDER);
             return new ArrayList<>(factory.generateCertificates(inputStream));
         } catch (Exception e) {
-            LOGGER.error("Cannot read certificates from file: {}", this.file.getPath());
+            LOGGER.error("Cannot read certificates from file: {}", storeFile.getPath());
             throw new TruststoreDataOperationException(e);
         }
     }
 
-
     private List<PemObjectGenerator> transformToPemGenerators(List<Certificate> certificates)
         throws TruststoreDataOperationException {
         List<PemObjectGenerator> generators = new ArrayList<>();
@@ -145,7 +146,7 @@ public class PemCertificateController implements CertificateController {
 
     private void appendToFile(String certificatesAsString) throws WriteTruststoreFileException {
         try {
-            FileOutputStream fileOutputStream = new FileOutputStream(this.file, APPEND_TO_FILE);
+            FileOutputStream fileOutputStream = new FileOutputStream(storeFile, APPEND_TO_FILE);
             fileOutputStream.write(certificatesAsString.getBytes());
         } catch (Exception e) {
             LOGGER.error("Cannot write certificates to file");
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.model;
+package org.onap.oom.certservice.postprocessor.merger.model;
 
 import java.io.File;
-import java.io.FileOutputStream;
-import java.nio.file.Files;
 import java.util.List;
-import org.onap.oom.truststoremerger.api.ExitableException;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAlias;
-import org.onap.oom.truststoremerger.certification.file.exception.CreateBackupException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.onap.oom.certservice.postprocessor.merger.exception.CreateBackupException;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.common.FileTools;
+import org.onap.oom.certservice.postprocessor.merger.model.certificate.CertificateWithAlias;
 
 public abstract class Truststore {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(Truststore.class);
-    private static final String BACKUP_EXTENSION = ".bak";
-    private final File file;
+    final File storeFile;
 
-    Truststore(File file) {
-        this.file = file;
+    private final FileTools fileTools;
+
+    public Truststore(File storeFile, FileTools fileTools) {
+        this.storeFile = storeFile;
+        this.fileTools = fileTools;
+    }
+
+    public void createBackup() throws CreateBackupException {
+        fileTools.createBackup(storeFile);
     }
 
     public abstract List<CertificateWithAlias> getCertificates() throws ExitableException;
 
-    public abstract void addCertificate(List<CertificateWithAlias> certificates) throws ExitableException;
+    public abstract void addCertificates(List<CertificateWithAlias> certificates) throws ExitableException;
 
     public abstract void saveFile() throws ExitableException;
-
-    public File getFile() {
-        return file;
-    }
-
-    public void createBackup() throws CreateBackupException {
-        LOGGER.debug("Create backup of file: {}", file.getPath());
-        String backupFilePath = file.getAbsolutePath() + BACKUP_EXTENSION;
-        try (FileOutputStream fileOutputStream = new FileOutputStream(backupFilePath)) {
-            Files.copy(file.toPath(), fileOutputStream);
-        } catch (Exception e) {
-            LOGGER.error("Cannot create backup of file: {} ", getFile().getPath());
-            throw new CreateBackupException(e);
-        }
-    }
 }
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/TruststoreFactory.java b/trustStoreMerger/src/main/java/org/onap/oom/certservice/postprocessor/merger/model/TruststoreFactory.java
new file mode 100644 (file)
index 0000000..b6984f3
--- /dev/null
@@ -0,0 +1,69 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.merger.model;
+
+import static org.onap.oom.certservice.postprocessor.api.CertificateConstants.JKS_TYPE;
+import static org.onap.oom.certservice.postprocessor.api.CertificateConstants.PKCS12_TYPE;
+
+import java.io.File;
+import org.onap.oom.certservice.postprocessor.merger.exception.KeystoreInstanceException;
+import org.onap.oom.certservice.postprocessor.merger.exception.LoadTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.PasswordReaderException;
+import org.onap.oom.certservice.postprocessor.common.ExtensionResolver;
+import org.onap.oom.certservice.postprocessor.merger.exception.TruststoreFileFactoryException;
+
+public class TruststoreFactory {
+
+    private static final String JKS_EXTENSION = ".jks";
+    private static final String P12_EXTENSION = ".p12";
+    private static final String PEM_EXTENSION = ".pem";
+    private static final String FILE_DOES_NOT_EXIST_MSG_TEMPLATE = "File: %s does not exist";
+    private static final String UNKNOWN_TRUSTSTORE_TYPE_MSG_TEMPLATE = "Unknown truststore extension type: %s";
+
+
+    private TruststoreFactory() {
+    }
+
+    public static Truststore create(String truststoreFilePath, String truststorePasswordPath)
+        throws TruststoreFileFactoryException, PasswordReaderException, KeystoreInstanceException, LoadTruststoreException {
+        File truststoreFile = new File(truststoreFilePath);
+        if (!ExtensionResolver.checkIfFileExists(truststoreFile)) {
+            throw new TruststoreFileFactoryException(String.format(FILE_DOES_NOT_EXIST_MSG_TEMPLATE, truststoreFile));
+        }
+        return createTypedTruststore(truststoreFile, truststorePasswordPath);
+    }
+
+    private static Truststore createTypedTruststore(File truststoreFile, String truststorePasswordPath)
+        throws KeystoreInstanceException, PasswordReaderException, LoadTruststoreException, TruststoreFileFactoryException {
+        String extension = ExtensionResolver.get(truststoreFile);
+        switch (extension) {
+            case JKS_EXTENSION:
+                return JavaTruststoreFactory.create(truststoreFile, truststorePasswordPath, JKS_TYPE);
+            case P12_EXTENSION:
+                return JavaTruststoreFactory.create(truststoreFile, truststorePasswordPath, PKCS12_TYPE);
+            case PEM_EXTENSION:
+                return new PemTruststore(truststoreFile);
+            default:
+                throw new TruststoreFileFactoryException(
+                    String.format(UNKNOWN_TRUSTSTORE_TYPE_MSG_TEMPLATE, extension));
+        }
+    }
+
+}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/TrustStoreMerger.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/TrustStoreMerger.java
deleted file mode 100644 (file)
index c8cc84d..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger;
-
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAlias;
-import org.onap.oom.truststoremerger.certification.file.model.Truststore;
-import org.onap.oom.truststoremerger.certification.file.provider.FileManager;
-import org.onap.oom.truststoremerger.certification.file.provider.PasswordReader;
-import org.onap.oom.truststoremerger.certification.file.TruststoreFileFactory;
-import org.onap.oom.truststoremerger.certification.file.TruststoreFilesListProvider;
-import org.onap.oom.truststoremerger.certification.path.EnvProvider;
-import org.onap.oom.truststoremerger.certification.path.TruststoresPathsProvider;
-import org.onap.oom.truststoremerger.configuration.MergerConfiguration;
-import org.onap.oom.truststoremerger.configuration.MergerConfigurationFactory;
-import org.onap.oom.truststoremerger.certification.path.PathValidator;
-
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class TrustStoreMerger {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(TrustStoreMerger.class);
-    private static final int FIRST_TRUSTSTORE_INDEX = 0;
-    private static final int SECOND_TRUSTSTORE_INDEX = 1;
-
-    private final AppExitHandler appExitHandler;
-
-    TrustStoreMerger(AppExitHandler appExitHandler) {
-        this.appExitHandler = appExitHandler;
-    }
-
-    void run() {
-        try {
-            mergeTruststores();
-            appExitHandler.exit(ExitStatus.SUCCESS);
-        } catch (ExitableException e) {
-            LOGGER.error("Truststore Merger fails in execution: ", e);
-            appExitHandler.exit(e.applicationExitStatus());
-        }
-    }
-
-    private void mergeTruststores() throws ExitableException {
-        MergerConfiguration configuration = loadConfiguration();
-        List<Truststore> truststoreFilesList = getTruststoreFilesList(configuration);
-
-        Truststore baseFile = truststoreFilesList.get(FIRST_TRUSTSTORE_INDEX);
-        baseFile.createBackup();
-
-        for (int i = SECOND_TRUSTSTORE_INDEX; i < truststoreFilesList.size(); i++) {
-            List<CertificateWithAlias> certificateWrappers = truststoreFilesList.get(i).getCertificates();
-            baseFile.addCertificate(certificateWrappers);
-        }
-
-        baseFile.saveFile();
-    }
-
-    private MergerConfiguration loadConfiguration() throws ExitableException {
-        TruststoresPathsProvider truststoresPathsProvider = new TruststoresPathsProvider(new EnvProvider(),
-            new PathValidator());
-        MergerConfigurationFactory factory = new MergerConfigurationFactory(truststoresPathsProvider);
-        return factory.createConfiguration();
-    }
-
-    private List<Truststore> getTruststoreFilesList(MergerConfiguration configuration) throws ExitableException {
-        TruststoreFileFactory truststoreFileFactory = new TruststoreFileFactory(new FileManager(),
-            new PasswordReader());
-        TruststoreFilesListProvider truststoreFilesListProvider = new TruststoreFilesListProvider(
-            truststoreFileFactory);
-        return truststoreFilesListProvider
-            .getTruststoreFilesList(
-                configuration.getTruststoreFilePaths(),
-                configuration.getTruststoreFilePasswordPaths()
-            );
-    }
-}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/api/ConfigurationEnvs.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/api/ConfigurationEnvs.java
deleted file mode 100644 (file)
index f6f8bbb..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.api;
-
-public class ConfigurationEnvs {
-
-    public static final String TRUSTSTORES_PATHS_ENV = "TRUSTSTORES_PATHS";
-    public static final String TRUSTSTORES_PASSWORDS_PATHS_ENV = "TRUSTSTORES_PASSWORDS_PATHS";
-}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoreFileFactory.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoreFileFactory.java
deleted file mode 100644 (file)
index d93409b..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.file;
-
-import org.onap.oom.truststoremerger.certification.file.model.JavaTruststore;
-import org.onap.oom.truststoremerger.certification.file.model.PemTruststore;
-import org.onap.oom.truststoremerger.certification.file.model.Truststore;
-
-import java.io.File;
-import org.onap.oom.truststoremerger.certification.file.exception.KeystoreInstanceException;
-import org.onap.oom.truststoremerger.certification.file.exception.LoadTruststoreException;
-import org.onap.oom.truststoremerger.certification.file.exception.PasswordReaderException;
-import org.onap.oom.truststoremerger.certification.file.exception.TruststoreFileFactoryException;
-import org.onap.oom.truststoremerger.certification.file.provider.CertificateStoreControllerFactory;
-import org.onap.oom.truststoremerger.certification.file.provider.FileManager;
-import org.onap.oom.truststoremerger.certification.file.provider.JavaCertificateStoreController;
-import org.onap.oom.truststoremerger.certification.file.provider.PasswordReader;
-import org.onap.oom.truststoremerger.certification.file.provider.PemCertificateController;
-
-public class TruststoreFileFactory {
-
-    private static final String JKS_EXTENSION = ".jks";
-    private static final String P12_EXTENSION = ".p12";
-    private static final String PEM_EXTENSION = ".pem";
-    private static final String FILE_DOES_NOT_EXIST_MSG_TEMPLATE = "File: %s does not exist";
-    private static final String UNKNOWN_TRUSTSTORE_TYPE_MSG_TEMPLATE = "Unknown truststore extension type: %s";
-
-    private final FileManager fileManager;
-    private final PasswordReader passwordReader;
-    private final CertificateStoreControllerFactory certificateStoreControllerFactory =
-        new CertificateStoreControllerFactory();
-
-    public TruststoreFileFactory(FileManager fileManager, PasswordReader passwordReader) {
-        this.fileManager = fileManager;
-        this.passwordReader = passwordReader;
-    }
-
-    public Truststore create(String truststoreFilePath, String truststorePasswordPath)
-        throws TruststoreFileFactoryException, PasswordReaderException, KeystoreInstanceException, LoadTruststoreException {
-        File truststoreFile = new File(truststoreFilePath);
-        if (!fileManager.checkIfFileExists(truststoreFile)) {
-            throw new TruststoreFileFactoryException(String.format(FILE_DOES_NOT_EXIST_MSG_TEMPLATE, truststoreFile));
-        }
-        return createTypedTruststore(truststoreFile, truststorePasswordPath);
-    }
-
-    private Truststore createTypedTruststore(File truststoreFile, String truststorePasswordPath)
-        throws KeystoreInstanceException, PasswordReaderException, LoadTruststoreException, TruststoreFileFactoryException {
-        String extension = fileManager.getExtension(truststoreFile);
-        switch (extension) {
-            case JKS_EXTENSION:
-                return createJksTruststore(truststoreFile, truststorePasswordPath);
-            case P12_EXTENSION:
-                return createP12Truststore(truststoreFile, truststorePasswordPath);
-            case PEM_EXTENSION:
-                return createPemTruststore(truststoreFile);
-            default:
-                throw new TruststoreFileFactoryException(
-                    String.format(UNKNOWN_TRUSTSTORE_TYPE_MSG_TEMPLATE, extension));
-        }
-    }
-
-    private JavaTruststore createJksTruststore(File truststoreFile, String truststorePasswordPath)
-        throws PasswordReaderException, LoadTruststoreException, KeystoreInstanceException {
-        String password = passwordReader.readPassword(new File(truststorePasswordPath));
-        JavaCertificateStoreController storeController = certificateStoreControllerFactory
-            .createLoadedJksCertificateStoreController(truststoreFile, password);
-        return new JavaTruststore(truststoreFile, storeController);
-    }
-
-    private JavaTruststore createP12Truststore(File truststoreFile, String truststorePasswordPath)
-        throws LoadTruststoreException, KeystoreInstanceException, PasswordReaderException {
-        String password = passwordReader.readPassword(new File(truststorePasswordPath));
-        JavaCertificateStoreController storeController = certificateStoreControllerFactory
-            .createLoadedPkcs12CertificateStoreController(truststoreFile, password);
-        return new JavaTruststore(truststoreFile, storeController);
-    }
-
-    private PemTruststore createPemTruststore(File truststoreFile) {
-        return new PemTruststore(truststoreFile, new PemCertificateController(truststoreFile));
-    }
-}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/model/JavaTruststore.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/model/JavaTruststore.java
deleted file mode 100644 (file)
index d46fba1..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.file.model;
-
-import java.io.File;
-import java.util.List;
-import org.onap.oom.truststoremerger.api.ExitableException;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAlias;
-import org.onap.oom.truststoremerger.certification.file.exception.WriteTruststoreFileException;
-import org.onap.oom.truststoremerger.certification.file.provider.JavaCertificateStoreController;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class JavaTruststore extends Truststore {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(JavaTruststore.class);
-    private final JavaCertificateStoreController storeController;
-
-    public JavaTruststore(File truststoreFile, JavaCertificateStoreController storeController) {
-        super(truststoreFile);
-        this.storeController = storeController;
-    }
-
-    @Override
-    public List<CertificateWithAlias> getCertificates() throws ExitableException {
-        LOGGER.debug("Attempt ro read certificates from file: {} ", this.getFile().getPath());
-        return storeController.getNotEmptyCertificateList();
-    }
-
-    @Override
-    public void addCertificate(List<CertificateWithAlias> certificates) throws ExitableException {
-        LOGGER.debug("Attempt to add certificates for saving to file");
-        storeController.addCertificates(certificates);
-    }
-
-    @Override
-    public void saveFile() throws WriteTruststoreFileException {
-        LOGGER.debug("Attempt to save file: {}", this.getFile().getPath());
-        storeController.saveFile();
-    }
-}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/model/PemTruststore.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/model/PemTruststore.java
deleted file mode 100644 (file)
index 3619526..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.file.model;
-
-import java.io.File;
-import java.util.List;
-import org.onap.oom.truststoremerger.api.ExitableException;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAlias;
-import org.onap.oom.truststoremerger.certification.file.provider.PemCertificateController;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PemTruststore extends Truststore {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(PemTruststore.class);
-    private final PemCertificateController pemCertificateController;
-
-    public PemTruststore(File truststoreFile, PemCertificateController pemCertificateController) {
-        super(truststoreFile);
-        this.pemCertificateController = pemCertificateController;
-    }
-
-    @Override
-    public List<CertificateWithAlias> getCertificates() throws ExitableException {
-        LOGGER.debug("Attempt ro read certificates from file: {}", this.getFile().getPath());
-        return pemCertificateController.getNotEmptyCertificateList();
-    }
-
-    @Override
-    public void addCertificate(List<CertificateWithAlias> certificates) throws ExitableException {
-        LOGGER.debug("Attempt to add certificates for saving to file");
-        pemCertificateController.addCertificates(certificates);
-    }
-
-    @Override
-    public void saveFile() throws ExitableException {
-        LOGGER.debug("Attempt to save file: {}", this.getFile().getPath());
-        pemCertificateController.saveFile();
-    }
-
-}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/CertificateController.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/CertificateController.java
deleted file mode 100644 (file)
index f2ed2c4..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.file.provider;
-
-import java.util.List;
-import org.onap.oom.truststoremerger.api.ExitableException;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAlias;
-
-public interface CertificateController {
-
-    List<CertificateWithAlias> getNotEmptyCertificateList() throws ExitableException;
-
-    void addCertificates(List<CertificateWithAlias> certificates) throws ExitableException;
-
-    void saveFile() throws ExitableException;
-}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/CertificateStoreControllerFactory.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/provider/CertificateStoreControllerFactory.java
deleted file mode 100644 (file)
index 66e2aed..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.file.provider;
-
-import static org.onap.oom.truststoremerger.api.CertificateConstants.JKS_INSTANCE;
-import static org.onap.oom.truststoremerger.api.CertificateConstants.PKCS12_INSTANCE;
-
-import java.io.File;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import org.onap.oom.truststoremerger.certification.file.exception.KeystoreInstanceException;
-import org.onap.oom.truststoremerger.certification.file.exception.LoadTruststoreException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class CertificateStoreControllerFactory {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(CertificateStoreControllerFactory.class);
-
-    public JavaCertificateStoreController createLoadedJksCertificateStoreController(File certFile, String certPassword)
-        throws LoadTruststoreException, KeystoreInstanceException {
-        return createLoadedCertificateStoreController(certFile, certPassword, JKS_INSTANCE);
-    }
-
-    public JavaCertificateStoreController createLoadedPkcs12CertificateStoreController(File certFile, String certPassword)
-        throws KeystoreInstanceException, LoadTruststoreException {
-        return createLoadedCertificateStoreController(certFile, certPassword, PKCS12_INSTANCE);
-    }
-
-    private JavaCertificateStoreController createLoadedCertificateStoreController(File certFile, String certPassword,
-        String instanceType)
-        throws LoadTruststoreException, KeystoreInstanceException {
-        try {
-            JavaCertificateStoreController javaCertificateStoreController = new JavaCertificateStoreController(
-                KeyStore.getInstance(instanceType), certFile, certPassword);
-            javaCertificateStoreController.loadFile();
-            return javaCertificateStoreController;
-        } catch (KeyStoreException e) {
-            LOGGER.error("Cannot initialize Java Keystore instance");
-            throw new KeystoreInstanceException(e);
-        }
-    }
-}
-
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/PathValidator.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/PathValidator.java
deleted file mode 100644 (file)
index 256da49..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.path;
-
-public class PathValidator {
-
-    private static final String TRUSTSTORE_PATH_REGEX = "^(/[a-zA-Z0-9_-]+)+\\.(pem|jks|p12)";
-    private static final String TRUSTSTORE_PASSWORD_PATH_REGEX = "^(/[a-zA-Z0-9_-]+)+\\.pass";
-
-    public boolean isTruststorePathValid(String truststorePath) {
-        return isPathValid(truststorePath, TRUSTSTORE_PATH_REGEX);
-    }
-
-    public boolean isTruststorePasswordPathValid(String truststorePasswordPath) {
-        return truststorePasswordPath.isEmpty() || isPathValid(truststorePasswordPath, TRUSTSTORE_PASSWORD_PATH_REGEX);
-    }
-
-    private boolean isPathValid(String path, String regex) {
-        return path.matches(regex);
-    }
-}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/TruststoresPathsProvider.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/path/TruststoresPathsProvider.java
deleted file mode 100644 (file)
index 9d86a8b..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.path;
-
-import static org.onap.oom.truststoremerger.api.ConfigurationEnvs.TRUSTSTORES_PATHS_ENV;
-import static org.onap.oom.truststoremerger.api.ConfigurationEnvs.TRUSTSTORES_PASSWORDS_PATHS_ENV;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.function.Predicate;
-
-public class TruststoresPathsProvider {
-
-    private static final String DELIMITER = ":";
-    private static final int NEGATIVE_SPLIT_LIMIT = -1;
-
-    private final EnvProvider envProvider;
-    private final PathValidator pathValidator;
-
-    public TruststoresPathsProvider(EnvProvider envProvider, PathValidator pathValidator) {
-        this.envProvider = envProvider;
-        this.pathValidator = pathValidator;
-    }
-
-    public List<String> getTruststores() throws TruststoresPathsProviderException {
-        return envProvider.getEnv(TRUSTSTORES_PATHS_ENV)
-            .filter(Predicate.not(String::isEmpty))
-            .map(this::splitToList)
-            .filter(this::validateTruststores)
-            .orElseThrow(() -> new TruststoresPathsProviderException(
-                TRUSTSTORES_PATHS_ENV + " environment variable does not contain valid truststores paths"));
-    }
-
-    public List<String> getTruststoresPasswords() throws TruststoresPathsProviderException {
-        return envProvider.getEnv(TRUSTSTORES_PASSWORDS_PATHS_ENV)
-            .map(this::splitToList)
-            .filter(this::validateTruststoresPasswords)
-            .orElseThrow(() -> new TruststoresPathsProviderException(
-                TRUSTSTORES_PASSWORDS_PATHS_ENV + " environment variable does not contain valid passwords paths"));
-    }
-
-    private boolean validateTruststores(List<String> truststores) {
-        return truststores.stream()
-            .allMatch(pathValidator::isTruststorePathValid);
-    }
-
-    private boolean validateTruststoresPasswords(List<String> truststoresPasswords) {
-        return truststoresPasswords.stream()
-            .allMatch(pathValidator::isTruststorePasswordPathValid);
-    }
-
-    private List<String> splitToList(String stringToSplit) {
-        return Arrays.asList(stringToSplit.split(DELIMITER, NEGATIVE_SPLIT_LIMIT));
-    }
-}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationException.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationException.java
deleted file mode 100644 (file)
index 54982f5..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.configuration;
-
-import org.onap.oom.truststoremerger.api.ExitStatus;
-import org.onap.oom.truststoremerger.api.ExitableException;
-
-public class MergerConfigurationException extends ExitableException {
-
-    MergerConfigurationException(String message) {
-        super(message, ExitStatus.MERGER_CONFIGURATION_EXCEPTION);
-    }
-}
diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactory.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactory.java
deleted file mode 100644 (file)
index acd9a84..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.configuration;
-
-import org.onap.oom.truststoremerger.certification.path.TruststoresPathsProvider;
-import org.onap.oom.truststoremerger.certification.path.TruststoresPathsProviderException;
-
-import static org.onap.oom.truststoremerger.api.ConfigurationEnvs.TRUSTSTORES_PATHS_ENV;
-import static org.onap.oom.truststoremerger.api.ConfigurationEnvs.TRUSTSTORES_PASSWORDS_PATHS_ENV;
-
-import java.util.List;
-
-public class MergerConfigurationFactory {
-
-    private final TruststoresPathsProvider pathsProvider;
-
-    public MergerConfigurationFactory(TruststoresPathsProvider pathsProvider) {
-        this.pathsProvider = pathsProvider;
-    }
-
-    public MergerConfiguration createConfiguration()
-        throws MergerConfigurationException, TruststoresPathsProviderException {
-        List<String> truststores = pathsProvider.getTruststores();
-        List<String> truststoresPasswords = pathsProvider.getTruststoresPasswords();
-
-        if (truststores.size() != truststoresPasswords.size()) {
-            throw new MergerConfigurationException(
-                "Size of " + TRUSTSTORES_PATHS_ENV
-                    + " does not match size of " + TRUSTSTORES_PASSWORDS_PATHS_ENV + " environment variables");
-        }
-
-        return new MergerConfiguration(truststores, truststoresPasswords);
-    }
-}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/AppExecutorTest.java b/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/AppExecutorTest.java
new file mode 100644 (file)
index 0000000..5c79f6e
--- /dev/null
@@ -0,0 +1,76 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+
+package org.onap.oom.certservice.postprocessor;
+
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.verify;
+import static org.onap.oom.certservice.postprocessor.api.ExitStatus.ALIAS_CONFLICT_EXCEPTION;
+import static org.onap.oom.certservice.postprocessor.api.ExitStatus.SUCCESS;
+import static org.onap.oom.certservice.postprocessor.api.ExitStatus.UNEXPECTED_EXCEPTION;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.onap.oom.certservice.postprocessor.merger.exception.AliasConflictException;
+
+@ExtendWith(MockitoExtension.class)
+public class AppExecutorTest {
+
+    @Mock
+    Runnable logic;
+    @Mock
+    AppExitHandler exitHandler;
+    @InjectMocks
+    AppExecutor executor = new AppExecutor();
+
+    @Test
+    void shouldExitWithUnexpectedException() {
+        doThrow(new NullPointerException()).when(logic).run();
+        doNothing().when(exitHandler).exit(UNEXPECTED_EXCEPTION);
+
+        executor.execute(logic);
+
+        verify(exitHandler).exit(UNEXPECTED_EXCEPTION);
+    }
+
+    @Test
+    void shouldExitWithKnownException() {
+        doThrow(new AliasConflictException("")).when(logic).run();
+        doNothing().when(exitHandler).exit(ALIAS_CONFLICT_EXCEPTION);
+
+        executor.execute(logic);
+
+        verify(exitHandler).exit(ALIAS_CONFLICT_EXCEPTION);
+    }
+
+    @Test
+    void shouldExitWithSuccess() {
+        doNothing().when(logic).run();
+        doNothing().when(exitHandler).exit(SUCCESS);
+
+        executor.execute(logic);
+
+        verify(exitHandler).exit(SUCCESS);
+    }
+}
@@ -17,8 +17,7 @@
  * ============LICENSE_END=========================================================
  */
 
-
-package org.onap.oom.truststoremerger.certification.file.provider;
+package org.onap.oom.certservice.postprocessor.common;
 
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.CsvSource;
@@ -27,9 +26,7 @@ import java.io.File;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-class FileManagerTest {
-
-    private FileManager fileManager = new FileManager();
+class ExtensionResolverTest {
 
     @ParameterizedTest
     @CsvSource(value = {
@@ -40,7 +37,7 @@ class FileManagerTest {
         "opt/app/truststore:''",
     }, delimiter = ':')
     void shouldReturnCorrectExtension(String filePath, String expectedExtension) {
-        String extension = fileManager.getExtension(new File(filePath));
+        String extension = ExtensionResolver.get(new File(filePath));
         assertThat(extension).isEqualTo(expectedExtension);
     }
 
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/common/FileToolsTest.java b/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/common/FileToolsTest.java
new file mode 100644 (file)
index 0000000..56f76e1
--- /dev/null
@@ -0,0 +1,71 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.common;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import org.apache.commons.io.FileUtils;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+public class FileToolsTest {
+
+    public static final String BAK_EXTENSION = ".bak";
+
+    @TempDir
+    File dir;
+
+    @Test
+    void shouldCreateBackupProvidedFile() throws Exception {
+        //given
+        File fileToBackup = createFile("truststore.pem", "arbitrary content");
+        String backupFilePath = fileToBackup.getPath() + BAK_EXTENSION;
+        //when
+        new FileTools().createBackup(fileToBackup);
+        //then
+        assertThat(fileToBackup.equals(new File(backupFilePath)));
+    }
+
+    @Test
+    void shouldCopyFile() throws IOException {
+        //given
+        File sourceFile = createFile("source.p12", "any content");
+        File destinationFile = new File(dir.getAbsolutePath() + "destination.p12");
+        //when
+        new FileTools().copy(sourceFile, destinationFile);
+        //then
+        assertThat(sourceFile.equals(destinationFile));
+    }
+
+
+    private File createFile(String name, String content) throws IOException {
+        File file = new File(dir.getAbsolutePath() + File.pathSeparator + name);
+        if (file.createNewFile()) {
+            FileUtils.write(file, content, Charset.defaultCharset());
+        } else {
+            throw new IllegalStateException("File could not be created: " + file.getAbsolutePath());
+        }
+        return file;
+    }
+
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.provider;
+package org.onap.oom.certservice.postprocessor.common;
 
 import org.junit.jupiter.api.Test;
 
 import java.io.File;
-import org.onap.oom.truststoremerger.certification.file.exception.PasswordReaderException;
+import org.onap.oom.certservice.postprocessor.merger.exception.PasswordReaderException;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@@ -31,15 +31,13 @@ class PasswordReaderTest {
 
     @Test
     void shouldReturnCorrectPasswordFromFile() throws PasswordReaderException {
-        PasswordReader passwordReader = new PasswordReader();
-        String fileData = passwordReader.readPassword(new File("src/test/resources/truststore-jks.pass"));
+        String fileData = PasswordReader.readPassword(new File("src/test/resources/truststore-jks.pass"));
         assertThat(fileData).isEqualTo("EOyuFbuYDyq_EhpboM72RHua");
     }
 
     @Test
     void shouldThrowExceptionForNonExistingFile() {
-        PasswordReader passwordReader = new PasswordReader();
         assertThatExceptionOfType(PasswordReaderException.class)
-                .isThrownBy(() -> passwordReader.readPassword(new File("src/test/resources/non-esisting-file.pass")));
+                .isThrownBy(() -> PasswordReader.readPassword(new File("src/test/resources/non-esisting-file.pass")));
     }
 }
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/AppConfigurationProviderTest.java b/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/AppConfigurationProviderTest.java
new file mode 100644 (file)
index 0000000..24e2dab
--- /dev/null
@@ -0,0 +1,141 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.configuration;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.mockito.Mockito.when;
+import static org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable.KEYSTORE_DESTINATION_PATHS;
+import static org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable.KEYSTORE_SOURCE_PATHS;
+import static org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable.TRUSTSTORES_PASSWORDS_PATHS;
+import static org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable.TRUSTSTORES_PATHS;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.onap.oom.certservice.postprocessor.configuration.exception.CertificatesPathsValidationException;
+import org.onap.oom.certservice.postprocessor.configuration.exception.ConfigurationException;
+import org.onap.oom.certservice.postprocessor.configuration.model.AppConfiguration;
+import org.onap.oom.certservice.postprocessor.configuration.path.DelimitedPathsSplitter;
+import org.onap.oom.certservice.postprocessor.configuration.path.env.EnvReader;
+
+@ExtendWith(MockitoExtension.class)
+class AppConfigurationProviderTest {
+
+    private static final String BASE_TRUSTSTORE_PATH = "/opt/app/truststore_";
+    private static final String JKS_EXTENSION = ".jks";
+    private static final String PASS_EXTENSION = ".pass";
+    private static final String SAMPLE_TRUSTSTORES_PATHS = "/opt/app/certificates/truststore.jks:/opt/app/certificates/truststore.pem";
+    private static final String SAMPLE_TRUSTSTORES_PASSWORDS_PATHS = "/opt/app/certificates/truststore.pass:/trust.pass";
+
+    @Mock
+    private DelimitedPathsSplitter pathsSplitter;
+    @Mock
+    private EnvReader envReader;
+    private AppConfigurationProvider provider;
+
+    @BeforeEach
+    void setUp() {
+        provider = new AppConfigurationProvider(pathsSplitter, envReader);
+    }
+
+    @Test
+    void shouldThrowExceptionWhenMandatoryEnvNotPresent() {
+        // given
+        when(envReader.getEnv(TRUSTSTORES_PATHS.name())).thenReturn(Optional.empty());
+        // when, then
+        assertThatExceptionOfType(ConfigurationException.class).isThrownBy(() -> provider.createConfiguration())
+            .withMessageContaining(TRUSTSTORES_PATHS + " mandatory environment variable is not defined");
+    }
+
+    @Test
+    void shouldThrowExceptionWhenTrustorePathsSizesDoNotMatch() {
+        // given
+        List<String> truststores = createListOfPathsWithExtension(2, JKS_EXTENSION);
+        List<String> truststoresPasswords = createListOfPathsWithExtension(1, PASS_EXTENSION);
+
+        mockTruststorePaths(truststores, truststoresPasswords);
+        // when, then
+        assertThatExceptionOfType(ConfigurationException.class)
+            .isThrownBy(() -> provider.createConfiguration())
+            .withMessageContaining("Size of " + TRUSTSTORES_PATHS
+                + " does not match size of " + TRUSTSTORES_PASSWORDS_PATHS + " environment variables");
+    }
+
+    @Test
+    void shouldReturnEmptyListWhenOptionalEnvNotPresent() {
+        // given
+        List<String> truststores = createListOfPathsWithExtension(2, JKS_EXTENSION);
+        List<String> truststoresPasswords = createListOfPathsWithExtension(2, PASS_EXTENSION);
+        mockTruststorePaths(truststores, truststoresPasswords);
+        mockKeystorePaths(Optional.empty(), Optional.empty());
+        // when
+        AppConfiguration paths = provider.createConfiguration();
+        // then
+        assertThat(paths.getDestinationKeystorePaths()).isEmpty();
+        assertThat(paths.getSourceKeystorePaths()).isEmpty();
+    }
+
+    private void mockTruststorePaths(List<String> truststores, List<String> truststoresPasswords) {
+        mockTruststores(truststores);
+        mockTruststoresPasswords(truststoresPasswords);
+    }
+
+    private void mockKeystorePaths(Optional<String> sourceKeystoresPairPaths, Optional<String> destKeystoresPairPaths) {
+        mockKeystoreCopierSourcePaths(sourceKeystoresPairPaths);
+        mockKeystoreCopierDestinationPaths(destKeystoresPairPaths);
+    }
+
+    private void mockTruststores(List<String> truststores) throws CertificatesPathsValidationException {
+        when(envReader.getEnv(TRUSTSTORES_PATHS.name())).thenReturn(Optional.of(SAMPLE_TRUSTSTORES_PATHS));
+        when(pathsSplitter.getValidatedPaths(TRUSTSTORES_PATHS, Optional.of(SAMPLE_TRUSTSTORES_PATHS)))
+            .thenReturn(truststores);
+    }
+
+    private void mockTruststoresPasswords(List<String> truststoresPasswords)
+        throws CertificatesPathsValidationException {
+        Optional<String> passwordsPaths = Optional.of(SAMPLE_TRUSTSTORES_PASSWORDS_PATHS);
+        when(envReader.getEnv(TRUSTSTORES_PASSWORDS_PATHS.name())).thenReturn(passwordsPaths);
+        when(pathsSplitter.getValidatedPaths(TRUSTSTORES_PASSWORDS_PATHS, passwordsPaths))
+            .thenReturn(truststoresPasswords);
+    }
+
+    private void mockKeystoreCopierSourcePaths(Optional<String> paths) {
+        when(envReader.getEnv(KEYSTORE_SOURCE_PATHS.name())).thenReturn(paths);
+    }
+
+    private void mockKeystoreCopierDestinationPaths(Optional<String> paths) {
+        when(envReader.getEnv(KEYSTORE_DESTINATION_PATHS.name())).thenReturn(paths);
+    }
+
+    private List<String> createListOfPathsWithExtension(int numberOfPaths, String passwordExtension) {
+        List<String> paths = new ArrayList<>();
+        while (numberOfPaths-- > 0) {
+            paths.add(BASE_TRUSTSTORE_PATH + numberOfPaths + passwordExtension);
+        }
+        return paths;
+    }
+
+}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/path/DelimitedPathsSplitterTest.java b/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/path/DelimitedPathsSplitterTest.java
new file mode 100644 (file)
index 0000000..be1bc39
--- /dev/null
@@ -0,0 +1,107 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.configuration.path;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable.TRUSTSTORES_PASSWORDS_PATHS;
+import static org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable.TRUSTSTORES_PATHS;
+
+import java.util.Optional;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.onap.oom.certservice.postprocessor.configuration.exception.CertificatesPathsValidationException;
+
+@ExtendWith(MockitoExtension.class)
+class DelimitedPathsSplitterTest {
+
+    private static final String VALID_TRUSTSTORES = "/opt/app/certificates/truststore.jks:/opt/app/certificates/truststore.pem";
+    private static final String VALID_TRUSTSTORES_PASSWORDS = "/opt/app/certificates/truststore.pass:";
+    private static final String VALID_TRUSTSTORES_PASSWORDS_WITH_EMPTY_IN_THE_MIDDLE = "/opt/app/certificates/truststore.pass::/etc/truststore.pass";
+    private static final String INVALID_TRUSTSTORES = "/opt/app/certificates/truststore.jks:/opt/app/certificates/truststore.invalid";
+    private static final String INVALID_TRUSTSTORES_PASSWORDS = "/opt/app/certificates/truststore.pass:/.pass";
+
+    private DelimitedPathsSplitter delimitedPathsSplitter;
+
+    @BeforeEach
+    void setUp() {
+        delimitedPathsSplitter = new DelimitedPathsSplitter();
+    }
+
+    @Test
+    void shouldReturnCorrectListWhenTruststoresValid() {
+        // when, then
+        assertThat(delimitedPathsSplitter.getValidatedPaths(TRUSTSTORES_PATHS, Optional.of(VALID_TRUSTSTORES)))
+            .containsSequence("/opt/app/certificates/truststore.jks",
+                "/opt/app/certificates/truststore.pem");
+    }
+
+    @Test
+    void shouldThrowExceptionWhenTruststoresPathsEnvIsEmpty() {
+        // when, then
+        assertThatExceptionOfType(CertificatesPathsValidationException.class)
+            .isThrownBy(() -> delimitedPathsSplitter.getValidatedPaths(TRUSTSTORES_PATHS, Optional.of("")));
+    }
+
+    @Test
+    void shouldThrowExceptionWhenOneOfTruststoresPathsInvalid() {
+        // when, then
+        assertThatExceptionOfType(CertificatesPathsValidationException.class)
+            .isThrownBy(() -> delimitedPathsSplitter
+                .getValidatedPaths(TRUSTSTORES_PATHS, Optional.of(INVALID_TRUSTSTORES)));
+    }
+
+    @Test
+    void shouldReturnCorrectListWhenTruststoresPasswordsValid() {
+        // when, then
+        assertThat(delimitedPathsSplitter
+            .getValidatedPaths(TRUSTSTORES_PASSWORDS_PATHS, Optional.of(VALID_TRUSTSTORES_PASSWORDS)))
+            .containsSequence("/opt/app/certificates/truststore.pass", "");
+    }
+
+    @Test
+    void shouldReturnCorrectListWhenTruststoresPasswordsContainsEmptyPathsInTheMiddle() {
+        // when, then
+        assertThat(delimitedPathsSplitter.getValidatedPaths(TRUSTSTORES_PASSWORDS_PATHS,
+            Optional.of(VALID_TRUSTSTORES_PASSWORDS_WITH_EMPTY_IN_THE_MIDDLE))).containsSequence(
+            "/opt/app/certificates/truststore.pass",
+            "",
+            "/etc/truststore.pass"
+        );
+    }
+
+    @Test
+    void shouldThrowExceptionWhenTruststoresPasswordsPathEnvIsEmpty() {
+        // when, then
+        assertThatExceptionOfType(CertificatesPathsValidationException.class)
+            .isThrownBy(
+                () -> delimitedPathsSplitter.getValidatedPaths(TRUSTSTORES_PASSWORDS_PATHS, Optional.of("")));
+    }
+
+    @Test
+    void shouldThrowExceptionWhenOneOfTruststorePasswordPathsInvalid() {
+        // when, then
+        assertThatExceptionOfType(CertificatesPathsValidationException.class)
+            .isThrownBy(() -> delimitedPathsSplitter
+                .getValidatedPaths(TRUSTSTORES_PASSWORDS_PATHS, Optional.of(INVALID_TRUSTSTORES_PASSWORDS)));
+    }
+}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/path/env/EnvReaderTest.java b/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/path/env/EnvReaderTest.java
new file mode 100644 (file)
index 0000000..343e565
--- /dev/null
@@ -0,0 +1,62 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.configuration.path.env;
+
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.when;
+import static org.onap.oom.certservice.postprocessor.configuration.model.EnvVariable.TRUSTSTORES_PASSWORDS_PATHS;
+
+import java.util.Optional;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+class EnvReaderTest {
+
+    private static final String SAMPLE_PASS_PATH = "/sample/path/trust.pass";
+    EnvReader provider;
+
+    @BeforeEach
+    void setUp() {
+        provider = Mockito.spy(EnvReader.class);
+    }
+
+    @Test
+    void shouldReturnOptionalWithEnv() {
+        // given
+        String envName = TRUSTSTORES_PASSWORDS_PATHS.name();
+        when(provider.getSystemEnv(envName)).thenReturn(Optional.of(SAMPLE_PASS_PATH));
+        // when
+        Optional<String> result = provider.getEnv(envName);
+        // then
+        assertThat(result).isEqualTo(Optional.of(SAMPLE_PASS_PATH));
+    }
+
+    @Test
+    void shouldReturnEmptyOptional() {
+        // given
+        String envName = TRUSTSTORES_PASSWORDS_PATHS.name();
+        // when
+        Optional<String> result = provider.getEnv(envName);
+        // then
+        assertThat(result).isEmpty();
+    }
+}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/path/validation/ValidationFunctionsTest.java b/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/configuration/path/validation/ValidationFunctionsTest.java
new file mode 100644 (file)
index 0000000..f65147a
--- /dev/null
@@ -0,0 +1,135 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.configuration.path.validation;
+
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.onap.oom.certservice.postprocessor.configuration.path.validation.ValidationFunctions.doesItContainValidCertificatesPaths;
+import static org.onap.oom.certservice.postprocessor.configuration.path.validation.ValidationFunctions.doesItContainValidPasswordPaths;
+import static org.onap.oom.certservice.postprocessor.configuration.path.validation.ValidationFunctions.doesItContainValidPathsToCopy;
+
+import java.util.Arrays;
+import java.util.List;
+import org.junit.jupiter.api.Test;
+
+class ValidationFunctionsTest {
+
+    @Test
+    void shouldValidateWithSuccessCorrectCertificatesPaths() {
+        // given
+        List<String> certPaths = Arrays.asList("/opt/app/certificates/truststore.p12");
+        // when
+        boolean result = doesItContainValidCertificatesPaths().test(certPaths);
+        // then
+        assertThat(result).isTrue();
+    }
+
+    @Test
+    void shouldValidateWithFailureCertificatesPathsWithOneEmptyPath() {
+        // given
+        List<String> certPaths = Arrays.asList("/opt/app/certificates/truststore.p12", "");
+        // when
+        boolean result = doesItContainValidCertificatesPaths().test(certPaths);
+        // then
+        assertThat(result).isFalse();
+    }
+
+    @Test
+    void shouldValidateWithFailureCertificatesPathsWithOnePathWhichHasIncorrectExtension() {
+        // given
+        List<String> certPaths = Arrays.asList("/opt/app/certificates/truststore.txt", "/opt/cert.p12");
+        // when
+        boolean result = doesItContainValidCertificatesPaths().test(certPaths);
+        // then
+        assertThat(result).isFalse();
+    }
+
+    @Test
+    void shouldValidateWithSuccessCertificatesPasswordPaths() {
+        // given
+        List<String> passwordPaths = Arrays.asList("/opt/app/certificates/truststore.pass", "");
+        // when
+        boolean result = doesItContainValidPasswordPaths().test(passwordPaths);
+        // then
+        assertThat(result).isTrue();
+    }
+
+    @Test
+    void shouldValidateWithSuccessCertificatePasswordsPathsWhichContainsEmptyPathsInTheMiddle() {
+        // given
+        List<String> passwordPaths = Arrays.asList("/opt/app/certificates/truststore.pass", "", "/etc/truststore.pass");
+        // when
+        boolean result = doesItContainValidPasswordPaths().test(passwordPaths);
+        // then
+        assertThat(result).isTrue();
+    }
+
+    @Test
+    void shouldValidateWithFailureCertificatesPasswordsPathsWithIncorrectExtension() {
+        // given
+        List<String> passwordPaths = Arrays.asList("/pass.txt");
+        // when
+        boolean result = doesItContainValidPasswordPaths().test(passwordPaths);
+        // then
+        assertThat(result).isFalse();
+    }
+
+    @Test
+    void shouldValidateWithFailureCertificatesPasswordPathsWithMissingPrecedingSlash() {
+        // given
+        List<String> passwordPaths = Arrays.asList("jks.pass");
+        // when
+        boolean result = doesItContainValidPasswordPaths().test(passwordPaths);
+        // then
+        assertThat(result).isFalse();
+    }
+
+    @Test
+    void shouldValidateWithSuccessSourcePathsToCopyFiles() {
+        // given
+        List<String> sourcePaths = Arrays.asList("/opt/dcae/cacert/external/keystore.p12",
+            "/opt/dcae/cacert/external/keystore.pass");
+        // when
+        boolean result = doesItContainValidPathsToCopy().test(sourcePaths);
+        // then
+        assertThat(result).isTrue();
+    }
+
+    @Test
+    void shouldValidateWithSuccessDestinationPathsToCopyFiles() {
+        // given
+        List<String> sourcePaths = Arrays.asList("/opt/dcae/cacert/cert.p12","/opt/dcae/cacert/p12.pass");
+        // when
+        boolean result = doesItContainValidPathsToCopy().test(sourcePaths);
+        // then
+        assertThat(result).isTrue();
+    }
+
+    @Test
+    void shouldValidateWithFailureDestinationPathsWithIncorrectExtension() {
+        // given
+        List<String> sourcePaths = Arrays.asList("/opt/dcae/cacert/cert.txt","/opt/dcae/cacert/p12.other");
+        // when
+        boolean result = doesItContainValidPathsToCopy().test(sourcePaths);
+        // then
+        assertThat(result).isFalse();
+    }
+
+}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/copier/KeystoreCopierTest.java b/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/copier/KeystoreCopierTest.java
new file mode 100644 (file)
index 0000000..99193a8
--- /dev/null
@@ -0,0 +1,147 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.copier;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.Collections;
+import org.apache.commons.io.FileUtils;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+import org.onap.oom.certservice.postprocessor.common.FileTools;
+import org.onap.oom.certservice.postprocessor.configuration.model.AppConfiguration;
+import org.onap.oom.certservice.postprocessor.copier.exception.KeystoreFileCopyException;
+import org.onap.oom.certservice.postprocessor.copier.exception.KeystoreNotExistException;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+
+public class KeystoreCopierTest {
+
+    private static final String SOURCE_CONTENT = "source content";
+    private static final String DESTINATION_CONTENT = "destination content";
+
+    @TempDir
+    File dir;
+
+    private KeystoreCopier copier = new KeystoreCopier(new FileTools());
+
+    @Test
+    void shouldDoNothingForEmptySourceFileList() {
+        AppConfiguration configuration = createEmptyConfiguration();
+
+        copier.copyKeystores(configuration);
+
+        assertThat(dir.listFiles()).isEmpty();
+    }
+
+
+    @Test
+    void shouldCopyFileAndCreateBackup() throws IOException {
+        File source = createFile("source.p12", SOURCE_CONTENT);
+        File destination = createFile("destination.p12", DESTINATION_CONTENT);
+        File backup = declareFile("destination.p12.bak");
+        AppConfiguration configuration = createConfiguration(source, destination);
+
+        copier.copyKeystores(configuration);
+
+        assertThat(readFile(destination)).isEqualTo(readFile(source));
+        assertThat(backup.exists()).isTrue();
+        assertThat(readFile(backup)).isEqualTo(DESTINATION_CONTENT);
+    }
+
+    @Test
+    void shouldCopyFileWithoutCreatingBackup() throws IOException {
+        File source = createFile("source.p12", SOURCE_CONTENT);
+        File destination = declareFile("destination.p12");
+        File backup = declareFile("destination.p12.bak");
+        AppConfiguration configuration = createConfiguration(source, destination);
+
+        copier.copyKeystores(configuration);
+
+        assertThat(destination.exists()).isTrue();
+        assertThat(readFile(destination)).isEqualTo(readFile(source));
+        assertThat(backup.exists()).isFalse();
+    }
+
+    @Test
+    void shouldThrowKeystoreNotExistException() throws IOException {
+        File source = declareFile("source.p12");
+        File destination = declareFile("destination.p12");
+        File backup = declareFile("destination.p12.bak");
+        AppConfiguration configuration = createConfiguration(source, destination);
+
+        assertThatExceptionOfType(KeystoreNotExistException.class).isThrownBy( () ->
+            copier.copyKeystores(configuration)
+        );
+
+        assertThat(source.exists()).isFalse();
+        assertThat(destination.exists()).isFalse();
+        assertThat(backup.exists()).isFalse();
+    }
+
+    @Test
+    void shouldThrowKeystoreFileCopyException() throws IOException {
+        File source = createFile("source.p12", SOURCE_CONTENT);
+        source.setReadable(false);
+        File destination = declareFile("destination.p12");
+        File backup = declareFile("destination.p12.bak");
+        AppConfiguration configuration = createConfiguration(source, destination);
+
+        assertThatExceptionOfType(KeystoreFileCopyException.class).isThrownBy( () ->
+            copier.copyKeystores(configuration)
+        );
+
+        assertThat(source.exists()).isTrue();
+        assertThat(destination.exists()).isFalse();
+        assertThat(backup.exists()).isFalse();
+    }
+
+    private AppConfiguration createConfiguration(File source, File destination) {
+        return new AppConfiguration(Collections.emptyList(), Collections.emptyList(),
+            Collections.singletonList(source.getAbsolutePath()),
+            Collections.singletonList(destination.getAbsolutePath()));
+    }
+
+    private AppConfiguration createEmptyConfiguration() {
+        return new AppConfiguration(Collections.emptyList(), Collections.emptyList(),
+            Collections.emptyList(),
+            Collections.emptyList());
+    }
+
+    private String readFile(File file) throws IOException {
+        return FileUtils.readFileToString(file, Charset.defaultCharset());
+    }
+
+    private File declareFile(String name) {
+        return new File(dir.getAbsolutePath() + File.pathSeparator + name);
+    }
+
+    private File createFile(String name, String content) throws IOException {
+        File file = new File(dir.getAbsolutePath() + File.pathSeparator + name);
+        if (file.createNewFile()) {
+            FileUtils.write(file, content, Charset.defaultCharset());
+        } else {
+            throw new IllegalStateException("File could not be created: " + file.getAbsolutePath());
+        }
+        return file;
+    }
+}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/TruststoreFilesProviderTest.java b/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/TruststoreFilesProviderTest.java
new file mode 100644 (file)
index 0000000..9040b53
--- /dev/null
@@ -0,0 +1,63 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+
+package org.onap.oom.certservice.postprocessor.merger;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Arrays;
+import java.util.List;
+import org.junit.jupiter.api.Test;
+import org.onap.oom.certservice.postprocessor.merger.exception.KeystoreInstanceException;
+import org.onap.oom.certservice.postprocessor.merger.exception.LoadTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.PasswordReaderException;
+import org.onap.oom.certservice.postprocessor.merger.exception.TruststoreFileFactoryException;
+import org.onap.oom.certservice.postprocessor.merger.model.Truststore;
+import org.onap.oom.certservice.postprocessor.merger.model.TruststoreFactory;
+
+class TruststoreFilesProviderTest {
+
+    private static final String TRUSTSTORE_JKS_PATH = "src/test/resources/truststore-jks.jks";
+    private static final String TRUSTSTORE_JKS_PASS_PATH = "src/test/resources/truststore-jks.pass";
+    private static final String TRUSTSTORE_P12_PATH = "src/test/resources/truststore-p12.p12";
+    private static final String TRUSTSTORE_P12_PASS_PATH = "src/test/resources/truststore-p12.pass";
+    private static final String TRUSTSTORE_PEM_PATH = "src/test/resources/truststore.pem";
+    private static final String EMPTY_PASS_PATH = "";
+
+    @Test
+    void shouldReturnTruststoreFilesList()
+        throws TruststoreFileFactoryException, PasswordReaderException, LoadTruststoreException, KeystoreInstanceException {
+        //given
+        List<String> truststorePaths = Arrays.asList(TRUSTSTORE_JKS_PATH, TRUSTSTORE_P12_PATH, TRUSTSTORE_PEM_PATH);
+        List<String> truststorePasswordPaths = Arrays
+            .asList(TRUSTSTORE_JKS_PASS_PATH, TRUSTSTORE_P12_PASS_PATH, EMPTY_PASS_PATH);
+
+        //when
+        List<Truststore> truststoreFilesList = TruststoreFilesProvider
+            .getTruststoreFiles(truststorePaths, truststorePasswordPaths);
+
+        //then
+        assertThat(truststoreFilesList.size()).isEqualTo(3);
+        TruststoreFactory.create(TRUSTSTORE_JKS_PATH, TRUSTSTORE_JKS_PASS_PATH);
+        TruststoreFactory.create(TRUSTSTORE_P12_PATH, TRUSTSTORE_P12_PASS_PATH);
+        TruststoreFactory.create(TRUSTSTORE_PEM_PATH, EMPTY_PASS_PATH);
+    }
+
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.provider;
+package org.onap.oom.certservice.postprocessor.merger.model;
 
 import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.onap.oom.truststoremerger.certification.file.TestCertificateProvider.getSampleJksTruststoreFile;
 
 import java.util.List;
 import org.junit.jupiter.api.Test;
-import org.onap.oom.truststoremerger.api.ExitableException;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAlias;
-import org.onap.oom.truststoremerger.certification.file.TestCertificateProvider;
-import org.onap.oom.truststoremerger.certification.file.exception.AliasConflictException;
-import org.onap.oom.truststoremerger.certification.file.exception.MissingTruststoreException;
-import org.onap.oom.truststoremerger.certification.file.model.JavaTruststore;
-
-class JavaCertificateStoreControllerTest {
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.merger.exception.AliasConflictException;
+import org.onap.oom.certservice.postprocessor.merger.exception.MissingTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.model.certificate.CertificateWithAlias;
 
+class JavaTruststoreTest {
 
     @Test
     void throwExceptionWhenAliasConflictDetected() throws Exception {
         //given
-        JavaTruststore p12Truststore = TestCertificateProvider.getSampleP12Truststore();
-        List<CertificateWithAlias> jksTruststoreCertificates = getSampleJksTruststoreFile().getCertificates();
+        Truststore p12Truststore = TestCertificateProvider.getSampleP12Truststore();
+
+        List<CertificateWithAlias> certificateFromJks = TestCertificateProvider
+            .getSampleJksTruststoreFile().getCertificates();
 
         //when //then
         assertThatExceptionOfType(AliasConflictException.class)
-            .isThrownBy(() -> p12Truststore.addCertificate(jksTruststoreCertificates));
+            .isThrownBy(() -> p12Truststore.addCertificates(certificateFromJks));
     }
 
-
     @Test
     void throwExceptionWhenFileNotContainsTruststoreEntry() throws ExitableException {
         //given
-        JavaTruststore p12Truststore = TestCertificateProvider.getSampleP12Keystore();
+        Truststore p12Truststore = TestCertificateProvider.getSampleP12Keystore();
 
         //when//then
         assertThatExceptionOfType(MissingTruststoreException.class)
-            .isThrownBy(p12Truststore::getCertificates);
+            .isThrownBy(() -> p12Truststore.getCertificates());
     }
 
 }
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/model/PemTruststoreTest.java b/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/model/PemTruststoreTest.java
new file mode 100644 (file)
index 0000000..af25489
--- /dev/null
@@ -0,0 +1,128 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.merger.model;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.mockito.Mockito.mock;
+
+import java.io.File;
+import java.io.IOException;
+import java.security.KeyStore;
+import java.security.KeyStoreSpi;
+import java.security.cert.Certificate;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.junit.jupiter.api.Test;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.merger.exception.MissingTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.TruststoreDataOperationException;
+import org.onap.oom.certservice.postprocessor.merger.exception.WriteTruststoreFileException;
+import org.onap.oom.certservice.postprocessor.merger.model.certificate.CertificateWithAlias;
+
+class PemTruststoreTest {
+
+    private static final int EXPECTED_ONE = 1;
+
+    @Test
+    void getCertificatesShouldThrowExceptionWhenFileNotContainsCertificate() {
+        //given
+        File emptyPemFile = TestCertificateProvider.getEmptyPemFile();
+        PemTruststore pemCertificate = new PemTruststore(emptyPemFile);
+        //when//then
+        assertThatExceptionOfType(MissingTruststoreException.class)
+            .isThrownBy(pemCertificate::getCertificates);
+    }
+
+    @Test
+    void shouldThrowExceptionWhenCannotSaveFile() {
+        //given
+        KeyStoreSpi keyStoreSpi = mock(KeyStoreSpi.class);
+        KeyStore keyStore = new KeyStore(keyStoreSpi, null, "") {
+        };
+        File pemFile = TestCertificateProvider.getEmptyPemFile();
+        pemFile.setWritable(false);
+        PemTruststore pem = new PemTruststore(pemFile);
+
+        //when. then
+        assertThatExceptionOfType(WriteTruststoreFileException.class)
+            .isThrownBy(pem::saveFile);
+    }
+
+    @Test
+    void transformToStringInPemFormatShouldCorrectlyTransform() throws ExitableException, IOException {
+        //given
+        Truststore pemTruststore = TestCertificateProvider.getSamplePemTruststoreFile();
+
+        List<CertificateWithAlias> wrappedCertificates = pemTruststore.getCertificates();
+        List<Certificate> certificateList = unWrapCertificate(wrappedCertificates);
+        File notEmptyPemFile = TestCertificateProvider.getNotEmptyPemFile();
+        PemTruststore pemCertificate = new PemTruststore(notEmptyPemFile);
+
+        //when
+        String certificateTransformed = pemCertificate.transformToStringInPemFormat(certificateList);
+
+        //then
+        String expected = TestCertificateProvider.getExpectedPemCertificateAsString();
+        assertThat(certificateTransformed).isEqualTo(expected);
+    }
+
+    @Test
+    void fileNotContainsPemCertificateShouldReturnTrueIfFileNotContainsCertificate()
+        throws TruststoreDataOperationException {
+        //given
+        File emptyPemFile = TestCertificateProvider.getEmptyPemFile();
+        PemTruststore pemCertificate = new PemTruststore(emptyPemFile);
+        //when//then
+        assertThat(pemCertificate.isFileWithoutPemCertificate()).isTrue();
+    }
+
+    @Test
+    void fileNotContainsPemCertificateShouldReturnFalseIfFileContainsCertificate()
+        throws TruststoreDataOperationException {
+        //given
+        File notEmptyPemFile = TestCertificateProvider.getNotEmptyPemFile();
+        PemTruststore pemCertificate = new PemTruststore(notEmptyPemFile);
+
+        //when//then
+        assertThat(pemCertificate.isFileWithoutPemCertificate()).isFalse();
+    }
+
+    @Test
+    void privateKeyIsSkippedWhileReadingCertificates() throws ExitableException {
+        //given
+        File pemTruststoreFile = TestCertificateProvider.getPemWithPrivateKeyFile();
+        PemTruststore pemCertificate = new PemTruststore(pemTruststoreFile);
+
+        //when
+        List<CertificateWithAlias> certificate = pemCertificate.getCertificates();
+
+        //then
+        assertThat(certificate).hasSize(EXPECTED_ONE);
+    }
+
+    private List<Certificate> unWrapCertificate(List<CertificateWithAlias> certificateWithAliases) {
+        return certificateWithAliases
+            .stream()
+            .map(CertificateWithAlias::getCertificate)
+            .collect(Collectors.toList());
+    }
+
+}
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file;
+package org.onap.oom.certservice.postprocessor.merger.model;
+
+import static org.onap.oom.certservice.postprocessor.api.CertificateConstants.JKS_TYPE;
+import static org.onap.oom.certservice.postprocessor.api.CertificateConstants.PKCS12_TYPE;
 
 import java.io.File;
 import java.io.IOException;
@@ -25,26 +28,22 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
-import org.onap.oom.truststoremerger.certification.file.exception.KeystoreInstanceException;
-import org.onap.oom.truststoremerger.certification.file.exception.LoadTruststoreException;
-import org.onap.oom.truststoremerger.certification.file.model.JavaTruststore;
-import org.onap.oom.truststoremerger.certification.file.model.PemTruststore;
-import org.onap.oom.truststoremerger.certification.file.provider.JavaCertificateStoreController;
-import org.onap.oom.truststoremerger.certification.file.provider.CertificateStoreControllerFactory;
-import org.onap.oom.truststoremerger.certification.file.provider.PemCertificateController;
+import org.onap.oom.certservice.postprocessor.merger.exception.KeystoreInstanceException;
+import org.onap.oom.certservice.postprocessor.merger.exception.LoadTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.PasswordReaderException;
 
-public class TestCertificateProvider {
+public final class TestCertificateProvider {
 
     public static final String SAMPLE_P12_TRUSTSTORE_FILE_PATH = "src/test/resources/truststore-p12.p12";
-    public static final String SAMPLE_P12_TRUSTSTORE_PASSWORD = "88y9v5D8H3SG6bZWRVHDfOAo";
+    public static final String SAMPLE_P12_TRUSTSTORE_PASSWORD_PATH = "src/test/resources/truststore-p12.pass";
     public static final String TMP_P12_TRUSTSTORE_FILE_PATH = "src/test/resources/tmp-truststore-p12.p12";
 
     public static final String SAMPLE_P12_KEYSTORE_FILE_PATH = "src/test/resources/keystore.p12";
-    public static final String SAMPLE_P12_KEYSTORE_PASSWORD = "Foh49MJNYI7S_pEzE9gvUDSu";
+    public static final String SAMPLE_P12_KEYSTORE_PASSWORD_PATH = "src/test/resources/keystore.pass";
 
     public static final String SAMPLE_JKS_TRUSTSTORE_FILE_PATH = "src/test/resources/truststore-jks.jks";
     public static final String SAMPLE_JKS_TRUSTSTORE_UNIQUE_ALIAS_FILE_PATH = "src/test/resources/truststore-jks-uniq.jks";
-    public static final String SAMPLE_JKS_TRUSTSTORE_PASSWORD = "EOyuFbuYDyq_EhpboM72RHua";
+    public static final String SAMPLE_JKS_TRUSTSTORE_PASSWORD_PATH = "src/test/resources/truststore-jks.pass";
     public static final String TMP_JKS_TRUSTSTORE_FILE_PATH = "src/test/resources/tmp-truststore-jks.jks";
 
     public static final String SAMPLE_PEM_TRUSTSTORE_FILE_PATH = "src/test/resources/truststore.pem";
@@ -52,99 +51,95 @@ public class TestCertificateProvider {
     public static final String TMP_PEM_TRUSTSTORE_FILE_PATH = "src/test/resources/tmp-truststore.pem";
     public static final String SAMPLE_PEM_TRUSTSTORE_WITH_PRIVATE_KEY_FILE_PATH = "src/test/resources/truststore-with-private-key.pem";
 
-    private static final CertificateStoreControllerFactory certificateStoreControllerFactory = new CertificateStoreControllerFactory();
+    public static final String PEM_FILE_PATH = "src/test/resources/truststore.pem";
+    public static final String PEM_BACKUP_FILE_PATH = "src/test/resources/truststore.pem.bak";
 
-    public static JavaTruststore getSampleP12Truststore() throws LoadTruststoreException, KeystoreInstanceException {
-        return createP12TruststoreInstance(SAMPLE_P12_TRUSTSTORE_FILE_PATH, SAMPLE_P12_TRUSTSTORE_PASSWORD);
+    private TestCertificateProvider() {
     }
 
-    public static JavaTruststore getSampleP12Keystore() throws LoadTruststoreException, KeystoreInstanceException {
-        return createP12TruststoreInstance(SAMPLE_P12_KEYSTORE_FILE_PATH, SAMPLE_P12_KEYSTORE_PASSWORD);
+    public static Truststore getSampleP12Truststore()
+        throws LoadTruststoreException, KeystoreInstanceException, PasswordReaderException {
+        return createJavaTruststore(SAMPLE_P12_TRUSTSTORE_FILE_PATH, SAMPLE_P12_TRUSTSTORE_PASSWORD_PATH, PKCS12_TYPE);
     }
 
-    public static JavaTruststore createTmpP12TruststoreFile()
-        throws IOException, LoadTruststoreException, KeystoreInstanceException {
-        copyFile(SAMPLE_P12_TRUSTSTORE_FILE_PATH, TMP_P12_TRUSTSTORE_FILE_PATH);
-        return createP12TruststoreInstance(TMP_P12_TRUSTSTORE_FILE_PATH, SAMPLE_P12_TRUSTSTORE_PASSWORD);
+    public static Truststore getSampleP12Keystore()
+        throws LoadTruststoreException, KeystoreInstanceException, PasswordReaderException {
+        return createJavaTruststore(SAMPLE_P12_KEYSTORE_FILE_PATH, SAMPLE_P12_KEYSTORE_PASSWORD_PATH, PKCS12_TYPE);
     }
 
-    public static JavaTruststore getTmpP12TruststoreFile() throws LoadTruststoreException, KeystoreInstanceException {
-        return createP12TruststoreInstance(TMP_P12_TRUSTSTORE_FILE_PATH, SAMPLE_P12_TRUSTSTORE_PASSWORD);
-    }
-
-    private static JavaTruststore createP12TruststoreInstance(String filePath, String password)
-        throws LoadTruststoreException, KeystoreInstanceException {
-        File certFile = getFile(filePath);
-        JavaCertificateStoreController storeController = certificateStoreControllerFactory
-            .createLoadedPkcs12CertificateStoreController(certFile, password);
-        return new JavaTruststore(certFile, storeController);
+    public static Truststore createTmpP12TruststoreFile()
+        throws IOException, LoadTruststoreException, KeystoreInstanceException, PasswordReaderException {
+        copyFile(SAMPLE_P12_TRUSTSTORE_FILE_PATH, TMP_P12_TRUSTSTORE_FILE_PATH);
+        return createJavaTruststore(TMP_P12_TRUSTSTORE_FILE_PATH, SAMPLE_P12_TRUSTSTORE_PASSWORD_PATH, PKCS12_TYPE);
     }
 
-    public static PemTruststore getSamplePemTruststoreFile() {
+    public static Truststore getSamplePemTruststoreFile() {
         return getPemTruststoreInstance(SAMPLE_PEM_TRUSTSTORE_FILE_PATH);
     }
 
-    public static PemTruststore getEmptyPemTruststoreFile() {
-        return getPemTruststoreInstance(EMPTY_PEM_TRUSTSTORE_FILE_PATH);
-    }
-
-    public static PemTruststore createEmptyTmpPemTruststoreFile() throws IOException {
+    public static Truststore createEmptyTmpPemTruststoreFile()
+        throws IOException {
         copyFile(EMPTY_PEM_TRUSTSTORE_FILE_PATH, TMP_PEM_TRUSTSTORE_FILE_PATH);
         return getPemTruststoreInstance(TMP_PEM_TRUSTSTORE_FILE_PATH);
     }
 
-    public static PemTruststore createTmpPemTruststoreFile() throws IOException {
+    public static Truststore createTmpPemTruststoreFile()
+        throws IOException {
         copyFile(SAMPLE_PEM_TRUSTSTORE_FILE_PATH, TMP_PEM_TRUSTSTORE_FILE_PATH);
         return getPemTruststoreInstance(TMP_PEM_TRUSTSTORE_FILE_PATH);
     }
 
-    public static PemTruststore getTmpPemTruststoreFile() {
-        return getPemTruststoreInstance(TMP_PEM_TRUSTSTORE_FILE_PATH);
-    }
-
-    public static PemTruststore getPemWithPrivateKeyTruststoreFile() {
-        return getPemTruststoreInstance(SAMPLE_PEM_TRUSTSTORE_WITH_PRIVATE_KEY_FILE_PATH);
-    }
-
     public static String getExpectedPemCertificateAsString() throws IOException {
         Path samplePemFilePath = Paths.get(SAMPLE_PEM_TRUSTSTORE_FILE_PATH);
         return Files.readString(samplePemFilePath);
     }
 
-    public static JavaTruststore getSampleJksTruststoreFile()
-        throws LoadTruststoreException, KeystoreInstanceException {
-        return createJKSTruststoreInstance(SAMPLE_JKS_TRUSTSTORE_FILE_PATH, SAMPLE_JKS_TRUSTSTORE_PASSWORD);
+    public static Truststore getSampleJksTruststoreFile()
+        throws LoadTruststoreException, KeystoreInstanceException, PasswordReaderException {
+        return createJavaTruststore(SAMPLE_JKS_TRUSTSTORE_FILE_PATH, SAMPLE_JKS_TRUSTSTORE_PASSWORD_PATH, JKS_TYPE);
     }
 
-    public static JavaTruststore getSampleJksTruststoreFileWithUniqueAlias()
-        throws LoadTruststoreException, KeystoreInstanceException {
-        return createJKSTruststoreInstance(SAMPLE_JKS_TRUSTSTORE_UNIQUE_ALIAS_FILE_PATH,
-            SAMPLE_JKS_TRUSTSTORE_PASSWORD);
+    public static Truststore getSampleJksTruststoreFileWithUniqueAlias()
+        throws LoadTruststoreException, KeystoreInstanceException, PasswordReaderException {
+        return createJavaTruststore(SAMPLE_JKS_TRUSTSTORE_UNIQUE_ALIAS_FILE_PATH, SAMPLE_JKS_TRUSTSTORE_PASSWORD_PATH,
+            JKS_TYPE);
     }
 
-    public static JavaTruststore createTmpJksTruststoreFileWithUniqAlias()
-        throws IOException, LoadTruststoreException, KeystoreInstanceException {
+    public static Truststore createTmpJksTruststoreFileWithUniqAlias()
+        throws IOException, LoadTruststoreException, KeystoreInstanceException, PasswordReaderException {
         copyFile(SAMPLE_JKS_TRUSTSTORE_UNIQUE_ALIAS_FILE_PATH, TMP_JKS_TRUSTSTORE_FILE_PATH);
-        return createJKSTruststoreInstance(TMP_JKS_TRUSTSTORE_FILE_PATH, SAMPLE_JKS_TRUSTSTORE_PASSWORD);
+        return createJavaTruststore(TMP_JKS_TRUSTSTORE_FILE_PATH, SAMPLE_JKS_TRUSTSTORE_PASSWORD_PATH, JKS_TYPE);
+    }
+
+    public static File getEmptyPemFile() {
+        return getFile(EMPTY_PEM_TRUSTSTORE_FILE_PATH);
+    }
+
+    public static File getNotEmptyPemFile() {
+        return getFile(SAMPLE_PEM_TRUSTSTORE_FILE_PATH);
+    }
+
+    public static File getPemWithPrivateKeyFile() {
+        return getFile(SAMPLE_PEM_TRUSTSTORE_WITH_PRIVATE_KEY_FILE_PATH);
     }
 
     public static void removeTemporaryFiles() throws IOException {
         Files.deleteIfExists(Paths.get(TMP_PEM_TRUSTSTORE_FILE_PATH));
         Files.deleteIfExists(Paths.get(TMP_JKS_TRUSTSTORE_FILE_PATH));
         Files.deleteIfExists(Paths.get(TMP_P12_TRUSTSTORE_FILE_PATH));
+        Files.deleteIfExists(Paths.get(PEM_BACKUP_FILE_PATH));
     }
 
-    private static JavaTruststore createJKSTruststoreInstance(String filePath, String password)
-        throws LoadTruststoreException, KeystoreInstanceException {
+    private static Truststore createJavaTruststore(String filePath, String password, String instanceType)
+        throws LoadTruststoreException, KeystoreInstanceException, PasswordReaderException {
         File certFile = getFile(filePath);
-        JavaCertificateStoreController storeController = certificateStoreControllerFactory
-            .createLoadedJksCertificateStoreController(certFile, password);
-        return new JavaTruststore(certFile, storeController);
+        return JavaTruststoreFactory.create(certFile, password, instanceType);
     }
 
-    private static PemTruststore getPemTruststoreInstance(String tmpPemTruststoreFilePath) {
+    private static Truststore getPemTruststoreInstance(
+        String tmpPemTruststoreFilePath) {
         File file = getFile(tmpPemTruststoreFilePath);
-        return new PemTruststore(file, new PemCertificateController(file));
+        return new PemTruststore(file);
     }
 
     private static void copyFile(String sourcePath, String destPath) throws IOException {
  */
 
 
-package org.onap.oom.truststoremerger.certification.file.provider;
+package org.onap.oom.certservice.postprocessor.merger.model;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
 
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.junit.jupiter.MockitoExtension;
-import org.onap.oom.truststoremerger.certification.file.TruststoreFileFactory;
-import org.onap.oom.truststoremerger.certification.file.model.JavaTruststore;
-import org.onap.oom.truststoremerger.certification.file.model.PemTruststore;
-import org.onap.oom.truststoremerger.certification.file.model.Truststore;
-import org.onap.oom.truststoremerger.certification.file.exception.KeystoreInstanceException;
-import org.onap.oom.truststoremerger.certification.file.exception.LoadTruststoreException;
-
-import java.io.File;
-import org.onap.oom.truststoremerger.certification.file.exception.PasswordReaderException;
-import org.onap.oom.truststoremerger.certification.file.exception.TruststoreFileFactoryException;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import org.onap.oom.certservice.postprocessor.merger.exception.KeystoreInstanceException;
+import org.onap.oom.certservice.postprocessor.merger.exception.LoadTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.PasswordReaderException;
+import org.onap.oom.certservice.postprocessor.merger.exception.TruststoreFileFactoryException;
 
 @ExtendWith(MockitoExtension.class)
 class TruststoreFactoryTest {
@@ -50,66 +43,66 @@ class TruststoreFactoryTest {
     private static final String TRUSTSTORE_UNKNOWN_EXTENSION_PATH = "src/test/resources/truststore-jks.unknown";
     private static final String NON_EXISTING_TRUSTSTORE_PATH = "src/test/resources/non-existing-truststore.jks";
 
-    private TruststoreFileFactory truststoreFileFactory;
-
-    @BeforeEach
-    void setUp() {
-        truststoreFileFactory = new TruststoreFileFactory(new FileManager(), new PasswordReader());
-    }
-
     @Test
     void shouldReturnCorrectJksTruststoreForJksFile()
         throws LoadTruststoreException, PasswordReaderException, TruststoreFileFactoryException, KeystoreInstanceException {
-        Truststore truststore = truststoreFileFactory
-                .create(TRUSTSTORE_JKS_PATH, TRUSTSTORE_JKS_PASS_PATH);
-        assertThat(truststore).isInstanceOf(JavaTruststore.class);
-        JavaTruststore jksTruststore = (JavaTruststore) truststore;
-        assertThat(jksTruststore.getFile()).isEqualTo(new File(TRUSTSTORE_JKS_PATH));
+        //given, when
+        Truststore truststore = TruststoreFactory
+            .create(TRUSTSTORE_JKS_PATH, TRUSTSTORE_JKS_PASS_PATH);
+
+        //then
+        assertThat(truststore).isInstanceOf(Truststore.class);
     }
 
     @Test
     void shouldReturnCorrectP12TruststoreForP12File()
         throws LoadTruststoreException, PasswordReaderException, TruststoreFileFactoryException, KeystoreInstanceException {
-        Truststore truststore = truststoreFileFactory
-                .create(TRUSTSTORE_P12_PATH,
-                        TRUSTSTORE_P12_PASS_PATH);
-        assertThat(truststore).isInstanceOf(JavaTruststore.class);
+        //given, when
+        Truststore truststore = TruststoreFactory
+            .create(TRUSTSTORE_P12_PATH, TRUSTSTORE_P12_PASS_PATH);
+
+        //then
+        assertThat(truststore).isInstanceOf(Truststore.class);
     }
 
     @Test
     void shouldReturnCorrectPemTruststoreForPemFile()
         throws LoadTruststoreException, PasswordReaderException, TruststoreFileFactoryException, KeystoreInstanceException {
-        Truststore truststore = truststoreFileFactory
-                .create(TRUSTSTORE_PEM_PATH,
-                        EMPTY_PASS_PATH);
-        assertThat(truststore).isInstanceOf(PemTruststore.class);
+        //given, when
+        Truststore truststore = TruststoreFactory
+            .create(TRUSTSTORE_PEM_PATH,
+                EMPTY_PASS_PATH);
+
+        //then
+        assertThat(truststore).isInstanceOf(Truststore.class);
     }
 
     @Test
     void shouldThrowExceptionForInvalidP12PassPath() {
         assertThatExceptionOfType(PasswordReaderException.class).isThrownBy(
-                () -> truststoreFileFactory.create(TRUSTSTORE_P12_PATH, EMPTY_PASS_PATH)
+            () -> TruststoreFactory.create(TRUSTSTORE_P12_PATH, EMPTY_PASS_PATH)
         );
     }
 
     @Test
     void shouldThrowExceptionForInvalidJksPassPath() {
         assertThatExceptionOfType(PasswordReaderException.class).isThrownBy(
-                () -> truststoreFileFactory.create(TRUSTSTORE_JKS_PATH, EMPTY_PASS_PATH)
+            () -> TruststoreFactory.create(TRUSTSTORE_JKS_PATH, EMPTY_PASS_PATH)
         );
     }
 
     @Test
     void shouldThrowExceptionForUnknownTruststoreExtension() {
         assertThatExceptionOfType(TruststoreFileFactoryException.class).isThrownBy(
-                () -> truststoreFileFactory.create(TRUSTSTORE_UNKNOWN_EXTENSION_PATH, TRUSTSTORE_JKS_PASS_PATH)
+            () -> TruststoreFactory
+                .create(TRUSTSTORE_UNKNOWN_EXTENSION_PATH, TRUSTSTORE_JKS_PASS_PATH)
         );
     }
 
     @Test
     void shouldThrowExceptionForNonExistingTruststoreFile() {
         assertThatExceptionOfType(TruststoreFileFactoryException.class).isThrownBy(
-                () -> truststoreFileFactory.create(NON_EXISTING_TRUSTSTORE_PATH, TRUSTSTORE_JKS_PASS_PATH)
+            () -> TruststoreFactory.create(NON_EXISTING_TRUSTSTORE_PATH, TRUSTSTORE_JKS_PASS_PATH)
         );
     }
 
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/model/TruststoreTest.java b/trustStoreMerger/src/test/java/org/onap/oom/certservice/postprocessor/merger/model/TruststoreTest.java
new file mode 100644 (file)
index 0000000..8ef148a
--- /dev/null
@@ -0,0 +1,206 @@
+/*============LICENSE_START=======================================================
+ * oom-truststore-merger
+ * ================================================================================
+ * Copyright (C) 2020 Nokia. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.oom.certservice.postprocessor.merger.model;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.onap.oom.certservice.postprocessor.api.CertificateConstants.X_509_CERTIFICATE;
+import static org.onap.oom.certservice.postprocessor.merger.model.TestCertificateProvider.PEM_BACKUP_FILE_PATH;
+
+import java.io.File;
+import java.io.IOException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.onap.oom.certservice.postprocessor.api.CertificateConstants;
+import org.onap.oom.certservice.postprocessor.api.ExitableException;
+import org.onap.oom.certservice.postprocessor.merger.exception.CreateBackupException;
+import org.onap.oom.certservice.postprocessor.merger.exception.KeystoreInstanceException;
+import org.onap.oom.certservice.postprocessor.merger.exception.LoadTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.MissingTruststoreException;
+import org.onap.oom.certservice.postprocessor.merger.exception.PasswordReaderException;
+import org.onap.oom.certservice.postprocessor.merger.exception.TruststoreDataOperationException;
+import org.onap.oom.certservice.postprocessor.merger.model.certificate.CertificateWithAlias;
+import org.onap.oom.certservice.postprocessor.merger.model.certificate.CertificateWithAliasFactory;
+
+class TruststoreTest {
+
+    private static final String BACKUP_EXTENSION = ".bak";
+
+    private static final int EXPECTED_ONE = 1;
+    public static final int EXPECTED_THREE = 3;
+    public static final int FIRST_ELEMENT = 0;
+
+    private final CertificateWithAliasFactory factory = new CertificateWithAliasFactory();
+
+    @Test
+    void createBackupShouldCreateFileWithExtension() throws CreateBackupException {
+        //given
+        File pemFile = new File(TestCertificateProvider.PEM_FILE_PATH);
+        Truststore truststore = new PemTruststore(pemFile);
+        //when
+        truststore.createBackup();
+
+        //then
+        File backupFile = new File(PEM_BACKUP_FILE_PATH);
+        assertThat(backupFile.getName().endsWith(BACKUP_EXTENSION)).isTrue();
+        assertThat(backupFile.isFile()).isTrue();
+    }
+
+    @ParameterizedTest
+    @MethodSource("truststoreProvider")
+    void truststoreShouldReadCertificatesFromFile(Truststore truststore) throws ExitableException {
+        //when
+
+        List<CertificateWithAlias> certificates = truststore.getCertificates();
+        Certificate certificate = certificates.get(FIRST_ELEMENT).getCertificate();
+
+        //then
+        assertThat(certificates).hasSize(EXPECTED_ONE);
+        assertThat(certificate.getType()).isEqualTo(X_509_CERTIFICATE);
+    }
+
+    @Test
+    void jksTruststoreShouldAddDifferentCertificates() throws Exception {
+        //given
+        Truststore jksTruststore = TestCertificateProvider.createTmpJksTruststoreFileWithUniqAlias();
+
+        List<CertificateWithAlias> certificateFromP12 = TestCertificateProvider.getSampleP12Truststore()
+            .getCertificates();
+
+        List<CertificateWithAlias> certificateFromPem = TestCertificateProvider
+            .getSamplePemTruststoreFile().getCertificates();
+
+        //when
+
+        jksTruststore.addCertificates(certificateFromP12);
+
+        jksTruststore.addCertificates(certificateFromPem);
+
+        jksTruststore.saveFile();
+
+        //then
+
+        assertThat(jksTruststore.getCertificates()).hasSize(EXPECTED_THREE);
+    }
+
+    @Test
+    void p12TruststoreShouldAddDifferentCertificates() throws Exception {
+        //given
+        Truststore p12Truststore = TestCertificateProvider.createTmpP12TruststoreFile();
+
+        List<CertificateWithAlias> certificateFromJks = TestCertificateProvider
+            .getSampleJksTruststoreFileWithUniqueAlias().getCertificates();
+
+        List<CertificateWithAlias> certificateFromPem = TestCertificateProvider
+            .getSamplePemTruststoreFile().getCertificates();
+
+        //when
+
+        p12Truststore.addCertificates(certificateFromJks);
+        p12Truststore.addCertificates(certificateFromPem);
+        p12Truststore.saveFile();
+
+        //then
+
+        assertThat(p12Truststore.getCertificates()).hasSize(EXPECTED_THREE);
+    }
+
+    @Test
+    void pemTruststoreShouldAddDifferentCertificates() throws IOException, ExitableException {
+        //given
+        Truststore pemTruststore = TestCertificateProvider
+            .createTmpPemTruststoreFile();
+
+        List<CertificateWithAlias> certificateFromJks = TestCertificateProvider
+            .getSampleJksTruststoreFileWithUniqueAlias().getCertificates();
+
+        List<CertificateWithAlias> certificateFromP12 = TestCertificateProvider.getSampleP12Truststore()
+            .getCertificates();
+
+        //when
+
+        pemTruststore.addCertificates(certificateFromJks);
+
+        pemTruststore.addCertificates(certificateFromP12);
+
+        pemTruststore.saveFile();
+
+        //then
+
+        List<CertificateWithAlias> addedCertificates = pemTruststore.getCertificates();
+        Certificate certificate = addedCertificates.get(FIRST_ELEMENT).getCertificate();
+
+        assertThat(pemTruststore.getCertificates()).hasSize(EXPECTED_THREE);
+        assertThat(certificate.getType()).isEqualTo(X_509_CERTIFICATE);
+    }
+
+    @Test
+    void shouldThrowExceptionWhenFileNotContainsCertificate() throws IOException {
+        //given
+        Truststore tmpPemTruststoreFile = TestCertificateProvider
+            .createEmptyTmpPemTruststoreFile();
+        //when//then
+        assertThatExceptionOfType(MissingTruststoreException.class)
+            .isThrownBy(() -> tmpPemTruststoreFile.getCertificates());
+    }
+
+    @Test
+    void shouldThrowExceptionWhenCannotConvertCertificateToPem() throws Exception {
+        //given
+        Truststore pemTruststore = TestCertificateProvider.createTmpPemTruststoreFile();
+        Certificate certificate = mock(Certificate.class);
+
+        when(certificate.getEncoded()).thenThrow(new CertificateEncodingException());
+
+        List<CertificateWithAlias> certificateFromPem = new ArrayList<>();
+        certificateFromPem.add(factory.createPemCertificate(certificate));
+
+        pemTruststore.addCertificates(certificateFromPem);
+
+        //when //then
+        assertThatExceptionOfType(TruststoreDataOperationException.class)
+            .isThrownBy(() -> pemTruststore.saveFile());
+    }
+
+    @AfterEach
+    void removeTemporaryFiles() throws IOException {
+        TestCertificateProvider.removeTemporaryFiles();
+    }
+
+    private static Stream<Arguments> truststoreProvider()
+        throws LoadTruststoreException, KeystoreInstanceException, PasswordReaderException {
+        return Stream.of(
+            Arguments.of(TestCertificateProvider.getSampleJksTruststoreFile()),
+            Arguments.of(TestCertificateProvider.getSampleP12Truststore()),
+            Arguments.of(TestCertificateProvider.getSamplePemTruststoreFile())
+        );
+    }
+
+}
@@ -17,7 +17,7 @@
  * ============LICENSE_END=========================================================
  */
 
-package org.onap.oom.truststoremerger.certification.file.provider.entry;
+package org.onap.oom.certservice.postprocessor.merger.model.certificate;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -27,7 +27,7 @@ import org.junit.jupiter.api.Test;
 
 class PemAliasGeneratorTest {
 
-    private final static String PREFIX_ALIAS_NAME = "pem-trusted-certificate-";
+    private static final String PREFIX_ALIAS_NAME = "pem-trusted-certificate-";
     static final int GENERATED_ALIASES_NUMBER = 100;
 
     @Test
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/TrustStoreMergerTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/TrustStoreMergerTest.java
deleted file mode 100644 (file)
index a7c6236..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-import org.onap.oom.truststoremerger.api.ExitStatus;
-
-import static org.mockito.Mockito.verify;
-
-@ExtendWith(MockitoExtension.class)
-class TrustStoreMergerTest {
-
-    @Mock
-    AppExitHandler appExitHandler;
-
-    @Test
-    void shouldExitWithTruststoresPathsProviderExceptionDueToMissingTrustoresPathEnvs() {
-        new TrustStoreMerger(appExitHandler).run();
-
-        verify(appExitHandler).exit(ExitStatus.TRUSTSTORES_PATHS_PROVIDER_EXCEPTION);
-    }
-}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/model/JavaTruststoreTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/model/JavaTruststoreTest.java
deleted file mode 100644 (file)
index eccf36b..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.file.model;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.onap.oom.truststoremerger.api.CertificateConstants.X_509_CERTIFICATE;
-
-import java.io.IOException;
-import java.security.cert.Certificate;
-import java.util.List;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.Test;
-import org.onap.oom.truststoremerger.api.ExitableException;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAlias;
-import org.onap.oom.truststoremerger.certification.file.TestCertificateProvider;
-
-
-class JavaTruststoreTest {
-    public static final int FIRST_ELEMENT = 0;
-    private static final int EXPECTED_ONE = 1;
-    public static final int EXPECTED_THREE = 3;
-
-    @Test
-    void jksTruststoreShouldReadCertificatesFromFile() throws ExitableException {
-
-        //given
-        JavaTruststore jksTruststoreFile = TestCertificateProvider.getSampleJksTruststoreFile();
-
-        //when
-        List<CertificateWithAlias> certificates = jksTruststoreFile.getCertificates();
-        Certificate certificate = certificates.get(FIRST_ELEMENT).getCertificate();
-
-        //then
-        assertThat(certificates).hasSize(EXPECTED_ONE);
-        assertThat(certificate.getType()).isEqualTo(X_509_CERTIFICATE);
-    }
-
-    @Test
-    void jksTruststoreShouldAddDifferentCertificates() throws Exception {
-
-        //given
-        JavaTruststore jksTruststore = TestCertificateProvider.createTmpJksTruststoreFileWithUniqAlias();
-        List<CertificateWithAlias> p12certificates = TestCertificateProvider.getSampleP12Truststore()
-            .getCertificates();
-        List<CertificateWithAlias> pemCertificates = TestCertificateProvider.getSamplePemTruststoreFile()
-            .getCertificates();
-
-        //when
-        jksTruststore.addCertificate(p12certificates);
-        jksTruststore.addCertificate(pemCertificates);
-
-        //then
-        assertThat(jksTruststore.getCertificates()).hasSize(EXPECTED_THREE);
-
-    }
-
-    @Test
-    void p12TruststoreShouldReadCertificatesFromFile() throws ExitableException {
-        //given
-        JavaTruststore p12Truststore = TestCertificateProvider.getSampleP12Truststore();
-
-        //when
-        List<CertificateWithAlias> certificatesWithAliases = p12Truststore.getCertificates();
-        Certificate certificate = certificatesWithAliases.get(FIRST_ELEMENT).getCertificate();
-
-        //then
-        assertThat(certificatesWithAliases).hasSize(EXPECTED_ONE);
-        assertThat(certificate.getType()).isEqualTo(X_509_CERTIFICATE);
-    }
-
-
-    @Test
-    void p12TruststoreShouldAddDifferentCertificates() throws Exception {
-        //given
-        JavaTruststore p12Truststore = TestCertificateProvider.createTmpP12TruststoreFile();
-        List<CertificateWithAlias> jksTruststoreCertificates = TestCertificateProvider
-            .getSampleJksTruststoreFileWithUniqueAlias()
-            .getCertificates();
-        List<CertificateWithAlias> pemTruststoreCertificates = TestCertificateProvider.getSamplePemTruststoreFile()
-            .getCertificates();
-
-        //when
-        p12Truststore.addCertificate(jksTruststoreCertificates);
-        p12Truststore.addCertificate(pemTruststoreCertificates);
-        p12Truststore.saveFile();
-
-
-        //then
-        JavaTruststore p12TruststoreSaved = TestCertificateProvider.getTmpP12TruststoreFile();
-        assertThat(p12TruststoreSaved.getCertificates()).hasSize(EXPECTED_THREE);
-    }
-
-
-
-    @AfterAll
-    static void removeTemporaryFiles() throws IOException {
-        TestCertificateProvider.removeTemporaryFiles();
-    }
-}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/model/PemTruststoreTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/model/PemTruststoreTest.java
deleted file mode 100644 (file)
index e7ffa09..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.file.model;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.onap.oom.truststoremerger.api.CertificateConstants.X_509_CERTIFICATE;
-
-import java.io.IOException;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateEncodingException;
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.Test;
-import org.onap.oom.truststoremerger.api.ExitableException;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAlias;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAliasFactory;
-import org.onap.oom.truststoremerger.certification.file.TestCertificateProvider;
-import org.onap.oom.truststoremerger.certification.file.exception.MissingTruststoreException;
-import org.onap.oom.truststoremerger.certification.file.exception.TruststoreDataOperationException;
-import org.onap.oom.truststoremerger.certification.file.exception.WriteTruststoreFileException;
-
-class PemTruststoreTest {
-
-    public static final int EXPECTED_ONE = 1;
-    public static final int EXPECTED_THREE = 3;
-    public static final int FIRST_ELEMENT = 0;
-
-    private final CertificateWithAliasFactory factory = new CertificateWithAliasFactory();
-
-    @Test
-    void pemTruststoreShouldReadCertificatesFromFile() throws ExitableException {
-
-        //given
-        PemTruststore pemTruststore = TestCertificateProvider.getSamplePemTruststoreFile();
-
-        //when
-        List<CertificateWithAlias> certificates = pemTruststore.getCertificates();
-        Certificate certificate = certificates.get(FIRST_ELEMENT).getCertificate();
-        //then
-
-        assertThat(certificates).hasSize(EXPECTED_ONE);
-        assertThat(certificate.getType()).isEqualTo(X_509_CERTIFICATE);
-    }
-
-    @Test
-    void pemTruststoreShouldAddDifferentCertificates() throws IOException, ExitableException {
-
-        //given
-        PemTruststore tmpPemTruststoreFile = TestCertificateProvider.createTmpPemTruststoreFile();
-        List<CertificateWithAlias> jksTruststoreCertificates = TestCertificateProvider
-            .getSampleJksTruststoreFileWithUniqueAlias().getCertificates();
-        List<CertificateWithAlias> p12TruststoreCertificates = TestCertificateProvider.getSampleP12Truststore()
-            .getCertificates();
-
-        //when
-        tmpPemTruststoreFile.addCertificate(jksTruststoreCertificates);
-        tmpPemTruststoreFile.addCertificate(p12TruststoreCertificates);
-        tmpPemTruststoreFile.saveFile();
-
-        PemTruststore tmpPemTruststoreSaved = TestCertificateProvider.getTmpPemTruststoreFile();
-        List<CertificateWithAlias> addedCertificates = tmpPemTruststoreSaved.getCertificates();
-        Certificate certificate = addedCertificates.get(FIRST_ELEMENT).getCertificate();
-
-        //then
-        assertThat(addedCertificates).hasSize(EXPECTED_THREE);
-        assertThat(certificate.getType()).isEqualTo(X_509_CERTIFICATE);
-
-    }
-
-    @Test
-    void privateKeyIsSkippedWhileReadingCertificates() throws ExitableException {
-        //given
-        PemTruststore pemTruststore = TestCertificateProvider.getPemWithPrivateKeyTruststoreFile();
-
-        //when
-        List<CertificateWithAlias> certificate = pemTruststore.getCertificates();
-        //then
-
-        assertThat(certificate).hasSize(EXPECTED_ONE);
-    }
-
-    @Test
-    void shouldThrowExceptionWhenCannotSaveFile() throws IOException, ExitableException {
-        //given
-        PemTruststore tmpPemTruststoreFile = TestCertificateProvider.createTmpPemTruststoreFile();
-        List<CertificateWithAlias> pemTruststoreCertificates =
-            TestCertificateProvider.getSamplePemTruststoreFile().getCertificates();
-        //when
-        tmpPemTruststoreFile.addCertificate(pemTruststoreCertificates);
-        tmpPemTruststoreFile.getFile().setWritable(false);
-        //then
-        assertThatExceptionOfType(WriteTruststoreFileException.class)
-            .isThrownBy(tmpPemTruststoreFile::saveFile);
-
-    }
-
-    @Test
-    void shouldThrowExceptionWhenFileNotContainsCertificate() throws IOException {
-        //given
-        PemTruststore tmpPemTruststoreFile = TestCertificateProvider.createEmptyTmpPemTruststoreFile();
-        //when//then
-        assertThatExceptionOfType(MissingTruststoreException.class)
-            .isThrownBy(tmpPemTruststoreFile::getCertificates);
-    }
-
-    @Test
-    void shouldThrowExceptionWhenCannotConvertCertificateToPem() throws Exception {
-        //given
-        PemTruststore pemTruststore = TestCertificateProvider.createTmpPemTruststoreFile();
-        Certificate certificate = mock(Certificate.class);
-
-        when(certificate.getEncoded()).thenThrow(new CertificateEncodingException());
-
-        List<CertificateWithAlias> certificatesWithAliases = new ArrayList<>();
-        certificatesWithAliases.add(factory.createPemCertificate(certificate));
-        pemTruststore.addCertificate(certificatesWithAliases);
-
-        //when //then
-        assertThatExceptionOfType(TruststoreDataOperationException.class)
-            .isThrownBy(pemTruststore::saveFile);
-    }
-
-    @AfterAll
-    static void removeTemporaryFiles() throws IOException {
-        TestCertificateProvider.removeTemporaryFiles();
-    }
-
-}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/model/TruststoreTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/model/TruststoreTest.java
deleted file mode 100644 (file)
index eea1f9c..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.file.model;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.Test;
-import org.onap.oom.truststoremerger.certification.file.exception.CreateBackupException;
-import org.onap.oom.truststoremerger.certification.file.provider.PemCertificateController;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class TruststoreTest {
-
-    private static final String PEM_FILE_PATH = "src/test/resources/truststore.pem";
-    private static final String PEM_BACKUP_FILE_PATH = "src/test/resources/truststore.pem.bak";
-    private static final String BACKUP_EXTENSION = ".bak";
-
-
-    @Test
-    void createBackupShouldCreateFileWithExtension() throws CreateBackupException {
-        //given
-        File pemFile = new File(PEM_FILE_PATH);
-        Truststore truststore = new PemTruststore(pemFile, new PemCertificateController(pemFile));
-        //when
-        truststore.createBackup();
-
-        //then
-        File backupFile = new File(PEM_BACKUP_FILE_PATH);
-        assertThat(backupFile.getName().endsWith(BACKUP_EXTENSION)).isTrue();
-        assertThat(backupFile.isFile()).isTrue();
-    }
-
-
-    @AfterAll
-    static void removeBackupFile() throws IOException {
-        Files.deleteIfExists(Paths.get(PEM_BACKUP_FILE_PATH));
-    }
-
-}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/PemCertificateControllerTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/PemCertificateControllerTest.java
deleted file mode 100644 (file)
index 080fcca..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.file.provider;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-
-import java.io.File;
-import java.io.IOException;
-import java.security.cert.Certificate;
-import java.util.List;
-import java.util.stream.Collectors;
-import org.junit.jupiter.api.Test;
-import org.onap.oom.truststoremerger.api.ExitableException;
-import org.onap.oom.truststoremerger.certification.file.provider.entry.CertificateWithAlias;
-import org.onap.oom.truststoremerger.certification.file.TestCertificateProvider;
-import org.onap.oom.truststoremerger.certification.file.exception.MissingTruststoreException;
-import org.onap.oom.truststoremerger.certification.file.exception.TruststoreDataOperationException;
-import org.onap.oom.truststoremerger.certification.file.model.PemTruststore;
-
-class PemCertificateControllerTest {
-
-    @Test
-    void getNotEmptyCertificateListShouldThrowExceptionWhenFileNotContainsCertificate() {
-        //given
-        File emptyPemFile = TestCertificateProvider.getEmptyPemTruststoreFile().getFile();
-        PemCertificateController pemCertificateController = new PemCertificateController(emptyPemFile);
-        //when//then
-        assertThatExceptionOfType(MissingTruststoreException.class)
-            .isThrownBy(pemCertificateController::getNotEmptyCertificateList);
-    }
-
-    @Test
-    void transformToStringInPemFormatShouldCorrectlyTransform() throws ExitableException, IOException {
-        //given
-        PemTruststore pemTruststore = TestCertificateProvider.getSamplePemTruststoreFile();
-        List<CertificateWithAlias> wrappedCertificates = pemTruststore.getCertificates();
-        File notEmptyPemFile = pemTruststore.getFile();
-        List<Certificate> certificateList = unWrapCertificate(wrappedCertificates);
-        PemCertificateController pemCertificateController = new PemCertificateController(notEmptyPemFile);
-        String expected = TestCertificateProvider.getExpectedPemCertificateAsString();
-
-        //when
-        String certificateTransformed = pemCertificateController.transformToStringInPemFormat(certificateList);
-
-        //then
-        assertThat(certificateTransformed).isEqualTo(expected);
-    }
-
-    @Test
-    void fileNotContainsPemCertificateShouldReturnTrueIfFileNotContainsCertificate()
-        throws TruststoreDataOperationException {
-        //given
-        File emptyPemFile = TestCertificateProvider.getEmptyPemTruststoreFile().getFile();
-        PemCertificateController pemCertificateController = new PemCertificateController(emptyPemFile);
-        //when//then
-        assertThat(pemCertificateController.isFileWithoutPemCertificate()).isTrue();
-    }
-
-    @Test
-    void fileNotContainsPemCertificateShouldReturnFalseIfFileContainsCertificate()
-        throws TruststoreDataOperationException {
-        //given
-        File notEmptyPemFile = TestCertificateProvider.getSamplePemTruststoreFile().getFile();
-        PemCertificateController pemCertificateController = new PemCertificateController(notEmptyPemFile);
-
-        //when//then
-        assertThat(pemCertificateController.isFileWithoutPemCertificate()).isFalse();
-    }
-
-    private List<Certificate> unWrapCertificate(List<CertificateWithAlias> certificateWithAliases) {
-        return certificateWithAliases
-            .stream()
-            .map(CertificateWithAlias::getCertificate)
-            .collect(Collectors.toList());
-    }
-
-}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFilesListProviderTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/provider/TruststoreFilesListProviderTest.java
deleted file mode 100644 (file)
index 0dadcfe..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-
-package org.onap.oom.truststoremerger.certification.file.provider;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.onap.oom.truststoremerger.certification.file.TruststoreFileFactory;
-import org.onap.oom.truststoremerger.certification.file.TruststoreFilesListProvider;
-import org.onap.oom.truststoremerger.certification.file.model.JavaTruststore;
-import org.onap.oom.truststoremerger.certification.file.model.PemTruststore;
-import org.onap.oom.truststoremerger.certification.file.model.Truststore;
-import org.onap.oom.truststoremerger.certification.file.exception.KeystoreInstanceException;
-import org.onap.oom.truststoremerger.certification.file.exception.LoadTruststoreException;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-import org.onap.oom.truststoremerger.certification.file.exception.PasswordReaderException;
-import org.onap.oom.truststoremerger.certification.file.exception.TruststoreFileFactoryException;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class TruststoreFilesListProviderTest {
-
-    private static final String TRUSTSTORE_JKS_PATH = "src/test/resources/truststore-jks.jks";
-    private static final String TRUSTSTORE_JKS_PASS_PATH = "src/test/resources/truststore-jks.pass";
-    private static final String TRUSTSTORE_P12_PATH = "src/test/resources/truststore-p12.p12";
-    private static final String TRUSTSTORE_P12_PASS_PATH = "src/test/resources/truststore-p12.pass";
-    private static final String TRUSTSTORE_PEM_PATH = "src/test/resources/truststore.pem";
-    private static final String EMPTY_PASS_PATH = "";
-
-    private TruststoreFilesListProvider truststoreFilesListProvider;
-
-    @BeforeEach
-    void setUp() {
-        TruststoreFileFactory truststoreFileFactory = new TruststoreFileFactory(new FileManager(), new PasswordReader());
-        truststoreFilesListProvider = new TruststoreFilesListProvider(truststoreFileFactory);
-    }
-
-    @Test
-    void shouldReturnTruststoreFilesList()
-        throws TruststoreFileFactoryException, PasswordReaderException, LoadTruststoreException, KeystoreInstanceException {
-        List<String> truststorePaths = Arrays.asList(TRUSTSTORE_JKS_PATH, TRUSTSTORE_P12_PATH, TRUSTSTORE_PEM_PATH);
-        List<String> truststorePasswordPaths = Arrays.asList(TRUSTSTORE_JKS_PASS_PATH, TRUSTSTORE_P12_PASS_PATH, EMPTY_PASS_PATH);
-        List<Truststore> truststoreFilesList = truststoreFilesListProvider.getTruststoreFilesList(truststorePaths, truststorePasswordPaths);
-        assertThat(truststoreFilesList.size()).isEqualTo(3);
-        assertCorrectJksTruststore(truststoreFilesList.get(0), TRUSTSTORE_JKS_PATH);
-        assertCorrectP12Truststore(truststoreFilesList.get(1), TRUSTSTORE_P12_PATH);
-        assertCorrectPemTruststore(truststoreFilesList.get(2), TRUSTSTORE_PEM_PATH);
-    }
-
-    private void assertCorrectJksTruststore(Truststore truststore, String truststorePath) {
-        assertCorrectTypeAndTruststorePath(truststore, truststorePath, JavaTruststore.class);
-    }
-
-    private void assertCorrectP12Truststore(Truststore truststore, String truststorePath) {
-        assertCorrectTypeAndTruststorePath(truststore, truststorePath, JavaTruststore.class);
-    }
-
-    private void assertCorrectPemTruststore(Truststore truststore, String truststorePath) {
-        assertCorrectTypeAndTruststorePath(truststore, truststorePath, PemTruststore.class);
-    }
-
-    private void assertCorrectTypeAndTruststorePath(Truststore truststore, String truststorePath, Class<?> truststoreType) {
-        assertThat(truststore).isInstanceOf(truststoreType);
-        assertThat(truststore.getFile()).isEqualTo(new File(truststorePath));
-    }
-
-}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/path/PathValidatorTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/path/PathValidatorTest.java
deleted file mode 100644 (file)
index a11bb23..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.path;
-
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.ValueSource;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class PathValidatorTest {
-
-    private final PathValidator validator = new PathValidator();
-
-    @ParameterizedTest()
-    @ValueSource(strings = {"/opt/app/truststore.pem", "/opt/app/truststore.jks",
-            "/opt/app/truststore.p12", "/truststore.pem"})
-    void shouldAcceptValidTruststorePaths(String path) {
-        assertThat(validator.isTruststorePathValid(path)).isTrue();
-    }
-
-    @ParameterizedTest()
-    @ValueSource(strings = {"/opt/app/truststore.pass", "/opt/app/truststore.invalid", "/",
-            "truststore", "opt/app/truststore.p12", "/?.pem", "/.pem"})
-    void shouldRejectInValidTruststorePaths(String path) {
-        assertThat(validator.isTruststorePathValid(path)).isFalse();
-    }
-
-    @ParameterizedTest()
-    @ValueSource(strings = {"", "/opt/app/truststore.pass", "/truststore.pass"})
-    void shouldAcceptValidTruststorePasswordPaths(String path) {
-        assertThat(validator.isTruststorePasswordPathValid(path)).isTrue();
-    }
-
-    @ParameterizedTest()
-    @ValueSource(strings = {"/opt/app/truststore.pem", "/opt/app/truststore.jks",
-            "/opt/app/truststore.p12", "/", "truststore", "opt/app/truststore.p12", "/?.pass", "/.pass"})
-    void shouldRejectInValidTruststorePasswordPaths(String path) {
-        assertThat(validator.isTruststorePasswordPathValid(path)).isFalse();
-    }
-
-}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/path/TruststoresPathsProviderTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/path/TruststoresPathsProviderTest.java
deleted file mode 100644 (file)
index 38422d5..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.certification.path;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import java.util.Optional;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.mockito.Mockito.when;
-import static org.onap.oom.truststoremerger.api.ConfigurationEnvs.TRUSTSTORES_PATHS_ENV;
-import static org.onap.oom.truststoremerger.api.ConfigurationEnvs.TRUSTSTORES_PASSWORDS_PATHS_ENV;
-
-
-@ExtendWith(MockitoExtension.class)
-class TruststoresPathsProviderTest {
-
-    private static final String VALID_TRUSTSTORES = "/opt/app/certificates/truststore.jks:/opt/app/certificates/truststore.pem";
-    private static final String VALID_TRUSTSTORES_PASSWORDS = "/opt/app/certificates/truststore.pass:";
-    private static final String INVALID_TRUSTSTORES = "/opt/app/certificates/truststore.jks:/opt/app/certificates/truststore.invalid";
-    private static final String INVALID_TRUSTSTORES_PASSWORDS = "/opt/app/certificates/truststore.pass:/.pass";
-
-    @Mock
-    private EnvProvider envProvider;
-    private TruststoresPathsProvider truststoresPathsProvider;
-
-    @BeforeEach
-    void setUp() {
-        truststoresPathsProvider = new TruststoresPathsProvider(envProvider, new PathValidator());
-    }
-
-    @Test
-    void shouldReturnCorrectListWhenTruststoresValid() throws TruststoresPathsProviderException {
-        mockTruststoresEnv(VALID_TRUSTSTORES);
-
-        assertThat(truststoresPathsProvider.getTruststores())
-                .contains("/opt/app/certificates/truststore.jks",
-                        "/opt/app/certificates/truststore.pem");
-    }
-
-    @Test
-    void shouldReturnCorrectListWhenTruststoresPasswordsValid() throws TruststoresPathsProviderException {
-        mockTruststoresPasswordsEnv(VALID_TRUSTSTORES_PASSWORDS);
-
-        assertThat(truststoresPathsProvider.getTruststoresPasswords())
-                .contains("/opt/app/certificates/truststore.pass",
-                        "");
-    }
-
-    @Test
-    void shouldThrowExceptionWhenTruststoresEmpty() {
-        mockTruststoresEnv("");
-
-        assertThatExceptionOfType(TruststoresPathsProviderException.class)
-                .isThrownBy(truststoresPathsProvider::getTruststores);
-    }
-
-    @Test
-    void shouldThrowExceptionWhenOneOfTruststoresPathsInvalid() {
-        mockTruststoresEnv(INVALID_TRUSTSTORES);
-
-        assertThatExceptionOfType(TruststoresPathsProviderException.class)
-                .isThrownBy(truststoresPathsProvider::getTruststores);
-    }
-
-    @Test
-    void shouldThrowExceptionWhenOneOfTruststorePasswordPathsInvalid() {
-        mockTruststoresPasswordsEnv(INVALID_TRUSTSTORES_PASSWORDS);
-
-        assertThatExceptionOfType(TruststoresPathsProviderException.class)
-                .isThrownBy(truststoresPathsProvider::getTruststoresPasswords);
-    }
-
-    private void mockTruststoresEnv(String truststores) {
-        mockEnv(truststores, TRUSTSTORES_PATHS_ENV);
-    }
-
-    private void mockTruststoresPasswordsEnv(String truststoresPasswords) {
-        mockEnv(truststoresPasswords, TRUSTSTORES_PASSWORDS_PATHS_ENV);
-    }
-
-    private void mockEnv(String envValue, String envName) {
-        when(envProvider.getEnv(envName))
-                .thenReturn(Optional.of(envValue));
-    }
-}
diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactoryTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactoryTest.java
deleted file mode 100644 (file)
index 43b7b9e..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/*============LICENSE_START=======================================================
- * oom-truststore-merger
- * ================================================================================
- * Copyright (C) 2020 Nokia. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.oom.truststoremerger.configuration;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-import org.onap.oom.truststoremerger.certification.path.TruststoresPathsProvider;
-import org.onap.oom.truststoremerger.certification.path.TruststoresPathsProviderException;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.mockito.Mockito.when;
-
-@ExtendWith(MockitoExtension.class)
-class MergerConfigurationFactoryTest {
-
-    private static final String BASE_TRUSTSTORE_PATH = "/opt/app/truststore_";
-    private static final String TRUSTSTORE_EXTENSION = ".jks";
-    private static final String PASSWORD_EXTENSION = ".pass";
-
-    @Mock
-    private TruststoresPathsProvider pathsProvider;
-    private MergerConfigurationFactory factory;
-
-    @BeforeEach
-    void setUp() {
-        factory = new MergerConfigurationFactory(pathsProvider);
-    }
-
-    @Test
-    void shouldReturnConfigurationWithCorrectPaths() throws TruststoresPathsProviderException, MergerConfigurationException {
-        int numberOfPaths = 5;
-        List<String> truststoresPaths = createListOfPathsWithExtension(numberOfPaths, TRUSTSTORE_EXTENSION);
-        List<String> truststorePasswordPaths = createListOfPathsWithExtension(numberOfPaths, PASSWORD_EXTENSION);
-        mockPaths(truststoresPaths, truststorePasswordPaths);
-
-        MergerConfiguration configuration = factory.createConfiguration();
-
-        assertThat(configuration.getTruststoreFilePaths()).containsAll(truststoresPaths);
-        assertThat(configuration.getTruststoreFilePasswordPaths()).containsAll(truststorePasswordPaths);
-    }
-
-    @Test
-    void shouldThrowExceptionWhenTruststoresLenghtDifferentThanTruststoresPasswordsLength() throws TruststoresPathsProviderException {
-        int numberOfTruststores = 5;
-        int numberOfTruststoresPasswords = 4;
-        List<String> truststoresPaths = createListOfPathsWithExtension(numberOfTruststores, TRUSTSTORE_EXTENSION);
-        List<String> truststorePasswordPaths = createListOfPathsWithExtension(numberOfTruststoresPasswords, PASSWORD_EXTENSION);
-        mockPaths(truststoresPaths, truststorePasswordPaths);
-
-        assertThatExceptionOfType(MergerConfigurationException.class)
-                .isThrownBy(factory::createConfiguration);
-    }
-
-    private void mockPaths(List<String> truststores, List<String> truststoresPasswords) throws TruststoresPathsProviderException {
-        mockTruststores(truststores);
-        mockTruststoresPasswords(truststoresPasswords);
-    }
-
-    private void mockTruststores(List<String> truststores) throws TruststoresPathsProviderException {
-        when(pathsProvider.getTruststores()).thenReturn(truststores);
-    }
-
-    private void mockTruststoresPasswords(List<String> truststoresPasswords) throws TruststoresPathsProviderException {
-        when(pathsProvider.getTruststoresPasswords()).thenReturn(truststoresPasswords);
-    }
-
-    private List<String> createListOfPathsWithExtension(int numberOfPaths, String password_extension) {
-        List<String> paths = new ArrayList<>();
-        while (numberOfPaths-- > 0) {
-            paths.add(BASE_TRUSTSTORE_PATH + numberOfPaths + password_extension);
-        }
-        return paths;
-    }
-}
diff --git a/trustStoreMerger/src/test/resources/keystore.pass b/trustStoreMerger/src/test/resources/keystore.pass
new file mode 100644 (file)
index 0000000..665ff8e
--- /dev/null
@@ -0,0 +1 @@
+Foh49MJNYI7S_pEzE9gvUDSu
\ No newline at end of file
index 00ef564..358e99c 100644 (file)
@@ -1,5 +1,5 @@
-major=1
-minor=2
+major=2
+minor=0
 patch=0
 base_version=${major}.${minor}.${patch}
 release_version=${base_version}