Add yang-xpath-api
[yangtools.git] / yang / 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 abstract class YangFunctionCallExpr implements YangExpr {
29     static class NoArgs extends YangFunctionCallExpr {
30         private static final long serialVersionUID = 1L;
31
32         private final QName name;
33
34         NoArgs(final QName name) {
35             this.name = requireNonNull(name);
36         }
37
38         @Override
39         public QName getName() {
40             return name;
41         }
42     }
43
44     private static final class WithArgs extends NoArgs {
45         private static final long serialVersionUID = 1L;
46
47         private final List<YangExpr> arguments;
48
49         WithArgs(final QName name, final List<YangExpr> arguments) {
50             super(name);
51             this.arguments = ImmutableList.copyOf(arguments);
52         }
53
54         @Override
55         public List<YangExpr> getArguments() {
56             return arguments;
57         }
58     }
59
60     private static final long serialVersionUID = 1L;
61
62     YangFunctionCallExpr() {
63         // Hidden
64     }
65
66     public static YangFunctionCallExpr of(final QName name) {
67         return new NoArgs(name);
68     }
69
70     public static YangFunctionCallExpr of(final QName name, final List<YangExpr> arguments) {
71         return arguments.isEmpty() ? of(name) : new WithArgs(name, arguments);
72     }
73
74     public abstract QName getName();
75
76     public List<YangExpr> getArguments() {
77         return ImmutableList.of();
78     }
79
80     @Override
81     public final int hashCode() {
82         return Objects.hash(getName(), getArguments());
83     }
84
85     @Override
86     public final boolean equals(final @Nullable Object obj) {
87         if (this == obj) {
88             return true;
89         }
90         if (!(obj instanceof YangFunctionCallExpr)) {
91             return false;
92         }
93         final YangFunctionCallExpr other = (YangFunctionCallExpr) obj;
94         return getName().equals(other.getName()) && getArguments().equals(other.getArguments());
95     }
96
97     @Override
98     public final String toString() {
99         final StringBuilder sb = new StringBuilder().append(getName()).append('(');
100         final Iterator<YangExpr> it = getArguments().iterator();
101         if (it.hasNext()) {
102             sb.append(it.next());
103             while (it.hasNext()) {
104                 sb.append(", ").append(it.next());
105             }
106         }
107         return sb.append(')').toString();
108     }
109 }