Beispiel #1
0
    def __jni_get_jobject_by_core_object_implementation(self, config):
        impl = 'jobject JniHelper::GetJ{0}ByCore{0}(const {0}& {1}) {{\n'.format(
            self.__class_name, string_utils.cpp_class_name_to_cpp_file_name(self.__class_name))
        impl += indent(2) + 'JNIEnv* env = GetJniEnv();\n'
        impl += indent(2) + 'if (!env) {\n'
        impl += indent(4) + 'sakura::log_error("Failed to get JNIEnv");\n'
        impl += indent(4) + 'return nullptr;\n'
        impl += indent(2) + '}\n\n'
        impl += indent(2) + 'jclass {0}Jclass = JniReferenceCache::SharedCache()->{1}_jclass();\n'.format(
            string_utils.first_char_to_lower(self.__class_name),
            string_utils.cpp_class_name_to_cpp_file_name(self.__class_name))
        impl += indent(2) + 'jmethodID {0}ConstructorMethodID = env->GetMethodID({0}Jclass, "<init>", "('.format(
            string_utils.first_char_to_lower(self.__class_name))
        for jni_var in self.__jni_var_list:
            impl += jni_var.var_type.to_jni_signature()
        impl += ')V");\n\n'

        for jni_var in self.__jni_var_list:
            impl += indent(2) + jni_var.jni_var_assignment_by_cpp_variable(config) + '\n'

        impl += '\n'

        constructor_fst_line = indent(2) + 'jobject j{0}Object = env->NewObject('.format(self.__class_name)
        num_constructor_indent = len(constructor_fst_line)

        impl += constructor_fst_line

        parameters = []
        jclass_instance_name = '{0}Jclass'.format(string_utils.first_char_to_lower(self.__class_name))
        constructor_method_id = '{0}ConstructorMethodID'.format(string_utils.first_char_to_lower(self.__class_name))
        parameters.append(constructor_method_id)
        for jni_var in self.__jni_var_list:
            parameters.append('j{0}'.format(string_utils.to_title_style_name(jni_var.name)))

        impl += jclass_instance_name + ',\n'
        for parameter in parameters:
            impl += indent(num_constructor_indent) + parameter + ',\n'
        impl = impl[:-2]
        impl += ');'
        impl += '\n'

        for jni_var in self.__jni_var_list:
            delete_method = jni_var.jni_delete_local_ref()
            if delete_method != '':
                impl += indent(2) + delete_method + '\n'
        impl += '\n'

        impl += indent(2) + 'return j{0}Object;'.format(self.__class_name)
        impl += '\n'
        impl += '}\n'
        impl += '\n'
        return impl
 def __jni_variable_from_cpp_class(self, config):
     instance_name = string_utils.cpp_class_name_to_cpp_file_name(self.__class_name)
     if self.__var_type == VarType.cpp_bool:
         return 'static_cast<jboolean>({0}.is_{1}())'.format(instance_name, self.__name)
     elif self.__var_type == VarType.cpp_enum:
         return 'static_cast<jint>({0}.{1}())'.format(instance_name, self.__name)
     elif self.__var_type == VarType.cpp_int:
         return 'static_cast<jint>({0}.{1}())'.format(instance_name, self.__name)
     elif self.__var_type == VarType.cpp_string:
         return 'env->NewStringUTF({0}.{1}().c_str())'.format(instance_name, self.__name)
     elif self.__var_type == VarType.cpp_string_array:
         return '{2}::JniHelper::JobjectArrayFromStringVector({0}.{1}())'.format(instance_name,
                                                                                 self.__name,
                                                                                 config.cpp_namespace)
     elif self.__var_type == VarType.cpp_time:
         return 'static_cast<jlong>({0}.{1}()) * 1000'.format(instance_name, self.__name)
     elif self.__var_type == VarType.cpp_object:
         skr_logger.skr_log_warning('JniVariable.__jni_variable_from_cpp_class() : C++ object is not supported')
         return ''
     elif self.__var_type == VarType.cpp_object_array:
         skr_logger.skr_log_warning(
             'JniVariable.__jni_variable_from_cpp_class() : C++ object array is not supported')
         return ''
     else:
         skr_logger.skr_log_warning('JniVariable.__jni_variable_from_cpp_class() : Not supported type')
