API: Use string type instead of u8.
[vpp.git] / extras / japi / java / jvpp / gen / jvppgen / dto_gen.py
1 #!/usr/bin/env python2
2 #
3 # Copyright (c) 2016,2018 Cisco and/or its affiliates.
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 from string import Template
17
18 from jvpp_common_gen import generate_hash_code, generate_equals, generate_to_string, generate_fields
19 from jvpp_model import is_request, is_reply, is_retval, is_dump, is_details, is_event, is_control_ping, \
20     is_control_ping_reply
21
22
23 def generate_dtos(work_dir, model, logger):
24     logger.debug("Generating DTOs for %s " % model.json_api_files)
25     _generate_message_dtos(work_dir, model, logger)
26     _generate_dump_reply_wrappers(work_dir, model, logger)
27
28
29 def _generate_message_dtos(work_dir, model, logger):
30     for msg in model.messages:
31         logger.debug("Generating DTO for message %s", msg)
32         class_name = msg.java_name_upper
33
34         if is_control_ping(msg) or is_control_ping_reply(msg):
35             # Skip control_ping managed by jvpp registry.
36             continue
37         if is_request(msg):
38             dto = _generate_request_dto(msg, model, base_type="JVppRequest")
39         elif is_dump(msg):
40             dto = _generate_request_dto(msg, model, base_type="JVppDump")
41         elif is_reply(msg) or is_details(msg):
42             dto = _generate_reply_dto(msg, model)
43         elif is_event(msg):
44             dto = _generate_event_dto(msg, model)
45         else:
46             logger.warn("Failed to generate DTO for: %s. Message type is not supported." % msg)
47             continue
48         with open("%s/%s.java" % (work_dir, class_name), "w") as f:
49             f.write(dto)
50
51
52 def _generate_request_dto(msg, model, base_type):
53     msg_java_name_upper = msg.java_name_upper
54     fields = msg.fields
55     return _REQUEST_TEMPLATE.substitute(
56         plugin_package=model.plugin_package,
57         json_filename=model.json_api_files,
58         json_definition=msg.doc,
59         class_name=msg_java_name_upper,
60         base_type=base_type,
61         fields=generate_fields(fields),
62         hash_code=generate_hash_code(fields),
63         equals=generate_equals(msg_java_name_upper, fields),
64         to_string=generate_to_string(msg_java_name_upper, fields),
65         send=_generate_send(model, msg))
66
67 _REQUEST_TEMPLATE = Template("""
68 package $plugin_package.dto;
69
70 /**
71  * <p>This class represents request DTO.
72  * <br>It was generated by dto_gen.py based on $json_filename:
73  * <pre>
74 $json_definition
75  * </pre>
76  */
77 public final class $class_name implements io.fd.vpp.jvpp.dto.$base_type {
78 $fields
79 $hash_code
80 $equals
81 $to_string
82 $send
83 }
84 """)
85
86
87 def _generate_send(model, msg):
88     return _SEND_TEMPLATE.substitute(
89         plugin_package=model.plugin_package,
90         plugin_name=model.plugin_java_name,
91         method_name=msg.java_name_lower,
92         args="this" if msg.has_fields else ""
93     )
94
95 _SEND_TEMPLATE = Template("""
96     @Override
97     public int send(final io.fd.vpp.jvpp.JVpp jvpp) throws io.fd.vpp.jvpp.VppInvocationException {
98         return (($plugin_package.JVpp${plugin_name})jvpp).$method_name($args);
99     }""")
100
101
102 def _generate_reply_dto(msg, model):
103     msg_java_name_upper = msg.java_name_upper
104     # Negative retval is mapped to java exception, so filter it out:
105     fields = filter(lambda field: not is_retval(field), msg.fields)
106     return _REPLY_TEMPLATE.substitute(
107         plugin_package=model.plugin_package,
108         json_filename=model.json_api_files,
109         json_definition=msg.doc,
110         class_name=msg_java_name_upper,
111         request_name=msg.request_java,
112         fields=generate_fields(fields),
113         hash_code=generate_hash_code(fields),
114         equals=generate_equals(msg_java_name_upper, fields),
115         to_string=generate_to_string(msg_java_name_upper, fields))
116
117 _REPLY_TEMPLATE = Template("""
118 package $plugin_package.dto;
119
120 /**
121  * <p>This class represents reply DTO.
122  * <br>It was generated by jvpp_dto_gen.py based on $json_filename:
123  * <pre>
124 $json_definition
125  * </pre>
126  */
127 public final class $class_name implements io.fd.vpp.jvpp.dto.JVppReply<$plugin_package.dto.$request_name> {
128 $fields
129 $hash_code
130 $equals
131 $to_string
132 }
133 """)
134
135
136 def _generate_event_dto(msg, model):
137     msg_java_name_upper = msg.java_name_upper
138     # Negative retval is mapped to java exception, so filter it out:
139     fields = filter(lambda field: not is_retval(field), msg.fields)
140     return _EVENT_TEMPLATE.substitute(
141         plugin_package=model.plugin_package,
142         json_filename=model.json_api_files,
143         json_definition=msg.doc,
144         class_name=msg_java_name_upper,
145         fields=generate_fields(fields),
146         hash_code=generate_hash_code(fields),
147         equals=generate_equals(msg_java_name_upper, fields),
148         to_string=generate_to_string(msg_java_name_upper, fields))
149
150 _EVENT_TEMPLATE = Template("""
151 package $plugin_package.dto;
152
153 /**
154  * <p>This class represents event DTO.
155  * <br>It was generated by jvpp_dto_gen.py based on $json_filename:
156  * <pre>
157 $json_definition
158  * </pre>
159  */
160 public final class $class_name {
161 $fields
162 $hash_code
163 $equals
164 $to_string
165 }
166 """)
167
168
169 def _generate_dump_reply_wrappers(work_dir, model, logger):
170     for msg in model.messages:
171         if is_details(msg):
172             logger.debug("Generating ReplyDump DTO for message %s", msg)
173             details_class = msg.java_name_upper
174             dto = _REPLY_DUMP_TEMPLATE.substitute(
175                 plugin_package=model.plugin_package,
176                 json_filename=model.json_api_files,
177                 json_definition=msg.doc,
178                 details_class=details_class,
179                 details_field=msg.java_name_lower,
180                 dump_class=msg.request_java
181             )
182             with open("%s/%sReplyDump.java" % (work_dir, details_class), "w") as f:
183                 f.write(dto)
184
185 _REPLY_DUMP_TEMPLATE = Template("""
186 package $plugin_package.dto;
187
188 /**
189  * <p>This class represents dump reply wrapper.
190  * <br>It was generated by jvpp_dto_gen.py based on $json_filename:
191  * <pre>
192 $json_definition
193  * </pre>
194  */
195 public final class ${details_class}ReplyDump implements io.fd.vpp.jvpp.dto.JVppReplyDump<${plugin_package}.dto.${dump_class}, ${plugin_package}.dto.${details_class}> {
196
197     public java.util.List<${details_class}> ${details_field} = new java.util.ArrayList<>();
198
199     @Override
200     @io.fd.vpp.jvpp.coverity.SuppressFBWarnings("UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD")
201     public int hashCode() {
202         return java.util.Objects.hash(${details_field});
203     }
204
205     @Override
206     public boolean equals(final Object o) {
207         if (this == o) {
208             return true;
209         }
210         if (o == null || getClass() != o.getClass()) {
211             return false;
212         }
213
214         final ${details_class}ReplyDump other = (${details_class}ReplyDump) o;
215
216         if (!java.util.Objects.equals(this.${details_field}, other.${details_field})) {
217             return false;
218         }
219
220         return true;
221     }
222
223     @Override
224     public java.lang.String toString() {
225         return "${details_class}ReplyDump{" +
226                 "${details_field}=" + ${details_field} + "}";
227     }
228
229
230 }
231 """)