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
parent
ff2cafa690
commit
825def252d
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue