Skip to content

Commit 24f22bd

Browse files
committed
added conditional includes
1 parent 7635485 commit 24f22bd

File tree

5 files changed

+70
-6
lines changed

5 files changed

+70
-6
lines changed

commons-spring/src/main/scala/com/avsystem/commons/spring/HoconBeanDefinitionReader.scala

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.avsystem.commons
22
package spring
33

4-
import java.{util => ju}
5-
64
import com.avsystem.commons.spring.AttrNames._
7-
import scala.annotation.nowarn
85
import com.typesafe.config._
96
import org.springframework.beans.factory.annotation.Qualifier
107
import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder
@@ -13,6 +10,9 @@ import org.springframework.beans.factory.support._
1310
import org.springframework.beans.{MutablePropertyValues, PropertyValue}
1411
import org.springframework.core.io.Resource
1512

13+
import java.{util => ju}
14+
import scala.annotation.nowarn
15+
1616
class HoconBeanDefinitionReader(registry: BeanDefinitionRegistry)
1717
extends AbstractBeanDefinitionReader(registry) {
1818

@@ -344,8 +344,28 @@ class HoconBeanDefinitionReader(registry: BeanDefinitionRegistry)
344344
}
345345
}
346346

347+
private def readConditionals(list: ConfigList, config: ConfigObject): ConfigObject = {
348+
list.asScala.foldLeft(config)((conf, conditionalConf) => {
349+
val props = getProps(conditionalConf.asInstanceOf[ConfigObject])
350+
val condition = props.get("condition")
351+
val newConfig = props("beans").asInstanceOf[ConfigObject].get("beans")
352+
353+
if (condition.map(_.unwrapped().asInstanceOf[Boolean]).exists(identity)) {
354+
newConfig.withFallback(conf).asInstanceOf[ConfigObject]
355+
} else {
356+
conf
357+
}
358+
})
359+
}
360+
347361
def loadBeanDefinitions(config: Config): Int = {
348-
val beans = if (config.hasPath("beans")) config.getObject("beans") else ConfigFactory.empty.root
362+
var beans = if (config.hasPath("beans")) config.getObject("beans") else ConfigFactory.empty.root
363+
364+
if (config.hasPath("conditionals")) {
365+
val conditionals: ConfigList = config.getList("conditionals")
366+
beans = readConditionals(conditionals, beans)
367+
}
368+
349369
val aliases = if (config.hasPath("aliases")) config.getObject("aliases") else ConfigFactory.empty.root
350370
val result = readBeans(beans)
351371
readAliases(aliases)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
beans {
2+
beanFromConditional = {
3+
%class = com.avsystem.commons.spring.ConditionalTestBean, %construct = true
4+
int = 100
5+
}
6+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
featureFlag.enabled = false
2+
3+
beans.beanFromConditional = null
4+
5+
conditionals = [
6+
{condition: ${featureFlag.enabled}, beans: {include "conditionalInclude.conf"}},
7+
]
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
featureFlag.enabled = true
2+
3+
beans.beanFromConditional = null
4+
5+
conditionals = [
6+
{condition: ${featureFlag.enabled}, beans: {include "conditionalInclude.conf"}},
7+
]

commons-spring/src/test/scala/com/avsystem/commons/spring/HoconBeanDefinitionReaderTest.scala

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package com.avsystem.commons
22
package spring
33

4-
import java.{util => ju}
5-
64
import com.typesafe.config.{Config, ConfigFactory}
75
import org.scalatest.funsuite.AnyFunSuite
86
import org.springframework.beans.factory.support.DefaultListableBeanFactory
97
import org.springframework.context.support.GenericApplicationContext
108
import org.springframework.core.StandardReflectionParameterNameDiscoverer
119

10+
import java.{util => ju}
1211
import scala.beans.BeanProperty
1312

1413
class TestBean(val constrInt: Int = 1, val constrString: String = "constrDefault") {
@@ -25,6 +24,16 @@ object TestBean {
2524
new TestBean(theInt, theString)
2625
}
2726

27+
class ConditionalTestBean(int: Int) {
28+
29+
import ConditionalTestBean.initializedCount
30+
31+
initializedCount += 1
32+
}
33+
object ConditionalTestBean {
34+
var initializedCount = 0
35+
}
36+
2837
class HoconBeanDefinitionReaderTest extends AnyFunSuite {
2938
def createContext(resource: String): GenericApplicationContext = {
3039
val beanFactory = new DefaultListableBeanFactory
@@ -40,6 +49,21 @@ class HoconBeanDefinitionReaderTest extends AnyFunSuite {
4049
ctx
4150
}
4251

52+
test("file should be included with true condition") {
53+
ConditionalTestBean.initializedCount = 0
54+
val ctx = createContext("conditionalsEnabled.conf")
55+
val testBean = ctx.getBean("beanFromConditional", classOf[ConditionalTestBean])
56+
assert(testBean != null)
57+
assertResult(1)(ConditionalTestBean.initializedCount)
58+
}
59+
60+
test("file should not be included with false condition") {
61+
ConditionalTestBean.initializedCount = 0
62+
val ctx = createContext("conditionalsDisabled.conf")
63+
assert(!ctx.containsBean("beanFromConditional"))
64+
assertResult(0)(ConditionalTestBean.initializedCount)
65+
}
66+
4367
test("hocon bean definition reader should work") {
4468
val ctx = createContext("testBean.conf")
4569

0 commit comments

Comments
 (0)