Beispiel #3
0
    def generate_core_addition_header(self, config):
        """Generates Objective-C++ private header file. (eg: LCCTopic_CoreAddition.h)

        Args:
            config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used.
        """
        file_name = '{1}{0}_CoreAddition.h'.format(self.class_name, config.objc_prefix)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#include "{0}.h"'.format(cpp_class_name_to_cpp_file_name(self.class_name)))
        output_header.write(_OBJC_BR)
        output_header.write('@interface {1}{0} () {{'.format(self.class_name, config.objc_prefix))
        output_header.write('\n')
        output_header.write(' @package')
        output_header.write('\n')
        output_header.write(_OBJC_SPACE)
        output_header.write('std::unique_ptr<{1}::{0}> _coreHandle;'.format(self.class_name, config.cpp_namespace))
        output_header.write('\n')
        output_header.write('}')
        output_header.write(_OBJC_BR)
        output_header.write('+ (instancetype){0}WithCore{1}:(const {2}::{1}&)core{1};'
                            .format(string_utils.first_char_to_lower(self.class_name),
                                    self.class_name,
                                    config.cpp_namespace))
        output_header.write(_OBJC_BR)
        output_header.write('@end')
Beispiel #4
0
    def generate_implementation(self):
        """Gets JNI implementation which is used before 4.0.

        Returns:
            A string which is JNI object implementation.
        """
        file_name = 'com_lesschat_core_{0}_{1}.cc'.format(self.__group_name, self.__class_name)
        file_path = 'build/jni/' + file_name
        output_header = open(file_path, 'w')

        style_class_name = string_utils.cpp_class_name_to_cpp_file_name(self.__class_name)
        header_name = 'com_lesschat_core_{0}_{1}.h'.format(self.__group_name, self.__class_name)
        cpp_name = '{0}/{1}.h'.format(self.__group_name, style_class_name)
        output_header.write('#include "{0}"'.format(header_name) + '\n')
        output_header.write('#include "{0}"'.format(cpp_name) + '\n')
        output_header.write('#include "utils/android/jni_helper.h"')

        output_header.write(_JNI_BR)
        output_header.write(self.__def_cpp + _JNI_BR)

        # release method
        output_header.write(self.__release_impl())
        output_header.write(_JNI_BR)

        for jni_var in self.__jni_var_list:
            output_header.write(jni_var.getter_impl())
            output_header.write(_JNI_BR)

        output_header.write(self.__end_def_cpp)
Beispiel #5
0
    def __jni_get_jobjects_array_by_core_objects_implementation(self):
        object_name = string_utils.cpp_class_name_to_cpp_file_name(self.__class_name)

        impl = 'jobjectArray JniHelper::GetJ{0}sArrayByCore{0}s(const std::vector<std::unique_ptr<{0}>>& {1}s) {{'.format(
            self.__class_name, object_name)

        impl += '\n'
        impl += indent(2) + 'jclass {0}Jclass = JniReferenceCache::SharedCache()->{1}_jclass();\n'.format(
            string_utils.first_char_to_lower(self.__class_name),
            object_name)

        impl += indent(2) + 'JNIEnv* env = GetJniEnv();\n'
        impl += indent(2) + 'if (!env) {\n'
        impl += indent(4) + 'return env->NewObjectArray(0, {0}Jclass, NULL);\n'.format(
            string_utils.first_char_to_lower(self.__class_name))
        impl += indent(2) + '}\n\n'
        impl += indent(2) + 'jobjectArray jobjs = env->NewObjectArray({0}s.size(), {1}Jclass, NULL);\n\n'.format(
            object_name,
            string_utils.first_char_to_lower(self.__class_name))

        impl += indent(2) + 'jsize i = 0;\n'
        impl += indent(2) + 'for (auto it = {0}s.begin(); it != {0}s.end(); ++it) {{\n'.format(object_name)
        impl += indent(4) + 'jobject j{0} = GetJ{0}ByCore{0}(**it);\n'.format(self.__class_name)
        impl += indent(4) + 'env->SetObjectArrayElement(jobjs, i, j{0});\n'.format(self.__class_name)
        impl += indent(4) + 'env->DeleteLocalRef(j{0});\n'.format(self.__class_name)
        impl += indent(4) + '++i;\n'
        impl += indent(2) + '}\n'
        impl += indent(2) + 'return jobjs;\n'
        impl += '}'
        return impl
    def generate_implementation(self):
        file_name = 'com_lesschat_core_{0}_{1}.cc'.format(self.group_name, self.class_name)
        file_path = 'jni/' + file_name
        output_header = open(file_path, 'w')

        style_class_name = string_utils.cpp_class_name_to_cpp_file_name(self.class_name)
        header_name = 'com_lesschat_core_{0}_{1}.h'.format(self.group_name, self.class_name)
        cpp_name = '{0}/{1}.h'.format(self.group_name, style_class_name)
        output_header.write('#include "{0}"'.format(header_name) + '\n')
        output_header.write('#include "{0}"'.format(cpp_name) + '\n')
        output_header.write('#include "utils/android/jni_helper.h"')

        output_header.write(_JNI_BR)
        output_header.write(self.def_cpp + _JNI_BR)

        # create method
        # output_header.write(self.create_impl())
        # output_header.write(_JNI_BR)

        # release method
        output_header.write(self.release_impl())
        output_header.write(_JNI_BR)

        for jni_var in self.jni_var_list:
            output_header.write(jni_var.getter_impl())
            output_header.write(_JNI_BR)

        output_header.write(self.end_def_cpp)
