def objc_wrapper_from_cpp_parameter(self): if self.var_type == VarType.cpp_object_array: return 'std::vector<std::unique_ptr<lesschat::{0}>> core{1}'.format( self.var_type.object_class_name, string_utils.to_title_style_name(self.name)) elif self.var_type == VarType.cpp_object: return 'std::unique_ptr<lesschat::{0}> core{0}'.format( self.var_type.object_class_name, string_utils.to_title_style_name(self.name)) else: return '{0} {1}'.format(self.var_type.to_getter_string(), self.name)
def __save_implementation(self, save_command): if save_command.is_plural: impl = '' if save_command.alias_or_none is None: impl += 'void {0}::Save{3}ToCache(const std::vector<std::unique_ptr<{1}>>& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.plural_object_name.lower(), self.plural_object_name) else: impl += 'void {0}::{3}(const std::vector<std::unique_ptr<{1}>>& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.plural_object_name.lower(), save_command.alias_or_none) impl += ' LockMainDatabase();\n\n BeginTransaction();' + _CPP_BR impl += ' for (auto it = {0}.begin(); it != {0}.end(); ++it) {{\n'.format( self.plural_object_name.lower()) if len(save_command.table_name_list) == 0: impl += ' UnsafeSave{0}ToCache(**it);\n'.format( self.object_name) else: for table_name in save_command.table_name_list: if table_name == self.plural_object_name: impl += ' UnsafeSave{0}ToCache(**it);\n'.format( self.object_name) else: impl += ' UnsafeSave{0}To{1}(**it);\n'.format( self.object_name, string_utils.to_title_style_name(table_name)) impl += ' }\n\n' impl += ' CommitTransaction();\n\n UnlockMainDatabase();\n' impl += '}' return impl else: impl = 'void {0}::Save{1}ToCache(const {1}& {2}) const {{\n'.format( self.manager_name, self.object_name, self.object_name.lower()) impl += ' LockMainDatabase();' + _CPP_BR if len(save_command.table_name_list) == 0: impl += ' UnsafeSave{0}ToCache({1});'.format( self.object_name, self.object_name.lower()) + _CPP_BR else: for table_name in save_command.table_name_list: if table_name == self.plural_object_name.lower(): impl += ' UnsafeSave{0}ToCache({1});'.format( self.object_name, self.object_name.lower()) + _CPP_BR else: impl += ' UnsafeSave{0}To{2}({1});'.format( self.object_name, self.object_name.lower(), string_utils.to_title_style_name( table_name)) + _CPP_BR impl += ' UnlockMainDatabase();\n' impl += '}' return impl
def objc_wrapper_from_cpp_parameter(self, config): """From std::vector<std::unique_ptr<Calendar>> to std::vector<std::unique_ptr<lesschat::Calendar>>, (Array also is) """ if self.var_type == VarType.cpp_object_array: return 'std::vector<std::unique_ptr<{2}::{0}>> core{1}'\ .format(self.var_type.object_class_name, string_utils.to_title_style_name(self.name), config.cpp_namespace) elif self.var_type == VarType.cpp_object: return 'std::unique_ptr<{1}::{0}> core{0}'\ .format(self.var_type.object_class_name, string_utils.to_title_style_name(self.name), config.cpp_namespace) else: return '{0} {1}'.format(self.var_type.to_getter_string(), self.name)
def unsafe_save_declaration(self, pre_spaces, table_name=''): """Returns 'UnsafeSaveObjectToCache' or 'UnsafeSaveObjectToTable' declaration""" if table_name == '': return '{2}void UnsafeSave{0}ToCache(const {0}& {1}) const;\n\n'\ .format(self.object_name, self.object_name.lower(), pre_spaces) else: return '{2}void UnsafeSave{0}To{3}(const {0}& {1}) const;\n\n'\ .format(self.object_name, self.object_name.lower(), pre_spaces, string_utils.to_title_style_name(table_name))
def getter_method_name(self): title_style_name = string_utils.to_title_style_name(self.name) if self.var_type == VarType.cpp_bool: method_name = 'JNIEXPORT {0} JNICALL Java_com_lesschat_core_{1}_{2}_nativeIs{3}'.\ format(self.var_type.to_jni_getter_string(), self.group_name, self.class_name, title_style_name) return method_name else: method_name = 'JNIEXPORT {0} JNICALL Java_com_lesschat_core_{1}_{2}_nativeGet{3}'.\ format(self.var_type.to_jni_getter_string(), self.group_name, self.class_name, title_style_name) return method_name
def __getter_method_name(self): title_style_name = string_utils.to_title_style_name(self.__name) if self.__var_type == VarType.cpp_bool: method_name = 'JNIEXPORT {0} JNICALL Java_com_lesschat_core_{1}_{2}_nativeIs{3}'. \ format(self.__var_type.to_jni_getter_string(), self.__group_name, self.__class_name, title_style_name) return method_name else: method_name = 'JNIEXPORT {0} JNICALL Java_com_lesschat_core_{1}_{2}_nativeGet{3}'. \ format(self.__var_type.to_jni_getter_string(), self.__group_name, self.__class_name, title_style_name) return method_name
def sqlite_record_by_object_declaration(self, table_name=''): """Returns 'sql::Record RecordByObject(const Object& obj) const;' (if table_name is empty) or 'sql::Record RecordByTaskFromTable(const Task& task) const; declaration' """ if table_name == '': return 'sql::Record RecordBy{0}(const {0}& {1}) const;'\ .format(self.object_name, self.object_name.lower()) else: return 'sql::Record RecordBy{0}From{2}(const {0}& {1}) const;'\ .format(self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name))
def jni_var_assignment_by_cpp_variable(self, config): """Returns a method which is a JNI filed converted from C++. Returns: For example: jstring jFileId = lesschat::JniHelper::JstringFromString(file.file_id()); """ jtype = self.__var_type.to_jni_getter_string() jname = 'j{0}'.format(string_utils.to_title_style_name(self.__name)) return '{0} {1} = {2};'.format(jtype, jname, self.__jni_variable_from_cpp_class(config))
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 __init__(self, name, var_type_string): """Init JavaVariable with name and type string declares in VarType. Args: name: A string descries Variable name. var_type_string: A string declares in VarType. """ var_type = VarType.instance_from_string(var_type_string) self.__name_str = to_objc_property_name(name) self.__title_style_name = to_title_style_name(name) self.__var_type = var_type self.__java_enum = ''
def jni_delete_local_ref(self): """Gets JNI delete local ref method. Returns: A string which is JNI delete local ref method. """ if self.__var_type == VarType.cpp_string or self.__var_type == VarType.cpp_string_array: return 'env->DeleteLocalRef(j{0});'.format(string_utils.to_title_style_name(self.__name)) elif self.__var_type == VarType.cpp_object or self.__var_type == VarType.cpp_object_array: skr_logger.skr_log_warning('JniVariable.jni_delete_local_ref() : Not supported type') return 'env->DeleteLocalRef(j{0});'.format(string_utils.first_char_to_upper(self.__name)) else: return ''
def unsafe_save_implementation(self, table_name=''): """Returns 'UnsafeSaveObjectToCache' or 'UnsafeSaveObjectToTable' implementation""" impl = '' if table_name == '': impl += 'void {0}::UnsafeSave{1}ToCache(const {1}& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.object_name.lower()) impl += _CPP_SPACE + 'sql::Record record = RecordBy{0}({1});\n'.format( self.object_name, self.object_name.lower()) else: impl += 'void {0}::UnsafeSave{1}To{3}(const {1}& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name)) impl += _CPP_SPACE + 'sql::Record record = RecordBy{0}From{2}({1});\n'.format( self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name)) impl += _CPP_SPACE + '{0}->addOrReplaceRecord(&record);\n'.format( self.__sqlite_tb_name(table_name)) impl += '}' return impl
def to_title_style_name(self): return string_utils.to_title_style_name(self.name)
def sqlite_record_by_object_implementation(self, table_name=''): """Returns 'sql::Record RecordByObject(const Object& obj) const;' (if table_name is empty) or 'sql::Record RecordByTaskFromTable(const Task& task) const; implementation' """ impl = '' if table_name == '': impl += 'sql::Record {0}::RecordBy{1}(const {1}& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.object_name.lower()) impl += _CPP_SPACE + 'sql::Record record({0}->fields());\n\n'.format( self.__sqlite_tb_name()) else: impl += 'sql::Record {0}::RecordBy{1}From{3}(const {1}& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name)) impl += _CPP_SPACE + 'sql::Record record({0}->fields());\n\n'.format( self.__sqlite_tb_name(table_name)) for cpp_var in self.cpp_variable_list: impl += _CPP_SPACE impl += cpp_var.to_set_sql_string(self.object_name.lower()) impl += '\n' impl += _CPP_SPACE impl += 'return record;\n' impl += '}' return impl
def objc_wrapper_from_cpp_parameter(self): if self.var_type == VarType.cpp_object_array: return 'std::vector<std::unique_ptr<lesschat::{0}>> core{1}'.format(self.var_type.object_class_name, string_utils.to_title_style_name(self.name)) elif self.var_type == VarType.cpp_object: return 'std::unique_ptr<lesschat::{0}> core{0}'.format(self.var_type.object_class_name, string_utils.to_title_style_name(self.name)) else: return '{0} {1}'.format(self.var_type.to_getter_string(), self.name)
def to_title_style_name(self): return string_utils.to_title_style_name(self.__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
def __cpp_cache_by_cache_description_name(self, cache_desc, name='', indent=6): 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( indent) + 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(indent) + '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( indent) + '{0}->set_{1}({1});\n'.format( string_utils.cpp_class_name_to_cpp_file_name( self.object_name), parameter) impl += string_utils.indent( indent) + '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(indent) + cpp_class + method return impl
def sqlite_record_by_object_implementation(self, table_name=''): """Returns 'sql::Record RecordByObject(const Object& obj) const;' (if table_name is empty) or 'sql::Record RecordByTaskFromTable(const Task& task) const; implementation' """ impl = '' if table_name == '': impl += 'sql::Record {0}::RecordBy{1}(const {1}& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.object_name.lower()) impl += _CPP_SPACE + 'sql::Record record({0}->fields());\n\n'.format(self.__sqlite_tb_name()) else: impl += 'sql::Record {0}::RecordBy{1}From{3}(const {1}& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name)) impl += _CPP_SPACE + 'sql::Record record({0}->fields());\n\n'.format(self.__sqlite_tb_name(table_name)) for cpp_var in self.cpp_variable_list: impl += _CPP_SPACE impl += cpp_var.to_set_sql_string(self.object_name.lower()) impl += '\n' impl += _CPP_SPACE impl += 'return record;\n' impl += '}' return impl
def to_title_style_name(self): """From 'display_name' to 'DisplayName'. """ return string_utils.to_title_style_name(self.__name)
def unsafe_save_implementation(self, table_name=''): """Returns 'UnsafeSaveObjectToCache' or 'UnsafeSaveObjectToTable' implementation""" impl = '' if table_name == '': impl += 'void {0}::UnsafeSave{1}ToCache(const {1}& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.object_name.lower()) impl += _CPP_SPACE + 'sql::Record record = RecordBy{0}({1});\n'.format(self.object_name, self.object_name.lower()) else: impl += 'void {0}::UnsafeSave{1}To{3}(const {1}& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name)) impl += _CPP_SPACE + 'sql::Record record = RecordBy{0}From{2}({1});\n'.format(self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name)) impl += _CPP_SPACE + '{0}->addOrReplaceRecord(&record);\n'.format(self.__sqlite_tb_name(table_name)) impl += '}' return impl
def to_title_style_name(self): """From 'display_name' to 'DisplayName' """ return string_utils.to_title_style_name(self.name)
def __save_implementation(self, save_command): if save_command.is_plural: impl = '' if save_command.alias_or_none is None: impl += 'void {0}::Save{3}ToCache(const std::vector<std::unique_ptr<{1}>>& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.plural_object_name.lower(), self.plural_object_name) else: impl += 'void {0}::{3}(const std::vector<std::unique_ptr<{1}>>& {2}) const {{\n'\ .format(self.manager_name, self.object_name, self.plural_object_name.lower(), save_command.alias_or_none) impl += ' LockMainDatabase();\n\n BeginTransaction();' + _CPP_BR impl += ' for (auto it = {0}.begin(); it != {0}.end(); ++it) {{\n'.format(self.plural_object_name.lower()) if len(save_command.table_name_list) == 0: impl += ' UnsafeSave{0}ToCache(**it);\n'.format(self.object_name) else: for table_name in save_command.table_name_list: if table_name == self.plural_object_name: impl += ' UnsafeSave{0}ToCache(**it);\n'.format(self.object_name) else: impl += ' UnsafeSave{0}To{1}(**it);\n'.format(self.object_name, string_utils.to_title_style_name(table_name)) impl += ' }\n\n' impl += ' CommitTransaction();\n\n UnlockMainDatabase();\n' impl += '}' return impl else: impl = 'void {0}::Save{1}ToCache(const {1}& {2}) const {{\n'.format(self.manager_name, self.object_name, self.object_name.lower()) impl += ' LockMainDatabase();' + _CPP_BR if len(save_command.table_name_list) == 0: impl += ' UnsafeSave{0}ToCache({1});'.format(self.object_name, self.object_name.lower()) + _CPP_BR else: for table_name in save_command.table_name_list: if table_name == self.plural_object_name.lower(): impl += ' UnsafeSave{0}ToCache({1});'.format(self.object_name, self.object_name.lower()) + _CPP_BR else: impl += ' UnsafeSave{0}To{2}({1});'.format(self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name)) + _CPP_BR impl += ' UnlockMainDatabase();\n' impl += '}' return impl