2 * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.dom.api.query;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.annotations.Beta;
13 import com.google.common.base.MoreObjects;
14 import com.google.common.base.MoreObjects.ToStringHelper;
15 import java.util.function.Predicate;
16 import java.util.regex.Pattern;
17 import org.eclipse.jdt.annotation.NonNull;
18 import org.eclipse.jdt.annotation.Nullable;
19 import org.opendaylight.yangtools.concepts.Immutable;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
21 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
22 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
25 public abstract class DOMQueryPredicate implements Immutable, Predicate<NormalizedNode<?, ?>> {
26 abstract static class AbstractLeafDOMQueryPredicate extends DOMQueryPredicate {
27 AbstractLeafDOMQueryPredicate(final YangInstanceIdentifier relativePath) {
32 public final boolean test(final NormalizedNode<?, ?> data) {
33 return testValue(data instanceof LeafNode ? ((LeafNode<?>) data).getValue() : null);
36 abstract boolean testValue(Object data);
39 abstract static class AbstractValueDOMQueryPredicate<T> extends AbstractLeafDOMQueryPredicate {
40 private final @NonNull T value;
42 AbstractValueDOMQueryPredicate(final YangInstanceIdentifier relativePath, final T value) {
44 this.value = requireNonNull(value);
47 final @NonNull T value() {
52 ToStringHelper addToStringAttributes(final ToStringHelper helper) {
53 return helper.add("value", value);
57 abstract static class AbstractComparableDOMQueryPredicate<T extends Comparable<T>>
58 extends AbstractValueDOMQueryPredicate<T> {
59 AbstractComparableDOMQueryPredicate(final YangInstanceIdentifier relativePath, final T value) {
60 super(relativePath, value);
64 @SuppressWarnings("unchecked")
65 public final boolean testValue(final Object data) {
66 return data != null && test(value().compareTo((T) data));
69 abstract boolean test(int valueToData);
72 abstract static class AbstractStringDOMQueryPredicate extends AbstractValueDOMQueryPredicate<String> {
73 AbstractStringDOMQueryPredicate(final YangInstanceIdentifier relativePath, final String value) {
74 super(relativePath, value);
78 public final boolean testValue(final Object data) {
79 return data instanceof String && test((String) data);
82 abstract boolean test(@NonNull String str);
85 public static final class Exists extends DOMQueryPredicate {
86 public Exists(final YangInstanceIdentifier relativePath) {
91 public boolean test(final NormalizedNode<?, ?> data) {
96 public static final class Not extends DOMQueryPredicate {
97 private final DOMQueryPredicate predicate;
99 Not(final DOMQueryPredicate predicate) {
100 super(predicate.relativePath);
101 this.predicate = predicate;
104 public @NonNull DOMQueryPredicate predicate() {
109 public DOMQueryPredicate negate() {
114 public boolean test(final NormalizedNode<?, ?> data) {
115 return !predicate.test(data);
119 public static final class ValueEquals<T> extends AbstractValueDOMQueryPredicate<T> {
120 public ValueEquals(final YangInstanceIdentifier relativePath, final T value) {
121 super(relativePath, value);
125 public boolean testValue(final Object data) {
126 return value().equals(data);
130 public static final class GreaterThan<T extends Comparable<T>> extends AbstractComparableDOMQueryPredicate<T> {
131 public GreaterThan(final YangInstanceIdentifier relativePath, final T value) {
132 super(relativePath, value);
136 boolean test(final int valueToData) {
137 return valueToData <= 0;
141 public static final class GreaterThanOrEqual<T extends Comparable<T>>
142 extends AbstractComparableDOMQueryPredicate<T> {
143 public GreaterThanOrEqual(final YangInstanceIdentifier relativePath, final T value) {
144 super(relativePath, value);
148 boolean test(final int valueToData) {
149 return valueToData < 0;
153 public static final class LessThan<T extends Comparable<T>> extends AbstractComparableDOMQueryPredicate<T> {
154 public LessThan(final YangInstanceIdentifier relativePath, final T value) {
155 super(relativePath, value);
159 boolean test(final int valueToData) {
160 return valueToData >= 0;
164 public static final class LessThanOrEqual<T extends Comparable<T>> extends AbstractComparableDOMQueryPredicate<T> {
165 public LessThanOrEqual(final YangInstanceIdentifier relativePath, final T value) {
166 super(relativePath, value);
170 boolean test(final int valueToData) {
171 return valueToData > 0;
175 public static final class StartsWith extends AbstractStringDOMQueryPredicate {
176 public StartsWith(final YangInstanceIdentifier relativePath, final String str) {
177 super(relativePath, str);
181 boolean test(final String str) {
182 return str.startsWith(value());
186 public static final class EndsWith extends AbstractStringDOMQueryPredicate {
187 public EndsWith(final YangInstanceIdentifier relativePath, final String str) {
188 super(relativePath, str);
192 boolean test(final String str) {
193 return str.endsWith(value());
197 public static final class Contains extends AbstractStringDOMQueryPredicate {
198 public Contains(final YangInstanceIdentifier relativePath, final String str) {
199 super(relativePath, str);
203 boolean test(final String str) {
204 return str.contains(value());
208 public static final class MatchesPattern extends AbstractLeafDOMQueryPredicate {
209 private final Pattern pattern;
211 public MatchesPattern(final YangInstanceIdentifier relativePath, final Pattern pattern) {
213 this.pattern = requireNonNull(pattern);
217 public boolean testValue(final Object data) {
218 return data instanceof CharSequence && pattern.matcher((CharSequence) data).matches();
222 ToStringHelper addToStringAttributes(final ToStringHelper helper) {
223 return helper.add("pattern", pattern);
227 private final @NonNull YangInstanceIdentifier relativePath;
229 DOMQueryPredicate(final YangInstanceIdentifier relativePath) {
230 this.relativePath = requireNonNull(relativePath);
233 public final @NonNull YangInstanceIdentifier getPath() {
238 public @NonNull DOMQueryPredicate negate() {
239 return new Not(this);
243 public abstract boolean test(@Nullable NormalizedNode<?, ?> data);
246 public String toString() {
247 return addToStringAttributes(MoreObjects.toStringHelper(this).add("path", relativePath)).toString();
250 ToStringHelper addToStringAttributes(final ToStringHelper helper) {