Skip to content

Commit dc35d55

Browse files
committed
fix logback-access/issues/34 by checking if dependency is a sub-model of the depender model.
This commit has the model check for submodels of any depth. Previously only direct sub-models (only one level) where looked into. Signed-off-by: ceki <ceki@qos.ch>
1 parent 8e32278 commit dc35d55

3 files changed

Lines changed: 24 additions & 18 deletions

File tree

logback-classic/src/test/java/ch/qos/logback/classic/joran/FileCollisionAnalyserTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ public void runCollisionTest(String configFile, int fileAppenderCount, int rolli
110110
Appender<ILoggingEvent> fileAppender2 = aLogger.getAppender("FILE2");
111111
assertNull(fileAppender2);
112112

113-
//statusPrinter2.print(loggerContext);
114113

115114
String expectationPattern = COLLISION_MESSAGE.replace("[", "\\[").replace("]", "\\]");
116115

logback-core/src/main/java/ch/qos/logback/core/model/processor/DefaultProcessor.java

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,6 @@ protected int secondPhaseTraverse(Model model, ModelFilter modelFilter) {
237237
try {
238238

239239
boolean allDependenciesStarted = allDependenciesStarted(model);
240-
241240
ModelHandlerBase handler = null;
242241
if (model.isUnhandled() && allDependenciesStarted) {
243242
handler = createHandler(model);
@@ -248,7 +247,7 @@ protected int secondPhaseTraverse(Model model, ModelFilter modelFilter) {
248247
}
249248
}
250249

251-
if (!allDependenciesStarted && !dependencyIsADirectSubmodel(model)) {
250+
if (!allDependenciesStarted && !dependencyIsLocatedInASubmodel(model)) {
252251
return count;
253252
}
254253

@@ -266,21 +265,31 @@ protected int secondPhaseTraverse(Model model, ModelFilter modelFilter) {
266265
return count;
267266
}
268267

269-
private boolean dependencyIsADirectSubmodel(Model model) {
270-
List<String> dependecyNames = this.mic.getDependencyNamesForModel(model);
271-
if (dependecyNames == null || dependecyNames.isEmpty()) {
268+
private boolean dependencyIsLocatedInASubmodel(Model model) {
269+
List<String> dependencyNames = this.mic.getDependencyNamesForModel(model);
270+
if (dependencyNames == null || dependencyNames.isEmpty()) {
272271
return false;
273272
}
274-
for (Model submodel : model.getSubModels()) {
275-
if (submodel instanceof NamedComponentModel) {
276-
NamedComponentModel namedComponentModel = (NamedComponentModel) submodel;
277-
String subModelName = namedComponentModel.getName();
278-
if (dependecyNames.contains(subModelName)) {
279-
return true;
280-
}
273+
274+
return recursiveIsDependencyPredicate(dependencyNames, model);
275+
}
276+
277+
private boolean recursiveIsDependencyPredicate(List<String> dependencyNames, Model model) {
278+
279+
if (model instanceof NamedComponentModel) {
280+
NamedComponentModel namedComponentModel = (NamedComponentModel) model;
281+
String modelName = namedComponentModel.getName();
282+
if (dependencyNames.contains(modelName)) {
283+
return true;
281284
}
282285
}
283286

287+
for(Model submodel : model.getSubModels()) {
288+
boolean result = recursiveIsDependencyPredicate(dependencyNames, submodel);
289+
if(result)
290+
return true;
291+
}
292+
284293
return false;
285294
}
286295

logback-core/src/main/java/ch/qos/logback/core/model/processor/FileCollisionAnalyser.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,14 @@ private void checkForCollisions(ModelInterpretationContext mic, MapKey mapKey, A
8484

8585
List<Model> matchingModels = Stream.concat(streamLevel1, streamLevel2).filter(m -> tagPredicate(m, tagName)).collect(Collectors.toList());
8686

87-
//List<Model> matchingModels = appenderModel.getSubModels().stream().filter(m -> tagPredicate(m, tagName)).collect(Collectors.toList());
88-
8987
if(!matchingModels.isEmpty()) {
9088
ImplicitModel implicitModel = (ImplicitModel) matchingModels.get(0);
9189
String bodyValue = mic.subst(implicitModel.getBodyText());
9290

9391

94-
Map<String, String> faileCollisionMap = getCollisionMapByKey(mic, mapKey);
92+
Map<String, String> collisionMap = getCollisionMapByKey(mic, mapKey);
9593

96-
Optional<Map.Entry<String, String>> collision = faileCollisionMap.entrySet()
94+
Optional<Map.Entry<String, String>> collision = collisionMap.entrySet()
9795
.stream()
9896
.filter(entry -> bodyValue.equals(entry.getValue()))
9997
.findFirst();
@@ -105,7 +103,7 @@ private void checkForCollisions(ModelInterpretationContext mic, MapKey mapKey, A
105103
} else {
106104
// add to collision map if and only if no collision detected
107105
// reasoning: single entry is as effective as multiple entries for collision detection
108-
faileCollisionMap.put(appenderName, bodyValue);
106+
collisionMap.put(appenderName, bodyValue);
109107
}
110108
}
111109
}

0 commit comments

Comments
 (0)