aboutsummaryrefslogtreecommitdiffstats
path: root/server/src/org/jsoup/select/CombiningEvaluator.java
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/org/jsoup/select/CombiningEvaluator.java')
-rw-r--r--server/src/org/jsoup/select/CombiningEvaluator.java94
1 files changed, 94 insertions, 0 deletions
diff --git a/server/src/org/jsoup/select/CombiningEvaluator.java b/server/src/org/jsoup/select/CombiningEvaluator.java
new file mode 100644
index 0000000000..a31ed2636f
--- /dev/null
+++ b/server/src/org/jsoup/select/CombiningEvaluator.java
@@ -0,0 +1,94 @@
+package org.jsoup.select;
+
+import org.jsoup.helper.StringUtil;
+import org.jsoup.nodes.Element;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Base combining (and, or) evaluator.
+ */
+abstract class CombiningEvaluator extends Evaluator {
+ final List<Evaluator> evaluators;
+
+ CombiningEvaluator() {
+ super();
+ evaluators = new ArrayList<Evaluator>();
+ }
+
+ CombiningEvaluator(Collection<Evaluator> evaluators) {
+ this();
+ this.evaluators.addAll(evaluators);
+ }
+
+ Evaluator rightMostEvaluator() {
+ return evaluators.size() > 0 ? evaluators.get(evaluators.size() - 1) : null;
+ }
+
+ void replaceRightMostEvaluator(Evaluator replacement) {
+ evaluators.set(evaluators.size() - 1, replacement);
+ }
+
+ static final class And extends CombiningEvaluator {
+ And(Collection<Evaluator> evaluators) {
+ super(evaluators);
+ }
+
+ And(Evaluator... evaluators) {
+ this(Arrays.asList(evaluators));
+ }
+
+ @Override
+ public boolean matches(Element root, Element node) {
+ for (Evaluator s : evaluators) {
+ if (!s.matches(root, node))
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return StringUtil.join(evaluators, " ");
+ }
+ }
+
+ static final class Or extends CombiningEvaluator {
+ /**
+ * Create a new Or evaluator. The initial evaluators are ANDed together and used as the first clause of the OR.
+ * @param evaluators initial OR clause (these are wrapped into an AND evaluator).
+ */
+ Or(Collection<Evaluator> evaluators) {
+ super();
+ if (evaluators.size() > 1)
+ this.evaluators.add(new And(evaluators));
+ else // 0 or 1
+ this.evaluators.addAll(evaluators);
+ }
+
+ Or() {
+ super();
+ }
+
+ public void add(Evaluator e) {
+ evaluators.add(e);
+ }
+
+ @Override
+ public boolean matches(Element root, Element node) {
+ for (Evaluator s : evaluators) {
+ if (s.matches(root, node))
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return String.format(":or%s", evaluators);
+ }
+ }
+}