Beispiel #7
0
    def generate_manager_implementation(self):
        """Generates C++ Object Manager implementation.
        """
        if self.__cpp_manager_or_none is None:
            return

        cpp_manager = self.__cpp_manager_or_none

        header_file_name = cpp_class_name_to_cpp_file_name(self.__class_name) + '_manager.h'
        file_path = io_utils.cpp_object_implementation_path(self.__group_name, cpp_manager.class_name())
        output_cc = open(file_path, 'w')

        cpp_include = '#include "{0}"\n'.format(header_file_name)
        cpp_include += '#include "director/director.h"'
        cpp_using = 'using std::string;\nusing std::unique_ptr;\nusing std::vector;\n\nusing sakura::FileUtils;\n'
        cpp_public_mark = '////////////////////////////////////////////////////////////////////////////////\n// ' \
                          '{0}, public:'.format(cpp_manager.class_name())
        cpp_private_mark = '////////////////////////////////////////////////////////////////////////////////\n// ' \
                           '{0}, private:'.format(cpp_manager.class_name())
        cpp_sqlite_schema_split = '// SQLite schema --------------------------------------------------------\n'

        output_cc.write(cpp_include + _CPP_BR)
        output_cc.write(cpp_using + _CPP_BR)
        output_cc.write(self.__config.cpp_ns_begin + _CPP_BR)

        output_cc.write(cpp_sqlite_schema_split + '\n')
        output_cc.write(cpp_manager.sqlite_key_declaration() + '\n')
        output_cc.write(cpp_manager.easy_sqlite_field_declaration() + _CPP_BR)

        output_cc.write(cpp_public_mark + _CPP_BR)

        output_cc.write(_CPP_LIFECYCLE_SPLIT + _CPP_BR)
        output_cc.write(cpp_manager.generate_constructor_implementation() + _CPP_BR)
        output_cc.write(cpp_manager.generate_deconstructor_implementation() + _CPP_BR)
        output_cc.write(cpp_manager.generate_init_or_die_implementation() + _CPP_BR)
        output_cc.write(cpp_manager.generate_default_manager_implementation() + _CPP_BR)

        output_cc.write(_CPP_HTTP_SPLIT + _CPP_BR)
        output_cc.write(cpp_manager.generate_manager_http_implementation())

        output_cc.write(_CPP_PERSISTENT_STORE_SPLIT + _CPP_BR)
        output_cc.write(cpp_manager.generate_save_implementations())
        output_cc.write(cpp_manager.generate_fetch_implementations())
        output_cc.write(cpp_manager.generate_delete_implementations())

        output_cc.write(cpp_private_mark + _CPP_BR)

        output_cc.write(_CPP_UTILS_SPLIT + _CPP_BR)
        output_cc.write(cpp_manager.unsafe_save_implementation() + _CPP_BR)
        for table_name in cpp_manager.table_name_list:
            output_cc.write(cpp_manager.unsafe_save_implementation(table_name) + _CPP_BR)

        output_cc.write(cpp_manager.sqlite_record_by_object_implementation() + _CPP_BR)
        for table_name in cpp_manager.table_name_list:
            output_cc.write(cpp_manager.sqlite_record_by_object_implementation(table_name) + _CPP_BR)

        output_cc.write(cpp_manager.sqlite_object_from_record_implementation() + _CPP_BR)

        output_cc.write(self.__config.cpp_ns_end + _CPP_BR)
    def generate_web_api_header(self):
        if self.cpp_manager_or_none is None:
            return

        cpp_manager = self.cpp_manager_or_none

        header_file_name = 'web_api_{0}.h'.format(string_utils.cpp_class_name_to_cpp_file_name(self.class_name))
        file_path = 'build/core/api/{0}'.format(header_file_name)
        output_header = open(file_path, 'w')

        output_header.write(cpp_manager.generate_wep_api_declarations())
    def generate_web_api_implementation(self):
        if self.cpp_manager_or_none is None:
            return

        cpp_manager = self.cpp_manager_or_none

        output_cc = 'web_api_{0}.cc'.format(string_utils.cpp_class_name_to_cpp_file_name(self.class_name))
        file_path = 'build/core/api/{0}'.format(output_cc)
        output_cc = open(file_path, 'w')

        output_cc.write(cpp_manager.generate_web_api_implementation())
