in src/codegen/tool/GenerateJava.cpp [397:631]
void CGenerateJava::codeGenerate(const schema::CObservableObjectInfo *pPropertyModelInfo)
{
bool isViewModel = pPropertyModelInfo->getModelType() == schema::ModelTypeInfoType_ViewModel;
std::wstring typeInfoName = toTypeInfoName(pPropertyModelInfo->getName());
_osAddFactoryTypes << FormatW(
_javaAddTypeTemplate,
typeInfoName.data(),
_typeInfoClassName,
nullptr);
std::wostringstream osPropertiesEnum;
std::wostringstream osMethodsEnum;
std::wostringstream osPropertiesDeclare;
std::wostringstream osPropertiesImplement;
std::wostringstream osMethodsDeclare;
std::wostringstream osMethodsImplement;
// Iterate Properties
for(schema::_PropertyIteratorType::const_iterator iter = pPropertyModelInfo->getProperties().begin();
iter != pPropertyModelInfo->getProperties().end();
++iter)
{
// generate enum
if(iter != pPropertyModelInfo->getProperties().begin())
{
osPropertiesEnum << "," << std::endl;
}
osPropertiesEnum << " " << (*iter)->getName() << "(";
if((*iter)->isParent())
{
osPropertiesEnum << "0x2000";
}
else
{
osPropertiesEnum << (*iter)->getId();
}
if(isViewModel && !(*iter)->isParent())
{
osPropertiesEnum << " + 0x1000";
}
osPropertiesEnum << ")";
// generate implementation
std::wstring javaPropertyType = toJavaPropertyTypeInfo(*iter);
UINT32 flags = (*iter)->getFlags();
if (flags & PropertyFlagType_CanRead)
{
bool isFoundationArray = false;
std::wstring arrayClass = L"";
std::wstring toCast = toCastFunc(*iter, isFoundationArray);
if (isFoundationArray)
{
arrayClass += L", ";
arrayClass += javaPropertyType.data();
arrayClass += L".class";
}
osPropertiesImplement << FormatW(
_javaGetPropertyTemplate,
(*iter)->getName().data(), // {0}
javaPropertyType.data(), // {1}
toCast.data(), // {2}
_typeInfoClassName, // {3}
typeInfoName.data(), // {4}
arrayClass.data(), // {5}
nullptr);
osPropertiesDeclare << FormatW(
_javaGetPropertyDeclareTemplate,
(*iter)->getName().data(),
javaPropertyType.data(),
nullptr);
}
if (flags & PropertyFlagType_CanWrite)
{
const bool isEnumArray = isEnumArrayProperty(*iter);
osPropertiesImplement << FormatW(
isEnumArray ? _javaSetPropertyEnumArrayTemplate : _javaSetPropertyTemplate,
(*iter)->getName().data(),
isEnumArray ? javaPropertyType.substr(0, javaPropertyType.length() - 2).data() : javaPropertyType.data(),
_typeInfoClassName,
typeInfoName.data(),
nullptr);
osPropertiesDeclare << FormatW(
isEnumArray ? _javaSetPropertyEnumArrayDeclareTemplate : _javaSetPropertyDeclareTemplate,
(*iter)->getName().data(),
isEnumArray ? javaPropertyType.substr(0, javaPropertyType.length() - 2).data() : javaPropertyType.data(),
nullptr);
}
}
// Iterate Methods
for(schema::_MethodIteratorType::const_iterator iter = pPropertyModelInfo->getMethods().begin();
iter != pPropertyModelInfo->getMethods().end();
++iter)
{
// generate enum
if(iter != pPropertyModelInfo->getMethods().begin())
{
osMethodsEnum << "," << std::endl;
}
osMethodsEnum << "\t\t" << (*iter)->getName() << "(" << (*iter)->getId() << ")";
bool isAsync = (*iter)->getIsAsync();
bool hasResult = isAsync || ((*iter)->getResultType()->getPropertyType() != foundation::PropertyType_Empty);
std::wstring javaReturnType = isAsync ?
toJavaAsyncOperationTypeInfo((*iter)->getResultType()) :
toJavaPropertyTypeInfo((*iter)->getResultType());
std::wostringstream osDeclareParameters;
std::wostringstream osInvokeParameters;
for(schema::_MethodParamIteratorType::const_iterator iterParam = (*iter)->getParameters().begin();
iterParam != (*iter)->getParameters().end();
++iterParam)
{
if(iterParam != (*iter)->getParameters().begin())
{
osDeclareParameters << ",";
osInvokeParameters << ",";
}
std::wstring javaParameterType = toJavaPropertyTypeInfo(*iterParam);
osDeclareParameters << javaParameterType << " " << (*iterParam)->getParameterName();
osInvokeParameters << (*iterParam)->getParameterName();
}
std::wstring methodName = (*iter)->getName();
// use java convention for methods by making first letter lowercase
methodName[0] = tolower(methodName[0]);
// TODO: ...
bool dummy = false;
osMethodsImplement << FormatW(
hasResult ? _javaMethodWithResultTemplate : _javaMethodTemplate,
methodName.data(),
(*iter)->getName().data(),
javaReturnType.data(),
osDeclareParameters.str().data(),
osInvokeParameters.str().data(),
hasResult
? (isAsync
? L"toFoundationObject"
: toCastFunc((*iter)->getResultType(), dummy).data())
: L"",
_typeInfoClassName,
typeInfoName.data(),
nullptr);
osMethodsDeclare << FormatW(
_javaMethodDeclareTemplate,
methodName.data(),
javaReturnType.data(),
osDeclareParameters.str().data(),
nullptr);
}
// Declare a class for model type definition
std::wstring typeId = ToWideString(pPropertyModelInfo->getType());
// Extend class name
std::wstring javaExtendsClass = pPropertyModelInfo->getBaseType() ?
toTypeInfoName(pPropertyModelInfo->getBaseType()->getName() + L"Impl") :
formatPackagePropertyModelName(L"ObservableObjectImpl");
std::wstring modelTypeDeclare = FormatW(
_javaModelType_Declare,
_javaPackageName.data(), // {0}
_packagePropertyModel, // {1}
javaExtendsClass.data(), // {2}
typeInfoName.data(), // {3}
typeId.data(), // {4}
// Properties implement // {5}
osPropertiesImplement.str().data(),
// Methods implement // {6}
osMethodsImplement.str().data(),
// who extends
nullptr);
std::wstring interfaceTypeDeclare = FormatW(
_javaModelInterfaceType_Declare,
// Java package name {0}
_javaPackageName.data(),
// Java interface name {1}
typeInfoName.data(),
// Base interface (ObservableObject) {2}
formatPackagePropertyModelName(_observableObjectInterfaceName).data(),
// Properties {3}
osPropertiesDeclare.str().data(),
// Methods {4}
osMethodsDeclare.str().data(),
nullptr);
_osTypeInfoEntries << FormatW(
_javaTypeInfoEntry_Template,
// Java interface name // {0}
typeInfoName.data(),
// IID
typeId.data(), // {1}
// Properties // {2}
pPropertyModelInfo->getProperties().size() ?
FormatW(_javaInnerEnum_Template,
L"Properties",
osPropertiesEnum.str().data(),
nullptr
).data() :
L"",
// Methods // {3}
pPropertyModelInfo->getMethods().size() ?
FormatW(_javaInnerEnum_Template,
L"Methods",
osMethodsEnum.str().data(),
nullptr
).data() :
L"",
// Events // {4}
L"",
nullptr);
std::wofstream fileJavaModelType(toJavaSourceFile((typeInfoName + L"Impl").data()),std::ios_base::out);
fileJavaModelType << modelTypeDeclare;
fileJavaModelType.close();
std::wofstream fileJavaInterfaceType(toJavaSourceFile(typeInfoName.data()), std::ios_base::out);
fileJavaInterfaceType << interfaceTypeDeclare;
fileJavaInterfaceType.close();
}