Seal YangExpr hierarchy
[yangtools.git] / xpath / yang-xpath-api / src / main / java / org / opendaylight / yangtools / yang / xpath / api / YangFunctionCallExpr.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, s.r.o.  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.ImmutableList;
14 import java.util.Iterator;
15 import java.util.List;
16 import java.util.Objects;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.common.YangConstants;
20
21 /**
22  * Function call invocation. Function names without a prefix are mapped into {@link YangConstants#RFC6020_YIN_MODULE},
23  * as they are required to be mapped into YANG as per RFC7950 definitions.
24  *
25  * @author Robert Varga
26  */
27 @Beta
28 public sealed class YangFunctionCallExpr implements YangExpr {
29     private static final class WithArgs extends YangFunctionCallExpr {
30         private static final long serialVersionUID = 1L;
31
32         private final ImmutableList<YangExpr> arguments;
33
34         WithArgs(final QName name, final List<YangExpr> arguments) {
35             super(name);
36             this.arguments = ImmutableList.copyOf(arguments);
37         }
38
39         @Override
40         public List<YangExpr> getArguments() {
41             return arguments;
42         }
43     }
44
45     private static final long serialVersionUID = 1L;
46
47     private final QName name;
48
49     private YangFunctionCallExpr(final QName name) {
50         this.name = requireNonNull(name);
51     }
52
53     public static YangFunctionCallExpr of(final QName name) {
54         return new YangFunctionCallExpr(name);
55     }
56
57     public static YangFunctionCallExpr of(final QName name, final YangExpr argument) {
58         return new WithArgs(name, ImmutableList.of(argument));
59     }
60
61     public static YangFunctionCallExpr of(final QName name, final List<YangExpr> arguments) {
62         return arguments.isEmpty() ? of(name) : new WithArgs(name, arguments);
63     }
64
65     public final QName getName() {
66         return name;
67     }
68
69     public List<YangExpr> getArguments() {
70         return ImmutableList.of();
71     }
72
73     @Override
74     public final int hashCode() {
75         return Objects.hash(getName(), getArguments());
76     }
77
78     @Override
79     public final boolean equals(final @Nullable Object obj) {
80         if (this == obj) {
81             return true;
82         }
83         if (!(obj instanceof YangFunctionCallExpr)) {
84             return false;
85         }
86         final YangFunctionCallExpr other = (YangFunctionCallExpr) obj;
87         return getName().equals(other.getName()) && getArguments().equals(other.getArguments());
88     }
89
90     @Override
91     public final String toString() {
92         final StringBuilder sb = new StringBuilder().append(getName()).append('(');
93         final Iterator<YangExpr> it = getArguments().iterator();
94         if (it.hasNext()) {
95             sb.append(it.next());
96             while (it.hasNext()) {
97                 sb.append(", ").append(it.next());
98             }
99         }
100         return sb.append(')').toString();
101     }
102 }