Beispiel #10
0
    def generate_web_api_header(self):
        """Generates C++ WebApi header, user should copy all code into WebApi.h manually.
        """
        if self.__cpp_manager_or_none is None:
            return

        cpp_manager = self.__cpp_manager_or_none

        header_file_name = 'web_api_{0}.h'.format(cpp_class_name_to_cpp_file_name(self.__class_name))
        file_path = 'build/core/api/{0}'.format(header_file_name)
        output_header = open(file_path, 'w')

        output_header.write(cpp_manager.generate_wep_api_declarations())
    def generate_manager_core_addition_header(self):
        file_name = 'LCC{0}Manager_CoreAddition.h'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#include "{0}_manager.h"\n#include "director.h"'.format(string_utils.cpp_class_name_to_cpp_file_name(self.class_name)))
        output_header.write(_OBJC_BR)
        output_header.write('@interface LCC{0}Manager () {{\n@private\n'.format(self.class_name))
        output_header.write(_OBJC_SPACE)
        output_header.write('const lesschat::{0}Manager *_coreManagerHandler;\n'.format(self.class_name))
        output_header.write('}')
        output_header.write(_OBJC_BR)
        output_header.write('@end\n')
Beispiel #12
0
    def generate_manager_core_addition_header(self, config):
        """Generates Objective-C++ object manager private header file.

        Args:
            config: A <Config> object represents user-defined configs, in this method, only apple/prefix is used.
        """
        file_name = '{1}{0}Manager_CoreAddition.h'.format(self.class_name, config.objc_prefix)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#include "{0}_manager.h"\n#include "director.h"'.format(
            string_utils.cpp_class_name_to_cpp_file_name(self.class_name)))
        output_header.write(_OBJC_BR)
        output_header.write('@interface {1}{0}Manager () {{\n @private\n'.format(self.class_name, config.objc_prefix))
        output_header.write(_OBJC_SPACE)
        output_header.write('const {1}::{0}Manager *_coreManagerHandler;\n'.format(self.class_name, config.cpp_namespace))
        output_header.write('}')
        output_header.write(_OBJC_BR)
        output_header.write('@end\n')
    def generate_core_addition_header(self):
        file_name = 'LCC{0}_CoreAddition.h'.format(self.class_name)
        file_path = _OBJC_BUILD_PATH + string_utils.cpp_group_name_to_objc_group_name(self.group_name) + '/' + file_name
        output_header = open(file_path, 'w')

        output_header.write('#include "{0}.h"'.format(cpp_class_name_to_cpp_file_name(self.class_name)))
        output_header.write(_OBJC_BR)
        output_header.write('@interface LCC{0} () {{'.format(self.class_name))
        output_header.write('\n')
        output_header.write('@package')
        output_header.write('\n')
        output_header.write(_OBJC_SPACE)
        output_header.write('std::unique_ptr<lesschat::{0}> _coreHandle;'.format(self.class_name))
        output_header.write('\n')
        output_header.write('}')
        output_header.write(_OBJC_BR)
        output_header.write('+ (instancetype){0}WithCore{1}:(const lesschat::{1}&)core{1};'
                            .format(string_utils.first_char_to_lower(self.class_name), self.class_name))
        output_header.write(_OBJC_BR)
        output_header.write('@end')
