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 NotExists extends DOMQueryPredicate {
97 public NotExists(final YangInstanceIdentifier relativePath) {
102 public boolean test(final NormalizedNode<?, ?> data) {
107 public static final class ValueEquals<T> extends AbstractValueDOMQueryPredicate<T> {
108 public ValueEquals(final YangInstanceIdentifier relativePath, final T value) {
109 super(relativePath, value);
113 public boolean testValue(final Object data) {
114 return value().equals(data);
118 public static final class GreaterThan<T extends Comparable<T>> extends AbstractComparableDOMQueryPredicate<T> {
119 public GreaterThan(final YangInstanceIdentifier relativePath, final T value) {
120 super(relativePath, value);
124 boolean test(final int valueToData) {
125 return valueToData <= 0;
129 public static final class GreaterThanOrEqual<T extends Comparable<T>>
130 extends AbstractComparableDOMQueryPredicate<T> {
131 public GreaterThanOrEqual(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 LessThan<T extends Comparable<T>> extends AbstractComparableDOMQueryPredicate<T> {
142 public LessThan(final YangInstanceIdentifier relativePath, final T value) {
143 super(relativePath, value);
147 boolean test(final int valueToData) {
148 return valueToData >= 0;
152 public static final class LessThanOrEqual<T extends Comparable<T>> extends AbstractComparableDOMQueryPredicate<T> {
153 public LessThanOrEqual(final YangInstanceIdentifier relativePath, final T value) {
154 super(relativePath, value);
158 boolean test(final int valueToData) {
159 return valueToData > 0;
163 public static final class StartsWith extends AbstractStringDOMQueryPredicate {
164 public StartsWith(final YangInstanceIdentifier relativePath, final String str) {
165 super(relativePath, str);
169 boolean test(final String str) {
170 return str.startsWith(value());
174 public static final class EndsWith extends AbstractStringDOMQueryPredicate {
175 public EndsWith(final YangInstanceIdentifier relativePath, final String str) {
176 super(relativePath, str);
180 boolean test(final String str) {
181 return str.endsWith(value());
185 public static final class Contains extends AbstractStringDOMQueryPredicate {
186 public Contains(final YangInstanceIdentifier relativePath, final String str) {
187 super(relativePath, str);
191 boolean test(final String str) {
192 return str.contains(value());
196 public static final class MatchesPattern extends AbstractLeafDOMQueryPredicate {
197 private final Pattern pattern;
199 public MatchesPattern(final YangInstanceIdentifier relativePath, final Pattern pattern) {
201 this.pattern = requireNonNull(pattern);
205 public boolean testValue(final Object data) {
206 return data instanceof CharSequence && pattern.matcher((CharSequence) data).matches();
210 ToStringHelper addToStringAttributes(final ToStringHelper helper) {
211 return helper.add("pattern", pattern);
215 private final @NonNull YangInstanceIdentifier relativePath;
217 DOMQueryPredicate(final YangInstanceIdentifier relativePath) {
218 this.relativePath = requireNonNull(relativePath);
221 public final @NonNull YangInstanceIdentifier getPath() {
226 public abstract boolean test(@Nullable NormalizedNode<?, ?> data);
229 public String toString() {
230 return addToStringAttributes(MoreObjects.toStringHelper(this).add("path", relativePath)).toString();
233 ToStringHelper addToStringAttributes(final ToStringHelper helper) {