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 <jcode@tanagra.id.au>
pull/4718/head
jimtng 2025-05-19 03:12:24 +10:00 committed by GitHub
parent ff2cafa690
commit 825def252d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 34 additions and 20 deletions

View File

@ -285,25 +285,37 @@ public class YamlModelRepositoryImpl implements WatchService.WatchEventListener,
// remove removed elements // remove removed elements
if (modelVersion == 1) { if (modelVersion == 1) {
model.getNodesV1().keySet().stream().filter(e -> !newElementNames.contains(e)) model.getNodesV1().entrySet().removeIf(e -> {
.forEach(removedElement -> { String elementName = e.getKey();
List<JsonNode> removedNodes = model.getNodesV1().remove(removedElement); if (newElementNames.contains(elementName)) {
getElementListeners(removedElement, modelVersion).forEach(listener -> { return false;
List removedElements = parseJsonNodesV1(removedNodes, listener.getElementClass(), }
null, null);
listener.removedModel(modelName, removedElements); List<JsonNode> removedNodes = e.getValue();
}); if (removedNodes != null) {
getElementListeners(elementName, modelVersion).forEach(listener -> {
List removedElements = parseJsonNodesV1(removedNodes, listener.getElementClass(), null,
null);
listener.removedModel(modelName, removedElements);
}); });
}
return true;
});
} else { } else {
model.getNodes().keySet().stream().filter(e -> !newElementNames.contains(e)) model.getNodes().entrySet().removeIf(e -> {
.forEach(removedElement -> { String elementName = e.getKey();
JsonNode removedNode = model.getNodes().remove(removedElement); if (newElementNames.contains(elementName)) {
getElementListeners(removedElement, modelVersion).forEach(listener -> { return false;
List removedElements = parseJsonMapNode(removedNode, listener.getElementClass(), }
null, null);
listener.removedModel(modelName, removedElements); JsonNode removedNode = e.getValue();
}); getElementListeners(elementName, modelVersion).forEach(listener -> {
}); List removedElements = parseJsonMapNode(removedNode, listener.getElementClass(), null,
null);
listener.removedModel(modelName, removedElements);
});
return true;
});
} }
checkElementNames(modelName, model); checkElementNames(modelName, model);
@ -315,6 +327,7 @@ public class YamlModelRepositoryImpl implements WatchService.WatchEventListener,
} }
} }
@SuppressWarnings({ "rawtypes", "unchecked" })
private void removeModel(String modelName) { private void removeModel(String modelName) {
YamlModelWrapper removedModel = modelCache.remove(modelName); YamlModelWrapper removedModel = modelCache.remove(modelName);
if (removedModel == null) { if (removedModel == null) {
@ -349,7 +362,8 @@ public class YamlModelRepositoryImpl implements WatchService.WatchEventListener,
public void addYamlModelListener(YamlModelListener<? extends YamlElement> listener) { public void addYamlModelListener(YamlModelListener<? extends YamlElement> listener) {
Class<? extends YamlElement> elementClass = listener.getElementClass(); Class<? extends YamlElement> elementClass = listener.getElementClass();
String elementName = getElementName(elementClass); String elementName = getElementName(elementClass);
elementListeners.computeIfAbsent(elementName, k -> new CopyOnWriteArrayList<>()).add(listener); Objects.requireNonNull(elementListeners.computeIfAbsent(elementName, k -> new CopyOnWriteArrayList<>()))
.add(listener);
// iterate over all models and notify the new listener of already existing models with this type // iterate over all models and notify the new listener of already existing models with this type
modelCache.forEach((modelName, model) -> { modelCache.forEach((modelName, model) -> {
@ -424,8 +438,8 @@ public class YamlModelRepositoryImpl implements WatchService.WatchEventListener,
List<JsonNode> addedNodes = new ArrayList<>(); List<JsonNode> addedNodes = new ArrayList<>();
JsonNode mapAddedNode = null; JsonNode mapAddedNode = null;
if (model.getVersion() == 1) { if (model.getVersion() == 1) {
List<JsonNode> modelNodes = model.getNodesV1().computeIfAbsent(elementName, List<JsonNode> modelNodes = Objects
k -> new CopyOnWriteArrayList<>()); .requireNonNull(model.getNodesV1().computeIfAbsent(elementName, k -> new CopyOnWriteArrayList<>()));
JsonNode newNode = objectMapper.convertValue(element, JsonNode.class); JsonNode newNode = objectMapper.convertValue(element, JsonNode.class);
modelNodes.add(newNode); modelNodes.add(newNode);
addedNodes.add(newNode); addedNodes.add(newNode);