/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.tool.config;
import java.util.ArrayList;
/**
* Utility methods for processing trees of ValidationNodes
*/
public class ValidationTreeUtils {
public static boolean containsErrors(ValidationNode validationNode) {
if (validationNode.isError()) {
return true;
}
for (ValidationNode child : validationNode.getSubNodes()) {
if (containsErrors(child)) {
return true;
}
}
return false;
}
public static boolean containsWarnings(ValidationNode validationNode) {
if (validationNode.getWarnings().size() > 0) {
return true;
}
for (ValidationNode child : validationNode.getSubNodes()) {
if (containsWarnings(child)) {
return true;
}
}
return false;
}
public static boolean containsErrorsOrWarnings(ValidationNode validationNode) {
if (validationNode.isError() || validationNode.getWarnings().size() > 0) {
return true;
}
for (ValidationNode child : validationNode.getSubNodes()) {
if (containsErrorsOrWarnings(child)) {
return true;
}
}
return false;
}
/**
* Modify a tree so all nodes in a path containing an error have their error flag set. Used to display only paths with errors present.
* @param validationNode the root of the tree, not null
* @return true, if the tree contains any errors
*/
public static boolean propagateErrorsUp(ValidationNode validationNode) {
boolean containsErrors = false;
for (ValidationNode child : validationNode.getSubNodes()) {
containsErrors |= propagateErrorsUp(child);
}
validationNode.setError(containsErrors | validationNode.isError());
return validationNode.isError();
}
/**
* Modify a tree so all nodes in a path containing an error or warning have their error flag set. Used to display only paths with errors present.
* @param validationNode the root of the tree, not null
* @return true, if the tree contains any errors or warnings
*/
public static boolean propagateErrorsAndWarningsUp(ValidationNode validationNode) {
boolean containsErrors = false;
for (ValidationNode child : validationNode.getSubNodes()) {
containsErrors |= propagateErrorsUp(child);
}
validationNode.setError(containsErrors | validationNode.isError() | validationNode.getWarnings().size() > 0);
return validationNode.isError();
}
/**
* Modify a tree to remove all nodes not having an error flag set. Used to display only paths with errors present.
* @param validationNode the root of the tree, not null
* @return tree root, if the tree contains any errors or warnings, null otherwise
*/
public static ValidationNode discardNonErrors(ValidationNode validationNode) {
if (!validationNode.isError()) {
return null;
}
for (ValidationNode child : new ArrayList<>(validationNode.getSubNodes())) {
if (child.isError()) {
discardNonErrors(child);
} else {
validationNode.getSubNodes().remove(child);
}
}
return validationNode;
}
}