pos.stepEnd++;
}
if (pos.stepEnd >= pos.path.length())
{
throw new XMPException("Missing ']' or '=' for array index", XMPError.BADXPATH);
}
if (pos.path.charAt(pos.stepEnd) == ']')
{
if (!"[last()".equals(pos.path.substring(pos.stepBegin, pos.stepEnd)))
{
throw new XMPException(
"Invalid non-numeric array index", XMPError.BADXPATH);
}
segment = new XMPPathSegment(null, XMPPath.ARRAY_LAST_STEP);
}
else
{
pos.nameStart = pos.stepBegin + 1;
pos.nameEnd = pos.stepEnd;
pos.stepEnd++; // Absorb the '=', remember the quote.
char quote = pos.path.charAt(pos.stepEnd);
if (quote != '\'' && quote != '"')
{
throw new XMPException(
"Invalid quote in array selector", XMPError.BADXPATH);
}
pos.stepEnd++; // Absorb the leading quote.
while (pos.stepEnd < pos.path.length())
{
if (pos.path.charAt(pos.stepEnd) == quote)
{
// check for escaped quote
if (pos.stepEnd + 1 >= pos.path.length()
|| pos.path.charAt(pos.stepEnd + 1) != quote)
{
break;
}
pos.stepEnd++;
}
pos.stepEnd++;
}
if (pos.stepEnd >= pos.path.length())
{
throw new XMPException("No terminating quote for array selector",
XMPError.BADXPATH);
}
pos.stepEnd++; // Absorb the trailing quote.
// ! Touch up later, also changing '@' to '?'.
segment = new XMPPathSegment(null, XMPPath.FIELD_SELECTOR_STEP);
}
}
if (pos.stepEnd >= pos.path.length() || pos.path.charAt(pos.stepEnd) != ']')
{
throw new XMPException("Missing ']' for array index", XMPError.BADXPATH);
}
pos.stepEnd++;
segment.setName(pos.path.substring(pos.stepBegin, pos.stepEnd));
return segment;