def __init__(self, schema, naming): javatype = schema['javaType'] if not javatype or 0 == len(javatype): raise Exception('missing "javaType" field') self._cppmodelclassname = jscom.javatypetocppname(javatype) self._naming = naming
def derivecppmodelclassname(): if type == jscom.JSON_TYPE_OBJECT: javatype = schema['javaType'] if not javatype or 0 == len(javatype): raise Exception('missing "javaType" field') return jscom.javatypetocppname(javatype) if type == jscom.JSON_TYPE_STRING: return jscom.CPP_TYPE_STRING raise Exception('unsupported "type" of "%s"' % type)
def cpprootmodelclassname(self): if self._schemaroot['type'] != 'object': raise Exception('expecting object') javatype = self._schemaroot['javaType'] if not javatype or 0 == len(javatype): raise Exception('missing "javaType" field') return jscom.javatypetocppname(javatype)
def writedestructorlogicforlist(outputfile, propname, propmetadata): dict = { 'cppmembername': jscom.propnametocppmembername(propname), 'cpptype': jscom.javatypetocppname(propmetadata['items']['javaType']) } outputfile.write( string.Template(""" int32 count = ${cppmembername}->CountItems(); for (i = 0; i < count; i++) delete ${cppmembername}->ItemAt(i); """).substitute(dict))
def writeheaderincludes(outputfile, properties): for propname, propmetadata in properties.items(): jsontype = propmetadata['type'] javatype = None if jsontype == 'object': javatype = propmetadata['javaType'] if jsontype == 'array': javatype = propmetadata['items']['javaType'] if javatype is not None: outputfile.write('#include "%s.h"\n' % jscom.javatypetocppname(javatype))
def writeheaderincludes(outputfile, properties): for propname, propmetadata in properties.items(): jsontype = propmetadata['type'] javatype = None if jsontype == jscom.JSON_TYPE_OBJECT: javatype = propmetadata['javaType'] if jsontype == jscom.JSON_TYPE_ARRAY: javatype = propmetadata['items']['javaType'] if javatype is not None: outputfile.write('#include "%s.h"\n' % jscom.javatypetocppname(javatype))
def writeaccessorsheader(outputfile, propname, propmetadata): type = propmetadata['type'] if type == 'array': writelistaccessorsheader( outputfile, jscom.propnametocppname(propname), jscom.javatypetocppname(propmetadata['items']['javaType'])) elif jscom.propmetadatatypeisscalar(propmetadata): writescalaraccessorsheader( outputfile, jscom.propnametocppname(propname), jscom.propmetadatatocpptypename(propmetadata)) else: writetakeownershipaccessorsheader( outputfile, jscom.propnametocppname(propname), jscom.propmetadatatocpptypename(propmetadata))
def writeaccessorsheader(outputfile, propname, propmetadata): type = propmetadata['type'] if type == 'array': writelistaccessorsheader(outputfile, jscom.propnametocppname(propname), jscom.javatypetocppname(propmetadata['items']['javaType'])) elif jscom.propmetadatatypeisscalar(propmetadata): writescalaraccessorsheader(outputfile, jscom.propnametocppname(propname), jscom.propmetadatatocpptypename(propmetadata)) else: writetakeownershipaccessorsheader(outputfile, jscom.propnametocppname(propname), jscom.propmetadatatocpptypename(propmetadata))
def schematocppmodels(inputfile, schema, outputdirectory): if schema['type'] != 'object': raise Exception('expecting object') javatype = schema['javaType'] if not javatype or 0 == len(javatype): raise Exception('missing "javaType" field') cppclassname = jscom.javatypetocppname(javatype) cpphfilename = os.path.join(outputdirectory, cppclassname + '.h') cppifilename = os.path.join(outputdirectory, cppclassname + '.cpp') with open(cpphfilename, 'w') as cpphfile: jscom.writetopcomment(cpphfile, os.path.split(inputfile)[1], 'Model') guarddefname = 'GEN_JSON_SCHEMA_MODEL__%s_H' % (cppclassname.upper()) cpphfile.write( string.Template(""" #ifndef ${guarddefname} #define ${guarddefname} #include "List.h" #include "String.h" """).substitute({'guarddefname': guarddefname})) writeheaderincludes(cpphfile, schema['properties']) cpphfile.write( string.Template(""" class ${cppclassname} { public: ${cppclassname}(); virtual ~${cppclassname}(); """).substitute({'cppclassname': cppclassname})) for propname, propmetadata in schema['properties'].items(): writeaccessorsheader(cpphfile, propname, propmetadata) cpphfile.write('\n') # Now add the instance variables for the object as well. cpphfile.write('private:\n') for propname, propmetadata in schema['properties'].items(): cpphfile.write(' %s* %s;\n' % (jscom.propmetadatatocpptypename(propmetadata), jscom.propnametocppmembername(propname))) cpphfile.write(('};\n\n' '#endif // %s') % guarddefname) with open(cppifilename, 'w') as cppifile: jscom.writetopcomment(cppifile, os.path.split(inputfile)[1], 'Model') cppifile.write('#include "%s.h"\n' % cppclassname) writeconstructor(cppifile, cppclassname, schema) writedestructor(cppifile, cppclassname, schema) for propname, propmetadata in schema['properties'].items(): writeaccessors(cppifile, cppclassname, propname, propmetadata) cppifile.write('\n') # Now write out any subordinate structures. for propname, propmetadata in schema['properties'].items(): jsontype = propmetadata['type'] if jsontype == 'array': schematocppmodels(inputfile, propmetadata['items'], outputdirectory) if jsontype == 'object': schematocppmodels(inputfile, propmetadata, outputdirectory)
def schematocppmodels(inputfile, schema, outputdirectory): if schema['type'] != 'object': raise Exception('expecting object') javatype = schema['javaType'] if not javatype or 0 == len(javatype): raise Exception('missing "javaType" field') cppclassname = jscom.javatypetocppname(javatype) cpphfilename = os.path.join(outputdirectory, cppclassname + '.h') cppifilename = os.path.join(outputdirectory, cppclassname + '.cpp') with open(cpphfilename, 'w') as cpphfile: jscom.writetopcomment(cpphfile, os.path.split(inputfile)[1], 'Model') guarddefname = 'GEN_JSON_SCHEMA_MODEL__%s_H' % (cppclassname.upper()) cpphfile.write(string.Template(""" #ifndef ${guarddefname} #define ${guarddefname} #include "List.h" #include "String.h" """).substitute({'guarddefname': guarddefname})) writeheaderincludes(cpphfile, schema['properties']) cpphfile.write(string.Template(""" class ${cppclassname} { public: ${cppclassname}(); virtual ~${cppclassname}(); """).substitute({'cppclassname': cppclassname})) for propname, propmetadata in schema['properties'].items(): writeaccessorsheader(cpphfile, propname, propmetadata) cpphfile.write('\n') # Now add the instance variables for the object as well. cpphfile.write('private:\n') for propname, propmetadata in schema['properties'].items(): cpphfile.write(' %s* %s;\n' % ( jscom.propmetadatatocpptypename(propmetadata), jscom.propnametocppmembername(propname))) cpphfile.write(( '};\n\n' '#endif // %s' ) % guarddefname) with open(cppifilename, 'w') as cppifile: jscom.writetopcomment(cppifile, os.path.split(inputfile)[1], 'Model') cppifile.write('#include "%s.h"\n' % cppclassname) writeconstructor(cppifile, cppclassname, schema) writedestructor(cppifile, cppclassname, schema) for propname, propmetadata in schema['properties'].items(): writeaccessors(cppifile, cppclassname, propname, propmetadata) cppifile.write('\n') # Now write out any subordinate structures. for propname, propmetadata in schema['properties'].items(): jsontype = propmetadata['type'] if jsontype == 'array': schematocppmodels(inputfile, propmetadata['items'], outputdirectory) if jsontype == 'object': schematocppmodels(inputfile, propmetadata, outputdirectory)