Gaurav Agrawal
Committed by Gerrit Code Review

[ONOS-3898/4069] Yang Utils Extension to support RPC/Notification/Choice/Case/Union

Change-Id: I405852caff3464719e8e586fa8e9ae9b6ed043ff
Showing 27 changed files with 2275 additions and 6 deletions
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.datamodel;
18 +
19 +import java.util.LinkedList;
20 +import java.util.List;
21 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
22 +import org.onosproject.yangutils.parser.Parsable;
23 +import org.onosproject.yangutils.utils.YangConstructType;
24 +
25 +import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
26 +
27 +/*
28 + * Reference RFC 6020.
29 + *
30 + * The "input" statement, which is optional, is used to define input
31 + * parameters to the RPC operation. It does not take an argument. The
32 + * substatements to "input" define nodes under the RPC's input node.
33 + *
34 + * If a leaf in the input tree has a "mandatory" statement with the
35 + * value "true", the leaf MUST be present in a NETCONF RPC invocation.
36 + * Otherwise, the server MUST return a "missing-element" error.
37 + *
38 + * If a leaf in the input tree has a default value, the NETCONF server
39 + * MUST use this value in the same cases as described in Section 7.6.1.
40 + * In these cases, the server MUST operationally behave as if the leaf
41 + * was present in the NETCONF RPC invocation with the default value as
42 + * its value.
43 + *
44 + * If a "config" statement is present for any node in the input tree,
45 + * the "config" statement is ignored.
46 + *
47 + * If any node has a "when" statement that would evaluate to false, then
48 + * this node MUST NOT be present in the input tree.
49 + *
50 + * The input substatements
51 + *
52 + * +--------------+---------+-------------+------------------+
53 + * | substatement | section | cardinality |data model mapping|
54 + * +--------------+---------+-------------+------------------+
55 + * | anyxml | 7.10 | 0..n | -not supported |
56 + * | choice | 7.9 | 0..n | -child nodes |
57 + * | container | 7.5 | 0..n | -child nodes |
58 + * | grouping | 7.11 | 0..n | -child nodes |
59 + * | leaf | 7.6 | 0..n | -YangLeaf |
60 + * | leaf-list | 7.7 | 0..n | -YangLeafList |
61 + * | list | 7.8 | 0..n | -child nodes |
62 + * | typedef | 7.3 | 0..n | -child nodes |
63 + * | uses | 7.12 | 0..n | -child nodes |
64 + * +--------------+---------+-------------+------------------+
65 + */
66 +
67 +/**
68 + * Data model node to maintain information defined in YANG input.
69 + */
70 +public class YangInput extends YangNode implements YangLeavesHolder, Parsable, CollisionDetector {
71 +
72 + /**
73 + * Name of the input.
74 + */
75 + private String name;
76 +
77 + /**
78 + * List of leaves contained.
79 + */
80 + private List<YangLeaf> listOfLeaf;
81 +
82 + /**
83 + * List of leaf-lists contained.
84 + */
85 + private List<YangLeafList> listOfLeafList;
86 +
87 + /**
88 + * Create a rpc input node.
89 + */
90 + public YangInput() {
91 + super(YangNodeType.INPUT_NODE);
92 + listOfLeaf = new LinkedList<YangLeaf>();
93 + listOfLeafList = new LinkedList<YangLeafList>();
94 + }
95 +
96 + @Override
97 + public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException {
98 + // Detect colliding child.
99 + detectCollidingChildUtil(identifierName, dataType, this);
100 + }
101 +
102 + @Override
103 + public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException {
104 + if (this.getName().equals(identifierName)) {
105 + throw new DataModelException("YANG file error: Duplicate input identifier detected, same as input \""
106 + + this.getName() + "\"");
107 + }
108 + }
109 +
110 + @Override
111 + public YangConstructType getYangConstructType() {
112 + return YangConstructType.INPUT_DATA;
113 + }
114 +
115 + @Override
116 + public void validateDataOnEntry() throws DataModelException {
117 + //TODO: implement the method.
118 + }
119 +
120 + @Override
121 + public void validateDataOnExit() throws DataModelException {
122 + //TODO: implement the method.
123 + }
124 +
125 + @Override
126 + public List<YangLeaf> getListOfLeaf() {
127 + return listOfLeaf;
128 + }
129 +
130 + @Override
131 + public void addLeaf(YangLeaf leaf) {
132 + getListOfLeaf().add(leaf);
133 + }
134 +
135 + @Override
136 + public List<YangLeafList> getListOfLeafList() {
137 + return listOfLeafList;
138 + }
139 +
140 + @Override
141 + public void addLeafList(YangLeafList leafList) {
142 + getListOfLeafList().add(leafList);
143 + }
144 +
145 + @Override
146 + public String getName() {
147 + return name;
148 + }
149 +
150 + @Override
151 + public void setName(String name) {
152 + this.name = name;
153 + }
154 +}
...@@ -75,6 +75,26 @@ public enum YangNodeType { ...@@ -75,6 +75,26 @@ public enum YangNodeType {
75 CONTAINER_NODE, 75 CONTAINER_NODE,
76 76
77 /** 77 /**
78 + * Node contains "YANG's notification" information.
79 + */
80 + NOTIFICATION_NODE,
81 +
82 + /**
83 + * Node contains "YANG's input" information.
84 + */
85 + INPUT_NODE,
86 +
87 + /**
88 + * Node contains "YANG's output" information.
89 + */
90 + OUTPUT_NODE,
91 +
92 + /**
93 + * Node contains "YANG's rpc" information.
94 + */
95 + RPC_NODE,
96 +
97 + /**
78 * Node contains "YANG's list" information. 98 * Node contains "YANG's list" information.
79 */ 99 */
80 LIST_NODE 100 LIST_NODE
......
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.datamodel;
18 +
19 +import java.util.LinkedList;
20 +import java.util.List;
21 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
22 +import org.onosproject.yangutils.parser.Parsable;
23 +import org.onosproject.yangutils.utils.YangConstructType;
24 +
25 +import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
26 +
27 +/*
28 + * Reference RFC 6020.
29 + *
30 + * YANG allows the definition of notifications suitable for NETCONF.
31 + * YANG data definition statements are used to model the content of the
32 + * notification.
33 + *
34 + * The "notification" statement is used to define a NETCONF
35 + * notification. It takes one argument, which is an identifier,
36 + * followed by a block of substatements that holds detailed notification
37 + * information. The "notification" statement defines a notification
38 + * node in the schema tree.
39 + *
40 + * If a leaf in the notification tree has a "mandatory" statement with
41 + * the value "true", the leaf MUST be present in a NETCONF notification.
42 + *
43 + * If a leaf in the notification tree has a default value, the NETCONF
44 + * client MUST use this value in the same cases as described in
45 + * Section 7.6.1. In these cases, the client MUST operationally behave
46 + * as if the leaf was present in the NETCONF notification with the
47 + * default value as its value.
48 + *
49 + * If a "config" statement is present for any node in the notification
50 + * tree, the "config" statement is ignored.
51 + *
52 + * The notification's substatements
53 + *
54 + * +--------------+---------+-------------+------------------+
55 + * | substatement | section | cardinality |data model mapping|
56 + * +--------------+---------+-------------+------------------+
57 + * | anyxml | 7.10 | 0..n | -not supported |
58 + * | choice | 7.9 | 0..n | -child nodes |
59 + * | container | 7.5 | 0..n | -child nodes |
60 + * | description | 7.19.3 | 0..1 | -string |
61 + * | grouping | 7.11 | 0..n | -child nodes |
62 + * | if-feature | 7.18.2 | 0..n | -TODO |
63 + * | leaf | 7.6 | 0..n | -YangLeaf |
64 + * | leaf-list | 7.7 | 0..n | -YangLeafList |
65 + * | list | 7.8 | 0..n | -child nodes |
66 + * | reference | 7.19.4 | 0..1 | -string |
67 + * | status | 7.19.2 | 0..1 | -YangStatus |
68 + * | typedef | 7.3 | 0..n | -child nodes |
69 + * | uses | 7.12 | 0..n | -child nodes |
70 + * +--------------+---------+-------------+------------------+
71 + */
72 +
73 +/**
74 + * Data model node to maintain information defined in YANG notification.
75 + */
76 +public class YangNotification extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable,
77 + CollisionDetector {
78 +
79 + /**
80 + * Name of the notification.
81 + */
82 + private String name;
83 +
84 + /**
85 + * Description of notification.
86 + */
87 + private String description;
88 +
89 + /**
90 + * List of leaves contained.
91 + */
92 + private List<YangLeaf> listOfLeaf;
93 +
94 + /**
95 + * List of leaf-lists contained.
96 + */
97 + private List<YangLeafList> listOfLeafList;
98 +
99 + /**
100 + * Reference of the module.
101 + */
102 + private String reference;
103 +
104 + /**
105 + * Status of the node.
106 + */
107 + private YangStatusType status = YangStatusType.CURRENT;
108 +
109 + /**
110 + * Create a notification node.
111 + */
112 + public YangNotification() {
113 + super(YangNodeType.NOTIFICATION_NODE);
114 + listOfLeaf = new LinkedList<YangLeaf>();
115 + listOfLeafList = new LinkedList<YangLeafList>();
116 + }
117 +
118 + @Override
119 + public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException {
120 + // Detect colliding child.
121 + detectCollidingChildUtil(identifierName, dataType, this);
122 + }
123 +
124 + @Override
125 + public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException {
126 + if (this.getName().equals(identifierName)) {
127 + throw new DataModelException("YANG file error: Duplicate input identifier detected, same as notification \""
128 + + this.getName() + "\"");
129 + }
130 + }
131 +
132 + @Override
133 + public YangConstructType getYangConstructType() {
134 + return YangConstructType.NOTIFICATION_DATA;
135 + }
136 +
137 + @Override
138 + public void validateDataOnEntry() throws DataModelException {
139 + //TODO: implement the method.
140 + }
141 +
142 + @Override
143 + public void validateDataOnExit() throws DataModelException {
144 + //TODO: implement the method.
145 + }
146 +
147 + @Override
148 + public String getDescription() {
149 + return description;
150 + }
151 +
152 + @Override
153 + public void setDescription(String description) {
154 + this.description = description;
155 + }
156 +
157 + @Override
158 + public List<YangLeaf> getListOfLeaf() {
159 + return listOfLeaf;
160 + }
161 +
162 + @Override
163 + public void addLeaf(YangLeaf leaf) {
164 + getListOfLeaf().add(leaf);
165 + }
166 +
167 + @Override
168 + public List<YangLeafList> getListOfLeafList() {
169 + return listOfLeafList;
170 + }
171 +
172 + @Override
173 + public void addLeafList(YangLeafList leafList) {
174 + getListOfLeafList().add(leafList);
175 + }
176 +
177 + @Override
178 + public String getName() {
179 + return name;
180 + }
181 +
182 + @Override
183 + public void setName(String name) {
184 + this.name = name;
185 + }
186 +
187 + @Override
188 + public String getReference() {
189 + return reference;
190 + }
191 +
192 + @Override
193 + public void setReference(String reference) {
194 + this.reference = reference;
195 + }
196 +
197 + @Override
198 + public YangStatusType getStatus() {
199 + return status;
200 + }
201 +
202 + @Override
203 + public void setStatus(YangStatusType status) {
204 + this.status = status;
205 + }
206 +}
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.datamodel;
18 +
19 +import java.util.LinkedList;
20 +import java.util.List;
21 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
22 +import org.onosproject.yangutils.parser.Parsable;
23 +import org.onosproject.yangutils.utils.YangConstructType;
24 +
25 +import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
26 +
27 +/*
28 + * Reference RFC 6020.
29 + *
30 + * The "output" statement, which is optional, is used to define output
31 + * parameters to the RPC operation. It does not take an argument. The
32 + * substatements to "output" define nodes under the RPC's output node.
33 + *
34 + * If a leaf in the output tree has a "mandatory" statement with the
35 + * value "true", the leaf MUST be present in a NETCONF RPC reply.
36 + *
37 + * If a leaf in the output tree has a default value, the NETCONF client
38 + * MUST use this value in the same cases as described in Section 7.6.1.
39 + * In these cases, the client MUST operationally behave as if the leaf
40 + * was present in the NETCONF RPC reply with the default value as its
41 + * value.
42 + *
43 + * If a "config" statement is present for any node in the output tree,
44 + * the "config" statement is ignored.
45 + *
46 + * If any node has a "when" statement that would evaluate to false, then
47 + * this node MUST NOT be present in the output tree.
48 + *
49 + * The output substatements
50 + *
51 + * +--------------+---------+-------------+------------------+
52 + * | substatement | section | cardinality |data model mapping|
53 + * +--------------+---------+-------------+------------------+
54 + * | anyxml | 7.10 | 0..n | -not supported |
55 + * | choice | 7.9 | 0..n | -child nodes |
56 + * | container | 7.5 | 0..n | -child nodes |
57 + * | grouping | 7.11 | 0..n | -child nodes |
58 + * | leaf | 7.6 | 0..n | -YangLeaf |
59 + * | leaf-list | 7.7 | 0..n | -YangLeafList |
60 + * | list | 7.8 | 0..n | -child nodes |
61 + * | typedef | 7.3 | 0..n | -child nodes |
62 + * | uses | 7.12 | 0..n | -child nodes |
63 + * +--------------+---------+-------------+------------------+
64 + */
65 +
66 +/**
67 + * Data model node to maintain information defined in YANG output.
68 + */
69 +public class YangOutput extends YangNode implements YangLeavesHolder, Parsable, CollisionDetector {
70 +
71 + /**
72 + * Name of the output.
73 + */
74 + private String name;
75 +
76 + /**
77 + * List of leaves contained.
78 + */
79 + private List<YangLeaf> listOfLeaf;
80 +
81 + /**
82 + * List of leaf-lists contained.
83 + */
84 + private List<YangLeafList> listOfLeafList;
85 +
86 + /**
87 + * Create a rpc output node.
88 + */
89 + public YangOutput() {
90 + super(YangNodeType.OUTPUT_NODE);
91 + listOfLeaf = new LinkedList<YangLeaf>();
92 + listOfLeafList = new LinkedList<YangLeafList>();
93 + }
94 +
95 + @Override
96 + public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException {
97 + // Detect colliding child.
98 + detectCollidingChildUtil(identifierName, dataType, this);
99 + }
100 +
101 + @Override
102 + public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException {
103 + if (this.getName().equals(identifierName)) {
104 + throw new DataModelException("YANG file error: Duplicate identifier detected, same as output \""
105 + + this.getName() + "\"");
106 + }
107 + }
108 +
109 + @Override
110 + public YangConstructType getYangConstructType() {
111 + return YangConstructType.OUTPUT_DATA;
112 + }
113 +
114 + @Override
115 + public void validateDataOnEntry() throws DataModelException {
116 + //TODO: implement the method.
117 + }
118 +
119 + @Override
120 + public void validateDataOnExit() throws DataModelException {
121 + //TODO: implement the method.
122 + }
123 +
124 + @Override
125 + public List<YangLeaf> getListOfLeaf() {
126 + return listOfLeaf;
127 + }
128 +
129 + @Override
130 + public void addLeaf(YangLeaf leaf) {
131 + getListOfLeaf().add(leaf);
132 + }
133 +
134 + @Override
135 + public List<YangLeafList> getListOfLeafList() {
136 + return listOfLeafList;
137 + }
138 +
139 + @Override
140 + public void addLeafList(YangLeafList leafList) {
141 + getListOfLeafList().add(leafList);
142 + }
143 +
144 + @Override
145 + public String getName() {
146 + return name;
147 + }
148 +
149 + @Override
150 + public void setName(String name) {
151 + this.name = name;
152 + }
153 +}
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.datamodel;
18 +
19 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
20 +import org.onosproject.yangutils.parser.Parsable;
21 +import org.onosproject.yangutils.utils.YangConstructType;
22 +
23 +import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
24 +
25 +/*
26 + * Reference RFC 6020.
27 + *
28 + * The "rpc" statement is used to define a NETCONF RPC operation. It
29 + * takes one argument, which is an identifier, followed by a block of
30 + * substatements that holds detailed rpc information. This argument is
31 + * the name of the RPC, and is used as the element name directly under
32 + * the <rpc> element, as designated by the substitution group
33 + * "rpcOperation" in [RFC4741].
34 + *
35 + * The "rpc" statement defines an rpc node in the schema tree. Under
36 + * the rpc node, a schema node with the name "input", and a schema node
37 + * with the name "output" are also defined. The nodes "input" and
38 + * "output" are defined in the module's namespace.
39 + *
40 + * The rpc substatements
41 + *
42 + * +--------------+---------+-------------+------------------+
43 + * | substatement | section | cardinality |data model mapping|
44 + * +--------------+---------+-------------+------------------+
45 + * | description | 7.19.3 | 0..1 | -string |
46 + * | grouping | 7.11 | 0..n | -child nodes |
47 + * | if-feature | 7.18.2 | 0..n | -TODO |
48 + * | input | 7.13.2 | 0..1 | -child nodes |
49 + * | output | 7.13.3 | 0..1 | -child nodes |
50 + * | reference | 7.19.4 | 0..1 | -string |
51 + * | status | 7.19.2 | 0..1 | -YangStatus |
52 + * | typedef | 7.3 | 0..n | -child nodes |
53 + * +--------------+---------+-------------+------------------+
54 + */
55 +
56 +/**
57 + * Data model node to maintain information defined in YANG rpc.
58 + */
59 +public class YangRpc extends YangNode implements YangCommonInfo, Parsable,
60 + CollisionDetector {
61 +
62 + /**
63 + * Name of the rpc.
64 + */
65 + private String name;
66 +
67 + /**
68 + * Description of rpc.
69 + */
70 + private String description;
71 +
72 + /**
73 + * Reference of the module.
74 + */
75 + private String reference;
76 +
77 + /**
78 + * Status of the node.
79 + */
80 + private YangStatusType status = YangStatusType.CURRENT;
81 +
82 + /**
83 + * Create a rpc node.
84 + */
85 + public YangRpc() {
86 + super(YangNodeType.RPC_NODE);
87 + }
88 +
89 + @Override
90 + public String getName() {
91 + return name;
92 + }
93 +
94 + @Override
95 + public void setName(String name) {
96 + this.name = name;
97 + }
98 +
99 + @Override
100 + public void detectCollidingChild(String identifierName, YangConstructType dataType) throws DataModelException {
101 + // Detect colliding child.
102 + detectCollidingChildUtil(identifierName, dataType, this);
103 + }
104 +
105 + @Override
106 + public void detectSelfCollision(String identifierName, YangConstructType dataType) throws DataModelException {
107 + if (this.getName().equals(identifierName)) {
108 + throw new DataModelException("YANG file error: Duplicate input identifier detected, same as rpc \""
109 + + this.getName() + "\"");
110 + }
111 + }
112 +
113 + @Override
114 + public YangConstructType getYangConstructType() {
115 + return YangConstructType.RPC_DATA;
116 + }
117 +
118 + @Override
119 + public void validateDataOnEntry() throws DataModelException {
120 + //TODO: implement the method.
121 + }
122 +
123 + @Override
124 + public void validateDataOnExit() throws DataModelException {
125 + //TODO: implement the method.
126 + }
127 +
128 + @Override
129 + public String getDescription() {
130 + return description;
131 + }
132 +
133 + @Override
134 + public void setDescription(String description) {
135 + this.description = description;
136 + }
137 +
138 + @Override
139 + public String getReference() {
140 + return reference;
141 + }
142 +
143 + @Override
144 + public void setReference(String reference) {
145 + this.reference = reference;
146 + }
147 +
148 + @Override
149 + public YangStatusType getStatus() {
150 + return status;
151 + }
152 +
153 + @Override
154 + public void setStatus(YangStatusType status) {
155 + this.status = status;
156 + }
157 +}
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.datamodel;
18 +
19 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
20 +import org.onosproject.yangutils.parser.Parsable;
21 +import org.onosproject.yangutils.utils.YangConstructType;
22 +
23 +import java.util.List;
24 +
25 +/*
26 + * Reference RFC 6020.
27 + *
28 + * The union built-in type represents a value that corresponds to one of
29 + * its member types.
30 + *
31 + * When the type is "union", the "type" statement (Section 7.4) MUST be
32 + * present. It is used to repeatedly specify each member type of the
33 + * union. It takes as an argument a string that is the name of a member
34 + * type.
35 + *
36 + * A member type can be of any built-in or derived type, except it MUST
37 + * NOT be one of the built-in types "empty" or "leafref".
38 + *
39 + * When a string representing a union data type is validated, the string
40 + * is validated against each member type, in the order they are
41 + * specified in the "type" statement, until a match is found.
42 + *
43 + * Any default value or "units" property defined in the member types is
44 + * not inherited by the union type.
45 + */
46 +
47 +/**
48 + * Data model node to maintain information defined in YANG union.
49 + */
50 +public class YangUnion implements Parsable {
51 +
52 + // List of YANG type.
53 + private List<YangType<?>> typeList;
54 +
55 + // Name of the union.
56 + private String unionName;
57 +
58 + /**
59 + * Create a YANG union node.
60 + */
61 + public YangUnion() {
62 + }
63 +
64 + /**
65 + * Returns list of YANG type.
66 + *
67 + * @return the list of YANG type
68 + */
69 + public List<YangType<?>> getTypeList() {
70 + return typeList;
71 + }
72 +
73 + /**
74 + * Returns union name.
75 + *
76 + * @return the union name
77 + */
78 + public String getUnionName() {
79 + return unionName;
80 + }
81 +
82 + /**
83 + * Set the list of YANG type.
84 + *
85 + * @param typeList list of YANG type.
86 + */
87 + public void setTypeList(List<YangType<?>> typeList) {
88 + this.typeList = typeList;
89 + }
90 +
91 + /**
92 + * Set the union name.
93 + *
94 + * @param unionName name of the union.
95 + */
96 + public void setUnionName(String unionName) {
97 + this.unionName = unionName;
98 + }
99 +
100 + @Override
101 + public YangConstructType getYangConstructType() {
102 + return YangConstructType.UNION_DATA;
103 + }
104 +
105 + @Override
106 + public void validateDataOnEntry() throws DataModelException {
107 + //TODO: implement the method.
108 + }
109 +
110 + @Override
111 + public void validateDataOnExit() throws DataModelException {
112 + //TODO: implement the method.
113 + }
114 +}
...@@ -29,6 +29,8 @@ import org.onosproject.yangutils.parser.impl.listeners.BaseFileListener; ...@@ -29,6 +29,8 @@ import org.onosproject.yangutils.parser.impl.listeners.BaseFileListener;
29 import org.onosproject.yangutils.parser.impl.listeners.BelongsToListener; 29 import org.onosproject.yangutils.parser.impl.listeners.BelongsToListener;
30 import org.onosproject.yangutils.parser.impl.listeners.BitListener; 30 import org.onosproject.yangutils.parser.impl.listeners.BitListener;
31 import org.onosproject.yangutils.parser.impl.listeners.BitsListener; 31 import org.onosproject.yangutils.parser.impl.listeners.BitsListener;
32 +import org.onosproject.yangutils.parser.impl.listeners.CaseListener;
33 +import org.onosproject.yangutils.parser.impl.listeners.ChoiceListener;
32 import org.onosproject.yangutils.parser.impl.listeners.ConfigListener; 34 import org.onosproject.yangutils.parser.impl.listeners.ConfigListener;
33 import org.onosproject.yangutils.parser.impl.listeners.ContactListener; 35 import org.onosproject.yangutils.parser.impl.listeners.ContactListener;
34 import org.onosproject.yangutils.parser.impl.listeners.ContainerListener; 36 import org.onosproject.yangutils.parser.impl.listeners.ContainerListener;
...@@ -54,6 +56,7 @@ import org.onosproject.yangutils.parser.impl.listeners.PresenceListener; ...@@ -54,6 +56,7 @@ import org.onosproject.yangutils.parser.impl.listeners.PresenceListener;
54 import org.onosproject.yangutils.parser.impl.listeners.ReferenceListener; 56 import org.onosproject.yangutils.parser.impl.listeners.ReferenceListener;
55 import org.onosproject.yangutils.parser.impl.listeners.RevisionDateListener; 57 import org.onosproject.yangutils.parser.impl.listeners.RevisionDateListener;
56 import org.onosproject.yangutils.parser.impl.listeners.RevisionListener; 58 import org.onosproject.yangutils.parser.impl.listeners.RevisionListener;
59 +import org.onosproject.yangutils.parser.impl.listeners.ShortCaseListener;
57 import org.onosproject.yangutils.parser.impl.listeners.StatusListener; 60 import org.onosproject.yangutils.parser.impl.listeners.StatusListener;
58 import org.onosproject.yangutils.parser.impl.listeners.SubModuleListener; 61 import org.onosproject.yangutils.parser.impl.listeners.SubModuleListener;
59 import org.onosproject.yangutils.parser.impl.listeners.TypeDefListener; 62 import org.onosproject.yangutils.parser.impl.listeners.TypeDefListener;
...@@ -914,32 +917,32 @@ public class TreeWalkListener implements GeneratedYangListener { ...@@ -914,32 +917,32 @@ public class TreeWalkListener implements GeneratedYangListener {
914 917
915 @Override 918 @Override
916 public void enterChoiceStatement(GeneratedYangParser.ChoiceStatementContext ctx) { 919 public void enterChoiceStatement(GeneratedYangParser.ChoiceStatementContext ctx) {
917 - // TODO: implement the method. 920 + ChoiceListener.processChoiceEntry(this, ctx);
918 } 921 }
919 922
920 @Override 923 @Override
921 public void exitChoiceStatement(GeneratedYangParser.ChoiceStatementContext ctx) { 924 public void exitChoiceStatement(GeneratedYangParser.ChoiceStatementContext ctx) {
922 - // TODO: implement the method. 925 + ChoiceListener.processChoiceExit(this, ctx);
923 } 926 }
924 927
925 @Override 928 @Override
926 public void enterShortCaseStatement(GeneratedYangParser.ShortCaseStatementContext ctx) { 929 public void enterShortCaseStatement(GeneratedYangParser.ShortCaseStatementContext ctx) {
927 - // TODO: implement the method. 930 + ShortCaseListener.processShortCaseEntry(this, ctx);
928 } 931 }
929 932
930 @Override 933 @Override
931 public void exitShortCaseStatement(GeneratedYangParser.ShortCaseStatementContext ctx) { 934 public void exitShortCaseStatement(GeneratedYangParser.ShortCaseStatementContext ctx) {
932 - // TODO: implement the method. 935 + ShortCaseListener.processShortCaseExit(this, ctx);
933 } 936 }
934 937
935 @Override 938 @Override
936 public void enterCaseStatement(GeneratedYangParser.CaseStatementContext ctx) { 939 public void enterCaseStatement(GeneratedYangParser.CaseStatementContext ctx) {
937 - // TODO: implement the method. 940 + CaseListener.processCaseEntry(this, ctx);
938 } 941 }
939 942
940 @Override 943 @Override
941 public void exitCaseStatement(GeneratedYangParser.CaseStatementContext ctx) { 944 public void exitCaseStatement(GeneratedYangParser.CaseStatementContext ctx) {
942 - // TODO: implement the method. 945 + CaseListener.processCaseExit(this, ctx);
943 } 946 }
944 947
945 @Override 948 @Override
......
1 +/*
2 + * Copyright 2014-2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import org.onosproject.yangutils.datamodel.YangCase;
20 +import org.onosproject.yangutils.datamodel.YangChoice;
21 +import org.onosproject.yangutils.datamodel.YangNode;
22 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
23 +import org.onosproject.yangutils.parser.Parsable;
24 +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
25 +import org.onosproject.yangutils.parser.exceptions.ParserException;
26 +import org.onosproject.yangutils.parser.impl.TreeWalkListener;
27 +
28 +import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
29 +import static org.onosproject.yangutils.datamodel.utils.YangDataModelFactory.getYangCaseNode;
30 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
31 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
32 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
33 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
34 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
35 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
36 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
37 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
38 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
39 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidIdentifier;
40 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
41 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityMaxOne;
42 +import static org.onosproject.yangutils.utils.YangConstructType.CASE_DATA;
43 +import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA;
44 +import static org.onosproject.yangutils.utils.YangConstructType.REFERENCE_DATA;
45 +import static org.onosproject.yangutils.utils.YangConstructType.STATUS_DATA;
46 +import static org.onosproject.yangutils.utils.YangConstructType.WHEN_DATA;
47 +
48 +/*
49 + * Reference: RFC6020 and YANG ANTLR Grammar
50 + *
51 + * ABNF grammar as per RFC6020
52 + * case-stmt = case-keyword sep identifier-arg-str optsep
53 + * (";" /
54 + * "{" stmtsep
55 + * ;; these stmts can appear in any order
56 + * [when-stmt stmtsep]
57 + * *(if-feature-stmt stmtsep)
58 + * [status-stmt stmtsep]
59 + * [description-stmt stmtsep]
60 + * [reference-stmt stmtsep]
61 + * *(data-def-stmt stmtsep)
62 + * "}")
63 + *
64 + * ANTLR grammar rule
65 + * caseStatement : CASE_KEYWORD identifier (STMTEND | LEFT_CURLY_BRACE (whenStatement | ifFeatureStatement
66 + * | statusStatement | descriptionStatement | referenceStatement | dataDefStatement)* RIGHT_CURLY_BRACE);
67 + */
68 +
69 +/**
70 + * Implements listener based call back function corresponding to the "case" rule
71 + * defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
72 + */
73 +public final class CaseListener {
74 +
75 + /**
76 + * Create a new case listener.
77 + */
78 + private CaseListener() {
79 + }
80 +
81 + /**
82 + * It is called when parser enters grammar rule (case), it perform
83 + * validations and updates the data model tree.
84 + *
85 + * @param listener listener's object
86 + * @param ctx context object of the grammar rule
87 + */
88 + public static void processCaseEntry(TreeWalkListener listener,
89 + GeneratedYangParser.CaseStatementContext ctx) {
90 +
91 + // Check for stack to be non empty.
92 + checkStackIsNotEmpty(listener, MISSING_HOLDER, CASE_DATA, ctx.identifier().getText(), ENTRY);
93 +
94 + // Check validity of identifier and remove double quotes.
95 + String identifier = getValidIdentifier(ctx.identifier().getText(), CASE_DATA, ctx);
96 +
97 + // Validate sub statement cardinality.
98 + validateSubStatementsCardinality(ctx);
99 +
100 + Parsable curData = listener.getParsedDataStack().peek();
101 +
102 + // Check for identifier collision
103 + int line = ctx.getStart().getLine();
104 + int charPositionInLine = ctx.getStart().getCharPositionInLine();
105 + detectCollidingChildUtil(listener, line, charPositionInLine, identifier, CASE_DATA);
106 +
107 + if (curData instanceof YangChoice) {
108 + YangCase caseNode = getYangCaseNode(JAVA_GENERATION);
109 + caseNode.setName(identifier);
110 + YangNode curNode = (YangNode) curData;
111 + try {
112 + curNode.addChild(caseNode);
113 + } catch (DataModelException e) {
114 + throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
115 + CASE_DATA, ctx.identifier().getText(), ENTRY, e.getMessage()));
116 + }
117 + listener.getParsedDataStack().push(caseNode);
118 + } else {
119 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, CASE_DATA,
120 + ctx.identifier().getText(), ENTRY));
121 + }
122 + }
123 +
124 + /**
125 + * It is called when parser exits from grammar rule (case), it perform
126 + * validations and update the data model tree.
127 + *
128 + * @param listener Listener's object
129 + * @param ctx context object of the grammar rule
130 + */
131 + public static void processCaseExit(TreeWalkListener listener,
132 + GeneratedYangParser.CaseStatementContext ctx) {
133 +
134 + // Check for stack to be non empty.
135 + checkStackIsNotEmpty(listener, MISSING_HOLDER, CASE_DATA, ctx.identifier().getText(), EXIT);
136 +
137 + if (listener.getParsedDataStack().peek() instanceof YangCase) {
138 + listener.getParsedDataStack().pop();
139 + } else {
140 + throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, CASE_DATA,
141 + ctx.identifier().getText(), EXIT));
142 + }
143 + }
144 +
145 + /**
146 + * Validates the cardinality of case sub-statements as per grammar.
147 + *
148 + * @param ctx context object of the grammar rule
149 + */
150 + private static void validateSubStatementsCardinality(GeneratedYangParser.CaseStatementContext ctx) {
151 +
152 + validateCardinalityMaxOne(ctx.whenStatement(), WHEN_DATA, CASE_DATA, ctx.identifier().getText());
153 + validateCardinalityMaxOne(ctx.statusStatement(), STATUS_DATA, CASE_DATA, ctx.identifier().getText());
154 + validateCardinalityMaxOne(ctx.descriptionStatement(), DESCRIPTION_DATA, CASE_DATA, ctx.identifier().getText());
155 + validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA, CASE_DATA, ctx.identifier().getText());
156 + }
157 +}
1 +/*
2 + * Copyright 2014-2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import org.onosproject.yangutils.datamodel.YangAugment;
20 +import org.onosproject.yangutils.datamodel.YangCase;
21 +import org.onosproject.yangutils.datamodel.YangChoice;
22 +import org.onosproject.yangutils.datamodel.YangContainer;
23 +import org.onosproject.yangutils.datamodel.YangGrouping;
24 +import org.onosproject.yangutils.datamodel.YangInput;
25 +import org.onosproject.yangutils.datamodel.YangList;
26 +import org.onosproject.yangutils.datamodel.YangModule;
27 +import org.onosproject.yangutils.datamodel.YangNode;
28 +import org.onosproject.yangutils.datamodel.YangNotification;
29 +import org.onosproject.yangutils.datamodel.YangOutput;
30 +import org.onosproject.yangutils.datamodel.YangSubModule;
31 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
32 +import org.onosproject.yangutils.parser.Parsable;
33 +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
34 +import org.onosproject.yangutils.parser.exceptions.ParserException;
35 +import org.onosproject.yangutils.parser.impl.TreeWalkListener;
36 +
37 +import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
38 +import static org.onosproject.yangutils.datamodel.utils.YangDataModelFactory.getYangChoiceNode;
39 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
40 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
41 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
42 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
43 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
44 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
45 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
46 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
47 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
48 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidIdentifier;
49 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
50 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityMaxOne;
51 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateMutuallyExclusiveChilds;
52 +import static org.onosproject.yangutils.utils.YangConstructType.CASE_DATA;
53 +import static org.onosproject.yangutils.utils.YangConstructType.CHOICE_DATA;
54 +import static org.onosproject.yangutils.utils.YangConstructType.CONFIG_DATA;
55 +import static org.onosproject.yangutils.utils.YangConstructType.DEFAULT_DATA;
56 +import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA;
57 +import static org.onosproject.yangutils.utils.YangConstructType.MANDATORY_DATA;
58 +import static org.onosproject.yangutils.utils.YangConstructType.REFERENCE_DATA;
59 +import static org.onosproject.yangutils.utils.YangConstructType.SHORT_CASE_DATA;
60 +import static org.onosproject.yangutils.utils.YangConstructType.STATUS_DATA;
61 +import static org.onosproject.yangutils.utils.YangConstructType.WHEN_DATA;
62 +
63 +/*
64 + * Reference: RFC6020 and YANG ANTLR Grammar
65 + *
66 + * ABNF grammar as per RFC6020
67 + * choice-stmt = choice-keyword sep identifier-arg-str optsep
68 + * (";" /
69 + * "{" stmtsep
70 + * ;; these stmts can appear in any order
71 + * [when-stmt stmtsep]
72 + * *(if-feature-stmt stmtsep)
73 + * [default-stmt stmtsep]
74 + * [config-stmt stmtsep]
75 + * [mandatory-stmt stmtsep]
76 + * [status-stmt stmtsep]
77 + * [description-stmt stmtsep]
78 + * [reference-stmt stmtsep]
79 + * *((short-case-stmt / case-stmt) stmtsep)
80 + * "}")
81 + *
82 + * ANTLR grammar rule
83 + * choiceStatement : CHOICE_KEYWORD identifier (STMTEND | LEFT_CURLY_BRACE (whenStatement | ifFeatureStatement
84 + * | defaultStatement | configStatement | mandatoryStatement | statusStatement | descriptionStatement
85 + * | referenceStatement | shortCaseStatement | caseStatement)* RIGHT_CURLY_BRACE);
86 + */
87 +
88 +/**
89 + * Implements listener based call back function corresponding to the "choice"
90 + * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
91 + */
92 +public final class ChoiceListener {
93 +
94 + /**
95 + * Create a new choice listener.
96 + */
97 + private ChoiceListener() {
98 + }
99 +
100 + /**
101 + * It is called when parser receives an input matching the grammar rule
102 + * (choice), perform validations and update the data model tree.
103 + *
104 + * @param listener Listener's object
105 + * @param ctx context object of the grammar rule
106 + */
107 + public static void processChoiceEntry(TreeWalkListener listener,
108 + GeneratedYangParser.ChoiceStatementContext ctx) {
109 +
110 + // Check for stack to be non empty.
111 + checkStackIsNotEmpty(listener, MISSING_HOLDER, CHOICE_DATA, ctx.identifier().getText(), ENTRY);
112 +
113 + // Check validity of identifier and remove double quotes.
114 + String identifier = getValidIdentifier(ctx.identifier().getText(), CHOICE_DATA, ctx);
115 +
116 + // Validate sub statement cardinality.
117 + validateSubStatementsCardinality(ctx);
118 +
119 + Parsable curData = listener.getParsedDataStack().peek();
120 +
121 + // Check for identifier collision
122 + int line = ctx.getStart().getLine();
123 + int charPositionInLine = ctx.getStart().getCharPositionInLine();
124 + detectCollidingChildUtil(listener, line, charPositionInLine, identifier, CHOICE_DATA);
125 +
126 + if (curData instanceof YangModule || curData instanceof YangSubModule || curData instanceof YangContainer
127 + || curData instanceof YangList || curData instanceof YangCase || curData instanceof YangGrouping
128 + || curData instanceof YangAugment || curData instanceof YangInput || curData instanceof YangOutput
129 + || curData instanceof YangNotification) {
130 +
131 + YangChoice choiceNode = getYangChoiceNode(JAVA_GENERATION);
132 + choiceNode.setName(identifier);
133 +
134 + YangNode curNode = (YangNode) curData;
135 + try {
136 + curNode.addChild(choiceNode);
137 + } catch (DataModelException e) {
138 + throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
139 + CHOICE_DATA, ctx.identifier().getText(), ENTRY, e.getMessage()));
140 + }
141 + listener.getParsedDataStack().push(choiceNode);
142 + } else {
143 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
144 + CHOICE_DATA, ctx.identifier().getText(), ENTRY));
145 + }
146 + }
147 +
148 + /**
149 + * It is called when parser exits from grammar rule (choice), it perform
150 + * validations and update the data model tree.
151 + *
152 + * @param listener Listener's object
153 + * @param ctx context object of the grammar rule
154 + */
155 + public static void processChoiceExit(TreeWalkListener listener,
156 + GeneratedYangParser.ChoiceStatementContext ctx) {
157 +
158 + // Check for stack to be non empty.
159 + checkStackIsNotEmpty(listener, MISSING_HOLDER, CHOICE_DATA, ctx.identifier().getText(), EXIT);
160 +
161 + if (listener.getParsedDataStack().peek() instanceof YangChoice) {
162 + listener.getParsedDataStack().pop();
163 + } else {
164 + throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, CHOICE_DATA,
165 + ctx.identifier().getText(), EXIT));
166 + }
167 + }
168 +
169 + /**
170 + * Validates the cardinality of choice sub-statements as per grammar.
171 + *
172 + * @param ctx context object of the grammar rule.
173 + */
174 + private static void validateSubStatementsCardinality(GeneratedYangParser.ChoiceStatementContext ctx) {
175 +
176 + validateCardinalityMaxOne(ctx.whenStatement(), WHEN_DATA, CHOICE_DATA, ctx.identifier().getText());
177 + validateCardinalityMaxOne(ctx.defaultStatement(), DEFAULT_DATA, CHOICE_DATA, ctx.identifier().getText());
178 + validateCardinalityMaxOne(ctx.configStatement(), CONFIG_DATA, CHOICE_DATA, ctx.identifier().getText());
179 + validateCardinalityMaxOne(ctx.mandatoryStatement(), MANDATORY_DATA, CHOICE_DATA, ctx.identifier().getText());
180 + validateCardinalityMaxOne(ctx.statusStatement(), STATUS_DATA, CHOICE_DATA, ctx.identifier().getText());
181 + validateCardinalityMaxOne(ctx.descriptionStatement(), DESCRIPTION_DATA, CHOICE_DATA,
182 + ctx.identifier().getText());
183 + validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA, CHOICE_DATA, ctx.identifier().getText());
184 + validateMutuallyExclusiveChilds(ctx.shortCaseStatement(), SHORT_CASE_DATA, ctx.caseStatement(), CASE_DATA,
185 + CHOICE_DATA, ctx.identifier().getText());
186 + }
187 +}
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import org.antlr.v4.runtime.ParserRuleContext;
20 +import org.antlr.v4.runtime.tree.ParseTree;
21 +import org.onosproject.yangutils.datamodel.YangCase;
22 +import org.onosproject.yangutils.datamodel.YangChoice;
23 +import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
24 +import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
25 +import org.onosproject.yangutils.parser.exceptions.ParserException;
26 +import org.onosproject.yangutils.parser.impl.TreeWalkListener;
27 +
28 +import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
29 +import static org.onosproject.yangutils.datamodel.utils.YangDataModelFactory.getYangCaseNode;
30 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
31 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
32 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
33 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
34 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
35 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_CHILD;
36 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
37 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
38 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
39 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
40 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidIdentifier;
41 +import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
42 +import static org.onosproject.yangutils.utils.YangConstructType.CASE_DATA;
43 +import static org.onosproject.yangutils.utils.YangConstructType.SHORT_CASE_DATA;
44 +
45 +/*
46 + * Reference: RFC6020 and YANG ANTLR Grammar
47 + *
48 + * ABNF grammar as per RFC6020
49 + * short-case-stmt = container-stmt /
50 + * leaf-stmt /
51 + * leaf-list-stmt /
52 + * list-stmt /
53 + * anyxml-stmt
54 + *
55 + * ANTLR grammar rule
56 + * shortCaseStatement : containerStatement | leafStatement | leafListStatement | listStatement;
57 + */
58 +
59 +/**
60 + * Implements listener based call back function corresponding to the "short
61 + * case" rule defined in ANTLR grammar file for corresponding ABNF rule in RFC
62 + * 6020.
63 + */
64 +public final class ShortCaseListener {
65 +
66 + /**
67 + * Create a new short case listener.
68 + */
69 + private ShortCaseListener() {
70 + }
71 +
72 + /**
73 + * It is called when parser enters grammar rule (short case), it perform
74 + * validations and updates the data model tree.
75 + *
76 + * @param listener listener's object
77 + * @param ctx context object of the grammar rule
78 + */
79 + public static void processShortCaseEntry(TreeWalkListener listener,
80 + GeneratedYangParser.ShortCaseStatementContext ctx) {
81 +
82 + ParseTree errorConstructContext;
83 +
84 + // Check for stack to be non empty.
85 + checkStackIsNotEmpty(listener, MISSING_HOLDER, SHORT_CASE_DATA, "", ENTRY);
86 +
87 + YangCase caseNode = getYangCaseNode(JAVA_GENERATION);
88 +
89 + if (ctx.containerStatement() != null) {
90 + caseNode.setName(getValidIdentifier(ctx.containerStatement().identifier().getText(), CASE_DATA, ctx));
91 + errorConstructContext = ctx.containerStatement();
92 + } else if (ctx.listStatement() != null) {
93 + caseNode.setName(getValidIdentifier(ctx.listStatement().identifier().getText(), CASE_DATA, ctx));
94 + errorConstructContext = ctx.listStatement();
95 + } else if (ctx.leafListStatement() != null) {
96 + caseNode.setName(getValidIdentifier(ctx.leafListStatement().identifier().getText(), CASE_DATA, ctx));
97 + errorConstructContext = ctx.leafListStatement();
98 + } else if (ctx.leafStatement() != null) {
99 + caseNode.setName(getValidIdentifier(ctx.leafStatement().identifier().getText(), CASE_DATA, ctx));
100 + errorConstructContext = ctx.leafStatement();
101 + } else {
102 + throw new ParserException(constructListenerErrorMessage(INVALID_CHILD, SHORT_CASE_DATA, "", ENTRY));
103 + }
104 + // TODO implement for augment.
105 +
106 + int line = ((ParserRuleContext) errorConstructContext).getStart().getLine();
107 + int charPositionInLine = ((ParserRuleContext) errorConstructContext).getStart().getCharPositionInLine();
108 +
109 + // Check for identifier collision
110 + detectCollidingChildUtil(listener, line, charPositionInLine, caseNode.getName(), CASE_DATA);
111 +
112 + if ((listener.getParsedDataStack().peek()) instanceof YangChoice) {
113 + try {
114 + ((YangChoice) listener.getParsedDataStack().peek()).addChild(caseNode);
115 + } catch (DataModelException e) {
116 + throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
117 + SHORT_CASE_DATA, caseNode.getName(), ENTRY, e.getMessage()));
118 + }
119 + listener.getParsedDataStack().push(caseNode);
120 + } else {
121 + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, SHORT_CASE_DATA,
122 + caseNode.getName(), ENTRY));
123 + }
124 + }
125 +
126 + /**
127 + * It is called when parser exits from grammar rule (short case), it perform
128 + * validations and update the data model tree.
129 + *
130 + * @param listener Listener's object
131 + * @param ctx context object of the grammar rule
132 + */
133 + public static void processShortCaseExit(TreeWalkListener listener,
134 + GeneratedYangParser.ShortCaseStatementContext ctx) {
135 +
136 + // Check for stack to be non empty.
137 + checkStackIsNotEmpty(listener, MISSING_HOLDER, SHORT_CASE_DATA, "", EXIT);
138 +
139 + if (listener.getParsedDataStack().peek() instanceof YangCase) {
140 + listener.getParsedDataStack().pop();
141 + } else {
142 + throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, SHORT_CASE_DATA,
143 + "", EXIT));
144 + }
145 + }
146 +}
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.translator.tojava.javamodel;
18 +
19 +import java.io.IOException;
20 +import org.onosproject.yangutils.datamodel.YangInput;
21 +import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
22 +import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
23 +import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
24 +import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
25 +import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
26 +import org.onosproject.yangutils.translator.tojava.JavaImportData;
27 +import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
28 +
29 +import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
30 +import static org.onosproject.yangutils.translator.tojava.utils.GenerateJavaCodeExitBuilder.generateJavaFile;
31 +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCamelCase;
32 +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCaptialCase;
33 +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCurNodePackage;
34 +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getPackageDirPathFromJavaJPackage;
35 +import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.createPackage;
36 +import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
37 +
38 +/**
39 + * Input information extended to support java code generation.
40 + */
41 +public class YangJavaInput extends YangInput
42 + implements JavaCodeGenerator, HasJavaFileInfo,
43 + HasJavaImportData, HasTempJavaCodeFragmentFiles {
44 +
45 + /**
46 + * Contains information of the java file being generated.
47 + */
48 + private JavaFileInfo javaFileInfo;
49 +
50 + /**
51 + * Contains information of the imports to be inserted in the java file
52 + * generated.
53 + */
54 + private JavaImportData javaImportData;
55 +
56 + /**
57 + * File handle to maintain temporary java code fragments as per the code
58 + * snippet types.
59 + */
60 + private TempJavaCodeFragmentFiles tempFileHandle;
61 +
62 + /**
63 + * Creates an instance of java input.
64 + */
65 + public YangJavaInput() {
66 + super();
67 + setJavaFileInfo(new JavaFileInfo());
68 + setJavaImportData(new JavaImportData());
69 + getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
70 + }
71 +
72 + /**
73 + * Returns the generated java file information.
74 + *
75 + * @return generated java file information
76 + */
77 + @Override
78 + public JavaFileInfo getJavaFileInfo() {
79 +
80 + if (javaFileInfo == null) {
81 + throw new RuntimeException("Missing java info in java datamodel node");
82 + }
83 + return javaFileInfo;
84 + }
85 +
86 + /**
87 + * Set the java file info object.
88 + *
89 + * @param javaInfo java file info object
90 + */
91 + @Override
92 + public void setJavaFileInfo(JavaFileInfo javaInfo) {
93 +
94 + javaFileInfo = javaInfo;
95 + }
96 +
97 + /**
98 + * Returns the data of java imports to be included in generated file.
99 + *
100 + * @return data of java imports to be included in generated file
101 + */
102 + @Override
103 + public JavaImportData getJavaImportData() {
104 +
105 + return javaImportData;
106 + }
107 +
108 + /**
109 + * Set the data of java imports to be included in generated file.
110 + *
111 + * @param javaImportData data of java imports to be included in generated
112 + * file
113 + */
114 + @Override
115 + public void setJavaImportData(JavaImportData javaImportData) {
116 +
117 + this.javaImportData = javaImportData;
118 + }
119 +
120 + /**
121 + * Returns the temporary file handle.
122 + *
123 + * @return temporary file handle
124 + */
125 + @Override
126 + public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
127 +
128 + if (tempFileHandle == null) {
129 + throw new RuntimeException("Missing temporary file handle for" +
130 + "current node " + getJavaFileInfo().getJavaName());
131 + }
132 + return tempFileHandle;
133 + }
134 +
135 + /**
136 + * Set temporary file handle.
137 + *
138 + * @param fileHandle temporary file handle
139 + */
140 + @Override
141 + public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
142 +
143 + tempFileHandle = fileHandle;
144 + }
145 +
146 + /**
147 + * Prepare the information for java code generation corresponding to YANG
148 + * container info.
149 + *
150 + * @param codeGenDir code generation directory
151 + * @throws IOException IO operation fail
152 + */
153 + @Override
154 + public void generateCodeEntry(String codeGenDir) throws IOException {
155 +
156 + getJavaFileInfo().setJavaName(getCaptialCase(getCamelCase(getName())));
157 + getJavaFileInfo().setPackage(getCurNodePackage(this));
158 + getJavaFileInfo().setPackageFilePath(
159 + getPackageDirPathFromJavaJPackage(getJavaFileInfo().getPackage()));
160 + getJavaFileInfo().setBaseCodeGenPath(codeGenDir);
161 +
162 + String absloutePath = getAbsolutePackagePath(
163 + getJavaFileInfo().getBaseCodeGenPath(),
164 + getJavaFileInfo().getPackageFilePath());
165 + createPackage(absloutePath, getName());
166 + setTempJavaCodeFragmentFiles(new TempJavaCodeFragmentFiles(
167 + getJavaFileInfo().getGeneratedFileTypes(), absloutePath,
168 + getJavaFileInfo().getJavaName()));
169 +
170 + getTempJavaCodeFragmentFiles().addCurNodeLeavesInfoToTempFiles(this);
171 +
172 + getTempJavaCodeFragmentFiles().addCurNodeInfoInParentTempFile(this, false);
173 + }
174 +
175 + /**
176 + * Create a java file using the YANG grouping info.
177 + *
178 + * @throws IOException IO operation fail
179 + */
180 + @Override
181 + public void generateCodeExit() throws IOException {
182 +
183 + generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
184 + getTempJavaCodeFragmentFiles().close();
185 + }
186 +}
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.translator.tojava.javamodel;
18 +
19 +import java.io.IOException;
20 +import org.onosproject.yangutils.datamodel.YangOutput;
21 +import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
22 +import org.onosproject.yangutils.translator.tojava.HasJavaImportData;
23 +import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
24 +import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
25 +import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
26 +import org.onosproject.yangutils.translator.tojava.JavaImportData;
27 +import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
28 +
29 +import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
30 +import static org.onosproject.yangutils.translator.tojava.utils.GenerateJavaCodeExitBuilder.generateJavaFile;
31 +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCamelCase;
32 +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCaptialCase;
33 +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCurNodePackage;
34 +import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getPackageDirPathFromJavaJPackage;
35 +import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.createPackage;
36 +import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
37 +
38 +/**
39 + * Output information extended to support java code generation.
40 + */
41 +public class YangJavaOutput extends YangOutput
42 + implements JavaCodeGenerator, HasJavaFileInfo,
43 + HasJavaImportData, HasTempJavaCodeFragmentFiles {
44 +
45 + /**
46 + * Contains information of the java file being generated.
47 + */
48 + private JavaFileInfo javaFileInfo;
49 +
50 + /**
51 + * Contains information of the imports to be inserted in the java file
52 + * generated.
53 + */
54 + private JavaImportData javaImportData;
55 +
56 + /**
57 + * File handle to maintain temporary java code fragments as per the code
58 + * snippet types.
59 + */
60 + private TempJavaCodeFragmentFiles tempFileHandle;
61 +
62 + /**
63 + * Creates an instance of java output.
64 + */
65 + public YangJavaOutput() {
66 + super();
67 + setJavaFileInfo(new JavaFileInfo());
68 + setJavaImportData(new JavaImportData());
69 + getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
70 + }
71 +
72 + /**
73 + * Returns the generated java file information.
74 + *
75 + * @return generated java file information
76 + */
77 + @Override
78 + public JavaFileInfo getJavaFileInfo() {
79 +
80 + if (javaFileInfo == null) {
81 + throw new RuntimeException("Missing java info in java datamodel node");
82 + }
83 + return javaFileInfo;
84 + }
85 +
86 + /**
87 + * Set the java file info object.
88 + *
89 + * @param javaInfo java file info object
90 + */
91 + @Override
92 + public void setJavaFileInfo(JavaFileInfo javaInfo) {
93 +
94 + javaFileInfo = javaInfo;
95 + }
96 +
97 + /**
98 + * Returns the data of java imports to be included in generated file.
99 + *
100 + * @return data of java imports to be included in generated file
101 + */
102 + @Override
103 + public JavaImportData getJavaImportData() {
104 +
105 + return javaImportData;
106 + }
107 +
108 + /**
109 + * Set the data of java imports to be included in generated file.
110 + *
111 + * @param javaImportData data of java imports to be included in generated
112 + * file
113 + */
114 + @Override
115 + public void setJavaImportData(JavaImportData javaImportData) {
116 +
117 + this.javaImportData = javaImportData;
118 + }
119 +
120 + /**
121 + * Returns the temporary file handle.
122 + *
123 + * @return temporary file handle
124 + */
125 + @Override
126 + public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
127 +
128 + if (tempFileHandle == null) {
129 + throw new RuntimeException("Missing temporary file handle for" +
130 + "current node " + getJavaFileInfo().getJavaName());
131 + }
132 + return tempFileHandle;
133 + }
134 +
135 + /**
136 + * Set temporary file handle.
137 + *
138 + * @param fileHandle temporary file handle
139 + */
140 + @Override
141 + public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
142 +
143 + tempFileHandle = fileHandle;
144 + }
145 +
146 + /**
147 + * Prepare the information for java code generation corresponding to YANG
148 + * container info.
149 + *
150 + * @param codeGenDir code generation directory
151 + * @throws IOException IO operation fail
152 + */
153 + @Override
154 + public void generateCodeEntry(String codeGenDir) throws IOException {
155 +
156 + getJavaFileInfo().setJavaName(getCaptialCase(getCamelCase(getName())));
157 + getJavaFileInfo().setPackage(getCurNodePackage(this));
158 + getJavaFileInfo().setPackageFilePath(
159 + getPackageDirPathFromJavaJPackage(getJavaFileInfo().getPackage()));
160 + getJavaFileInfo().setBaseCodeGenPath(codeGenDir);
161 +
162 + String absloutePath = getAbsolutePackagePath(
163 + getJavaFileInfo().getBaseCodeGenPath(),
164 + getJavaFileInfo().getPackageFilePath());
165 + createPackage(absloutePath, getName());
166 + setTempJavaCodeFragmentFiles(new TempJavaCodeFragmentFiles(
167 + getJavaFileInfo().getGeneratedFileTypes(), absloutePath,
168 + getJavaFileInfo().getJavaName()));
169 +
170 + getTempJavaCodeFragmentFiles().addCurNodeLeavesInfoToTempFiles(this);
171 +
172 + getTempJavaCodeFragmentFiles().addCurNodeInfoInParentTempFile(this, false);
173 + }
174 +
175 + /**
176 + * Create a java file using the YANG grouping info.
177 + *
178 + * @throws IOException IO operation fail
179 + */
180 + @Override
181 + public void generateCodeExit() throws IOException {
182 +
183 + generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
184 + getTempJavaCodeFragmentFiles().close();
185 + }
186 +}
...@@ -235,6 +235,41 @@ public enum YangConstructType { ...@@ -235,6 +235,41 @@ public enum YangConstructType {
235 DATA_DEF_DATA, 235 DATA_DEF_DATA,
236 236
237 /** 237 /**
238 + * Identifies the YANG union element parsed data.
239 + */
240 + UNION_DATA,
241 +
242 + /**
243 + * Identifies the YANG notification element parsed data.
244 + */
245 + NOTIFICATION_DATA,
246 +
247 + /**
248 + * Identifies the YANG when element parsed data.
249 + */
250 + WHEN_DATA,
251 +
252 + /**
253 + * Identifies the YANG input element parsed data.
254 + */
255 + INPUT_DATA,
256 +
257 + /**
258 + * Identifies the YANG output element parsed data.
259 + */
260 + OUTPUT_DATA,
261 +
262 + /**
263 + * Identifies the YANG rpc element parsed data.
264 + */
265 + RPC_DATA,
266 +
267 + /**
268 + * Identifies the YANG short case element parsed data.
269 + */
270 + SHORT_CASE_DATA,
271 +
272 + /**
238 * Identifies the derived data type. 273 * Identifies the derived data type.
239 */ 274 */
240 DERIVED; 275 DERIVED;
...@@ -334,8 +369,22 @@ public enum YangConstructType { ...@@ -334,8 +369,22 @@ public enum YangConstructType {
334 return "default"; 369 return "default";
335 case DATA_DEF_DATA: 370 case DATA_DEF_DATA:
336 return "data-def-substatements"; 371 return "data-def-substatements";
372 + case WHEN_DATA:
373 + return "when";
374 + case INPUT_DATA:
375 + return "input";
376 + case OUTPUT_DATA:
377 + return "ouput";
378 + case RPC_DATA:
379 + return "rpc";
380 + case SHORT_CASE_DATA:
381 + return "short-case";
337 case DERIVED: 382 case DERIVED:
338 return "derived"; 383 return "derived";
384 + case NOTIFICATION_DATA:
385 + return "notification";
386 + case UNION_DATA:
387 + return "union";
339 default: 388 default:
340 return "yang"; 389 return "yang";
341 } 390 }
......
1 +/*
2 + * Copyright 2014-2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import static org.hamcrest.MatcherAssert.assertThat;
20 +import static org.hamcrest.core.Is.is;
21 +import org.junit.Test;
22 +import org.onosproject.yangutils.datamodel.YangCase;
23 +import org.onosproject.yangutils.datamodel.YangChoice;
24 +import org.onosproject.yangutils.datamodel.YangContainer;
25 +import org.onosproject.yangutils.datamodel.YangLeaf;
26 +import org.onosproject.yangutils.datamodel.YangModule;
27 +import org.onosproject.yangutils.datamodel.YangNode;
28 +import org.onosproject.yangutils.datamodel.YangNodeType;
29 +import org.onosproject.yangutils.parser.exceptions.ParserException;
30 +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
31 +
32 +import java.io.IOException;
33 +import java.util.ListIterator;
34 +
35 +/**
36 + * Test cases for case listener.
37 + */
38 +public class CaseListenerTest {
39 +
40 + private final YangUtilsParserManager manager = new YangUtilsParserManager();
41 +
42 + /**
43 + * Checks multiple case statement.
44 + */
45 + @Test
46 + public void processCaseStatement() throws IOException, ParserException {
47 +
48 + YangNode node = manager.getDataModel("src/test/resources/CaseStatement.yang");
49 +
50 + // Check whether the data model tree returned is of type module.
51 + assertThat((node instanceof YangModule), is(true));
52 +
53 + // Check whether the node type is set properly to module.
54 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
55 +
56 + // Check whether the module name is set correctly.
57 + YangModule yangNode = (YangModule) node;
58 + assertThat(yangNode.getName(), is("Test"));
59 +
60 + YangContainer yangContainer = (YangContainer) yangNode.getChild();
61 + assertThat(yangContainer.getName(), is("food"));
62 +
63 + YangChoice yangChoice = (YangChoice) yangContainer.getChild();
64 + assertThat(yangChoice.getName(), is("snack"));
65 +
66 + YangCase yangCase1 = (YangCase) yangChoice.getChild();
67 + assertThat(yangCase1.getName(), is("sports-arena"));
68 +
69 + // Check whether leaf properties as set correctly.
70 + ListIterator<YangLeaf> leafIterator1 = yangCase1.getListOfLeaf().listIterator();
71 + YangLeaf leafInfo1 = leafIterator1.next();
72 +
73 + assertThat(leafInfo1.getLeafName(), is("pretzel"));
74 +
75 + YangCase yangCase2 = (YangCase) yangCase1.getNextSibling();
76 + assertThat(yangCase2.getName(), is("late-night"));
77 +
78 + // Check whether leaf properties as set correctly.
79 + ListIterator<YangLeaf> leafIterator2 = yangCase2.getListOfLeaf().listIterator();
80 + YangLeaf leafInfo2 = leafIterator2.next();
81 +
82 + assertThat(leafInfo2.getLeafName(), is("chocolate"));
83 + }
84 +
85 + /**
86 + * Checks duplicate case in choice.
87 + */
88 + @Test(expected = ParserException.class)
89 + public void processDuplicateCaseInChoice() throws IOException, ParserException {
90 +
91 + YangNode node = manager.getDataModel("src/test/resources/DuplicateCaseInChoice.yang");
92 + }
93 +
94 + /**
95 + * Checks duplicate leaf at different hierarchy.
96 + */
97 + @Test(expected = ParserException.class)
98 + public void processDuplicateLeafInHierarchy() throws IOException, ParserException {
99 +
100 + YangNode node = manager.getDataModel("src/test/resources/DuplicateLeafInHierarchy.yang");
101 + }
102 +
103 + /**
104 + * Checks duplicate leaf in different case within choice.
105 + */
106 + @Test(expected = ParserException.class)
107 + public void processDuplicateLeafInChoice() throws IOException, ParserException {
108 +
109 + YangNode node = manager.getDataModel("src/test/resources/DuplicateLeafInChoice.yang");
110 + }
111 +
112 + /**
113 + * Checks same case within different choice.
114 + */
115 + @Test
116 + public void processCaseStatementSameEntryDifferentChoice() throws IOException, ParserException {
117 +
118 + YangNode node = manager.getDataModel("src/test/resources/CaseStatementSameEntryDifferentChoice.yang");
119 +
120 + // Check whether the data model tree returned is of type module.
121 + assertThat((node instanceof YangModule), is(true));
122 +
123 + // Check whether the node type is set properly to module.
124 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
125 +
126 + // Check whether the module name is set correctly.
127 + YangModule yangNode = (YangModule) node;
128 + assertThat(yangNode.getName(), is("Test"));
129 +
130 + YangContainer yangContainer = (YangContainer) yangNode.getChild();
131 + assertThat(yangContainer.getName(), is("food"));
132 +
133 + YangChoice yangChoice = (YangChoice) yangContainer.getChild();
134 + assertThat(yangChoice.getName(), is("snack"));
135 +
136 + YangCase yangCase1 = (YangCase) yangChoice.getChild();
137 + assertThat(yangCase1.getName(), is("sports-arena"));
138 +
139 + // Check whether leaf properties as set correctly.
140 + ListIterator<YangLeaf> leafIterator1 = yangCase1.getListOfLeaf().listIterator();
141 + YangLeaf leafInfo1 = leafIterator1.next();
142 +
143 + assertThat(leafInfo1.getLeafName(), is("pretzel"));
144 +
145 + YangChoice yangChoice2 = (YangChoice) yangChoice.getNextSibling();
146 + assertThat(yangChoice2.getName(), is("lunch"));
147 +
148 + YangCase yangCase2 = (YangCase) yangChoice2.getChild();
149 + assertThat(yangCase2.getName(), is("sports-arena"));
150 +
151 + // Check whether leaf properties as set correctly.
152 + ListIterator<YangLeaf> leafIterator2 = yangCase2.getListOfLeaf().listIterator();
153 + YangLeaf leafInfo2 = leafIterator2.next();
154 +
155 + assertThat(leafInfo2.getLeafName(), is("chocolate"));
156 + }
157 +
158 + /**
159 + * Checks case choice hierarchy.
160 + */
161 + @Test
162 + public void processCaseChoiceHierarchy() throws IOException, ParserException {
163 +
164 + YangNode node = manager.getDataModel("src/test/resources/CaseChoiceHierarchy.yang");
165 +
166 + // Check whether the data model tree returned is of type module.
167 + assertThat((node instanceof YangModule), is(true));
168 +
169 + // Check whether the node type is set properly to module.
170 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
171 +
172 + // Check whether the module name is set correctly.
173 + YangModule yangNode = (YangModule) node;
174 + assertThat(yangNode.getName(), is("Test"));
175 +
176 + YangContainer yangContainer = (YangContainer) yangNode.getChild();
177 + assertThat(yangContainer.getName(), is("food"));
178 +
179 + YangChoice yangChoice1 = (YangChoice) yangContainer.getChild();
180 + assertThat(yangChoice1.getName(), is("snack"));
181 +
182 + YangCase yangCase1 = (YangCase) yangChoice1.getChild();
183 + assertThat(yangCase1.getName(), is("sports-arena"));
184 +
185 + // Check whether leaf properties as set correctly.
186 + ListIterator<YangLeaf> leafIterator1 = yangCase1.getListOfLeaf().listIterator();
187 + YangLeaf leafInfo1 = leafIterator1.next();
188 +
189 + assertThat(leafInfo1.getLeafName(), is("pretzel"));
190 +
191 + YangCase yangCase2 = (YangCase) yangCase1.getNextSibling();
192 + assertThat(yangCase2.getName(), is("late-night"));
193 +
194 + YangChoice yangChoice2 = (YangChoice) yangCase2.getChild();
195 + assertThat(yangChoice2.getName(), is("dinner"));
196 +
197 + YangCase yangCase3 = (YangCase) yangChoice2.getChild();
198 + assertThat(yangCase3.getName(), is("late-night"));
199 +
200 + // Check whether leaf properties as set correctly.
201 + ListIterator<YangLeaf> leafIterator2 = yangCase3.getListOfLeaf().listIterator();
202 + YangLeaf leafInfo2 = leafIterator2.next();
203 + assertThat(leafInfo2.getLeafName(), is("beer"));
204 + }
205 +}
1 +/*
2 + * Copyright 2014-2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.yangutils.parser.impl.listeners;
18 +
19 +import static org.hamcrest.MatcherAssert.assertThat;
20 +import static org.hamcrest.core.Is.is;
21 +import org.junit.Test;
22 +import org.onosproject.yangutils.datamodel.YangChoice;
23 +import org.onosproject.yangutils.datamodel.YangContainer;
24 +import org.onosproject.yangutils.datamodel.YangModule;
25 +import org.onosproject.yangutils.datamodel.YangNode;
26 +import org.onosproject.yangutils.datamodel.YangNodeType;
27 +import org.onosproject.yangutils.parser.exceptions.ParserException;
28 +import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
29 +
30 +import java.io.IOException;
31 +
32 +/**
33 + * Test cases for choice listener.
34 + */
35 +public class ChoiceListenerTest {
36 +
37 + private final YangUtilsParserManager manager = new YangUtilsParserManager();
38 +
39 + /**
40 + * Checks choice statement without body.
41 + */
42 + @Test
43 + public void processChoiceStatementWithoutBody() throws IOException, ParserException {
44 +
45 + YangNode node = manager.getDataModel("src/test/resources/ChoiceStatementWithoutBody.yang");
46 +
47 + // Check whether the data model tree returned is of type module.
48 + assertThat((node instanceof YangModule), is(true));
49 +
50 + // Check whether the node type is set properly to module.
51 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
52 +
53 + // Check whether the module name is set correctly.
54 + YangModule yangNode = (YangModule) node;
55 + assertThat(yangNode.getName(), is("Test"));
56 +
57 + YangContainer yangContainer = (YangContainer) yangNode.getChild();
58 + assertThat(yangContainer.getName(), is("food"));
59 +
60 + YangChoice yangChoice = (YangChoice) yangContainer.getChild();
61 + assertThat(yangChoice.getName(), is("snack"));
62 + }
63 +
64 + /**
65 + * Checks choice statement with stmt end.
66 + */
67 + @Test
68 + public void processChoiceStatementWithStmtend() throws IOException, ParserException {
69 +
70 + YangNode node = manager.getDataModel("src/test/resources/ChoiceStatementWithStmtend.yang");
71 +
72 + // Check whether the data model tree returned is of type module.
73 + assertThat((node instanceof YangModule), is(true));
74 +
75 + // Check whether the node type is set properly to module.
76 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
77 +
78 + // Check whether the module name is set correctly.
79 + YangModule yangNode = (YangModule) node;
80 + assertThat(yangNode.getName(), is("Test"));
81 +
82 + YangContainer yangContainer = (YangContainer) yangNode.getChild();
83 + assertThat(yangContainer.getName(), is("food"));
84 +
85 + YangChoice yangChoice = (YangChoice) yangContainer.getChild();
86 + assertThat(yangChoice.getName(), is("snack"));
87 + }
88 +
89 + /**
90 + * Checks choice statement duplicate entry.
91 + */
92 + @Test(expected = ParserException.class)
93 + public void processChoiceStatementDuplicateEntry() throws IOException, ParserException {
94 +
95 + YangNode node = manager.getDataModel("src/test/resources/ChoiceStatementDuplicateEntry.yang");
96 + }
97 +
98 + /**
99 + * Checks choice statement with same entry in two different container.
100 + */
101 + @Test
102 + public void processChoiceStatementSameEntryDifferentContainer() throws IOException, ParserException {
103 +
104 + YangNode node = manager.getDataModel("src/test/resources/ChoiceStatementSameEntryDifferentContainer.yang");
105 +
106 + // Check whether the data model tree returned is of type module.
107 + assertThat((node instanceof YangModule), is(true));
108 +
109 + // Check whether the node type is set properly to module.
110 + assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
111 +
112 + // Check whether the module name is set correctly.
113 + YangModule yangNode = (YangModule) node;
114 + assertThat(yangNode.getName(), is("Test"));
115 +
116 + YangContainer yangContainer1 = (YangContainer) yangNode.getChild();
117 + assertThat(yangContainer1.getName(), is("food1"));
118 +
119 + YangChoice yangChoice1 = (YangChoice) yangContainer1.getChild();
120 + assertThat(yangChoice1.getName(), is("snack"));
121 +
122 + YangContainer yangContainer2 = (YangContainer) yangNode.getChild().getNextSibling();
123 + assertThat(yangContainer2.getName(), is("food2"));
124 +
125 + YangChoice yangChoice2 = (YangChoice) yangContainer2.getChild();
126 + assertThat(yangChoice2.getName(), is("snack"));
127 + }
128 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food {
6 + choice snack {
7 + case sports-arena {
8 + leaf pretzel {
9 + type empty;
10 + }
11 + }
12 + case late-night {
13 + choice dinner {
14 + case late-night {
15 + leaf beer {
16 + type empty;
17 + }
18 + }
19 + }
20 + }
21 + }
22 + }
23 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food {
6 + choice snack {
7 + case sports-arena {
8 + leaf pretzel {
9 + type empty;
10 + }
11 + leaf beer {
12 + type empty;
13 + }
14 + }
15 + case late-night {
16 + leaf chocolate {
17 + type enumeration {
18 + enum dark;
19 + enum milk;
20 + enum first-available;
21 + }
22 + }
23 + }
24 + }
25 + }
26 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food {
6 + choice snack {
7 + case sports-arena {
8 + leaf pretzel {
9 + type empty;
10 + }
11 + leaf beer {
12 + type empty;
13 + }
14 + }
15 + }
16 + choice lunch {
17 + case sports-arena {
18 + leaf chocolate {
19 + type enumeration {
20 + enum dark;
21 + enum milk;
22 + enum first-available;
23 + }
24 + }
25 + }
26 + }
27 + }
28 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food {
6 + choice snack;
7 + choice lunch;
8 + choice snack;
9 + }
10 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food1 {
6 + choice snack;
7 + choice lunch;
8 + }
9 + container food2 {
10 + choice snack;
11 + choice lunch;
12 + }
13 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food {
6 + choice snack;
7 + }
8 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food {
6 + choice snack {
7 + }
8 + }
9 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food {
6 + choice snack {
7 + case sports-arena {
8 + leaf pretzel {
9 + type empty;
10 + }
11 + leaf beer {
12 + type empty;
13 + }
14 + }
15 + case sports-arena {
16 + leaf chocolate {
17 + type enumeration {
18 + enum dark;
19 + enum milk;
20 + enum first-available;
21 + }
22 + }
23 + }
24 + }
25 + }
26 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food {
6 + choice snack {
7 + case sports-arena {
8 + leaf pretzel {
9 + type empty;
10 + }
11 + leaf beer {
12 + type empty;
13 + }
14 + }
15 + case late-night {
16 + leaf pretzel {
17 + type empty;
18 + }
19 + }
20 + }
21 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food {
6 + choice snack {
7 + case sports-arena {
8 + leaf pretzel {
9 + type empty;
10 + }
11 + }
12 + case late-night {
13 + choice lunch {
14 + case late {
15 + leaf pretzel {
16 + type empty;
17 + }
18 + }
19 + }
20 + }
21 + }
22 + }
23 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food {
6 + choice snack {
7 + container sports-arena {
8 + leaf pretzel {
9 + type empty;
10 + }
11 + }
12 + }
13 + }
14 + }
15 +}
1 +module Test {
2 + yang-version 1;
3 + namespace http://huawei.com;
4 + prefix Ant;
5 + container food {
6 + choice snack {
7 + list sports-arena {
8 + key "pretzel";
9 + leaf pretzel {
10 + type int32;
11 + }
12 + }
13 + }
14 + }
15 + }
16 +}