Implant vid-app-common org.onap.vid.job (main and test)
[vid.git] / vid-app-common / src / main / java / org / onap / vid / services / VersionService.kt
1 package org.onap.vid.services
2
3 import com.fasterxml.jackson.module.kotlin.readValue
4 import org.apache.commons.lang3.StringUtils
5 import org.apache.commons.lang3.StringUtils.substringAfterLast
6 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate
7 import org.onap.portalsdk.core.util.SystemProperties
8 import org.onap.vid.model.VersionAndFeatures
9 import org.onap.vid.utils.JACKSON_OBJECT_MAPPER
10 import org.springframework.stereotype.Service
11 import java.util.regex.Pattern
12 import javax.inject.Inject
13 import javax.servlet.ServletContext
14
15 @Service
16 class VersionService
17 @Inject
18 constructor(internal var servletContext: ServletContext) {
19
20     private val Logger = EELFLoggerDelegate.getLogger(VersionService::class.java)
21
22     private val versionAndFeatures: VersionAndFeatures by lazy {
23         loadVersionAndFeatures()
24     }
25
26     private fun readBuildNumber(): String {
27         val resource = servletContext.getResource("/app/vid/scripts/constants/version.json")
28         return JACKSON_OBJECT_MAPPER.readValue<Map<String, String>>(resource)["Version"]!!
29     }
30
31     //protected so can be easily tested in UT
32     protected fun readFeatureSet(): String {
33         return SystemProperties.getProperty("features.set.filename")
34     }
35
36     //protected so can be easily tested in UT
37     protected fun buildDisplayVersion(features: String, build: String): String {
38         val matcher = Pattern.compile("([^/]+?)(\\.features|$)").matcher(features)
39         val majorByFeatures = if (matcher.find()) matcher.group(1) else features
40
41         val buildByVersion = StringUtils.defaultIfBlank(substringAfterLast(build, "."), build)
42
43         return StringUtils.join(majorByFeatures, ".", buildByVersion)
44     }
45
46     fun retrieveVersionAndFeatures(): VersionAndFeatures {
47         return try {
48             versionAndFeatures
49         } catch (exception: Exception) {
50             Logger.error("Failed to read build number or feature properties settings from version file", exception)
51             VersionAndFeatures.unknown
52         }
53     }
54
55     private fun loadVersionAndFeatures(): VersionAndFeatures {
56         val featureSet = readFeatureSet();
57         val build = readBuildNumber();
58         val displayVersion = buildDisplayVersion(featureSet, build)
59         return VersionAndFeatures(featureSet, build, displayVersion)
60     }
61
62     //might throw an exception
63     fun retrieveBuildNumber(): String {
64         return versionAndFeatures.build
65     }
66 }