(file) Return to WQLOperationRequestDispatcher.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Server

Diff for /pegasus/src/Pegasus/Server/WQLOperationRequestDispatcher.cpp between version 1.9 and 1.10

version 1.9, 2004/10/25 18:26:02 version 1.10, 2004/11/10 14:19:38
Line 69 
Line 69 
     PEG_METHOD_ENTER(TRC_DISPATCHER,     PEG_METHOD_ENTER(TRC_DISPATCHER,
         "CIMOperationRequestDispatcher::handleExecQueryResponse");         "CIMOperationRequestDispatcher::handleExecQueryResponse");
  
     CIMExecQueryResponseMessage * toResponse =          Uint32 numberResponses = poA->numberResponses();
         (CIMExecQueryResponseMessage *) poA->getResponse(0);  
   
     Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,     Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
         "CIMOperationRequestDispatcher::ExecQuery Response - Name Space: $0  Class name: $1 Response Count: poA->numberResponses",                                                          "CIMOperationRequestDispatcher::ExecQuery Response - "
                                                           "Name Space: $0  Class name: $1 Response Count: $2",
         poA->_nameSpace.getString(),         poA->_nameSpace.getString(),
         poA->_className.getString(),         poA->_className.getString(),
         poA->numberResponses());                                                          numberResponses);
   
           if (numberResponses == 0)
                   return;
  
     if (poA->getResponse(0)->getType()==CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE) {          CIMResponseMessage *response = poA->getResponse(0);
        applyQueryToEnumeration(poA->getResponse(0),poA->_query);          CIMExecQueryResponseMessage *toResponse = 0;
           Uint32 startIndex = 0;
           Uint32 endIndex = numberResponses - 1;
   
           if (response->getType() == CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE)
           {
                   CIMRequestMessage &request = *poA->getRequest();
                   AutoPtr<CIMExecQueryResponseMessage> query
                           (new CIMExecQueryResponseMessage(request.messageId,
                                                                                                                                                            CIMException(),
                                                                                                                                                            request.queueIds.copyAndPop(),
                                                                                                                                                            Array<CIMObject>()));
                   toResponse = query.release();
           }
           else
           {
                   toResponse = (CIMExecQueryResponseMessage *)response;
                   startIndex = 1;
     }     }
  
     // Work backward and delete each response off the end of the array     // Work backward and delete each response off the end of the array
     for(Uint32 i = poA->numberResponses() - 1; i > 0; i--) {          for(Uint32 i = endIndex; i >= startIndex; i--)
         if (poA->getResponse(i)->getType()==CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE) {          {
            applyQueryToEnumeration(poA->getResponse(i),poA->_query);                  response = poA->getResponse(i);
   
                   if (response->getType() == CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE)
                   {
                           // convert enumerate instances responses to exec query responses
                           applyQueryToEnumeration(response, poA->_query);
            CIMEnumerateInstancesResponseMessage *fromResponse =            CIMEnumerateInstancesResponseMessage *fromResponse =
                (CIMEnumerateInstancesResponseMessage *)poA->getResponse(i);                                  (CIMEnumerateInstancesResponseMessage *)response;
            CIMClass cimClass;            CIMClass cimClass;
   
            Boolean clsRead=false;            Boolean clsRead=false;
            for (Uint32 j = 0, m = fromResponse->cimNamedInstances.size(); j<m; j++) {                          for (Uint32 j = 0,m = fromResponse->cimNamedInstances.size(); j<m; j++)
                           {
               CIMObject co=CIMObject(fromResponse->cimNamedInstances[j]);               CIMObject co=CIMObject(fromResponse->cimNamedInstances[j]);
               CIMObjectPath op=co.getPath();               CIMObjectPath op=co.getPath();
               const Array<CIMKeyBinding>& kbs=op.getKeyBindings();               const Array<CIMKeyBinding>& kbs=op.getKeyBindings();
               if (kbs.size()==0) {     // no path set why ?                if (kbs.size()==0)
                  if (clsRead==false) {                                  {     // no path set why ?
                     cimClass = _repository->getClass(                                          if (clsRead==false)
                       poA->_nameSpace,op.getClassName(),                                          {
                                                   cimClass =
                                                           _repository->getClass(poA->_nameSpace, op.getClassName(),
                       false,true,false, CIMPropertyList());                       false,true,false, CIMPropertyList());
                     clsRead=true;                     clsRead=true;
                  }                  }
Line 109 
Line 137 
               toResponse->cimObjects.append(co);               toResponse->cimObjects.append(co);
            }            }
         }         }
         else {                  else
                   {
            CIMExecQueryResponseMessage *fromResponse =            CIMExecQueryResponseMessage *fromResponse =
                (CIMExecQueryResponseMessage *)poA->getResponse(i);                                  (CIMExecQueryResponseMessage *)response;
            CIMClass cimClass;            CIMClass cimClass;
            Boolean clsRead=false;            Boolean clsRead=false;
            for (Uint32 j = 0, m = fromResponse->cimObjects.size(); j<m; j++) {                          for (Uint32 j = 0, m = fromResponse->cimObjects.size(); j<m; j++)
                           {
               CIMObject co=fromResponse->cimObjects[j];               CIMObject co=fromResponse->cimObjects[j];
               CIMObjectPath op=co.getPath();               CIMObjectPath op=co.getPath();
               const Array<CIMKeyBinding>& kbs=op.getKeyBindings();               const Array<CIMKeyBinding>& kbs=op.getKeyBindings();
               if (kbs.size()==0) {     // no path set why ?                if (kbs.size()==0)
                  if (clsRead==false) {                                  {     // no path set why ?
                     cimClass = _repository->getClass(                                          if (clsRead==false)
                       poA->_nameSpace,op.getClassName(),                                          {
                                                   cimClass =
                                                           _repository->getClass(poA->_nameSpace,op.getClassName(),
                       false,true,false, CIMPropertyList());                       false,true,false, CIMPropertyList());
                     clsRead=true;                     clsRead=true;
                  }                  }
Line 133 
Line 165 
               toResponse->cimObjects.append(co);               toResponse->cimObjects.append(co);
            }            }
         }         }
   
         poA->deleteResponse(i);         poA->deleteResponse(i);
     }                  if (i == 0)
     delete poA->_query;                          break;
           } // for all responses in response list
   
           // if we started with an enumerateInstances repsonse, then add it to overall
           if (startIndex == 0)
                   poA->appendResponse(toResponse);
   
     PEG_METHOD_EXIT();     PEG_METHOD_EXIT();
 } }
  
Line 306 
Line 345 
     poA->_aggregationSN = cimOperationAggregationSN++;     poA->_aggregationSN = cimOperationAggregationSN++;
     poA->_nameSpace=request->nameSpace;     poA->_nameSpace=request->nameSpace;
  
     // insert dummy CIMExecQueryResponseMessage entry  
     // this ensures a CIMExecQueryResponse to be generated  
     CIMExecQueryResponseMessage *qResp=new CIMExecQueryResponseMessage(  
            request->messageId,  
            CIMException(CIM_ERR_FAILED,String::EMPTY), // will be removed later in  
                                                // handleOperationResponseAggregation  
            request->queueIds.copyAndPop(),  
             Array<CIMObject>());  
   
     if (_repository->isDefaultInstanceProvider())  
         poA->setTotalIssued(numClasses+1);  
     else poA->setTotalIssued(providerCount+1);  
     poA->appendResponse(qResp);  
   
     // Loop through providerInfos, forwarding requests to providers  
     for (Uint32 i = 0; i < numClasses; i++)  
     {  
         // If this class has a provider  
         if (providerInfos[i].hasProvider)  
         {  
             STAT_PROVIDERSTART  
   
             PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,  
                 Formatter::format(  
                     "Query Req. class $0 to svc \"$1\" for "  
                         "control provider \"$2\", No $3 of $4, SN $5",  
                     providerInfos[i].className.getString(),  
                     providerInfos[i].serviceName,  
                     providerInfos[i].controlProviderName,  
                     i, numClasses, poA->_aggregationSN));  
   
             if (providerInfos[i].hasNoQuery) {  
                // if (getenv("CMPI_DEBUG")) asm("int $3");  
                CIMEnumerateInstancesRequestMessage *enumReq=  
                   new CIMEnumerateInstancesRequestMessage(  
                      request->messageId, request->nameSpace,  
                      providerInfos[i].className,  
                      false,false,false,false,CIMPropertyList(),  
                      request->queueIds,request->authType,  
                      ((IdentityContainer)request->operationContext.get(IdentityContainer::NAME)).getUserName());  
   
                 _forwardRequestForAggregation(providerInfos[i].serviceName,  
                       providerInfos[i].controlProviderName, enumReq, poA);  
             }  
   
             else {  
                // if (getenv("CMPI_DEBUG")) asm("int $3");  
                AutoPtr<CIMExecQueryRequestMessage> requestCopy(  
                    new CIMExecQueryRequestMessage(*request));  
   
                requestCopy->className = providerInfos[i].className;  
   
                _forwardRequestForAggregation(providerInfos[i].serviceName,  
                    providerInfos[i].controlProviderName, requestCopy.release(), poA);  
             }  
   
             STAT_PROVIDEREND  
         }  
     }  
     // if (getenv("CMPI_DEBUG")) asm("int $3");  
     if (_repository->isDefaultInstanceProvider())     if (_repository->isDefaultInstanceProvider())
     {     {
         // Loop through providerInfos, forwarding requests to repository         // Loop through providerInfos, forwarding requests to repository
         for (Uint32 i = 0; i < numClasses; i++)         for (Uint32 i = 0; i < numClasses; i++)
         {         {
                                   ProviderInfo &providerInfo = providerInfos[i];
   
                                   // this class is registered to a provider - skip
                                   if (providerInfo.hasProvider)
                                           continue;
   
             // If this class does not have a provider             // If this class does not have a provider
             if (!providerInfos[i].hasProvider)  
             {                                  PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,  Formatter::format
                 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,                                                                                                   ("ExcecQuery Req. class $0 to repository, "
                     Formatter::format(  
                         "ExcecQuery Req. class $0 to repository, "  
                             "No $1 of $2, SN $3",                             "No $1 of $2, SN $3",
                         providerInfos[i].className.getString(),                                                                                                          providerInfo.className.getString(),
                         i, numClasses, poA->_aggregationSN));                         i, numClasses, poA->_aggregationSN));
  
                 CIMException cimException;                 CIMException cimException;
                 Array<CIMInstance> cimInstances;                 Array<CIMInstance> cimInstances;
   
                 STAT_PROVIDERSTART                 STAT_PROVIDERSTART
  
                 try                 try
Line 392 
Line 374 
                     cimInstances =                     cimInstances =
                         _repository->enumerateInstancesForClass(                         _repository->enumerateInstancesForClass(
                             request->nameSpace,                             request->nameSpace,
                             providerInfos[i].className,                                                                                                                                                                                                                  providerInfo.className,
                             false);                             false);
                 }                 }
                 catch(CIMException& exception)                 catch(CIMException& exception)
Line 412 
Line 394 
  
                 STAT_PROVIDEREND                 STAT_PROVIDEREND
  
                 AutoPtr<CIMEnumerateInstancesResponseMessage> response(                                  AutoPtr<CIMEnumerateInstancesResponseMessage> response
                     new CIMEnumerateInstancesResponseMessage(                                          (new CIMEnumerateInstancesResponseMessage
                         request->messageId,                                           (request->messageId,   cimException, request->queueIds.copyAndPop(),
                         cimException,  
                         request->queueIds.copyAndPop(),  
                         cimInstances));                         cimInstances));
  
                 STAT_COPYDISPATCHER_REP                 STAT_COPYDISPATCHER_REP
                                                                         // ??? new CIMEnumerateInstancesRequestMessage(*request)  
                                                                         // ?? should this be a new ???                                  poA->appendResponse(response.release());
                                                                 _forwardRequestForAggregation(String(PEGASUS_QUEUENAME_OPREQDISPATCHER), String(), request, poA, response.release());                          } // for all classes and derived classes
   
                           Uint32 numberResponses = poA->numberResponses();
                           Uint32 totalIssued = providerCount + (numberResponses > 0 ? 1 : 0);
                           poA->setTotalIssued(totalIssued);
   
                           if (numberResponses > 0)
                           {
                                   handleEnumerateInstancesResponseAggregation(poA);
                                   CIMResponseMessage *response = poA->removeResponse(0);
                                   _forwardRequestForAggregation(String(PEGASUS_QUEUENAME_OPREQDISPATCHER),
                                                                                                                                                           String(),
                                                                                                                                                           new CIMExecQueryRequestMessage(*request),
                                                                                                                                                           poA, response);
             }             }
       } // if isDefaultInstanceProvider
                   else
                   {
                           // Set the number of expected responses in the OperationAggregate
                           poA->setTotalIssued(providerCount);
         }         }
   
       // Loop through providerInfos, forwarding requests to providers
       for (Uint32 i = 0; i < numClasses; i++)
       {
           // If this class has a provider
                           ProviderInfo &providerInfo = providerInfos[i];
   
                           // this class is NOT registered to a provider - skip
                           if (! providerInfo.hasProvider)
                                   continue;
   
                           STAT_PROVIDERSTART
   
                           PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4, Formatter::format
                                                                                            ("Query Req. class $0 to svc \"$1\" for "
                                                                                                   "control provider \"$2\", No $3 of $4, SN $5",
                                                                                                   providerInfo.className.getString(),
                                                                                                   providerInfo.serviceName,
                                                                                                   providerInfo.controlProviderName,
                                                                                                   i, numClasses, poA->_aggregationSN));
   
                           ProviderIdContainer *providerIdContainer =
                                   providerInfo.providerIdContainer.get();
   
                           if (providerInfo.hasNoQuery && providerIdContainer)
                           {
                                   OperationContext *context = &request->operationContext;
                                   const OperationContext::Container *container = 0;
                                   container = &context->get(IdentityContainer::NAME);
                                   const IdentityContainer &identityContainer =
                                           dynamic_cast<const IdentityContainer &>(*container);
   
                                   CIMEnumerateInstancesRequestMessage *enumReq = new
                                           CIMEnumerateInstancesRequestMessage(request->messageId,
                                                                                                                                                                                           request->nameSpace,
                                                                                                                                                                                           providerInfo.className,
                                                                                                                                                                                           false,false,false,false,
                                                                                                                                                                                           CIMPropertyList(),
                                                                                                                                                                                           request->queueIds,
                                                                                                                                                                                           request->authType,
                                                                                                                                                                                           identityContainer.getUserName());
   
                                   context = &enumReq->operationContext;
                                   context->insert(*providerIdContainer);
                                   context->insert(identityContainer);
                                   _forwardRequestForAggregation(providerInfo.serviceName,
                                                                                                                                                           providerInfo.controlProviderName,
                                                                                                                                                           enumReq, poA);
               }
               else
                           {
                                   AutoPtr<CIMExecQueryRequestMessage> requestCopy
                                           (new CIMExecQueryRequestMessage(*request));
   
                                   requestCopy->className = providerInfo.className;
   
                                   _forwardRequestForAggregation(providerInfo.serviceName,
                                                                                                                                                           providerInfo.controlProviderName,
                                                                                                                                                           requestCopy.release(), poA);
     }     }
  //   abort();  
                           STAT_PROVIDEREND
   
       } // for all classes and derived classes
   
    PEG_METHOD_EXIT();    PEG_METHOD_EXIT();
     return;     return;
 } }


Legend:
Removed from v.1.9  
changed lines
  Added in v.1.10

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2