return new ArrayList<Node>();
}
pathQuery = pathQuery.trim();
if(! reQueryFormat.matcher(pathQuery).matches()) {
throw new XmlModelException("Invalid pathQuery path: " + pathQuery);
}
//
// build parser
//
List<PathQueryMatcher> queryMatchers = new ArrayList<PathQueryMatcher>();
// extract path query components
Matcher parts = reQueryParts.matcher(pathQuery);
int level = 0;
while(parts.find()) {
Matcher m;
String part = parts.group(1);
if(part.matches(reQueryAnyNode.pattern())) {
// nodename and attribute name match
queryMatchers.add(new AnyNodeMatcher());
} else if(part.matches(reQueryNodename.pattern())) {
// nodename match
queryMatchers.add(new NodenameMatcher(level, part));
} else if(part.matches(reQueryAttrNameValue.pattern())) {
// attribute name value match
m = reQueryAttrNameValue.matcher(part);
if(!m.find()) {
throw new XmlModelException("Internal parser error for: " + pathQuery);
}
queryMatchers.add(new AttributeNameValueMatcher(level, m.group(1), m.group(2)));
} else if(part.matches(reQueryAttrName.pattern())) {
// attribute name match
m = reQueryAttrName.matcher(part);
if(!m.find()) {
throw new XmlModelException("Internal parser error for: " + pathQuery);
}
queryMatchers.add(new AttributeNameMatcher(level, m.group(1)));
} else if(part.matches(reQueryNodenameAttrNameValue.pattern())) {
// nodename, attribute name and value match
m = reQueryNodenameAttrNameValue.matcher(part);
if(!m.find()) {
throw new XmlModelException("Internal parser error for: " + pathQuery);
}
queryMatchers.add(new ElementAttributeValueMatcher(level, m.group(1), m.group(2), m.group(3)));
} else if(part.matches(reQueryNodenameAttrName.pattern())) {
// nodename and attribute name match
m = reQueryNodenameAttrName.matcher(part);
if(!m.find()) {
throw new XmlModelException("Internal parser error for: " + pathQuery);
}
queryMatchers.add(new ElementAttributeMatcher(level, m.group(1), m.group(2)));
} else {
// no match
throw new XmlModelException("Invalid pathQuery: " + pathQuery);
}
level += 1;
}
//