Skip to content

Commit 825def2

Browse files
authored
Refactor to avoid possible null pointer dereference in YamlModelRepositoryImpl (#4788)
* Refactor to avoid possible null pointer dereference in YamlModelRepositoryImpl * add null check Signed-off-by: Jimmy Tanagra <[email protected]>
1 parent ff2cafa commit 825def2

File tree

1 file changed

+34
-20
lines changed

1 file changed

+34
-20
lines changed

bundles/org.openhab.core.model.yaml/src/main/java/org/openhab/core/model/yaml/internal/YamlModelRepositoryImpl.java

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -285,25 +285,37 @@ public synchronized void processWatchEvent(Kind kind, Path fullPath) {
285285

286286
// remove removed elements
287287
if (modelVersion == 1) {
288-
model.getNodesV1().keySet().stream().filter(e -> !newElementNames.contains(e))
289-
.forEach(removedElement -> {
290-
List<JsonNode> removedNodes = model.getNodesV1().remove(removedElement);
291-
getElementListeners(removedElement, modelVersion).forEach(listener -> {
292-
List removedElements = parseJsonNodesV1(removedNodes, listener.getElementClass(),
293-
null, null);
294-
listener.removedModel(modelName, removedElements);
295-
});
288+
model.getNodesV1().entrySet().removeIf(e -> {
289+
String elementName = e.getKey();
290+
if (newElementNames.contains(elementName)) {
291+
return false;
292+
}
293+
294+
List<JsonNode> removedNodes = e.getValue();
295+
if (removedNodes != null) {
296+
getElementListeners(elementName, modelVersion).forEach(listener -> {
297+
List removedElements = parseJsonNodesV1(removedNodes, listener.getElementClass(), null,
298+
null);
299+
listener.removedModel(modelName, removedElements);
296300
});
301+
}
302+
return true;
303+
});
297304
} else {
298-
model.getNodes().keySet().stream().filter(e -> !newElementNames.contains(e))
299-
.forEach(removedElement -> {
300-
JsonNode removedNode = model.getNodes().remove(removedElement);
301-
getElementListeners(removedElement, modelVersion).forEach(listener -> {
302-
List removedElements = parseJsonMapNode(removedNode, listener.getElementClass(),
303-
null, null);
304-
listener.removedModel(modelName, removedElements);
305-
});
306-
});
305+
model.getNodes().entrySet().removeIf(e -> {
306+
String elementName = e.getKey();
307+
if (newElementNames.contains(elementName)) {
308+
return false;
309+
}
310+
311+
JsonNode removedNode = e.getValue();
312+
getElementListeners(elementName, modelVersion).forEach(listener -> {
313+
List removedElements = parseJsonMapNode(removedNode, listener.getElementClass(), null,
314+
null);
315+
listener.removedModel(modelName, removedElements);
316+
});
317+
return true;
318+
});
307319
}
308320

309321
checkElementNames(modelName, model);
@@ -315,6 +327,7 @@ public synchronized void processWatchEvent(Kind kind, Path fullPath) {
315327
}
316328
}
317329

330+
@SuppressWarnings({ "rawtypes", "unchecked" })
318331
private void removeModel(String modelName) {
319332
YamlModelWrapper removedModel = modelCache.remove(modelName);
320333
if (removedModel == null) {
@@ -349,7 +362,8 @@ private void removeModel(String modelName) {
349362
public void addYamlModelListener(YamlModelListener<? extends YamlElement> listener) {
350363
Class<? extends YamlElement> elementClass = listener.getElementClass();
351364
String elementName = getElementName(elementClass);
352-
elementListeners.computeIfAbsent(elementName, k -> new CopyOnWriteArrayList<>()).add(listener);
365+
Objects.requireNonNull(elementListeners.computeIfAbsent(elementName, k -> new CopyOnWriteArrayList<>()))
366+
.add(listener);
353367

354368
// iterate over all models and notify the new listener of already existing models with this type
355369
modelCache.forEach((modelName, model) -> {
@@ -424,8 +438,8 @@ public void addElementToModel(String modelName, YamlElement element) {
424438
List<JsonNode> addedNodes = new ArrayList<>();
425439
JsonNode mapAddedNode = null;
426440
if (model.getVersion() == 1) {
427-
List<JsonNode> modelNodes = model.getNodesV1().computeIfAbsent(elementName,
428-
k -> new CopyOnWriteArrayList<>());
441+
List<JsonNode> modelNodes = Objects
442+
.requireNonNull(model.getNodesV1().computeIfAbsent(elementName, k -> new CopyOnWriteArrayList<>()));
429443
JsonNode newNode = objectMapper.convertValue(element, JsonNode.class);
430444
modelNodes.add(newNode);
431445
addedNodes.add(newNode);

0 commit comments

Comments
 (0)