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:
8 # http://www.apache.org/licenses/LICENSE-2.0
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.
16 from string import Template
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, \
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)
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
34 if is_control_ping(msg) or is_control_ping_reply(msg):
35 # Skip control_ping managed by jvpp registry.
38 dto = _generate_request_dto(msg, model, base_type="JVppRequest")
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)
44 dto = _generate_event_dto(msg, model)
46 logger.warn("Failed to generate DTO for: %s. Message type is not supported." % msg)
48 with open("%s/%s.java" % (work_dir, class_name), "w") as f:
52 def _generate_request_dto(msg, model, base_type):
53 msg_java_name_upper = msg.java_name_upper
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,
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))
67 _REQUEST_TEMPLATE = Template("""
68 package $plugin_package.dto;
71 * <p>This class represents request DTO.
72 * <br>It was generated by dto_gen.py based on $json_filename:
77 public final class $class_name implements io.fd.vpp.jvpp.dto.$base_type {
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 ""
95 _SEND_TEMPLATE = Template("""
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);
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))
117 _REPLY_TEMPLATE = Template("""
118 package $plugin_package.dto;
121 * <p>This class represents reply DTO.
122 * <br>It was generated by jvpp_dto_gen.py based on $json_filename:
127 public final class $class_name implements io.fd.vpp.jvpp.dto.JVppReply<$plugin_package.dto.$request_name> {
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))
150 _EVENT_TEMPLATE = Template("""
151 package $plugin_package.dto;
154 * <p>This class represents event DTO.
155 * <br>It was generated by jvpp_dto_gen.py based on $json_filename:
160 public final class $class_name {
169 def _generate_dump_reply_wrappers(work_dir, model, logger):
170 for msg in model.messages:
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
182 with open("%s/%sReplyDump.java" % (work_dir, details_class), "w") as f:
185 _REPLY_DUMP_TEMPLATE = Template("""
186 package $plugin_package.dto;
189 * <p>This class represents dump reply wrapper.
190 * <br>It was generated by jvpp_dto_gen.py based on $json_filename:
195 public final class ${details_class}ReplyDump implements io.fd.vpp.jvpp.dto.JVppReplyDump<${plugin_package}.dto.${dump_class}, ${plugin_package}.dto.${details_class}> {
197 public java.util.List<${details_class}> ${details_field} = new java.util.ArrayList<>();
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});
206 public boolean equals(final Object o) {
210 if (o == null || getClass() != o.getClass()) {
214 final ${details_class}ReplyDump other = (${details_class}ReplyDump) o;
216 if (!java.util.Objects.equals(this.${details_field}, other.${details_field})) {
224 public java.lang.String toString() {
225 return "${details_class}ReplyDump{" +
226 "${details_field}=" + ${details_field} + "}";