diff --git a/logback-core-blackbox/src/test/blackboxInput/joran/conditional/conditionInsideIf.xml b/logback-core-blackbox/src/test/blackboxInput/joran/conditional/conditionInsideIf.xml new file mode 100644 index 0000000000..419cb2b37f --- /dev/null +++ b/logback-core-blackbox/src/test/blackboxInput/joran/conditional/conditionInsideIf.xml @@ -0,0 +1,14 @@ + + + + + + + propertyEquals("ki1", "val1") + + + + + + + diff --git a/logback-core-blackbox/src/test/java/ch/qos/logback/core/blackbox/joran/conditional/IfThenElseTest.java b/logback-core-blackbox/src/test/java/ch/qos/logback/core/blackbox/joran/conditional/IfThenElseTest.java index b5f3093f28..5c3fcbb3a0 100644 --- a/logback-core-blackbox/src/test/java/ch/qos/logback/core/blackbox/joran/conditional/IfThenElseTest.java +++ b/logback-core-blackbox/src/test/java/ch/qos/logback/core/blackbox/joran/conditional/IfThenElseTest.java @@ -189,6 +189,15 @@ public void whenNoPropertyIsDefined_ElseBranchIsEvaluated_NoJoran() throws Joran simpleConfigurator.doConfigure(CONDITIONAL_DIR_PREFIX + "if0_NoJoran.xml"); verifyConfig(new String[] { "BEGIN", "b", "END" }); } + + @Test + public void conditionNestedWithinIfProducesWarning() throws JoranException { + simpleConfigurator.doConfigure(CONDITIONAL_DIR_PREFIX + "conditionInsideIf.xml"); + assertTrue(checker.containsMatch(Status.WARN, + "The element must be placed before the element, not inside it.")); + verifyConfig(new String[] { "BEGIN", "END" }); + } + // ---------------------------------------------------------------------------------------------------- @Test diff --git a/logback-core/src/main/java/ch/qos/logback/core/model/processor/conditional/IfModelHandler.java b/logback-core/src/main/java/ch/qos/logback/core/model/processor/conditional/IfModelHandler.java index fd050aea25..c42a625ced 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/model/processor/conditional/IfModelHandler.java +++ b/logback-core/src/main/java/ch/qos/logback/core/model/processor/conditional/IfModelHandler.java @@ -19,6 +19,7 @@ import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.joran.conditional.Condition; import ch.qos.logback.core.model.Model; +import ch.qos.logback.core.model.conditional.ByPropertiesConditionModel; import ch.qos.logback.core.model.conditional.IfModel; import ch.qos.logback.core.model.conditional.IfModel.BranchState; import ch.qos.logback.core.model.processor.ModelHandlerBase; @@ -63,6 +64,10 @@ protected Class getSupportedModelClass() { public void handle(ModelInterpretationContext mic, Model model) throws ModelHandlerException { ifModel = (IfModel) model; + if (ifModel.getSubModels().stream().anyMatch(ByPropertiesConditionModel.class::isInstance)) { + addWarn("The element must be placed before the element, not inside it."); + } + mic.pushModel(ifModel); Object micTopObject = mic.peekObject(); String conditionStr = ifModel.getCondition();