Read flags from env variables
[dcaegen2/collectors/hv-ves.git] / hv-collector-utils / src / main / kotlin / org / onap / dcae / collectors / veshv / utils / commandline / ArgBasedConfiguration.kt
1 /*
2  * ============LICENSE_START=======================================================
3  * dcaegen2-collectors-veshv
4  * ================================================================================
5  * Copyright (C) 2018 NOKIA
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20 package org.onap.dcae.collectors.veshv.utils.commandline
21
22 import arrow.core.Either
23 import arrow.core.Option
24 import arrow.core.Try
25 import arrow.core.flatMap
26 import arrow.core.getOrElse
27 import org.apache.commons.cli.CommandLine
28 import org.apache.commons.cli.CommandLineParser
29 import org.apache.commons.cli.Options
30 import org.onap.dcae.collectors.veshv.utils.arrow.fromNullablesChain
31 import java.io.File
32 import java.nio.file.Path
33 import java.nio.file.Paths
34
35 abstract class ArgBasedConfiguration<T>(private val parser: CommandLineParser) {
36     abstract val cmdLineOptionsList: List<CommandLineOption>
37
38     fun parse(args: Array<out String>): Either<WrongArgumentError, T> {
39         val parseResult = Try {
40             val commandLineOptions = cmdLineOptionsList.map { it.option }.fold(Options(), Options::addOption)
41             parser.parse(commandLineOptions, args)
42         }
43         return parseResult
44                 .toEither()
45                 .mapLeft { ex -> WrongArgumentError(ex, cmdLineOptionsList) }
46                 .map(this::getConfiguration)
47                 .flatMap {
48                     it.toEither {
49                         WrongArgumentError(
50                                 message = "Unexpected error when parsing command line arguments",
51                                 cmdLineOptionsList = cmdLineOptionsList)
52                     }
53                 }
54     }
55
56     protected abstract fun getConfiguration(cmdLine: CommandLine): Option<T>
57
58     protected fun CommandLine.longValue(cmdLineOpt: CommandLineOption, default: Long): Long =
59             longValue(cmdLineOpt).getOrElse { default }
60
61     protected fun CommandLine.stringValue(cmdLineOpt: CommandLineOption, default: String): String =
62             optionValue(cmdLineOpt).getOrElse { default }
63
64     protected fun CommandLine.intValue(cmdLineOpt: CommandLineOption, default: Int): Int =
65             intValue(cmdLineOpt).getOrElse { default }
66
67     protected fun CommandLine.intValue(cmdLineOpt: CommandLineOption): Option<Int> =
68             optionValue(cmdLineOpt).map(String::toInt)
69
70     private fun CommandLine.longValue(cmdLineOpt: CommandLineOption): Option<Long> =
71             optionValue(cmdLineOpt).map(String::toLong)
72
73     protected fun CommandLine.stringValue(cmdLineOpt: CommandLineOption): Option<String> =
74             optionValue(cmdLineOpt)
75
76     protected fun CommandLine.hasOption(cmdLineOpt: CommandLineOption): Boolean =
77             this.hasOption(cmdLineOpt.option.opt) ||
78                     System.getenv(cmdLineOpt.environmentVariableName()) != null
79
80     protected fun stringPathToPath(path: String): Path = Paths.get(File(path).toURI())
81
82     private fun CommandLine.optionValue(cmdLineOpt: CommandLineOption) = Option.fromNullablesChain(
83             getOptionValue(cmdLineOpt.option.opt),
84             { System.getenv(cmdLineOpt.environmentVariableName()) })
85 }