def gen_field_map_assign_stmt(self, prefix, typename, name, row_name, map_delims, tabs): assert len(map_delims) == 2, map_delims delim1 = map_delims[0].strip() if delim1 == '\\': delim1 = '\\\\' delim2 = map_delims[1].strip() if delim2 == '\\': delim2 = '\\\\' space = self.TAB_SPACE * tabs k, v = types.map_key_value_types(typename) key_type = lang.map_java_type(k) val_type = lang.map_java_type(v) content = '%sString[] tokens = %s.split("\\\\%s");\n' % ( space, row_name, delim1) content += '%sfor(int i = 0; i < tokens.length; i++) {\n' % space content += '%s String text = tokens[i];\n' % space content += '%s if (text.isEmpty()) {\n' % space content += '%s continue;\n' % space content += '%s }\n' % space content += '%s String[] item = text.split("\\\\%s");\n' % (space, delim2) prefix1 = '%s key' % key_type prefix2 = '%s value' % val_type content += self.gen_field_assgin_stmt(prefix1, key_type, 'item[0]', tabs + 1) content += self.gen_field_assgin_stmt(prefix2, val_type, 'item[1]', tabs + 1) content += '%s %s%s.put(key, value);\n' % (space, prefix, name) content += '%s}\n' % space return content
def gen_java_inner_class_assign(self, struct, prefix): content = '' inner_class_type = struct["options"][predef.PredefInnerTypeClass] inner_var_name = struct["options"][predef.PredefInnerTypeName] inner_fields = genutil.get_inner_class_struct_fields(struct) start, end, step = genutil.get_inner_class_range(struct) assert start > 0 and end > 0 and step > 1 content += ' for (int i = %s; i < %s; i += %s) \n' % (start, end, step) content += ' {\n' content += ' %s item = new %s();\n' % (inner_class_type, inner_class_type) for n in range(step): field = inner_fields[n] origin_type = field['original_type_name'] typename = lang.map_java_type(origin_type) valuetext = 'row[i + %d]' % n content += ' if (!row[i + %d].isEmpty()) \n' % n content += ' {\n' content += self.gen_field_assgin_stmt("item." + field['name'], typename, valuetext, 4) content += ' }\n' content += ' %s%s.add(item);\n' % (prefix, inner_var_name) content += ' }\n' return content
def gen_field_array_assign_stmt(self, prefix, typename, name, row_name, array_delim, tabs): assert len(array_delim) == 1 array_delim = array_delim.strip() if array_delim == '\\': array_delim = '\\\\' content = '' space = self.TAB_SPACE * tabs elem_type = types.array_element_type(typename) elem_type = lang.map_java_type(elem_type) content += '%sString[] tokens = %s.split("\\\\%s");\n' % ( space, row_name, array_delim) content += '%s%s[] list = new %s[tokens.length];\n' % ( space, elem_type, elem_type) content += '%sfor (int i = 0; i < tokens.length; i++) {\n' % space content += '%s if (!tokens[i].isEmpty()) {\n' % (self.TAB_SPACE * tabs) varname = '%s value' % elem_type content += self.gen_field_assgin_stmt(varname, elem_type, 'tokens[i]', tabs + 2) content += '%s list[i] = value;\n' % (self.TAB_SPACE * tabs) content += '%s }\n' % (self.TAB_SPACE * tabs) content += '%s}\n' % space content += '%s%s%s = list;\n' % (space, prefix, name) return content
def gen_kv_parse_method(self, struct): rows = struct['data_rows'] keycol = struct['options'][predef.PredefKeyColumn] valcol = struct['options'][predef.PredefValueColumn] typcol = int(struct['options'][predef.PredefValueTypeColumn]) assert keycol > 0 and valcol > 0 and typcol > 0 keyidx, keyfield = genutil.get_field_by_column_index(struct, keycol) validx, valfield = genutil.get_field_by_column_index(struct, valcol) typeidx, typefield = genutil.get_field_by_column_index(struct, typcol) array_delim = struct['options'].get(predef.OptionArrayDelimeter, predef.DefaultArrayDelimiter) map_delims = struct['options'].get(predef.OptionMapDelimeters, predef.DefaultMapDelimiters) content = '' content += '%s// parse fields data from text rows\n' % self.TAB_SPACE content += '%spublic void parseFromRows(String[][] rows)\n' % self.TAB_SPACE content += '%s{\n' % self.TAB_SPACE content += '%s if (rows.length < %d) {\n' % (self.TAB_SPACE, len(rows)) content += '%s throw new RuntimeException(String.format("%s: row length out of index, %%d < %d", rows.length));\n' % ( self.TAB_SPACE, struct['name'], len(rows)) content += '%s}\n' % (self.TAB_SPACE * 2) idx = 0 for row in rows: name = rows[idx][keyidx].strip() name = strutil.camel_case(name) origin_typename = rows[idx][typeidx].strip() typename = lang.map_java_type(origin_typename) valuetext = 'rows[%d][%d]' % (idx, validx) # print('kv', name, origin_typename, valuetext) if origin_typename.startswith('array'): content += '%s{\n' % (self.TAB_SPACE * 2) content += self.gen_field_array_assign_stmt( 'this.', origin_typename, name, valuetext, array_delim, 3) content += '%s}\n' % (self.TAB_SPACE * 2) elif origin_typename.startswith('map'): content += '%s{\n' % (self.TAB_SPACE * 2) content += self.gen_field_map_assign_stmt( 'this.', origin_typename, name, valuetext, map_delims, 3) content += '%s}\n' % (self.TAB_SPACE * 2) else: content += '%sif (!rows[%d][%d].isEmpty()) {\n' % ( self.TAB_SPACE * 2, idx, validx) content += self.gen_field_assgin_stmt('this.' + name, typename, valuetext, 3) content += '%s}\n' % (self.TAB_SPACE * 2) idx += 1 content += '%s}\n\n' % self.TAB_SPACE return content
def gen_java_class(self, struct): content = '' fields = struct['fields'] if struct['options'][predef.PredefParseKVMode]: fields = genutil.get_struct_kv_fields(struct) content += '// %s, %s\n' % (struct['comment'], struct['file']) content += 'public class %s\n{\n' % struct['name'] inner_class_done = False inner_typename = '' inner_var_name = '' inner_type_class = '' inner_field_names, inner_fields = genutil.get_inner_class_mapped_fields(struct) if len(inner_fields) > 0: content += self.gen_java_inner_class(struct) inner_type_class = struct["options"][predef.PredefInnerTypeClass] inner_var_name = struct["options"][predef.PredefInnerTypeName] vec_done = False vec_names, vec_name = genutil.get_vec_field_range(struct) max_name_len = strutil.max_field_length(fields, 'name', None) max_type_len = strutil.max_field_length(fields, 'original_type_name', lang.map_java_type) if len(inner_typename) > max_type_len: max_type_len = len(inner_typename) for field in fields: field_name = field['name'] if field_name in inner_field_names: if not inner_class_done: typename = "ArrayList<>();" content += ' public List<%s> %s = new %s \n' % (inner_type_class, inner_var_name, typename) inner_class_done = True else: typename = lang.map_java_type(field['original_type_name']) assert typename != "", field['original_type_name'] typename = strutil.pad_spaces(typename, max_type_len + 1) if field['name'] not in vec_names: name = lang.name_with_default_java_value(field, typename) name = strutil.pad_spaces(name, max_name_len + 8) content += ' public %s %s // %s\n' % (typename, name, field['comment']) elif not vec_done: name = '%s = new %s[%d];' % (vec_name, typename.strip(), len(vec_names)) name = strutil.pad_spaces(name, max_name_len + 8) content += ' public %s[] %s // %s\n' % (typename.strip(), name, field['comment']) vec_done = True return content
def gen_java_inner_class(self, struct): content = '' class_name = struct["options"][predef.PredefInnerTypeClass] inner_fields = genutil.get_inner_class_struct_fields(struct) content += ' public static class %s \n' % class_name content += ' {\n' max_name_len = strutil.max_field_length(inner_fields, 'name', None) max_type_len = strutil.max_field_length(inner_fields, 'original_type_name', lang.map_java_type) for field in inner_fields: typename = lang.map_java_type(field['original_type_name']) assert typename != "", field['original_type_name'] typename = strutil.pad_spaces(typename, max_type_len + 1) name = lang.name_with_default_java_value(field, typename) name = strutil.pad_spaces(name, max_name_len + 8) content += ' public %s %s // %s\n' % (typename.strip(), name, field['comment']) content += ' }\n\n' return content
def gen_parse_method(self, struct): content = '' if struct['options'][predef.PredefParseKVMode]: return self.gen_kv_parse_method(struct) array_delim = struct['options'].get(predef.OptionArrayDelimeter, predef.DefaultArrayDelimiter) map_delims = struct['options'].get(predef.OptionMapDelimeters, predef.DefaultMapDelimiters) vec_idx = 0 vec_names, vec_name = genutil.get_vec_field_range(struct) inner_class_done = False inner_field_names, inner_fields = genutil.get_inner_class_mapped_fields( struct) content += '%s// parse fields data from text row\n' % self.TAB_SPACE content += '%spublic void parseFromRow(String[] row)\n' % self.TAB_SPACE content += '%s{\n' % self.TAB_SPACE content += '%sif (row.length < %d) {\n' % (self.TAB_SPACE * 2, len(struct['fields'])) content += '%sthrow new RuntimeException(String.format("%s: row length out of index %%d", row.length));\n' % ( self.TAB_SPACE * 3, struct['name']) content += '%s}\n' % (self.TAB_SPACE * 2) idx = 0 prefix = 'this.' for field in struct['fields']: field_name = field['name'] if field_name in inner_field_names: if not inner_class_done: inner_class_done = True content += self.gen_java_inner_class_assign(struct, prefix) else: origin_type_name = field['original_type_name'] typename = lang.map_java_type(origin_type_name) valuetext = 'row[%d]' % idx if origin_type_name.startswith('array'): content += '%s{\n' % (self.TAB_SPACE * 2) content += self.gen_field_array_assign_stmt( prefix, origin_type_name, field_name, valuetext, array_delim, 3) content += '%s}\n' % (self.TAB_SPACE * 2) elif origin_type_name.startswith('map'): content += '%s{\n' % (self.TAB_SPACE * 2) content += self.gen_field_map_assign_stmt( prefix, origin_type_name, field_name, valuetext, map_delims, 3) content += '%s}\n' % (self.TAB_SPACE * 2) else: content += '%sif (!row[%d].isEmpty()) {\n' % ( self.TAB_SPACE * 2, idx) if field_name in vec_names: name = '%s[%d]' % (vec_name, vec_idx) content += self.gen_field_assgin_stmt( prefix + name, typename, valuetext, 3) vec_idx += 1 else: content += self.gen_field_assgin_stmt( prefix + field_name, typename, valuetext, 3) content += '%s}\n' % (self.TAB_SPACE * 2) idx += 1 content += '%s}\n\n' % self.TAB_SPACE return content