#include "Link_Provider.h" #include "Employee_Provider.h" #include "Resource.h" CIMPLE_NAMESPACE_BEGIN Link_Provider::Link_Provider() { } Link_Provider::~Link_Provider() { } Load_Status Link_Provider::load() { return LOAD_OK; } Unload_Status Link_Provider::unload() { return UNLOAD_OK; } Get_Instance_Status Link_Provider::get_instance( const Link* model, Link*& instance) { return GET_INSTANCE_UNSUPPORTED; } Enum_Instances_Status Link_Provider::enum_instances( const Link* model, Enum_Instances_Handler* handler) { Auto_Mutex am(resource.mutex); for (size_t i = 0; i < resource.employees.size(); i++) { const Employee* e = resource.employees[i]; Employee* emp = Employee::create(true); emp->Id = e->Id; Manager* mgr = Manager::create(true); mgr->Id.set(1001); Link* link = Link::create(true); link->Mgr = mgr; link->Emp = emp; handler->handle(link); } return ENUM_INSTANCES_OK; } Create_Instance_Status Link_Provider::create_instance( Link* instance) { return CREATE_INSTANCE_UNSUPPORTED; } Delete_Instance_Status Link_Provider::delete_instance( const Link* instance) { return DELETE_INSTANCE_UNSUPPORTED; } Modify_Instance_Status Link_Provider::modify_instance( const Link* model, const Link* instance) { return MODIFY_INSTANCE_UNSUPPORTED; } Enum_Associator_Names_Status Link_Provider::enum_associator_names( const Instance* instance, const String& result_class, const String& role, const String& result_role, Enum_Associator_Names_Handler* handler) { return ENUM_ASSOCIATOR_NAMES_UNSUPPORTED; } Enum_References_Status Link_Provider::enum_references( const Instance* instance, const Link* model, const String& role, Enum_References_Handler* handler) { return ENUM_REFERENCES_UNSUPPORTED; } Enum_Associators_Status Link_Provider::enum_associators( const Instance* instance, const String& result_class, const String& role, const String& result_role, Enum_Associators_Handler* handler) { Auto_Mutex am(resource.mutex); // // This function implements the associators operation across the following // class. // // [Association] // class Link // { // [Key] Employee REF Emp; // [Key] Manager REF Mgr; // }; // // The instance parameter refers to the "source" instance of the // association. This function creates "result" instances and passes // them to the handler. If the source is a manager, the results will // be employees. If the source is an employee, the result will be // a single manager. // // // Client use cases: // // $ cimcli a Manager.Id=1001 // $ cimcli a Employee.Id=4001 // // Case 1: the source is a manager; results are employees. Manager* manager = cast(instance); if (manager) { // The result class must be Employee (or empty). if (result_class.size() && result_class != "Employee") return ENUM_ASSOCIATORS_FAILED; // [Source] role must be "Mgr" or empty. if (!role.empty() && !eqi(role, "Mgr")) return ENUM_ASSOCIATORS_FAILED; // Result_role must be "Emp" or empty. if (!result_role.empty() && !eqi(result_role, "Emp")) return ENUM_ASSOCIATORS_FAILED; // We only have one manager in this module. if (manager->Id.value == 1001) { for (size_t i = 0; i < resource.employees.size(); i++) handler->handle(resource.employees[i]->clone()); return ENUM_ASSOCIATORS_OK; } return ENUM_ASSOCIATORS_FAILED; } // Case 2: the source is an employee; result is a manager. Employee* employee = cast(instance); if (employee) { // The result class must be Manager (or empty). if (result_class.size() && result_class != "Manager") return ENUM_ASSOCIATORS_FAILED; // [Source] role must be "Emp" or empty. if (!role.empty() && !eqi(role, "Emp")) return ENUM_ASSOCIATORS_FAILED; // Result_role must be "Mgr" or empty. if (!result_role.empty() && !eqi(result_role, "Mgr")) return ENUM_ASSOCIATORS_FAILED; // Find this employee and send result instance. for (size_t i = 0; i < resource.employees.size(); i++) { if (key_eq(resource.employees[i], employee)) { handler->handle(resource.manager->clone()); return ENUM_ASSOCIATORS_OK; } } return ENUM_ASSOCIATORS_FAILED; } return ENUM_ASSOCIATORS_FAILED; } /*@END@*/ CIMPLE_NAMESPACE_END