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)
Example #4
0
    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()
Example #6
0
    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()
Example #7
0
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)