std::shared_ptr<SimulatorResource> SimulatorResourceFactory::buildResource(
    const std::shared_ptr<RAML::RamlResource> &ramlResource)
{
    // Build resource request and respone model schema
    RequestModelBuilder requestModelBuilder;
    std::unordered_map<std::string, RequestModelSP> requestModels =
        requestModelBuilder.build(ramlResource);

    // Build SimulatorResourceModel from "GET" response schema
    if (requestModels.end() == requestModels.find("GET"))
    {
        OIC_LOG(ERROR, TAG, "Resource's RAML does not have GET request model!");
        return nullptr;
    }

    RequestModelSP getRequestModel = requestModels["GET"];
    ResponseModelSP getResponseModel = getRequestModel->getResponseModel(200);
    if (!getResponseModel)
    {
        OIC_LOG(ERROR, TAG, "Resource's RAML does not have response for GET request!");
        return nullptr;
    }

    std::shared_ptr<SimulatorResourceModelSchema> responseSchema =
        getResponseModel->getSchema();
    if (!responseSchema)
    {
        OIC_LOG(ERROR, TAG, "Failed to get schema from response model!");
        return nullptr;
    }

    SimulatorResourceModel resourceModel = responseSchema->buildResourceModel();

    // Remove the common properties from  resource Model
    std::string resourceURI = ramlResource->getResourceUri();
    std::string resourceName = ramlResource->getDisplayName();
    std::string resourceType;

    // Extracting resource type.
    if (resourceModel.contains("rt"))
    {
        resourceType = resourceModel.get<std::string>("rt");
        resourceModel.remove("rt");
    }
    else if (resourceModel.contains("resourceType"))
    {
        resourceType = resourceModel.get<std::string>("resourceType");
        resourceModel.remove("resourceType");
    }

    // Construct resource type from uri
    if(resourceType.empty())
    {
        std::ostringstream rtString;
        rtString << "oic.r.";

        size_t pos = resourceURI.rfind("/");
        if (pos == std::string::npos)
            pos = -1;

        std::string rtName = resourceURI.substr(pos+1);
        std::transform(rtName.begin(), rtName.end(), rtName.begin(), ::tolower);
        rtString << rtName;
        resourceType = rtString.str();
    }

    // Extracting interface type.
    std::vector<std::string> interfaceTypes;
    if (resourceModel.contains("if"))
    {
        SimulatorResourceModel::TypeInfo typeInfo = resourceModel.getType("if");
        if(AttributeValueType::STRING == typeInfo.type())
        {
            interfaceTypes.push_back(resourceModel.get<std::string>("if"));
        }
        else if(AttributeValueType::VECTOR == typeInfo.type()
            && AttributeValueType::STRING == typeInfo.baseType()
            && typeInfo.depth() == 1)
        {
            interfaceTypes = resourceModel.get<std::vector<std::string>>("if");
            if (interfaceTypes.size() > 1)
                interfaceTypes.erase(interfaceTypes.begin()+1, interfaceTypes.end());
        }

        resourceModel.remove("if");
    }

    for (auto &requestModel : requestModels)
    {
        if (requestModel.second)
        {
            addInterfaceFromQueryParameter((requestModel.second)->getQueryParams("if"),
                interfaceTypes);
        }
    }

    // Remove properties which are not part of resource representation
    resourceModel.remove("p");
    resourceModel.remove("n");
    resourceModel.remove("id");

    // Create simple/collection resource
    std::shared_ptr<SimulatorResource> simResource;
    if (resourceModel.contains("links"))
    {
        std::shared_ptr<SimulatorCollectionResourceImpl> collectionRes(
            new SimulatorCollectionResourceImpl());

        collectionRes->setName(resourceName);
        collectionRes->setResourceType(resourceType);
        if (interfaceTypes.size() > 0)
            collectionRes->setInterface(interfaceTypes);
        collectionRes->setURI(ResourceURIFactory::getInstance()->makeUniqueURI(resourceURI));

        // Set the resource model and its schema to simulated resource
        collectionRes->setResourceModel(resourceModel);
        collectionRes->setResourceModelSchema(responseSchema);
        collectionRes->setRequestModel(requestModels);

        simResource = collectionRes;
    }
    else
    {
        std::shared_ptr<SimulatorSingleResourceImpl> singleRes(
            new SimulatorSingleResourceImpl());

        singleRes->setName(resourceName);
        singleRes->setResourceType(resourceType);
        if (interfaceTypes.size() > 0)
            singleRes->setInterface(interfaceTypes);
        singleRes->setURI(ResourceURIFactory::getInstance()->makeUniqueURI(resourceURI));

        // Set the resource model and its schema to simulated resource
        singleRes->setResourceModel(resourceModel);
        singleRes->setResourceModelSchema(responseSchema);
        singleRes->setRequestModel(requestModels);

        simResource = singleRes;
    }

    return simResource;
}
std::shared_ptr<SimulatorResource> SimulatorResourceFactory::buildResource(
    std::shared_ptr<RAML::RamlResource> ramlResource)
{
    std::string name;
    std::string uri;
    std::string resourceType, rt;
    std::vector<std::string> interfaceType, ifType;

    name = ramlResource->getDisplayName();
    uri = ramlResource->getResourceUri();
    std::map<RAML::ActionType, RAML::ActionPtr> actionType = ramlResource->getActions();

    RAML::RequestResponseBodyPtr successResponseBody = getRAMLResponseBody(
                ramlResource, RAML::ActionType::GET, "200");
    RAML::RequestResponseBodyPtr putErrorResponseBody = getRAMLResponseBody(
                ramlResource, RAML::ActionType::PUT, "403");
    RAML::RequestResponseBodyPtr postErrorResponseBody = getRAMLResponseBody(
                ramlResource, RAML::ActionType::POST, "403");

    SimulatorResourceModel successResponseModel = buildModelFromResponseBody(
                successResponseBody, resourceType, interfaceType);
    SimulatorResourceModel putErrorResponseModel = buildModelFromResponseBody(
                putErrorResponseBody, rt, ifType);
    SimulatorResourceModel postErrorResponseModel = buildModelFromResponseBody(
                postErrorResponseBody, rt, ifType);

    // Create simple/collection resource
    std::shared_ptr<SimulatorResource> simResource;
    if (successResponseModel.containsAttribute("links"))
    {
        try
        {
            std::shared_ptr<SimulatorCollectionResourceImpl> collectionRes(
                new SimulatorCollectionResourceImpl());

            collectionRes->setName(name);
            collectionRes->setResourceType(resourceType);
            collectionRes->setInterface(interfaceType);
            collectionRes->setURI(ResourceURIFactory::getInstance()->constructURI(uri));
            collectionRes->setActionType(actionType);

            collectionRes->setResourceModel(successResponseModel);
            simResource = std::dynamic_pointer_cast<SimulatorResource>(collectionRes);
        }
        catch (InvalidArgsException &e) {}
    }
    else
    {
        try
        {
            std::shared_ptr<SimulatorSingleResourceImpl> singleRes(
                new SimulatorSingleResourceImpl());

            singleRes->setName(name);
            singleRes->setResourceType(resourceType);
            singleRes->setInterface(interfaceType);
            singleRes->setURI(ResourceURIFactory::getInstance()->constructURI(uri));
            singleRes->setActionType(actionType);

            singleRes->setResourceModel(successResponseModel);
            singleRes->setPutErrorResponseModel(putErrorResponseModel);
            singleRes->setPostErrorResponseModel(postErrorResponseModel);

            simResource = std::dynamic_pointer_cast<SimulatorResource>(singleRes);
        }
        catch (InvalidArgsException &e) {}
    }

    return simResource;
}