public PathFilter parseFilter(AsciiBuffer path) { ArrayList<Part> parts = new ArrayList<Part>(parsePath(path).parts); Collections.reverse(parts); PartFilter last = null; for (Part p : parts) { if (p.isLiteral()) { last = new LitteralPathFilter(last, (LiteralPart) p); } else if (p == ANY_CHILD) { last = new AnyChildPathFilter(last); } else if (p == ANY_DESCENDANT) { last = new AnyDecendentPathFilter(last); } } final PartFilter filter = last; return new PathFilter() { public boolean matches(Path path) { return filter.matches(new LinkedList(path.parts)); } }; }