void CGenerateJava::codeGenerate()

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();
}