Beispiel #14
0
    def generate_manager_implementation(self, version, config):
        """Gets JNI object manager implementation.

        Args:
            version: A float version number of <JniModelXmlParser>.
            config: A <Config> object describes user-defined names.

        Returns:
            A string which is JNI object manager implementation.
        """
        if self.__jni_manager_or_none is None:
            return

        jni_manager = self.__jni_manager_or_none

        file_name = '{2}_{0}_{1}Manager.cc'.format(self.__group_name, self.__class_name, config.jni_package_path)
        file_path = 'build/jni/' + file_name
        output_header = open(file_path, 'w')

        header_name = '#include "{2}_{0}_{1}Manager.h"\n'.format(self.__group_name,
                                                                 self.__class_name,
                                                                 config.jni_package_path)
        cpp_name = '#include "{0}/{1}_manager.h"\n'\
            .format(self.__group_name, string_utils.cpp_class_name_to_cpp_file_name(self.__class_name))

        output_header.write(header_name)
        output_header.write(cpp_name)
        output_header.write('#include "utils/android/jni_helper.h"')
        output_header.write(_JNI_BR)

        output_header.write(self.__def_cpp)
        output_header.write(_JNI_BR)

        output_header.write(jni_manager.generate_fetch_implementations(version, config))
        output_header.write(jni_manager.generate_http_function_implementations(config))

        output_header.write(self.__end_def_cpp + '\n')
    def generate_manager_header(self):
        """Generates C++ Object Manager header.
        """
        if self.__cpp_manager_or_none is None:
            return

        cpp_manager = self.__cpp_manager_or_none
        file_path = io_utils.cpp_object_header_path(self.__group_name,
                                                    cpp_manager.class_name())
        output_header = open(file_path, 'w')

        def_guard = '#ifndef {2}_{0}_{1}_H_\n#define {2}_{0}_{1}_H_'.format(
            self.__group_name.upper().replace('/', '_'),
            cpp_class_name_to_cpp_file_name(cpp_manager.class_name()).upper(),
            self.__config.cpp_module_name)
        end_def_guard = '#endif /* defined({2}_{0}_{1}_H_) */'.format(
            self.__group_name.upper().replace('/', '_'),
            cpp_class_name_to_cpp_file_name(cpp_manager.class_name()).upper(),
            self.__config.cpp_module_name)
        cpp_include = '#include <string>\n' \
                      '#include <memory>\n' \
                      '#include <vector>\n' \
                      '#include <functional>\n\n' \
                      '#include "easySQLite/easySQLite.h"\n\n' \
                      '#include "base/base.h"\n#include "director/object_manager.h"\n#include "api/web_api.h"\n\n'
        cpp_include += '#include "{0}/{1}.h"'.format(
            self.__group_name.replace('core/', ''),
            cpp_class_name_to_cpp_file_name(self.__class_name))
        cpp_class_begin = 'class LCC_DLL {0} : public ObjectManager {{'.format(
            cpp_manager.class_name())
        cpp_class_end = '};'
        cpp_constructor = 'explicit {0}(Director* director);'.format(
            cpp_manager.class_name())
        cpp_deconstructor = 'virtual ~{0}();'.format(cpp_manager.class_name())
        cpp_init_method = 'bool InitOrDie();'
        cpp_default_manager = 'static const {0}* DefaultManager();'.format(
            cpp_manager.class_name())
        cpp_manager_save_methods = cpp_manager.generate_save_declarations(
            _CPP_SPACE)
        cpp_manager_fetch_methods = cpp_manager.generate_fetch_declarations(
            _CPP_SPACE)
        cpp_manager_delete_methods = cpp_manager.generate_delete_declarations(
            _CPP_SPACE)
        cpp_disallow_copy_and_assign = 'DISALLOW_COPY_AND_ASSIGN({0});'.format(
            cpp_manager.class_name())
        cpp_manager_http_methods = cpp_manager.generate_manager_http_declarations(
            _CPP_SPACE)

        output_header.write(def_guard + _CPP_BR)
        output_header.write(cpp_include + _CPP_BR)
        output_header.write(self.__config.cpp_ns_begin + _CPP_BR)
        output_header.write(cpp_class_begin + '\n')
        output_header.write(_CPP_PUBLIC + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_LIFECYCLE_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_constructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_deconstructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_init_method + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_default_manager + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_HTTP_SPLIT + _CPP_BR)
        output_header.write(cpp_manager_http_methods)

        output_header.write(_CPP_SPACE + _CPP_PERSISTENT_STORE_SPLIT + _CPP_BR)
        output_header.write(cpp_manager_save_methods)
        output_header.write(cpp_manager_fetch_methods)
        output_header.write(cpp_manager_delete_methods)

        output_header.write(_CPP_PRIVATE + '\n')
        output_header.write(_CPP_SPACE + cpp_manager.sqlite_table_var() +
                            _CPP_BR)
        for table_name in cpp_manager.table_name_list:
            output_header.write(_CPP_SPACE +
                                cpp_manager.sqlite_table_var(table_name) +
                                _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_UTILS_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE +
                            cpp_manager.sqlite_record_by_object_declaration() +
                            _CPP_BR)
        for table_name in cpp_manager.table_name_list:
            output_header.write(
                _CPP_SPACE +
                cpp_manager.sqlite_record_by_object_declaration(table_name) +
                _CPP_BR)

        output_header.write(cpp_manager.unsafe_save_declaration(_CPP_SPACE))
        for table_name in cpp_manager.table_name_list:
            output_header.write(
                cpp_manager.unsafe_save_declaration(_CPP_SPACE, table_name))

        output_header.write(
            _CPP_SPACE + cpp_manager.sqlite_object_from_record_declaration() +
            _CPP_BR)

        output_header.write('\n' + _CPP_SPACE + cpp_disallow_copy_and_assign +
                            '\n')

        output_header.write(cpp_class_end + _CPP_BR)
        output_header.write(self.__config.cpp_ns_end + _CPP_BR)
        output_header.write(end_def_guard + _CPP_BR)
