Seal YangExpr hierarchy
[yangtools.git] / xpath / yang-xpath-api / src / main / java / org / opendaylight / yangtools / yang / xpath / api / YangFilterExpr.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.xpath.api;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ImmutableSet;
14 import java.util.Arrays;
15 import java.util.Collection;
16 import java.util.Objects;
17 import java.util.Set;
18 import org.eclipse.jdt.annotation.Nullable;
19
20 @Beta
21 public sealed class YangFilterExpr implements YangExpr, YangPredicateAware {
22     private static final class WithPredicates extends YangFilterExpr {
23         private static final long serialVersionUID = 1L;
24
25         private final ImmutableSet<YangExpr> predicates;
26
27         WithPredicates(final YangExpr expr, final ImmutableSet<YangExpr> predicates) {
28             super(expr);
29             this.predicates = requireNonNull(predicates);
30         }
31
32         @Override
33         public Set<YangExpr> getPredicates() {
34             return predicates;
35         }
36     }
37
38     private static final long serialVersionUID = 1L;
39
40     private final YangExpr expr;
41
42     private YangFilterExpr(final YangExpr expr) {
43         this.expr = requireNonNull(expr);
44     }
45
46     public static YangFilterExpr of(final YangExpr expr) {
47         return new YangFilterExpr(expr);
48     }
49
50     public static YangFilterExpr of(final YangExpr expr, final YangExpr... predicates) {
51         return of(expr, Arrays.asList(predicates));
52     }
53
54     public static YangFilterExpr of(final YangExpr expr, final Collection<YangExpr> predicates) {
55         return predicates.isEmpty() ? of(expr) : new WithPredicates(expr, ImmutableSet.copyOf(predicates));
56     }
57
58     public final YangExpr getExpr() {
59         return expr;
60     }
61
62     @Override
63     public final int hashCode() {
64         return Objects.hash(expr, getPredicates());
65     }
66
67     @Override
68     public final boolean equals(final @Nullable Object obj) {
69         if (this == obj) {
70             return true;
71         }
72         if (!(obj instanceof YangFilterExpr)) {
73             return false;
74         }
75         final YangFilterExpr other = (YangFilterExpr) obj;
76         return expr.equals(((YangFilterExpr) obj).expr) && getPredicates().equals(other.getPredicates());
77     }
78
79     @Override
80     public final String toString() {
81         // FIXME: this is not right
82         return "-(" + expr + ")";
83     }
84 }