package eu.dnetlib.iis.wf.ingest.pmc.metadata;
import java.util.Stack;
/**
* Utils class with helper methods to look through xml parents tag stack
*
* @author mhorst
* @author madryk
*
*/
public final class TagHierarchyUtils {
//------------------------ CONSTRUCTOS --------------------------
private TagHierarchyUtils() { }
//------------------------ LOGIC --------------------------
/**
* Returns true only if current element is same as expectedElement
*/
public static boolean isElement(String qName, String expectedElement) {
return qName.equals(expectedElement);
}
/**
* Returns true only if current element is same as expectedElement
* and have direct parent defined in expectedParent
*/
public static boolean isWithinElement(String qName,
String expectedElement, Stack<String> parentStack, String expectedParent) {
return qName.equals(expectedElement) &&
(expectedParent==null || !parentStack.isEmpty() && expectedParent.equals(parentStack.peek()));
}
/**
* Returns true if current element is same as expectedElement
* and have among parents all of expectedParents (internally uses {@link #hasAmongParents(Stack, String...)}).
*/
public static boolean hasAmongParents(String qName,
String expectedElement, Stack<String> parentStack, String... expectedParents) {
if (qName.equals(expectedElement)) {
return hasAmongParents(parentStack, expectedParents);
} else {
return false;
}
}
/**
* Returns true if all of expectedParents are found in parentStack.
* Order of expectedParents is relevant. Method will return true
* only if they appear in parentStack in the same order (looking from the top)
* as in expectedParents, but there could be gaps between them.
*
*/
public static boolean hasAmongParents(Stack<String> parentStack, String... expectedParents) {
if (expectedParents.length <= parentStack.size()) {
int startIterationIdx = 0;
for (String currentParent : expectedParents) {
boolean found = false;
for (int i=startIterationIdx; i<parentStack.size(); i++) {
// iteration starts from the bottom while we want to check from top
if (currentParent.equals(parentStack.get(parentStack.size()-(i+1)))) {
startIterationIdx = i+1;
found = true;
break;
}
}
if (!found) {
return false;
}
}
return true;
}
return false;
}
}