def parse(self, directory): # create core folder if not exists and remove last build jni_dir_path = 'jni' io_utils.make_directory_if_not_exists(jni_dir_path) # start parsing xml e = xml.etree.ElementTree.parse(directory) root = e.getroot() # search directories for folder_node in root.findall('group'): group_name = folder_node.get('name') # search classes for class_node in folder_node.findall('class'): class_name = class_node.get('name') print 'Find class {0} under "{1}" group'.format(class_name, group_name) # parse all <variable/> jni_var_list = [] for variable in class_node.findall('variable'): variable_name = variable.get('name') variable_type = variable.get('type') variable_enum_or_none = variable.get('enum') jni_var = JniVariable(variable_name, variable_type, group_name, class_name) jni_var.set_enum_class_name(variable_enum_or_none) jni_var_list.append(jni_var) # parse <manager/> jni_manager = None manager_or_none = class_node.find('manager') if manager_or_none is not None: manager_name = manager_or_none.get('name') jni_manager = JniManager(manager_name) # parse all <save/> for save_node in manager_or_none.findall('save'): is_plural = False plural_node = save_node.get('plural') if plural_node is not None: is_plural = True save_command = CppManagerSaveCommand(is_plural) jni_manager.add_save_command(save_command) # parse all <delete/> for delete_node in manager_or_none.findall('delete'): is_plural = False plural_node = delete_node.get('plural') if plural_node is not None: is_plural = True by = delete_node.get('by') delete_command = CppManagerDeleteCommand(is_plural, by) jni_manager.add_delete_command(delete_command) # parse all <fetch/> for fetch_node in manager_or_none.findall('fetch'): is_plural = False plural_node = fetch_node.get('plural') if plural_node is not None: is_plural = True by = fetch_node.get('by') fetch_command = CppManagerFetchCommand(is_plural, by) jni_manager.add_fetch_command(fetch_command) # write jni wrapper header jni_wrapper = JniClass(group_name, class_name, jni_var_list, jni_manager) jni_wrapper.generate_header() # write jni wrapper implementation jni_wrapper.generate_implementation() # write jni wrapper manager header jni_wrapper.generate_manager_header() # write jni wrapper manager implementation jni_wrapper.generate_manager_implementation()
from skr_java_builder.java_model_xml_parser import JavaModelXmlParser from skr_jni_builder.jni_model_xml_parser import JniModelXmlParser from skr_objc_builder.objc_model_xml_parser import ObjcModelXmlParser from skrutil import io_utils from skrutil.config import Config if __name__ == "__main__": # Fixes Chinese chars encoding issue reload(sys) sys.setdefaultencoding('utf-8') input_file_path = sys.argv[1] dir_path, file_name = os.path.split(input_file_path) io_utils.make_directory_if_not_exists("build") if dir_path is None or dir_path == '': dir_path = '当前路径' print('输入的文件路径为:{0}, 文件名为:{1}'.format(dir_path, file_name)) print('开始解析据...') config = Config('config/worktile.precfg.xml') parser = CppModelXmlParser(6.0) parser.parse(input_file_path, config) objc_parser = ObjcModelXmlParser(6.0) objc_parser.parse(input_file_path, config)
def parse(self, directory, config): """Parse the input file with user-defined config. Args: directory: A string represents module.xml file. config: A <Config> object represents user-defined info, such as class prefix. """ # create core folder if not exists and remove last build objc_dir_path = 'build/ObjectiveCppWrapper' io_utils.make_directory_if_not_exists(objc_dir_path) # start parsing xml e = xml.etree.ElementTree.parse(directory) root = e.getroot() # search directories for folder_node in root.findall('group'): group_name = folder_node.get('name') objc_group_name = 'build/ObjectiveCppWrapper/' + string_utils.cpp_group_name_to_objc_group_name(group_name) io_utils.make_directory_if_not_exists(objc_group_name) # search classes for class_node in folder_node.findall('class'): class_name = class_node.get('name') print 'Find objc class {0} under "{1}" group'.format(class_name, group_name) # parse all <enum/> objc_enum_list = [] for enum in class_node.findall('enum'): enum_name = enum.get('name') objc_enum = ObjcEnum(enum_name) for enum_value in enum.findall('value'): int_value = enum_value.get('int_value') alias = enum_value.get('alias') objc_enum.append(int_value, alias) objc_enum_list.append(objc_enum) # parse all <variable/> objc_var_list = [] for variable in class_node.findall('variable'): variable_name = variable.get('name') variable_type = variable.get('type') variable_enum_or_none = variable.get('enum') objc_var = ObjcVariable(variable_name, variable_type) objc_var.set_enum_class_name(variable_enum_or_none) objc_var_list.append(objc_var) # parse <manager/> objc_manager = None manager_or_none = class_node.find('manager') if manager_or_none is not None: manager_name = manager_or_none.get('name') objc_manager = ObjcManager(manager_name) # parse all <save/> for save_node in manager_or_none.findall('save'): is_plural = False plural_node = save_node.get('plural') if plural_node is not None: is_plural = True alias_attr = save_node.get('alias') save_command = CppManagerSaveCommand(is_plural, [], alias_attr) objc_manager.add_save_command(save_command) # parse all <delete/> for delete_node in manager_or_none.findall('delete'): is_plural = False plural_node = delete_node.get('plural') if plural_node is not None: is_plural = True by = delete_node.get('by') alias_attr = delete_node.get('alias') delete_command = CppManagerDeleteCommand(is_plural, by, [], alias_attr) objc_manager.add_delete_command(delete_command) # parse all <fetch/> for fetch_node in manager_or_none.findall('fetch'): is_plural = False plural_node = fetch_node.get('plural') if plural_node is not None: is_plural = True by = fetch_node.get('by') sort_by_or_none = fetch_node.get('sort') is_asc = True if sort_by_or_none is not None: desc_desciption_or_none = fetch_node.get('desc') if desc_desciption_or_none is not None: if desc_desciption_or_none == 'true': is_asc = False alias_attr = fetch_node.get('alias') fetch_command = CppManagerFetchCommand(is_plural, by, sort_by_or_none, is_asc, [], alias_attr) objc_manager.add_fetch_command(fetch_command) # parse all <api/> for api_node in manager_or_none.findall('api'): api_name = api_node.get('name') api_alias = api_node.get('alias') api_method = api_node.get('method') api_uri = api_node.get('uri') input_var_list = [] inputs_node = api_node.find('inputs') for variable_node in inputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = ObjcVariable(var_name, var_type_string) var.set_enum_class_name(var_enum_or_none) input_var_list.append(var) output_var_list = [] outputs_node = api_node.find('outputs') for variable_node in outputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = ObjcVariable(var_name, var_type_string) var.set_enum_class_name(var_enum_or_none) output_var_list.append(var) api = CppApiDescription(api_name, api_alias, api_method, api_uri, input_var_list, output_var_list, []) objc_manager.add_api_description(api) # write objective-c++ wrapper core addition header objc_wrapper = ObjcClass(group_name, class_name, objc_var_list, objc_enum_list, objc_manager) objc_wrapper.generate_core_addition_header(config) # write objective-c++ wrapper header objc_wrapper.generate_header(config) # write objective-c++ wrapper implementation objc_wrapper.generate_implementation(config) # write objective-c++ wrapper manager category header objc_wrapper.generate_manager_core_addition_header(config) # write objective-c++ wrapper manager header objc_wrapper.generate_manager_header(config) # write objective-c++ wrapper manager implementation objc_wrapper.generate_manager_implementation(config)
def parse(self, directory, config): """Parses module XML file and gets code for JNI implementation. Args: directory: The directory which is full path of XML file. config: A <Config> object describes user-defined names. Returns: A string which is JNI implementation. """ # create core folder if not exists and remove last build jni_dir_path = 'build/jni' io_utils.make_directory_if_not_exists(jni_dir_path) # start parsing xml e = xml.etree.ElementTree.parse(directory) root = e.getroot() # search directories for folder_node in root.findall('group'): group_name = folder_node.get('name') # search classes for class_node in folder_node.findall('class'): class_name = class_node.get('name') print 'Find class {0} under "{1}" group'.format( class_name, group_name) # parse all <variable/> jni_var_list = [] for variable in class_node.findall('variable'): variable_name = variable.get('name') variable_type = variable.get('type') variable_enum_or_none = variable.get('enum') jni_var = JniVariable(variable_name, variable_type, group_name, class_name) jni_var.set_enum_class_name(variable_enum_or_none) jni_var_list.append(jni_var) # parse <manager/> jni_manager = None manager_or_none = class_node.find('manager') if manager_or_none is not None: manager_name = manager_or_none.get('name') jni_manager = JniManager(manager_name) # parse all <save/> for save_node in manager_or_none.findall('save'): is_plural = False plural_node = save_node.get('plural') if plural_node is not None: is_plural = True save_command = JniManagerSaveCommand(is_plural) jni_manager.add_save_command(save_command) # parse all <delete/> for delete_node in manager_or_none.findall('delete'): is_plural = False plural_node = delete_node.get('plural') if plural_node is not None: is_plural = True by = delete_node.get('by') delete_command = JniManagerDeleteCommand(is_plural, by) jni_manager.add_delete_command(delete_command) # parse all <fetch/> for fetch_node in manager_or_none.findall('fetch'): is_plural = False is_plural_attr = fetch_node.get('plural') if is_plural_attr == 'true': is_plural = True by = fetch_node.get('by') alias = fetch_node.get('alias') fetch_command = JniManagerFetchCommand( is_plural, by, alias) jni_manager.add_fetch_command(fetch_command) for fetch_node in manager_or_none.findall('fetches'): is_plural = True by = fetch_node.get('by') alias = fetch_node.get('alias') fetch_command = JniManagerFetchCommand( is_plural, by, alias) jni_manager.add_fetch_command(fetch_command) # parse all <api/> for api_node in manager_or_none.findall('api'): api_function_name = api_node.get('name') function_name = api_node.get('alias') input_var_list = [] inputs_node = api_node.find('inputs') for variable_node in inputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = JniVariable(var_name, var_type_string, group_name, class_name) var.set_enum_class_name(var_enum_or_none) input_var_list.append(var) output_var_list = [] outputs_node = api_node.find('outputs') for variable_node in outputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = JniVariable(var_name, var_type_string, group_name, class_name) var.set_enum_class_name(var_enum_or_none) output_var_list.append(var) api = JniApiDescription(function_name, input_var_list, output_var_list) jni_manager.add_api_description(api) jni_wrapper = JniClass(group_name, class_name, jni_var_list, jni_manager) if self.__version < 5.0: # write jni wrapper header jni_wrapper.generate_header() # write jni wrapper implementation jni_wrapper.generate_implementation() # write jni wrapper manager header jni_wrapper.generate_manager_header() # write jni wrapper manager implementation jni_wrapper.generate_manager_implementation() else: # write jni helper implementation jni_wrapper.generate_jni_helper_implementation(config) # write jni wrapper manager implementation jni_wrapper.generate_manager_implementation( self.__version, config)
def parse(self, directory): """Parse module description xml file and translate them into Cpp objects. Args: directory: Path of xml file including the file. """ # create core folder if not exists and remove last build core_dir_path = 'build/core' io_utils.make_directory_if_not_exists(core_dir_path) # create api folder if not exists and remove last build api_dir_path = 'build/core/api' io_utils.make_directory_if_not_exists(api_dir_path) # start parsing xml e = xml.etree.ElementTree.parse(directory) root = e.getroot() # search all <define/> replacement_list = [] for define_node in root.findall('define'): replacement = CppReplacement(define_node.get('name'), define_node.get('description')) replacement_list.append(replacement) # search directories for folder_node in root.findall('group'): group_name = folder_node.get('name') group_name = 'core/' + group_name io_utils.make_directory_if_not_exists('build/{0}'.format(group_name)) # search classes for class_node in folder_node.findall('class'): class_name = class_node.get('name') class_comment = class_node.get('comment') print('Find class {0} under "{1}" group'.format(class_name, group_name)) # parse all <enum/> cpp_enum_list = [] for enum in class_node.findall('enum'): enum_name = enum.get('name') cpp_enum = CppEnum(enum_name) for enum_value in enum.findall('value'): int_value = enum_value.get('int_value') alias = enum_value.get('alias') cpp_enum.append(int_value, alias) cpp_enum_list.append(cpp_enum) # parse all <variable/> cpp_var_list = [] for variable in class_node.findall('variable'): cpp_var = CppModelXmlParser.__parse_variable_node(variable) cpp_var_list.append(cpp_var) # parse <manager/> cpp_manager = None manager_node_or_none = class_node.find('manager') if manager_node_or_none is not None: manager_name = manager_node_or_none.get('name') cpp_manager = CppManager(manager_name) # parse all <save/> for save_node in manager_node_or_none.findall('save'): save_command = CppModelXmlParser.__parse_save_node(save_node) cpp_manager.add_save_command(save_command) # parse all <saves/> for saves_node in manager_node_or_none.findall('saves'): save_command = CppModelXmlParser.__parse_saves_node(saves_node) cpp_manager.add_save_command(save_command) # parse all <delete/> for delete_node in manager_node_or_none.findall('delete'): delete_command = CppModelXmlParser.__parse_delete_command(delete_node) cpp_manager.add_delete_command(delete_command) # parse all <deletes/> for deletes_node in manager_node_or_none.findall('deletes'): delete_command = CppModelXmlParser.__parse_deletes_command(deletes_node) cpp_manager.add_delete_command(delete_command) # parse all <fetch/> for fetch_node in manager_node_or_none.findall('fetch'): fetch_command = CppModelXmlParser.__parse_fetch_node(fetch_node) cpp_manager.add_fetch_command(fetch_command) # parse all <fetches/> for fetches_node in manager_node_or_none.findall('fetches'): fetch_command = CppModelXmlParser.__parse_fetches_node(fetches_node) cpp_manager.add_fetch_command(fetch_command) # parse all <api/> for api_node in manager_node_or_none.findall('api'): api_name = api_node.get('name') api_alias = api_node.get('alias') api_method = api_node.get('method') api_uri = api_node.get('uri') input_var_list = [] inputs_node = api_node.find('inputs') for variable_node in inputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_json_path = variable_node.get('json_path') var_cache_desc = variable_node.get('cache') var_enum_or_none = variable_node.get('enum') var_capture_or_none = variable_node.get('capture') if var_capture_or_none is None: var_capture_or_none = False var = CppVariable(var_name, var_type_string, var_json_path, None, var_cache_desc, var_capture_or_none) var.set_enum_class_name(var_enum_or_none) input_var_list.append(var) output_var_list = [] extra_list = [] outputs_node = api_node.find('outputs') for variable_node in outputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_json_path = variable_node.get('json_path') var_cache_desc = variable_node.get('cache') var_enum_or_none = variable_node.get('enum') var = CppVariable(var_name, var_type_string, var_json_path, None, var_cache_desc) var.set_enum_class_name(var_enum_or_none) output_var_list.append(var) # parse <extra/> inside <output/> for extra_node in outputs_node.findall('extra'): extra_list.append(extra_node.get('cache')) api = CppApiDescription(api_name, api_alias, api_method, api_uri, input_var_list, output_var_list, extra_list) cpp_manager.add_api_description(api) # parse <tables/> table_name_list = [] tables_node_or_none = manager_node_or_none.find('tables') if tables_node_or_none is not None: for table_node in tables_node_or_none.findall('table'): table_name_list.append(table_node.get('name')) cpp_manager.set_table_name_list(table_name_list) # write object header cpp_class = CppClass(group_name, class_name, cpp_var_list, cpp_enum_list, cpp_manager, replacement_list, class_comment) cpp_class.generate_header() # write object implementation cpp_class.generate_implementation() # write manager header cpp_class.generate_manager_header() # write manager implementation cpp_class.generate_manager_implementation() # write web_api_object.h under "api" folder cpp_class.generate_web_api_header() # write web_api_object.cc under "api" folder cpp_class.generate_web_api_implementation()
def parse(self, directory, config): """Parse module description xml file and translate them into Cpp objects. Args: directory: Path of xml file including the file. """ # compact with older version if self.__version < 6.0: if config is None: config = Config('config/lesschat.precfg.xml') # create core folder if not exists and remove last build core_dir_path = 'build/core' io_utils.make_directory_if_not_exists(core_dir_path) # create api folder if not exists and remove last build api_dir_path = 'build/core/api' io_utils.make_directory_if_not_exists(api_dir_path) # start parsing xml e = xml.etree.ElementTree.parse(directory) root = e.getroot() # search all <define/> replacement_list = [] for define_node in root.findall('define'): replacement = CppReplacement(define_node.get('name'), define_node.get('description')) replacement_list.append(replacement) # search directories for folder_node in root.findall('group'): group_name = folder_node.get('name') group_name = 'core/' + group_name io_utils.make_directory_if_not_exists('build/{0}'.format(group_name)) # search classes for class_node in folder_node.findall('class'): class_name = class_node.get('name') class_comment = class_node.get('comment') print('Find class {0} under "{1}" group'.format(class_name, group_name)) # parse all <enum/> cpp_enum_list = [] for enum in class_node.findall('enum'): enum_name = enum.get('name') cpp_enum = CppEnum(enum_name) for enum_value in enum.findall('value'): int_value = enum_value.get('int_value') alias = enum_value.get('alias') cpp_enum.append(int_value, alias) cpp_enum_list.append(cpp_enum) # parse all <variable/> cpp_var_list = [] for variable in class_node.findall('variable'): cpp_var = CppModelXmlParser.__parse_variable_node(variable) cpp_var_list.append(cpp_var) # parse <manager/> cpp_manager = None manager_node_or_none = class_node.find('manager') if manager_node_or_none is not None: manager_name = manager_node_or_none.get('name') cpp_manager = CppManager(manager_name) # parse all <save/> for save_node in manager_node_or_none.findall('save'): save_command = CppModelXmlParser.__parse_save_node(save_node) cpp_manager.add_save_command(save_command) # parse all <saves/> for saves_node in manager_node_or_none.findall('saves'): save_command = CppModelXmlParser.__parse_saves_node(saves_node) cpp_manager.add_save_command(save_command) # parse all <delete/> for delete_node in manager_node_or_none.findall('delete'): delete_command = CppModelXmlParser.__parse_delete_command(delete_node) cpp_manager.add_delete_command(delete_command) # parse all <deletes/> for deletes_node in manager_node_or_none.findall('deletes'): delete_command = CppModelXmlParser.__parse_deletes_command(deletes_node) cpp_manager.add_delete_command(delete_command) # parse all <fetch/> for fetch_node in manager_node_or_none.findall('fetch'): fetch_command = CppModelXmlParser.__parse_fetch_node(fetch_node) cpp_manager.add_fetch_command(fetch_command) # parse all <fetches/> for fetches_node in manager_node_or_none.findall('fetches'): fetch_command = CppModelXmlParser.__parse_fetches_node(fetches_node) cpp_manager.add_fetch_command(fetch_command) # parse all <api/> for api_node in manager_node_or_none.findall('api'): api_name = api_node.get('name') api_alias = api_node.get('alias') api_method = api_node.get('method') api_uri = api_node.get('uri') input_var_list = [] inputs_node = api_node.find('inputs') for variable_node in inputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_json_path = variable_node.get('json_path') var_cache_desc = variable_node.get('cache') var_enum_or_none = variable_node.get('enum') var_capture_or_none = variable_node.get('capture') if var_capture_or_none is None: var_capture_or_none = False var = CppVariable(var_name, var_type_string, var_json_path, None, var_cache_desc, var_capture_or_none) var.set_enum_class_name(var_enum_or_none) input_var_list.append(var) output_var_list = [] extra_list = [] outputs_node = api_node.find('outputs') for variable_node in outputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_json_path = variable_node.get('json_path') var_cache_desc = variable_node.get('cache') var_enum_or_none = variable_node.get('enum') var = CppVariable(var_name, var_type_string, var_json_path, None, var_cache_desc) var.set_enum_class_name(var_enum_or_none) output_var_list.append(var) # parse <extra/> inside <output/> for extra_node in outputs_node.findall('extra'): extra_list.append(extra_node.get('cache')) api = CppApiDescription(api_name, api_alias, api_method, api_uri, input_var_list, output_var_list, extra_list) cpp_manager.add_api_description(api) # parse <tables/> table_name_list = [] tables_node_or_none = manager_node_or_none.find('tables') if tables_node_or_none is not None: for table_node in tables_node_or_none.findall('table'): table_name_list.append(table_node.get('name')) cpp_manager.set_table_name_list(table_name_list) # write object header cpp_class = CppClass(group_name, class_name, cpp_var_list, cpp_enum_list, cpp_manager, replacement_list, class_comment) cpp_class.set_config(config) cpp_class.generate_header() # write object implementation cpp_class.generate_implementation() # write manager header cpp_class.generate_manager_header() # write manager implementation cpp_class.generate_manager_implementation() # write web_api_object.h under "api" folder cpp_class.generate_web_api_header() # write web_api_object.cc under "api" folder cpp_class.generate_web_api_implementation()
from skr_cpp_builder.model_xml_parser import CppModelXmlParser from skr_java_builder.java_model_xml_parser import JavaModelXmlParser from skr_jni_builder.jni_model_xml_parser import JniModelXmlParser from skr_objc_builder.objc_model_xml_parser import ObjcModelXmlParser from skrutil import io_utils from skrutil.config import Config if __name__ == "__main__": # Fixes Chinese chars encoding issue reload(sys) sys.setdefaultencoding('utf-8') input_file_path = sys.argv[1] dir_path, file_name = os.path.split(input_file_path) io_utils.make_directory_if_not_exists("build") if dir_path is None or dir_path == '': dir_path = '当前路径' print('输入的文件路径为:{0}, 文件名为:{1}'.format(dir_path, file_name)) print('开始解析据...') config = Config('config/worktile.precfg.xml') parser = CppModelXmlParser(6.0) parser.parse(input_file_path, config) objc_parser = ObjcModelXmlParser(4.0) objc_parser.parse(input_file_path)
def parse(self, directory): # create core folder if not exists and remove last build core_dir_path = 'build/core' io_utils.make_directory_if_not_exists(core_dir_path) # create api folder if not exists and remove last build api_dir_path = 'build/core/api' io_utils.make_directory_if_not_exists(api_dir_path) # start parsing xml e = xml.etree.ElementTree.parse(directory) root = e.getroot() # search all <define/> replacement_list = [] for define_node in root.findall('define'): replacement = CppReplacement(define_node.get('name'), define_node.get('description')) replacement_list.append(replacement) # search directories for folder_node in root.findall('group'): group_name = folder_node.get('name') group_name = 'core/' + group_name io_utils.make_directory_if_not_exists('build/{0}'.format(group_name)) # search classes for class_node in folder_node.findall('class'): class_name = class_node.get('name') class_comment = class_node.get('comment') print('Find class {0} under "{1}" group'.format(class_name, group_name)) # parse all <enum/> cpp_enum_list = [] for enum in class_node.findall('enum'): enum_name = enum.get('name') cpp_enum = CppEnum(enum_name) for enum_value in enum.findall('value'): int_value = enum_value.get('int_value') alias = enum_value.get('alias') cpp_enum.append(int_value, alias) cpp_enum_list.append(cpp_enum) # parse all <variable/> cpp_var_list = [] for variable in class_node.findall('variable'): variable_name = variable.get('name') variable_type = variable.get('type') variable_json_path = variable.get('json_path') variable_enum_or_none = variable.get('enum') variable_sql_flag = variable.get('sql_flag') variable_json_search_path = variable.get('json_search_path') cpp_var = CppVariable(variable_name, variable_type, variable_json_path, variable_sql_flag) cpp_var.set_enum_class_name(variable_enum_or_none) cpp_var.set_json_search_path(variable_json_search_path) cpp_var_list.append(cpp_var) # parse <manager/> cpp_manager = None manager_or_none = class_node.find('manager') if manager_or_none is not None: manager_name = manager_or_none.get('name') cpp_manager = CppManager(manager_name) # parse all <save/> for save_node in manager_or_none.findall('save'): is_plural = False plural_node = save_node.get('plural') if plural_node is not None: is_plural = True save_command = CppManagerSaveCommand(is_plural) cpp_manager.add_save_command(save_command) # parse all <delete/> for delete_node in manager_or_none.findall('delete'): is_plural = False plural_node = delete_node.get('plural') if plural_node is not None: is_plural = True by = delete_node.get('by') delete_command = CppManagerDeleteCommand(is_plural, by) cpp_manager.add_delete_command(delete_command) # parse all <fetch/> for fetch_node in manager_or_none.findall('fetch'): is_plural = False plural_node = fetch_node.get('plural') if plural_node is not None: is_plural = True by = fetch_node.get('by') sort_by_or_none = fetch_node.get('sort') is_asc = True if sort_by_or_none is not None: desc_desciption_or_none = fetch_node.get('desc') if desc_desciption_or_none is not None: if desc_desciption_or_none == 'true': is_asc = False fetch_command = CppManagerFetchCommand(is_plural, by, sort_by_or_none, is_asc) cpp_manager.add_fetch_command(fetch_command) # parse all <api/> for api_node in manager_or_none.findall('api'): api_name = api_node.get('name') api_alias = api_node.get('alias') api_method = api_node.get('method') api_uri = api_node.get('uri') input_var_list = [] inputs_node = api_node.find('inputs') for variable_node in inputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_json_path = variable_node.get('json_path') var_cache_desc = variable_node.get('cache') var_enum_or_none = variable_node.get('enum') var_capture_or_none = variable_node.get('capture') if var_capture_or_none is None: var_capture_or_none = False var = CppVariable(var_name, var_type_string, var_json_path, None, var_cache_desc, var_capture_or_none) var.set_enum_class_name(var_enum_or_none) input_var_list.append(var) output_var_list = [] extra_list = [] outputs_node = api_node.find('outputs') for variable_node in outputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_json_path = variable_node.get('json_path') var_cache_desc = variable_node.get('cache') var_enum_or_none = variable_node.get('enum') var = CppVariable(var_name, var_type_string, var_json_path, None, var_cache_desc) var.set_enum_class_name(var_enum_or_none) output_var_list.append(var) # parse <extra/> inside <output/> for extra_node in outputs_node.findall('extra'): extra_list.append(extra_node.get('cache')) api = CppApiDescription(api_name, api_alias, api_method, api_uri, input_var_list, output_var_list, extra_list) cpp_manager.add_api_description(api) # write object header cpp_class = CppClass(group_name, class_name, cpp_var_list, cpp_enum_list, cpp_manager, replacement_list, class_comment) cpp_class.generate_header() # write object implementation cpp_class.generate_implementation() # write manager header cpp_class.generate_manager_header() # write manager implementation cpp_class.generate_manager_implementation() # write web_api_object.h under "api" folder cpp_class.generate_web_api_header() # write web_api_object.cc under "api" folder cpp_class.generate_web_api_implementation()
def parse(self, directory, config): """Parses module XML file and gets code for JNI implementation. Args: directory: The directory which is full path of XML file. config: A <Config> object describes user-defined names. Returns: A string which is JNI implementation. """ # create core folder if not exists and remove last build jni_dir_path = 'build/jni' io_utils.make_directory_if_not_exists(jni_dir_path) # start parsing xml e = xml.etree.ElementTree.parse(directory) root = e.getroot() # search directories for folder_node in root.findall('group'): group_name = folder_node.get('name') # search classes for class_node in folder_node.findall('class'): class_name = class_node.get('name') print 'Find class {0} under "{1}" group'.format(class_name, group_name) # parse all <variable/> jni_var_list = [] for variable in class_node.findall('variable'): variable_name = variable.get('name') variable_type = variable.get('type') variable_enum_or_none = variable.get('enum') jni_var = JniVariable(variable_name, variable_type, group_name, class_name) jni_var.set_enum_class_name(variable_enum_or_none) jni_var_list.append(jni_var) # parse <manager/> jni_manager = None manager_or_none = class_node.find('manager') if manager_or_none is not None: manager_name = manager_or_none.get('name') jni_manager = JniManager(manager_name) # parse all <save/> for save_node in manager_or_none.findall('save'): is_plural = False plural_node = save_node.get('plural') if plural_node is not None: is_plural = True save_command = JniManagerSaveCommand(is_plural) jni_manager.add_save_command(save_command) # parse all <delete/> for delete_node in manager_or_none.findall('delete'): is_plural = False plural_node = delete_node.get('plural') if plural_node is not None: is_plural = True by = delete_node.get('by') delete_command = JniManagerDeleteCommand(is_plural, by) jni_manager.add_delete_command(delete_command) # parse all <fetch/> for fetch_node in manager_or_none.findall('fetch'): is_plural = False is_plural_attr = fetch_node.get('plural') if is_plural_attr == 'true': is_plural = True by = fetch_node.get('by') alias = fetch_node.get('alias') fetch_command = JniManagerFetchCommand(is_plural, by, alias) jni_manager.add_fetch_command(fetch_command) for fetch_node in manager_or_none.findall('fetches'): is_plural = True by = fetch_node.get('by') alias = fetch_node.get('alias') fetch_command = JniManagerFetchCommand(is_plural, by, alias) jni_manager.add_fetch_command(fetch_command) # parse all <api/> for api_node in manager_or_none.findall('api'): api_function_name = api_node.get('name') function_name = api_node.get('alias') input_var_list = [] inputs_node = api_node.find('inputs') for variable_node in inputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = JniVariable(var_name, var_type_string, group_name, class_name) var.set_enum_class_name(var_enum_or_none) input_var_list.append(var) output_var_list = [] outputs_node = api_node.find('outputs') for variable_node in outputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = JniVariable(var_name, var_type_string, group_name, class_name) var.set_enum_class_name(var_enum_or_none) output_var_list.append(var) api = JniApiDescription(function_name, input_var_list, output_var_list) jni_manager.add_api_description(api) jni_wrapper = JniClass(group_name, class_name, jni_var_list, jni_manager) if self.__version < 5.0: # write jni wrapper header jni_wrapper.generate_header() # write jni wrapper implementation jni_wrapper.generate_implementation() # write jni wrapper manager header jni_wrapper.generate_manager_header() # write jni wrapper manager implementation jni_wrapper.generate_manager_implementation() else: # write jni helper implementation jni_wrapper.generate_jni_helper_implementation(config) # write jni wrapper manager implementation jni_wrapper.generate_manager_implementation(self.__version, config)
def parse(self, directory, config): """Parse the input file with user-defined config. Args: directory: A string represents module.xml file. config: A <Config> object represents user-defined info, such as class prefix. """ # create core folder if not exists and remove last build objc_dir_path = 'build/ObjectiveCppWrapper' io_utils.make_directory_if_not_exists(objc_dir_path) # start parsing xml e = xml.etree.ElementTree.parse(directory) root = e.getroot() # search directories for folder_node in root.findall('group'): group_name = folder_node.get('name') objc_group_name = 'build/ObjectiveCppWrapper/' + string_utils.cpp_group_name_to_objc_group_name( group_name) io_utils.make_directory_if_not_exists(objc_group_name) # search classes for class_node in folder_node.findall('class'): class_name = class_node.get('name') print 'Find objc class {0} under "{1}" group'.format( class_name, group_name) # parse all <enum/> objc_enum_list = [] for enum in class_node.findall('enum'): enum_name = enum.get('name') objc_enum = ObjcEnum(enum_name) for enum_value in enum.findall('value'): int_value = enum_value.get('int_value') alias = enum_value.get('alias') objc_enum.append(int_value, alias) objc_enum_list.append(objc_enum) # parse all <variable/> objc_var_list = [] for variable in class_node.findall('variable'): variable_name = variable.get('name') variable_type = variable.get('type') variable_enum_or_none = variable.get('enum') objc_var = ObjcVariable(variable_name, variable_type) objc_var.set_enum_class_name(variable_enum_or_none) objc_var_list.append(objc_var) # parse <manager/> objc_manager = None manager_or_none = class_node.find('manager') if manager_or_none is not None: manager_name = manager_or_none.get('name') objc_manager = ObjcManager(manager_name) # parse all <save/> for save_node in manager_or_none.findall('save'): is_plural = False plural_node = save_node.get('plural') if plural_node is not None: is_plural = True alias_attr = save_node.get('alias') save_command = CppManagerSaveCommand( is_plural, [], alias_attr) objc_manager.add_save_command(save_command) # parse all <delete/> for delete_node in manager_or_none.findall('delete'): is_plural = False plural_node = delete_node.get('plural') if plural_node is not None: is_plural = True by = delete_node.get('by') alias_attr = delete_node.get('alias') delete_command = CppManagerDeleteCommand( is_plural, by, [], alias_attr) objc_manager.add_delete_command(delete_command) # parse all <fetch/> for fetch_node in manager_or_none.findall('fetch'): is_plural = False plural_node = fetch_node.get('plural') if plural_node is not None: is_plural = True by = fetch_node.get('by') sort_by_or_none = fetch_node.get('sort') is_asc = True if sort_by_or_none is not None: desc_desciption_or_none = fetch_node.get('desc') if desc_desciption_or_none is not None: if desc_desciption_or_none == 'true': is_asc = False alias_attr = fetch_node.get('alias') fetch_command = CppManagerFetchCommand( is_plural, by, sort_by_or_none, is_asc, [], alias_attr) objc_manager.add_fetch_command(fetch_command) # parse all <api/> for api_node in manager_or_none.findall('api'): api_name = api_node.get('name') api_alias = api_node.get('alias') api_method = api_node.get('method') api_uri = api_node.get('uri') input_var_list = [] inputs_node = api_node.find('inputs') for variable_node in inputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = ObjcVariable(var_name, var_type_string) var.set_enum_class_name(var_enum_or_none) input_var_list.append(var) output_var_list = [] outputs_node = api_node.find('outputs') for variable_node in outputs_node.findall('variable'): var_name = variable_node.get('name') var_type_string = variable_node.get('type') var_enum_or_none = variable_node.get('enum') var = ObjcVariable(var_name, var_type_string) var.set_enum_class_name(var_enum_or_none) output_var_list.append(var) api = CppApiDescription(api_name, api_alias, api_method, api_uri, input_var_list, output_var_list, []) objc_manager.add_api_description(api) # write objective-c++ wrapper core addition header objc_wrapper = ObjcClass(group_name, class_name, objc_var_list, objc_enum_list, objc_manager) objc_wrapper.generate_core_addition_header(config) # write objective-c++ wrapper header objc_wrapper.generate_header(config) # write objective-c++ wrapper implementation objc_wrapper.generate_implementation(config) # write objective-c++ wrapper manager category header objc_wrapper.generate_manager_core_addition_header(config) # write objective-c++ wrapper manager header objc_wrapper.generate_manager_header(config) # write objective-c++ wrapper manager implementation objc_wrapper.generate_manager_implementation(config)