/** * Returns a converter that first applies {@code other} then this converter. * * @param other The other converter. * @return A converter that first applies {@code other} then this converter. * @throws IllegalArgumentException When {@code other} is {@code null}. */ public default ElementNameConverter compose(ElementNameConverter other) { Checks.isNotNull(other, "other"); return (Parent parent, String name) -> convertElementName(parent, other.convertElementName(parent, name)); }
/** * Returns a converter that first applies this converter and then {@code other}. * * @param other The other converter. * @return A converter that first applies this converter and then {@code other}. * @throws IllegalArgumentException When {@code other} is {@code null}. */ public default ElementNameConverter andThen(ElementNameConverter other) { Checks.isNotNull(other, "other"); return (Parent parent, String name) -> other.convertElementName(parent, convertElementName(parent, name)); }
private final String convertElementName(Parent parent, String name) { return shareElementName(elementNameConverter.convertElementName(parent, name)); }
/** * Sets the name of matching elements. * <p> * Uses a Depth First traversal for recursion.<br> * Change is applied on parent before its children. * * @param parent The initial node. <em>MUST NOT</em> be null. * @param predicate The predicate of matching elements. <em>MUST NOT</em> be null. * @param converter The name converter. <em>MUST NOT</em> be null. * @param evaluator The evaluator. <em>MUST NOT</em> be null. */ public static void setNameOfMatchingElements(Parent parent, Predicate<? super Element> predicate, ElementNameConverter converter, Evaluator<? super Parent> evaluator) { if (parent instanceof Element) { final Element element = (Element) parent; if (predicate.test(element)) { element.setName(converter.convertElementName(parent, element.getName())); } } for (final Parent child : parent.getChildren(Parent.class)) { if (evaluator.evaluate(child) == Evaluation.CONTINUE) { setNameOfMatchingElements(child, predicate, converter, evaluator); } } }