Beispiel #16
0
 def __jni_get_jobject_by_core_object_declaration(self):
     return 'static jobject GetJ{0}ByCore{0}(const {0}& {1});'.format(
         self.__class_name, string_utils.cpp_class_name_to_cpp_file_name(self.__class_name))
Beispiel #17
0
 def __jni_get_jobjects_array_by_core_objects_declaration(self):
     return 'static jobjectArray GetJ{0}sArrayByCore{0}s(const std::vector<std::unique_ptr<{0}>>& {1}s);'.format(
         self.__class_name, string_utils.cpp_class_name_to_cpp_file_name(self.__class_name))
    def __cpp_cache_by_cache_description_name(self, cache_desc, name=''):
        cache_attr = cache_desc

        if cache_attr is None or cache_attr == '':  # if no 'cache'
            return ''

        impl = ''
        caches = re.split(',', cache_attr)
        for cache in caches:
            if cache[0] == '#':  # if define
                impl += string_utils.indent(6) + self.__find_replace_string_by_name(cache[1:]) + '\n'
            else:  # if by command
                cpp_class = 'this->'
                method = ''

                # command_components[0]: save(s)/delete(s)/update(s)
                # command_components[1]: (id, project_id) - replace string
                command_components = re.split('\(', cache)
                sql_verb = command_components[0]
                parameters = ''
                num_parameters = 0
                if len(command_components) == 2:
                    parameters = command_components[1]
                    parameters = parameters[:-1]
                    num_parameters = len(re.split(',', parameters))
                else:
                    parameters = name
                    num_parameters = 0

                if sql_verb == 'saves':
                    method = 'Save{0}ToCache({1});\n'.format(self.plural_object_name, name)
                elif sql_verb == 'save':
                    method = 'Save{0}ToCache(*{1});\n'.format(self.object_name, name)
                elif sql_verb == 'deletes':
                    if num_parameters == 0:
                        method = 'Delete{0}FromCache();\n'.format(self.plural_object_name)
                    elif num_parameters == 1:
                        by = 'by_{0}'.format(parameters)
                        by = string_utils.to_title_style_name(by)
                        method = 'Delete{0}FromCache{2}({1});\n'.format(self.plural_object_name, parameters, by)
                    else:
                        method = 'Delete{0}FromCache({1});\n'.format(self.plural_object_name, parameters)
                elif sql_verb == 'delete':
                    if num_parameters == 0:
                        method = 'Delete{0}FromCache();\n'.format(self.object_name)
                    elif num_parameters == 1:
                        by = 'by_{0}'.format(parameters)
                        by = string_utils.to_title_style_name(by)
                        method = 'Delete{0}FromCache{2}({1});\n'.format(self.object_name, parameters, by)
                    else:
                        method = 'Delete{0}FromCache({1});\n'.format(self.object_name, parameters)
                elif sql_verb[:7] == 'fupdate':  # generate implementation automatically
                    components = re.split(':', sql_verb)
                    fetch_by_id = components[1]
                    impl = string_utils.indent(6) + 'unique_ptr<{0}> {1} = this->Fetch{0}FromCacheBy{2}({3});\n'\
                        .format(self.object_name,
                                string_utils.cpp_class_name_to_cpp_file_name(self.object_name),
                                string_utils.to_title_style_name(fetch_by_id),
                                fetch_by_id)

                    for parameter in re.split(',', parameters):
                        impl += string_utils.indent(6) + '{0}->set_{1}({1});\n'.format(string_utils.cpp_class_name_to_cpp_file_name(self.object_name), parameter)

                    impl += string_utils.indent(6) + 'this->Save{0}ToCache(*{1});\n'.format(self.object_name, string_utils.cpp_class_name_to_cpp_file_name(self.object_name))
                    return impl
                else:
                    print 'Unsupported method'
                    assert False
                impl += string_utils.indent(6) + cpp_class + method

        return impl
