Changeset 300 for XMLIO_V2/dev/common/src/node/context.cpp
- Timestamp:
- 02/13/12 19:35:25 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XMLIO_V2/dev/common/src/node/context.cpp
r286 r300 1 1 #include "context.hpp" 2 3 2 #include "tree_manager.hpp" 4 3 … … 11 10 12 11 #include "data_treatment.hpp" 12 #include "context_client.hpp" 13 #include "context_server.hpp" 14 #include "nc4_data_output.hpp" 13 15 14 16 namespace xmlioserver { … … 19 21 CContext::CContext(void) 20 22 : CObjectTemplate<CContext>(), CContextAttributes() 21 , calendar() 23 , calendar(),hasClient(false),hasServer(false) 22 24 { /* Ne rien faire de plus */ } 23 25 24 26 CContext::CContext(const StdString & id) 25 27 : CObjectTemplate<CContext>(id), CContextAttributes() 26 , calendar() 28 , calendar(),hasClient(false),hasServer(false) 27 29 { /* Ne rien faire de plus */ } 28 30 29 31 CContext::~CContext(void) 30 { /* Ne rien faire de plus */ } 32 { 33 if (hasClient) delete client ; 34 if (hasServer) delete server ; 35 } 31 36 32 37 //---------------------------------------------------------------- … … 299 304 } 300 305 ///--------------------------------------------------------------- 301 306 307 void CContext::initClient(MPI_Comm intraComm, MPI_Comm interComm) 308 { 309 hasClient=true ; 310 client = new CContextClient(this,intraComm, interComm) ; 311 } 312 313 void CContext::initServer(MPI_Comm intraComm,MPI_Comm interComm) 314 { 315 hasServer=true ; 316 server = new CContextServer(this,intraComm,interComm) ; 317 } 318 319 bool CContext::eventLoop(void) 320 { 321 return server->eventLoop() ; 322 } 323 324 void CContext::finalize(void) 325 { 326 if (hasClient && !hasServer) 327 { 328 client->finalize() ; 329 } 330 if (hasServer) 331 { 332 closeAllFile() ; 333 } 334 } 335 336 337 338 339 void CContext::closeDefinition(void) 340 { 341 if (hasClient && !hasServer) sendCloseDefinition() ; 342 343 solveCalendar(); 344 345 // Résolution des héritages pour le context actuel. 346 this->solveAllInheritance(); 347 348 //Initialisation du vecteur 'enabledFiles' contenant la liste des fichiers à sortir. 349 this->findEnabledFiles(); 350 351 //Recherche des champs à sortir (enable à true + niveau de sortie correct) 352 // pour chaque fichier précédemment listé. 353 this->findAllEnabledFields(); 354 355 // Résolution des références de grilles pour chacun des champs. 356 this->solveAllGridRef(); 357 358 // Traitement des opérations. 359 this->solveAllOperation(); 360 361 // Nettoyage de l'arborescence 362 CleanTree(); 363 if (hasClient) sendCreateFileHeader() ; 364 } 365 366 void CContext::findAllEnabledFields(void) 367 { 368 for (unsigned int i = 0; i < this->enabledFiles.size(); i++) 369 (void)this->enabledFiles[i]->getEnabledFields(); 370 } 371 372 void CContext::solveAllGridRef(void) 373 { 374 for (unsigned int i = 0; i < this->enabledFiles.size(); i++) 375 this->enabledFiles[i]->solveEFGridRef(); 376 } 377 378 void CContext::solveAllOperation(void) 379 { 380 for (unsigned int i = 0; i < this->enabledFiles.size(); i++) 381 this->enabledFiles[i]->solveEFOperation(); 382 } 383 384 void CContext::solveAllInheritance(void) 385 { 386 // Résolution des héritages descendants (cà d des héritages de groupes) 387 // pour chacun des contextes. 388 solveDescInheritance(); 389 390 // Résolution des héritages par référence au niveau des fichiers. 391 const std::vector<boost::shared_ptr<CFile> > & allFiles 392 = CObjectFactory::GetObjectVector<CFile>(); 393 394 for (unsigned int i = 0; i < allFiles.size(); i++) 395 allFiles[i]->solveFieldRefInheritance(); 396 } 397 398 void CContext::findEnabledFiles(void) 399 { 400 const std::vector<boost::shared_ptr<CFile> > & allFiles 401 = CObjectFactory::GetObjectVector<CFile>(); 402 403 for (unsigned int i = 0; i < allFiles.size(); i++) 404 if (!allFiles[i]->enabled.isEmpty()) // Si l'attribut 'enabled' est défini. 405 if (allFiles[i]->enabled.getValue()) // Si l'attribut 'enabled' est fixé à vrai. 406 enabledFiles.push_back(allFiles[i]); 407 408 if (enabledFiles.size() == 0) 409 DEBUG(<<"Aucun fichier ne va être sorti dans le contexte nommé \"" 410 << getId() << "\" !"); 411 } 412 413 void CContext::closeAllFile(void) 414 { 415 std::vector<boost::shared_ptr<CFile> >::const_iterator 416 it = this->enabledFiles.begin(), end = this->enabledFiles.end(); 417 418 for (; it != end; it++) 419 { 420 info(30)<<"Closing File : "<<(*it)->getId()<<endl; 421 (*it)->close(); 422 } 423 } 424 425 bool CContext::dispatchEvent(CEventServer& event) 426 { 427 428 if (SuperClass::dispatchEvent(event)) return true ; 429 else 430 { 431 switch(event.type) 432 { 433 case EVENT_ID_CLOSE_DEFINITION : 434 recvCloseDefinition(event) ; 435 return true ; 436 break ; 437 case EVENT_ID_UPDATE_CALENDAR : 438 recvUpdateCalendar(event) ; 439 return true ; 440 break ; 441 case EVENT_ID_CREATE_FILE_HEADER : 442 recvCreateFileHeader(event) ; 443 return true ; 444 break ; 445 default : 446 ERROR("bool CContext::dispatchEvent(CEventServer& event)", 447 <<"Unknown Event") ; 448 return false ; 449 } 450 } 451 } 452 453 void CContext::sendCloseDefinition(void) 454 { 455 456 CEventClient event(getType(),EVENT_ID_CLOSE_DEFINITION) ; 457 if (client->isServerLeader()) 458 { 459 CMessage msg ; 460 msg<<this->getId() ; 461 event.push(client->getServerLeader(),1,msg) ; 462 client->sendEvent(event) ; 463 } 464 else client->sendEvent(event) ; 465 } 466 467 void CContext::recvCloseDefinition(CEventServer& event) 468 { 469 470 CBufferIn* buffer=event.subEvents.begin()->buffer; 471 string id; 472 *buffer>>id ; 473 get(id)->closeDefinition() ; 474 } 475 476 void CContext::sendUpdateCalendar(int step) 477 { 478 if (!hasServer) 479 { 480 CEventClient event(getType(),EVENT_ID_UPDATE_CALENDAR) ; 481 if (client->isServerLeader()) 482 { 483 CMessage msg ; 484 msg<<this->getId()<<step ; 485 event.push(client->getServerLeader(),1,msg) ; 486 client->sendEvent(event) ; 487 } 488 else client->sendEvent(event) ; 489 } 490 } 491 492 void CContext::recvUpdateCalendar(CEventServer& event) 493 { 494 495 CBufferIn* buffer=event.subEvents.begin()->buffer; 496 string id; 497 *buffer>>id ; 498 get(id)->recvUpdateCalendar(*buffer) ; 499 } 500 501 void CContext::recvUpdateCalendar(CBufferIn& buffer) 502 { 503 int step ; 504 buffer>>step ; 505 updateCalendar(step) ; 506 } 507 508 void CContext::sendCreateFileHeader(void) 509 { 510 511 CEventClient event(getType(),EVENT_ID_CREATE_FILE_HEADER) ; 512 if (client->isServerLeader()) 513 { 514 CMessage msg ; 515 msg<<this->getId() ; 516 event.push(client->getServerLeader(),1,msg) ; 517 client->sendEvent(event) ; 518 } 519 else client->sendEvent(event) ; 520 } 521 522 void CContext::recvCreateFileHeader(CEventServer& event) 523 { 524 525 CBufferIn* buffer=event.subEvents.begin()->buffer; 526 string id; 527 *buffer>>id ; 528 get(id)->recvCreateFileHeader(*buffer) ; 529 } 530 531 void CContext::recvCreateFileHeader(CBufferIn& buffer) 532 { 533 createFileHeader() ; 534 } 535 536 void CContext::updateCalendar(int step) 537 { 538 calendar->update(step) ; 539 } 540 541 void CContext::createFileHeader(void ) 542 { 543 vector<shared_ptr<CFile> >::const_iterator it ; 544 545 for (it=enabledFiles.begin(); it != enabledFiles.end(); it++) 546 { 547 /* shared_ptr<CFile> file = *it; 548 StdString filename = (!file->name.isEmpty()) ? file->name.getValue() : file->getId(); 549 StdOStringStream oss; 550 if (! output_dir.isEmpty()) oss << output_dir.getValue(); 551 oss << filename; 552 if (!file->name_suffix.isEmpty()) oss << file->name_suffix.getValue(); 553 554 bool multifile=true ; 555 if (!file->type.isEmpty()) 556 { 557 StdString str=file->type.getValue() ; 558 if (str.compare("one_file")==0) multifile=false ; 559 else if (str.compare("multi_file")==0) multifile=true ; 560 else ERROR("void Context::createDataOutput(void)", 561 "incorrect file <type> attribut : must be <multi_file> or <one_file>, " 562 <<"having : <"<<str<<">") ; 563 } 564 if (multifile) 565 { 566 if (server->intraCommSize > 1) oss << "_" << server->intraCommRank; 567 } 568 oss << ".nc"; 569 570 shared_ptr<io::CDataOutput> dout(new T(oss.str(), false,server->intraComm,multifile)); 571 */ 572 (*it)->createHeader(); 573 } 574 } 575 576 shared_ptr<CContext> CContext::current(void) 577 { 578 return CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()) ; 579 } 580 302 581 } // namespace tree 303 582 } // namespace xmlioserver
Note: See TracChangeset
for help on using the changeset viewer.