Beispiel #19
0
    def generate_manager_header(self):
        """Generates C++ Object Manager header.
        """
        if self.__cpp_manager_or_none is None:
            return

        cpp_manager = self.__cpp_manager_or_none
        file_path = io_utils.cpp_object_header_path(self.__group_name, cpp_manager.class_name())
        output_header = open(file_path, 'w')

        def_guard = '#ifndef {2}_{0}_{1}_H_\n#define {2}_{0}_{1}_H_'.format(
                self.__group_name.upper().replace('/', '_'),
                cpp_class_name_to_cpp_file_name(cpp_manager.class_name()).upper(),
                self.__config.cpp_module_name)
        end_def_guard = '#endif /* defined({2}_{0}_{1}_H_) */'.format(
                self.__group_name.upper().replace('/', '_'),
                cpp_class_name_to_cpp_file_name(cpp_manager.class_name()).upper(),
                self.__config.cpp_module_name)
        cpp_include = '#include <string>\n' \
                      '#include <memory>\n' \
                      '#include <vector>\n' \
                      '#include <functional>\n\n' \
                      '#include "easySQLite/easySQLite.h"\n\n' \
                      '#include "base/base.h"\n#include "director/object_manager.h"\n#include "api/web_api.h"\n\n'
        cpp_include += '#include "{0}/{1}.h"'.format(self.__group_name.replace('core/', ''),
                                                     cpp_class_name_to_cpp_file_name(self.__class_name))
        cpp_class_begin = 'class LCC_DLL {0} : public ObjectManager {{'.format(cpp_manager.class_name())
        cpp_class_end = '};'
        cpp_constructor = 'explicit {0}(Director* director);'.format(cpp_manager.class_name())
        cpp_deconstructor = 'virtual ~{0}();'.format(cpp_manager.class_name())
        cpp_init_method = 'bool InitOrDie();'
        cpp_default_manager = 'static const {0}* DefaultManager();'.format(cpp_manager.class_name())
        cpp_manager_save_methods = cpp_manager.generate_save_declarations(_CPP_SPACE)
        cpp_manager_fetch_methods = cpp_manager.generate_fetch_declarations(_CPP_SPACE)
        cpp_manager_delete_methods = cpp_manager.generate_delete_declarations(_CPP_SPACE)
        cpp_disallow_copy_and_assign = 'DISALLOW_COPY_AND_ASSIGN({0});'.format(cpp_manager.class_name())
        cpp_manager_http_methods = cpp_manager.generate_manager_http_declarations(_CPP_SPACE)

        output_header.write(def_guard + _CPP_BR)
        output_header.write(cpp_include + _CPP_BR)
        output_header.write(self.__config.cpp_ns_begin + _CPP_BR)
        output_header.write(cpp_class_begin + '\n')
        output_header.write(_CPP_PUBLIC + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_LIFECYCLE_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_constructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_deconstructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_init_method + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_default_manager + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_HTTP_SPLIT + _CPP_BR)
        output_header.write(cpp_manager_http_methods)

        output_header.write(_CPP_SPACE + _CPP_PERSISTENT_STORE_SPLIT + _CPP_BR)
        output_header.write(cpp_manager_save_methods)
        output_header.write(cpp_manager_fetch_methods)
        output_header.write(cpp_manager_delete_methods)

        output_header.write(_CPP_PRIVATE + '\n')
        output_header.write(_CPP_SPACE + cpp_manager.sqlite_table_var() + _CPP_BR)
        for table_name in cpp_manager.table_name_list:
            output_header.write(_CPP_SPACE + cpp_manager.sqlite_table_var(table_name) + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_UTILS_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_manager.sqlite_record_by_object_declaration() + _CPP_BR)
        for table_name in cpp_manager.table_name_list:
            output_header.write(_CPP_SPACE + cpp_manager.sqlite_record_by_object_declaration(table_name) + _CPP_BR)

        output_header.write(cpp_manager.unsafe_save_declaration(_CPP_SPACE))
        for table_name in cpp_manager.table_name_list:
            output_header.write(cpp_manager.unsafe_save_declaration(_CPP_SPACE, table_name))

        output_header.write(_CPP_SPACE + cpp_manager.sqlite_object_from_record_declaration() + _CPP_BR)

        output_header.write('\n' + _CPP_SPACE + cpp_disallow_copy_and_assign + '\n')

        output_header.write(cpp_class_end + _CPP_BR)
        output_header.write(self.__config.cpp_ns_end + _CPP_BR)
        output_header.write(end_def_guard + _CPP_BR)
Beispiel #20
0
    def generate_header(self):
        """Generates C++ Object header file.
        """
        file_path = io_utils.cpp_object_header_path(self.__group_name, self.__class_name)
        output_header = open(file_path, 'w')

        def_guard = '#ifndef {2}_{0}_{1}_H_\n#define {2}_{0}_{1}_H_'.format(
                self.__group_name.upper().replace('/', '_'),
                cpp_class_name_to_cpp_file_name(self.__class_name).upper(),
                self.__config.cpp_module_name)
        end_def_guard = '#endif /* defined({2}_{0}_{1}_H_) */'.format(
                self.__group_name.upper().replace('/', '_'),
                cpp_class_name_to_cpp_file_name(self.__class_name).upper(),
                self.__config.cpp_module_name)
        cpp_include = '#include <string>\n#include <memory>\n#include <vector>\n\n#include "base/base.h"'
        cpp_class_begin = 'class LCC_DLL {0} : public CodingInterface {{'.format(self.__class_name)
        cpp_class_end = '};'
        cpp_constructor = '{0}();'.format(self.__class_name)
        cpp_deconstructor = 'virtual ~{0}();'.format(self.__class_name)
        cpp_init_method = self.__generate_init_method_declarasion()
        cpp_clone = 'std::unique_ptr<{0}> Clone() const;'.format(self.__class_name)
        cpp_getter_setter_split = '// Getter/Setter --------------------------------------------------------'
        cpp_variable_split = '// Variable --------------------------------------------------------'
        cpp_disallow_copy_and_assign = 'DISALLOW_COPY_AND_ASSIGN({0});'.format(self.__class_name)

        output_header.write(def_guard + _CPP_BR)
        output_header.write(cpp_include + _CPP_BR)
        output_header.write(self.__config.cpp_ns_begin + _CPP_BR)

        if self.__class_comment is not None:
            comment = self.__find_replacement_by_define_name(self.__class_comment)
            output_header.write('{0}'.format(comment))

        output_header.write(cpp_class_begin + '\n')
        output_header.write(_CPP_PUBLIC + _CPP_BR)

        for cpp_enum in self.__cpp_enum_list:
            output_header.write(cpp_enum.generate_cpp_enum(_CPP_SPACE) + '\n')

        output_header.write(_CPP_SPACE + _CPP_LIFECYCLE_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_constructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_deconstructor + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_init_method + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_clone + _CPP_BR)

        output_header.write(_CPP_SPACE + _CPP_CODING_INTERFACE_SPLIT + _CPP_BR)
        output_header.write(_CPP_SPACE + _CPP_INIT_WITH_JSON_DECLARATION + _CPP_BR)

        output_header.write(_CPP_SPACE + cpp_getter_setter_split + _CPP_BR)

        for cpp_var in self.__cpp_var_list:
            output_header.write(_CPP_SPACE + cpp_var.getter() + '\n')
            output_header.write(_CPP_SPACE + cpp_var.setter() + _CPP_BR)

        output_header.write(_CPP_PRIVATE + _CPP_BR)
        output_header.write(_CPP_SPACE + cpp_variable_split + _CPP_BR)

        for cpp_var in self.__cpp_var_list:
            output_header.write(_CPP_SPACE + cpp_var.private_var() + '\n')
        output_header.write(_CPP_BR)

        output_header.write(_CPP_SPACE + cpp_disallow_copy_and_assign + '\n')
        output_header.write(cpp_class_end + _CPP_BR)
        output_header.write(self.__config.cpp_ns_end + _CPP_BR)
        output_header.write(end_def_guard + _CPP_BR)
Beispiel #21
0
 def __header_file_name(self):
     return cpp_class_name_to_cpp_file_name(self.__class_name)