00001 #include "StdAfx.h"
00002 #include "BON2Component.h"
00003
00004 #include "logger.h"
00005
00006 #include "string"
00007
00008 #include "Dumper.h"
00009 #include "globals.h"
00010
00011 extern Globals global_vars;
00012
00013 namespace BON
00014 {
00015
00016 void Component::entityBuilder( const Model& model, const Folder& parent)
00017 {
00018
00019 std::set<Set> aspects = model->getChildSets();
00020 std::set<Set>::iterator aspect = aspects.begin();
00021 for( ; aspect != aspects.end(); ++aspect)
00022 {
00023 Entity new_elem( parent, *aspect);
00024 m_entities.push_back( new_elem);
00025
00026 std::set<FCO> aspect_elements = (*aspect)->getMembers();
00027 std::set<FCO>::iterator asp_elem = aspect_elements.begin();
00028 for( ; asp_elem != aspect_elements.end(); ++asp_elem)
00029 {
00030
00031
00032
00033
00034 if ((*asp_elem)->getObjectMeta().type() == MON::OT_Atom ||
00035 (*asp_elem)->getObjectMeta().type() == MON::OT_Reference)
00036 {
00037
00038 Relation rela( Relation::ASPECT_MEMBER_OP, *aspect, *asp_elem);
00039
00040 if ( m_relations.end() == std::find( m_relations.begin(), m_relations.end(), rela))
00041 m_relations.push_back( rela);
00042 else
00043 global_vars.err << MSG_ERROR << "Internal warning: Relation ASPECT_MEMBER \"" << BON::FCO( *asp_elem) << "\" found already in relations.\n";
00044 }
00045 else if ((*asp_elem)->getObjectMeta().type() == MON::OT_Connection &&
00046 (*asp_elem)->getObjectMeta().name() == Relation::containment_str )
00047 {
00048 FCO src_fco, dst_model;
00049 Connection containment( *asp_elem);
00050 if (containment)
00051 {
00052 src_fco = FCO( containment->getSrc());
00053 dst_model = FCO( containment->getDst());
00054 }
00055
00056 Relation rela( Relation::ASPECT_MEMBER_OP, *aspect, src_fco, *asp_elem, dst_model);
00057
00058 if ( m_relations.end() == std::find( m_relations.begin(), m_relations.end(), rela))
00059 m_relations.push_back( rela);
00060 else
00061 global_vars.err << MSG_ERROR << "Internal warning: Relation ASPECT_MEMBER \"" << BON::FCO( *asp_elem) << "\" found already in relations\n";
00062 }
00063 else
00064 global_vars.err << MSG_ERROR << "Cannot handle AspectMember operation. Op1: " << BON::FCO( *aspect) << " Op2: " << BON::FCO( *asp_elem) << "\n";
00065 }
00066 }
00067
00068
00069 std::set<Connection> conns = model->getChildConnections();
00070 std::set<Connection>::iterator conn_it = conns.begin();
00071 for( ; conn_it != conns.end(); ++conn_it)
00072 {
00073 #if(0)
00074 **
00075 * in case of reference:
00076 * op1: FCO ( referred )
00077 * op2: Reference
00078 *
00079 * in other cases:
00080 * op1: container
00081 * op2: element
00082 * op3: association class (in case of connector)
00083 * connection line class (in case of containment and foldercontainment)
00084 * op4: connection line class (in case of connector: source2connector)
00085 * op5: connection line class (in case of connector: connector2destination)
00086 *
00087 #endif
00088
00089 std::string conn_kind = (*conn_it)->getObjectMeta().name();
00090 if ( conn_kind == Relation::containment_str ||
00091 conn_kind == Relation::folder_containment_str ||
00092 conn_kind == Relation::set_membership_str ||
00093 conn_kind == Relation::refer_to_str ||
00094 conn_kind == Relation::has_aspect_str ||
00095 conn_kind == Relation::has_constraint_str ||
00096 conn_kind == Relation::has_attribute_str)
00097 {
00098 FCO src = FCO((*conn_it)->getSrc());
00099 FCO dst = FCO((*conn_it)->getDst());
00100
00101 Relation rela( Relation::CONTAINMENT_OP, dst, src);
00102
00103 if ( conn_kind == Relation::containment_str)
00104 {
00105 rela.setOperation( Relation::CONTAINMENT_OP);
00106 rela.setOp3( *conn_it);
00107 }
00108 else if ( conn_kind == Relation::folder_containment_str)
00109 {
00110 rela.setOperation( Relation::FOLDER_CONTAINMENT_OP);
00111 rela.setOp3( *conn_it);
00112 }
00113 else if ( conn_kind == Relation::set_membership_str)
00114 rela.setOperation( Relation::SET_MEMBER_OP);
00115 else if ( conn_kind == Relation::refer_to_str)
00116 rela.setOperation( Relation::REFER_TO_OP);
00117 else if ( conn_kind == Relation::has_aspect_str)
00118 rela.setOperation( Relation::HAS_ASPECT_OP);
00119 else if ( conn_kind == Relation::has_constraint_str)
00120 rela.setOperation( Relation::HAS_CONSTRAINT_OP);
00121 else if ( conn_kind == Relation::has_attribute_str)
00122 rela.setOperation( Relation::HAS_ATTRIBUTE_OP);
00123 else
00124 global_vars.err << MSG_ERROR << "Unknown connection kind.\n";
00125
00126 m_relations.push_back(rela);
00127 }
00128 }
00129
00130
00131 std::set<Reference> refs = model->getChildReferences();
00132 std::set<Reference>::iterator ref_it = refs.begin();
00133 for( ; ref_it != refs.end(); ++ref_it)
00134 {
00135 Entity new_elem( parent, *ref_it);
00136 m_entities.push_back( new_elem);
00137
00138 try
00139 {
00140 FCO referred = (*ref_it)->getReferred();
00141 this->m_realObj[ *ref_it] = referred;
00142 if ( referred)
00143 this->m_equivBag[ referred].insert( *ref_it);
00144 else
00145 global_vars.err << MSG_ERROR << "Null proxy object found: " << BON::FCO( *ref_it) << "\n";
00146 }
00147 catch( ... )
00148 {
00149 global_vars.err << MSG_ERROR << "Handling exeception thrown by Null proxy " << BON::FCO( *ref_it) << "\n";
00150 }
00151 }
00152
00153
00154 std::set<Atom> atoms = model->getChildAtoms();
00155 std::set<Atom>::iterator atom_it = atoms.begin();
00156 for( ; atom_it != atoms.end(); ++atom_it)
00157 {
00158 if ( (*atom_it)->getStereotype() != OT_Set)
00159 {
00160 Entity new_elem( parent, *atom_it);
00161
00162 std::string kind_name = (*atom_it)->getObjectMeta().name();
00163 if ( kind_name != Relation::connector_str.c_str() &&
00164 kind_name != Relation::inheritance_str.c_str() &&
00165 kind_name != Relation::int_inheritance_str.c_str() &&
00166 kind_name != Relation::imp_inheritance_str.c_str() &&
00167 kind_name != Relation::equivalence_str.c_str() &&
00168 kind_name != Relation::same_folder_str.c_str() &&
00169 kind_name != Relation::same_aspect_str.c_str())
00170 {
00171 m_entities.push_back( new_elem);
00172 }
00173 else if ( kind_name == Relation::connector_str)
00174 {
00175 Connection in_connection_line;
00176 Connection out_connection_line;
00177
00178 ConnectionEnd obj1, obj2, obja;
00179
00180 std::set<Connection> con_list_ptr_i = (*atom_it)->getInConnLinks( Relation::connector_src.c_str());
00181 std::set<Connection> con_list_ptr_o = (*atom_it)->getOutConnLinks( Relation::connector_dst.c_str());
00182
00183 if ( !con_list_ptr_i.empty())
00184 {
00185 in_connection_line = * con_list_ptr_i.begin();
00186 obj1 = in_connection_line->getSrc();
00187 }
00188 if ( !con_list_ptr_o.empty())
00189 {
00190 out_connection_line = * con_list_ptr_o.begin();
00191 obj2 = out_connection_line->getDst();
00192 }
00193 if ( !in_connection_line || !out_connection_line)
00194 global_vars.err << MSG_ERROR << "Connector \"" << BON::FCO( *atom_it) << "\" does not have both SourceToConnector and ConnectorToDestination connections attached.\n";
00195
00196
00197
00198
00199
00200 std::multiset<ConnectionEnd> a_out_list = (*atom_it)->getOutConnEnds( Relation::connector_descr);
00201 std::multiset<ConnectionEnd> a_in_list = (*atom_it)->getInConnEnds( Relation::connector_descr);
00202
00203 if ( !a_out_list.empty())
00204 {
00205 obja = * a_out_list.begin();
00206 }
00207 else if ( !a_in_list.empty())
00208 {
00209 obja = * a_in_list.begin();
00210 }
00211 else
00212 global_vars.err << MSG_ERROR << "Connector \"" << BON::FCO( *atom_it) << "\" has no Associated Class!\n";
00213
00214
00215
00216
00217 if ( !obj1 || !obj2 || !obja || !in_connection_line || !out_connection_line)
00218 {
00219 global_vars.err << MSG_ERROR << "Association \"" << BON::FCO( obja) << "\" disregarded.\n";
00220 }
00221 else
00222 {
00223 Relation rela(
00224 Relation::ASSOCIATION_OP,
00225 FCO( obj1),
00226 FCO( obj2),
00227 FCO( obja),
00228 in_connection_line,
00229 out_connection_line);
00230 m_relations.push_back(rela);
00231 }
00232 }
00233 else if ( kind_name == Relation::inheritance_str)
00234 {
00235 ConnectionEnd obj1, obj2;
00236 std::multiset<ConnectionEnd> in_list = (*atom_it)->getInConnEnds( Relation::inheritance_base);
00237 std::multiset<ConnectionEnd> out_list = (*atom_it)->getOutConnEnds( Relation::inheritance_derived);
00238 std::multiset<ConnectionEnd>::iterator in_it = in_list.begin();
00239 std::multiset<ConnectionEnd>::iterator out_it = out_list.begin();
00240
00241 int how_many_bases = 0;
00242 for( ; in_it != in_list.end(); ++in_it )
00243 {
00244 obj1 = * in_it;
00245 ++how_many_bases;
00246 if ( how_many_bases > 1) global_vars.err << MSG_WARNING << "Too many base classes at " << BON::FCO( *atom_it) << ". Multiple inheritance should be used with two different operators.\n";
00247 for( ; out_it != out_list.end(); ++out_it)
00248 {
00249 obj2 = * out_it;
00250
00251 Relation rela( Relation::INHERITANCE_OP, FCO( obj1), FCO( obj2));
00252 m_relations.push_back(rela);
00253 }
00254 }
00255 }
00256 else if ( kind_name == Relation::imp_inheritance_str)
00257 {
00258 ConnectionEnd obj1, obj2;
00259 std::multiset<ConnectionEnd> in_list = (*atom_it)->getInConnEnds( Relation::imp_inheritance_base);
00260 std::multiset<ConnectionEnd> out_list = (*atom_it)->getOutConnEnds( Relation::imp_inheritance_derived);
00261 std::multiset<ConnectionEnd>::iterator in_it = in_list.begin();
00262 std::multiset<ConnectionEnd>::iterator out_it = out_list.begin();
00263
00264 int how_many_bases = 0;
00265 for( ; in_it != in_list.end(); ++in_it )
00266 {
00267 obj1 = * in_it;
00268 ++how_many_bases;
00269 if ( how_many_bases > 1) global_vars.err << MSG_WARNING << "Too many base classes at " << BON::FCO( *atom_it) << ". Multiple inheritance should be used with two different operators.\n";
00270 for( ; out_it != out_list.end(); ++out_it)
00271 {
00272 obj2 = * out_it;
00273
00274 Relation rela( Relation::IMP_INHERITANCE_OP, FCO( obj1), FCO( obj2));
00275 m_relations.push_back(rela);
00276 }
00277 }
00278 }
00279 else if ( kind_name == Relation::int_inheritance_str)
00280 {
00281 ConnectionEnd obj1, obj2;
00282 std::multiset<ConnectionEnd> in_list = (*atom_it)->getInConnEnds( Relation::int_inheritance_base);
00283 std::multiset<ConnectionEnd> out_list = (*atom_it)->getOutConnEnds( Relation::int_inheritance_derived);
00284 std::multiset<ConnectionEnd>::iterator in_it = in_list.begin();
00285 std::multiset<ConnectionEnd>::iterator out_it = out_list.begin();
00286
00287 int how_many_bases = 0;
00288 for( ; in_it != in_list.end(); ++in_it )
00289 {
00290 obj1 = * in_it;
00291 ++how_many_bases;
00292 if ( how_many_bases > 1) global_vars.err << MSG_WARNING << "Too many base classes at " << BON::FCO( *atom_it) << ". Multiple inheritance should be used with two different operators.\n";
00293 for( ; out_it != out_list.end(); ++out_it)
00294 {
00295 obj2 = * out_it;
00296
00297 Relation rela( Relation::INT_INHERITANCE_OP, FCO( obj1), FCO( obj2));
00298 m_relations.push_back(rela);
00299 }
00300 }
00301 }
00302 else if ( kind_name == Relation::equivalence_str)
00303 {
00304 ConnectionEnd obj1, obj2;
00305 std::multiset<ConnectionEnd> in_list = (*atom_it)->getInConnEnds( Relation::equivalence_right);
00306 std::multiset<ConnectionEnd> out_list = (*atom_it)->getOutConnEnds( Relation::equivalence_left);
00307 std::multiset<ConnectionEnd>::iterator in_it = in_list.begin();
00308 std::multiset<ConnectionEnd>::iterator out_it = out_list.begin();
00309
00310 for( ; in_it != in_list.end(); ++in_it )
00311 {
00312 obj1 = * in_it;
00313 for( ; out_it != out_list.end(); ++out_it)
00314 {
00315 obj2 = * out_it;
00316
00317 Relation rela( Relation::EQUIVALENCE_OP, FCO( obj1), FCO( obj2), *atom_it);
00318 m_equivRelations.push_back(rela);
00319 }
00320 }
00321 }
00322 else if ( kind_name == Relation::same_aspect_str)
00323 {
00324 ConnectionEnd obj1, obj2;
00325 std::multiset<ConnectionEnd> in_list = (*atom_it)->getInConnEnds( Relation::same_aspect_right);
00326 std::multiset<ConnectionEnd> out_list = (*atom_it)->getOutConnEnds( Relation::same_aspect_left);
00327 std::multiset<ConnectionEnd>::iterator in_it = in_list.begin();
00328 std::multiset<ConnectionEnd>::iterator out_it = out_list.begin();
00329
00330 for( ; in_it != in_list.end(); ++in_it )
00331 {
00332 obj1 = * in_it;
00333 for( ; out_it != out_list.end(); ++out_it)
00334 {
00335 obj2 = * out_it;
00336
00337 Relation rela( Relation::SAME_ASPECT_OP, FCO( obj1), FCO( obj2), *atom_it);
00338 m_equivRelations.push_back(rela);
00339 }
00340 }
00341 }
00342 else if ( kind_name == Relation::same_folder_str)
00343 {
00344 ConnectionEnd obj1, obj2;
00345 std::multiset<ConnectionEnd> in_list = (*atom_it)->getInConnEnds( Relation::same_folder_right);
00346 std::multiset<ConnectionEnd> out_list = (*atom_it)->getOutConnEnds( Relation::same_folder_left);
00347 std::multiset<ConnectionEnd>::iterator in_it = in_list.begin();
00348 std::multiset<ConnectionEnd>::iterator out_it = out_list.begin();
00349
00350 for( ; in_it != in_list.end(); ++in_it )
00351 {
00352 obj1 = * in_it;
00353 for( ; out_it != out_list.end(); ++out_it)
00354 {
00355 obj2 = * out_it;
00356
00357 Relation rela( Relation::SAME_FOLDER_OP, FCO( obj1), FCO( obj2), *atom_it);
00358 m_equivRelations.push_back(rela);
00359 }
00360 }
00361 }
00362 }
00363 }
00364 }
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374 void Component::selectFromSameAspectsFolders()
00375 {
00376 Relation_Iterator rel_it = m_equivRelations.begin();
00377 for( ; rel_it != m_equivRelations.end(); ++rel_it)
00378 {
00379 if ( rel_it->getOperation() == Relation::SAME_ASPECT_OP ||
00380 rel_it->getOperation() == Relation::SAME_FOLDER_OP ||
00381 rel_it->getOperation() == Relation::EQUIVALENCE_OP)
00382 {
00383 {
00384 int p1 = isProxy( rel_it->getOp1());
00385 int p2 = isProxy( rel_it->getOp2());
00386 if( p1 == 2 || p2 == 2)
00387 {
00388 global_vars.err << MSG_ERROR << rel_it->getOperationStr() << " relation disregarded between " << rel_it->getOp1() << " and " << rel_it->getOp2() << ".\n";
00389 continue;
00390 }
00391
00392 bool is_proxy_first = p1 == 1;
00393 bool is_proxy_second = p2 == 1;
00394
00395 ObjPointer selected_ptr = 0;
00396 if (is_proxy_first == is_proxy_second)
00397 selected_ptr = rel_it->getOp3();
00398 else if (is_proxy_first)
00399 selected_ptr = rel_it->getOp2();
00400 else
00401 selected_ptr = rel_it->getOp1();
00402
00403
00404
00405
00406
00407 ObjPointer to_find = is_proxy_first?m_realObj[rel_it->getOp1()]:rel_it->getOp1();
00408
00409 Entity_Iterator it( m_entities.begin());
00410 while( it != m_entities.end())
00411 {
00412 if ( to_find == it->getPointer())
00413 {
00414 it->setRespPointer( selected_ptr);
00415 }
00416 ++it;
00417 }
00418
00419 to_find = is_proxy_second?m_realObj[rel_it->getOp2()]:rel_it->getOp2();
00420 it = m_entities.begin();
00421 while( it != m_entities.end())
00422 {
00423 if ( to_find == it->getPointer())
00424 {
00425 it->setRespPointer( selected_ptr);
00426 }
00427 ++it;
00428 }
00429 }
00430 }
00431 }
00432 }
00433
00434
00435 Entity Component::entitySearch( const ObjPointer& p_ptr)
00436 {
00437 Entity_Iterator it( m_entities.begin());
00438 while ( it != m_entities.end() && p_ptr != it->getPointer())
00439 ++it;
00440
00441 if ( it == m_entities.end())
00442 return Entity( BON::Folder(), BON::FCO());
00443 else
00444 return *it;
00445 }
00446
00447
00448
00449
00450
00451
00452
00453
00454 void Component::proxyFinder()
00455 {
00456 RealMap_Iterator real_map_it = this->m_realObj.begin();
00457 for( ; real_map_it != m_realObj.end(); ++real_map_it)
00458 {
00459 ObjPointer proxy_for_sure = real_map_it->first;
00460 ObjPointer real_for_sure = real_map_it->second;
00461
00462 #ifdef _DEBUG
00463 std::string n1, n2;
00464 if ( proxy_for_sure != BON::FCO())
00465 n1 = proxy_for_sure->getName();
00466 if ( real_for_sure != BON::FCO())
00467 n2= real_for_sure->getName();
00468 #endif
00469 if ( proxy_for_sure != BON::FCO() && real_for_sure != BON::FCO())
00470 {
00471 Entity_Iterator it( m_entities.begin());
00472 while ( it != m_entities.end() && proxy_for_sure != it->getPointer())
00473 ++it;
00474
00475 if ( it == m_entities.end())
00476 {
00477 global_vars.err << MSG_ERROR << "Entity not found during proxyFinder: " << proxy_for_sure << "\n";
00478 }
00479 else
00480 {
00481 operandSearchAndReplace( proxy_for_sure, real_for_sure);
00482
00483 }
00484 }
00485 }
00486 }
00487
00488
00489 void Component::equivalenceFinder()
00490 {
00491 Relation_Iterator rel_it = m_equivRelations.begin();
00492 while ( rel_it != m_equivRelations.end())
00493 {
00494 if( rel_it->getOperation() == Relation::EQUIVALENCE_OP ||
00495 rel_it->getOperation() == Relation::SAME_FOLDER_OP ||
00496 rel_it->getOperation() == Relation::SAME_ASPECT_OP )
00497 {
00498 ObjPointer obj1 = rel_it->getOp1(), obj2 = rel_it->getOp2();
00499
00500
00501 if( obj1 != obj2)
00502 {
00503
00504 insertIntoEquivBag( obj2, obj1);
00505 operandSearchAndReplace( obj2, obj1);
00506 }
00507
00508 rel_it = m_equivRelations.erase( rel_it);
00509
00510 }
00511 else
00512 {
00513 ASSERT(0);
00514 ++rel_it;
00515 }
00516 }
00517 ASSERT( m_equivRelations.empty());
00518 }
00519
00520
00521
00522
00523
00524 void Component::insertIntoEquivBag( const ObjPointer& obj2, const ObjPointer& obj1)
00525 {
00526 if ( obj1 == obj2) return;
00527
00528 std::set< FCO > bag2;
00529
00530
00531 EquivBag_Iterator it = m_equivBag.find( obj2);
00532 if ( it != m_equivBag.end())
00533 {
00534 bag2 = m_equivBag[ obj2];
00535 m_equivBag.erase( it);
00536 }
00537
00538 m_equivBag[obj1].insert( bag2.begin(), bag2.end());
00539 m_equivBag[obj1].insert( obj1);
00540 m_equivBag[obj1].insert( obj2);
00541
00542 #ifdef _DEBUG
00543 std::string n1 = obj1->getName();
00544 std::string n2 = obj2->getName();
00545
00546 std::set< FCO > :: const_iterator ii = m_equivBag[obj1].begin();
00547 for( ; ii != m_equivBag[obj1].end(); ++ii)
00548 {
00549 n2 = (*ii)->getName();
00550 }
00551 #endif
00552
00553 }
00554
00555
00556 void Component::markEquivEntities()
00557 {
00558 EquivBag_Iterator it = m_equivBag.begin();
00559 for( ; it != m_equivBag.end(); ++it)
00560 {
00561 ASSERT( !it->first->isDeleted());
00562 std::set< ObjPointer > & clique = it->second;
00563 std::set< ObjPointer > :: const_iterator jt = clique.begin();
00564
00565
00566 for( ; jt != clique.end(); ++jt)
00567 {
00568
00569 if ( *jt != it->first)
00570 {
00571 Entity_Iterator kt( m_entities.begin());
00572 while ( kt != m_entities.end() && *jt != kt->getPointer())
00573 ++kt;
00574
00575 if ( kt != m_entities.end())
00576 {
00577 kt->deleted( true);
00578 }
00579 else
00580 {
00581 global_vars.err << MSG_ERROR << "Entity not found during markEquivEntities: " << BON::FCO( *jt) << "\n";
00582 }
00583 }
00584 }
00585 }
00586 }
00587
00588
00589
00590
00591
00592
00593
00594
00595 void Component::operandSearchAndReplace( const std::vector<ObjPointer>& find_obj_vec, const ObjPointer& real_obj)
00596 {
00597 const static int len = 2;
00598 Relations* reldb[ len] = { &m_relations, &m_equivRelations};
00599 for ( int k = 0; k < len; ++k)
00600 {
00601 Relation_Iterator rel_it = reldb[k]->begin();
00602 for( ; rel_it != reldb[k]->end(); ++rel_it)
00603 {
00604 if (!rel_it->getOp1()) global_vars.err << MSG_ERROR << "First operand is Null Pointer\n";
00605 if (!rel_it->getOp2()) global_vars.err << MSG_ERROR << "Second operand is Null Pointer\n";
00606
00607 ObjPointer obj = BON::FCO(); obj = rel_it->getOp1();
00608
00609 if ( std::find( find_obj_vec.begin(), find_obj_vec.end(), obj) != find_obj_vec.end())
00610 rel_it->setOp1( real_obj);
00611
00612 obj = BON::FCO(); obj = rel_it->getOp2();
00613
00614 if ( std::find( find_obj_vec.begin(), find_obj_vec.end(), obj) != find_obj_vec.end())
00615 rel_it->setOp2( real_obj);
00616
00617
00618 obj = BON::FCO(); obj = rel_it->getOp3();
00619
00620 if ( obj != BON::FCO() && std::find( find_obj_vec.begin(), find_obj_vec.end(), obj) != find_obj_vec.end())
00621 rel_it->setOp3( real_obj);
00622
00623
00624 obj = BON::FCO(); obj = rel_it->getOp4();
00625
00626 if ( obj != BON::FCO() && std::find( find_obj_vec.begin(), find_obj_vec.end(), obj) != find_obj_vec.end())
00627 rel_it->setOp4(real_obj);
00628
00629 obj = BON::FCO(); obj = rel_it->getOp5();
00630
00631 if ( obj != BON::FCO() && std::find( find_obj_vec.begin(), find_obj_vec.end(), obj) != find_obj_vec.end())
00632 rel_it->setOp5(real_obj);
00633 }
00634 }
00635 }
00636
00637
00638 void Component::operandSearchAndReplace( const ObjPointer& find_obj, const ObjPointer& real_obj)
00639 {
00640 operandSearchAndReplace( std::vector< ObjPointer>( 1, find_obj), real_obj);
00641 }
00642
00643
00644 void Component::removeProxiesAndEquiv()
00645 {
00646 markEquivEntities();
00647 }
00648
00649
00650 #if(NEEDED_FOR_METAINTERPRETER_ONLY)
00651 bool Component::nameSelector()
00652 {
00653 bool res = true;
00654
00655 dlg = new NameSpecDlg();
00656
00657 Entity_Iterator it_1( m_entities.begin());
00658 for( ; it_1 != m_entities.end(); ++it_1 )
00659 {
00660 if( it_1->isDeleted()) continue;
00661
00662 FCO fco( it_1->getPointer());
00663 FCO resp( it_1->getRespPointer());
00664
00665 EquivBag_Iterator it_2 = m_equivBag.find( fco);
00666 if( it_2 == m_equivBag.end()) continue;
00667
00668 if( !resp) resp = fco;
00669
00670
00671
00672
00673 std::string defname = resp->getName();
00674 std::string regname;
00675
00676 if( fco->getObjectMeta().name() == "Aspect")
00677 regname = AspectRep::getMyRegistry( fco, it_1->getParentFolder())->getValueByPath( "/" + Any::NameSelectorNode_str);
00678 else
00679 regname = Any::getMyRegistry( fco, it_1->getParentFolder())->getValueByPath( "/" + Any::NameSelectorNode_str);
00680
00681
00682 bool is_any_alternative = false;
00683 bool is_def_among_names = false;
00684 bool is_reg_among_names = false;
00685 std::set < ObjPointer >::iterator jt = it_2->second.begin();
00686 for( ; jt != it_2->second.end(); ++jt)
00687 {
00688 if( !isProxy( *jt))
00689 {
00690 std::string eqname = (*jt)->getName();
00691
00692 if( eqname == defname)
00693 is_def_among_names = true;
00694 else
00695 is_any_alternative = true;
00696
00697 if( eqname == regname)
00698 is_reg_among_names = true;
00699 }
00700 }
00701
00702 if( is_any_alternative)
00703 {
00704 CString dd = defname.c_str();
00705 CString kind = fco->getObjectMeta().name().c_str();
00706
00707 if( is_reg_among_names)
00708 dlg->m_dn[ fco] = regname;
00709 else
00710 dlg->m_dn[ fco] = defname;
00711
00712 if( !is_def_among_names)
00713 {
00714 dlg->m_map[ fco].insert( resp);
00715 }
00716
00717 jt = it_2->second.begin();
00718 for( ; jt != it_2->second.end(); ++jt)
00719 {
00720 if( !isProxy( *jt))
00721 {
00722 dlg->m_map[ fco].insert( *jt);
00723 }
00724 }
00725 }
00726 }
00727
00728 res = false;
00729 if( !dlg->m_dn.empty()) res = dlg->DoModal() == IDOK;
00730 if( res)
00731 {
00732 NameSpecDlg::DEFNAMES_MAP::iterator it_0 = dlg->m_result.begin();
00733 for( ; it_0 != dlg->m_result.end(); ++it_0)
00734 {
00735 BON::FCO key_fco = it_0->first;
00736 std::string newsel_name = it_0->second;
00737 BON::FCO newsel_resp;
00738
00739 Entity_Iterator it_1( m_entities.begin());
00740 for( ; it_1 != m_entities.end(); ++it_1 )
00741 {
00742 if( it_1->isDeleted()) continue;
00743
00744 FCO fco( it_1->getPointer());
00745 if( fco == key_fco)
00746 {
00747 if( fco->getObjectMeta().name() == "Aspect")
00748 AspectRep::getMyRegistry( fco, it_1->getParentFolder())->setValueByPath( "/" + Any::NameSelectorNode_str, newsel_name);
00749 else
00750 Any::getMyRegistry( fco, it_1->getParentFolder())->setValueByPath( "/" + Any::NameSelectorNode_str, newsel_name);
00751
00752
00753 EquivBag_Iterator it_2 = m_equivBag.find( key_fco);
00754 if( it_2 == m_equivBag.end()) continue;
00755
00756 std::set < ObjPointer >::iterator it_3 = it_2->second.begin();
00757 for( ; !newsel_resp && it_3 != it_2->second.end(); ++it_3)
00758 {
00759 if( !isProxy( *it_3))
00760 {
00761 std::string eqname = (*it_3)->getName();
00762
00763 if( eqname == newsel_name)
00764 newsel_resp = *it_3;
00765 }
00766 }
00767
00768 if( newsel_resp)
00769 it_1->setRespPointer( newsel_resp);
00770
00771 }
00772 }
00773 }
00774 }
00775
00776 delete dlg;
00777 return res;
00778 }
00779 #endif
00780
00781 int Component::isProxy( const ObjPointer& ptr)
00782 {
00783 if( ptr == BON::FCO()) return 0;
00784 RealMap_Iterator it = m_realObj.find( ptr);
00785 if( it != m_realObj.end() && it->second != BON::FCO()) return 1;
00786 if( ptr->getObjectMeta().name().find("Proxy") != std::string::npos) return 2;
00787
00788 return 0;
00789 }
00790
00791
00792 bool Component::checkForProxies()
00793 {
00794 std::vector< ObjPointer> to_delete;
00795 bool correct = true;
00796 Entity_Iterator it(m_entities.begin());
00797 for( ; it != m_entities.end(); ++it)
00798 {
00799 if ( it->isDeleted()) continue;
00800
00801 int res;
00802 if ( res = isProxy( it->getPointer()))
00803 {
00804 if ( res == 1)
00805 global_vars.err << MSG_ERROR << "Internal error: entity " << it->getPointer() << " is a proxy.";
00806 else if ( res == 2)
00807 global_vars.err << MSG_ERROR << "Entity " << it->getPointer() << " is a NULL proxy.";
00808
00809
00810 global_vars.err << " Disregarding it from the Paradigm sheet.\n";
00811 correct = false;
00812 to_delete.push_back( it->getPointer());
00813 }
00814 }
00815
00816 unsigned int c = to_delete.size();
00817 Relation_Iterator rel_it = m_relations.begin();
00818 for( ; rel_it != m_relations.end(); ++rel_it)
00819 {
00820 if ( isProxy( rel_it->getOp1()))
00821 to_delete.push_back( rel_it->getOp1());
00822
00823 if ( isProxy( rel_it->getOp2()))
00824 to_delete.push_back( rel_it->getOp2());
00825
00826 if ( isProxy( rel_it->getOp3()))
00827 to_delete.push_back( rel_it->getOp3());
00828
00829 if ( isProxy( rel_it->getOp4()))
00830 to_delete.push_back( rel_it->getOp4());
00831
00832 if ( isProxy( rel_it->getOp5()))
00833 to_delete.push_back( rel_it->getOp5());
00834 }
00835
00836 rel_it = m_equivRelations.begin();
00837 for( ; rel_it != m_equivRelations.end(); ++rel_it)
00838 {
00839 if ( isProxy( rel_it->getOp1()))
00840 to_delete.push_back( rel_it->getOp1());
00841
00842 if ( isProxy( rel_it->getOp2()))
00843 to_delete.push_back( rel_it->getOp2());
00844
00845 if ( isProxy( rel_it->getOp3()))
00846 to_delete.push_back( rel_it->getOp3());
00847
00848 if ( isProxy( rel_it->getOp4()))
00849 to_delete.push_back( rel_it->getOp4());
00850
00851 if ( isProxy( rel_it->getOp5()))
00852 to_delete.push_back( rel_it->getOp5());
00853 }
00854
00855 if ( c != to_delete.size()) correct = false;
00856
00857 std::vector< ObjPointer>::iterator ee = to_delete.begin();
00858 for( ; ee != to_delete.end(); ++ee)
00859 {
00860 Entity_Iterator ent_it = m_entities.begin();
00861 while( ent_it != m_entities.end())
00862 {
00863 if (*ee != ent_it->getPointer())
00864 ++ent_it;
00865 else
00866 ent_it = m_entities.erase( ent_it);
00867 }
00868
00869 Relation_Iterator rel_it = m_relations.begin();
00870 while( rel_it != m_relations.end())
00871 {
00872 if ( rel_it->getOp1() != *ee &&
00873 rel_it->getOp2() != *ee &&
00874 rel_it->getOp3() != *ee &&
00875 rel_it->getOp4() != *ee &&
00876 rel_it->getOp5() != *ee )
00877 ++rel_it;
00878 else
00879 rel_it = m_relations.erase( rel_it);
00880 }
00881 rel_it = m_equivRelations.begin();
00882 while( rel_it != m_equivRelations.end())
00883 {
00884 if ( rel_it->getOp1() != *ee &&
00885 rel_it->getOp2() != *ee &&
00886 rel_it->getOp3() != *ee &&
00887 rel_it->getOp4() != *ee &&
00888 rel_it->getOp5() != *ee )
00889 ++rel_it;
00890 else
00891 rel_it = m_equivRelations.erase( rel_it);
00892 }
00893 }
00894 if( !correct)
00895 global_vars.err << MSG_ERROR << "Some objects/relations disregarded by the Proxy Checker.\n";
00896
00897 return correct;
00898 }
00899
00900
00901 void Component::inheritancesManager( Relation & rel_it)
00902 {
00903 Relation::OPER_TYPE relation[ ::FCO::NUMBER_OF_INHERITANCES ] = {
00904 Relation::INHERITANCE_OP,
00905 Relation::INT_INHERITANCE_OP,
00906 Relation::IMP_INHERITANCE_OP
00907 };
00908
00909 ::FCO::INHERITANCE_TYPE new_relation[ ::FCO::NUMBER_OF_INHERITANCES ] = {
00910 ::FCO::REGULAR,
00911 ::FCO::INTERFACE,
00912 ::FCO::IMPLEMENTATION
00913 };
00914
00915 int inh_type;
00916 for( inh_type = 0; inh_type != ::FCO::NUMBER_OF_INHERITANCES; ++inh_type )
00917 {
00918 if ( rel_it.getOperation() == relation[inh_type] )
00919 {
00920 ObjPointer obj1 = rel_it.getOp1();
00921 ObjPointer obj2 = rel_it.getOp2();
00922
00923 ::FCO* base = m_sheet->findFCO( rel_it.getOp1());
00924 ::FCO* derived = m_sheet->findFCO( rel_it.getOp2());
00925 if ( base != 0 && derived != 0)
00926 {
00927 base->addChild( new_relation[inh_type], derived);
00928 derived->addParent( new_relation[inh_type], base);
00929 }
00930 else
00931 {
00932 if ( base == 0 )
00933 global_vars.err << MSG_ERROR << "No base peer present in inheritance relation: " << obj1 << " <|---- " << obj2 << "\n";
00934 if ( derived == 0 )
00935 global_vars.err << MSG_ERROR << "No derived peer present in inheritance relation: " << obj1 << " <|---- " << obj2 << "\n";
00936 }
00937 }
00938 }
00939 }
00940
00941
00942 void Component::associationClassManager( Relation & rel_it)
00943 {
00944 if ( rel_it.getOperation() == Relation::ASSOCIATION_OP )
00945 {
00946 ObjPointer obj1 = rel_it.getOp1();
00947 ObjPointer obj2 = rel_it.getOp2();
00948 ObjPointer obj3 = rel_it.getOp3();
00949
00950
00951 BON::Connection obj4( rel_it.getOp4());
00952 BON::Connection obj5( rel_it.getOp5());
00953
00954 ::FCO* op1 = m_sheet->findFCO( rel_it.getOp1());
00955 ::FCO* op2 = m_sheet->findFCO( rel_it.getOp2());
00956 ::FCO* op3 = m_sheet->findFCO( rel_it.getOp3());
00957
00958 if ( op1 != 0 && op2 != 0 && op3 != 0)
00959 {
00960
00961 std::string src_role = "src", dst_role = "dst";
00962 std::string src_card = "0..*", dst_card = "0..*";
00963
00964 src_card = obj4->getAttribute( "Cardinality")->getStringValue();
00965 dst_card = obj5->getAttribute( "Cardinality")->getStringValue();
00966
00967 src_role = obj4->getAttribute( "srcRolename")->getStringValue();
00968 if ( src_role != "" && src_role != "src")
00969 global_vars.err << MSG_ERROR << "Incorrect Rolename attribute: <" << src_role << "> of " << obj4 << "\n";
00970
00971 dst_role = obj5->getAttribute( "dstRolename")->getStringValue();
00972 if ( dst_role != "" && dst_role != "dst")
00973 global_vars.err << MSG_ERROR << "Incorrect Rolename attribute: <" << dst_role << "> of " << obj5 << "\n";
00974
00975
00976 ConnJoint::SDList list_op1, list_op2;
00977 list_op1.push_back( op1);
00978 list_op2.push_back( op2);
00979
00980 if ( op3->getMyKind() != Any::CONN ) global_vars.err << MSG_ERROR << "How can happen that the association class is Not a Connection.\n";
00981 ConnectionRep * conn_obj = dynamic_cast< ConnectionRep * > ( op3 );
00982
00983 ConnJoint assoc( conn_obj,
00984 list_op1, list_op2, src_role == dst_role,
00985 src_card, dst_card);
00986
00987 if (conn_obj) conn_obj->addJoint( assoc );
00988 else global_vars.err << MSG_ERROR << "After dynamic_cast - conn" << obj3 << "\n";
00989 }
00990 else if ( obj3 == BON::FCO() )
00991 global_vars.err << MSG_ERROR << "Association relation is not complete. Association class missing. Op1: " << obj1 << " Op2: " << obj2 << "\n";
00992 else
00993 global_vars.err << MSG_ERROR << "Association relation is not complete. Some part missing. Op1: " << obj1 << " Op2: " << obj2 << " Association class: " << obj3 << "\n";
00994 }
00995 }
00996
00997
00998 void Component::setMemberManager( Relation & rel_it)
00999 {
01000 if ( rel_it.getOperation() == Relation::SET_MEMBER_OP )
01001 {
01002 ObjPointer obj1 = rel_it.getOp1();
01003 ObjPointer obj2 = rel_it.getOp2();
01004
01005 ::FCO* set = m_sheet->findFCO( rel_it.getOp1());
01006 ::FCO* member = m_sheet->findFCO( rel_it.getOp2());
01007 if ( set != 0 && member != 0)
01008 {
01009 if ( set->getMyKind() != Any::SET ) global_vars.err << MSG_ERROR << "Internal error: Not a set on left hand side of set_member relation\n";
01010 SetRep * set_obj = dynamic_cast< SetRep * > ( set );
01011 if (set_obj) set_obj->addMember( member);
01012 else global_vars.err << MSG_ERROR << "Internal error: After dynamic_cast - set" << obj1 << "\n";
01013
01014 }
01015 else
01016 {
01017 if ( set == 0 )
01018 global_vars.err << MSG_ERROR << "No set peer present in set_member relation. " << obj1 << " missing.\n";
01019 if ( member == 0 )
01020 global_vars.err << MSG_ERROR << "No member peer present in set_member relation. " << obj2 << " missing.\n";
01021 }
01022 }
01023 }
01024
01025
01026 void Component::refersToManager( Relation & rel_it)
01027 {
01028 if ( rel_it.getOperation() == Relation::REFER_TO_OP )
01029 {
01030 ObjPointer obj1 = rel_it.getOp1();
01031 ObjPointer obj2 = rel_it.getOp2();
01032
01033 ::FCO* elem = m_sheet->findFCO( rel_it.getOp1());
01034 ::FCO* ref = m_sheet->findFCO( rel_it.getOp2());
01035 if ( elem != 0 && ref != 0)
01036 {
01037 ReferenceRep * ref_obj = dynamic_cast<ReferenceRep *>( ref);
01038 if ( !ref_obj || ref->getMyKind() != Any::REF)
01039 global_vars.err << MSG_ERROR << "Not reference " << obj1 << " referring\n";
01040 else
01041 ref_obj->addInitialReferee( elem);
01042 elem->addRefersToMe( ref_obj);
01043 }
01044 else
01045 {
01046 if ( elem == 0 )
01047 global_vars.err << MSG_ERROR << "No referee peer present in RefersTo relation. " << obj1 << " missing.\n";
01048 if ( ref == 0 )
01049 global_vars.err << MSG_ERROR << "No reference peer present in RefersTo relation. " << obj2 << " missing.\n";
01050 }
01051 }
01052 }
01053
01054
01055 void Component::containmentManager( Relation & rel_it)
01056 {
01057 if ( rel_it.getOperation() == Relation::CONTAINMENT_OP )
01058 {
01059 ObjPointer obj1 = rel_it.getOp1();
01060 ObjPointer obj2 = rel_it.getOp2();
01061 BON::Connection obj3( rel_it.getOp3());
01062
01063 ::FCO* model = m_sheet->findFCO( rel_it.getOp1());
01064 ::FCO* fco = m_sheet->findFCO( rel_it.getOp2());
01065
01066 if ( model != 0 && fco != 0)
01067 {
01068 ModelRep * model_obj = dynamic_cast< ModelRep * > ( model);
01069 if (!model_obj || model->getMyKind() != Any::MODEL)
01070 global_vars.err << MSG_ERROR << "ERROR: after dynamic_cast - containment - model is 0 / Not model " << obj1 << " contains an FCO\n";
01071
01072 if ( !obj3)
01073 global_vars.err << MSG_ERROR << "ERROR: Null containment line class - containmentManager\n";
01074
01075 bool is_a_port = obj3->getAttribute("IsPort")->getBooleanValue();
01076 std::string comp_role = obj3->getAttribute("Rolename")->getStringValue();
01077 std::string card = obj3->getAttribute("Cardinality")->getStringValue();
01078
01079 RoleRep role(
01080 comp_role,
01081 fco,
01082 model_obj,
01083 is_a_port,
01084 card,
01085 false,
01086 false);
01087
01088
01089
01090 model_obj->addRole( fco, role);
01091
01092 }
01093 else
01094 {
01095 if ( model == 0 )
01096 global_vars.err << MSG_ERROR << "No model peer present in containment relation. " << obj1 << " missing.\n";
01097 if ( fco == 0 )
01098 global_vars.err << MSG_ERROR << "No fco peer present in containment relation. " << obj2 << " missing.\n";
01099 }
01100 }
01101 }
01102
01103
01104 void Component::folderContainmentManager( Relation & rel_it)
01105 {
01106 if ( rel_it.getOperation() == Relation::FOLDER_CONTAINMENT_OP )
01107 {
01108 ObjPointer obj1 = rel_it.getOp1();
01109 ObjPointer obj2 = rel_it.getOp2();
01110 BON::Connection obj3( rel_it.getOp3());
01111
01112 Any* folder = m_sheet->findAny( rel_it.getOp1());
01113 Any* any = m_sheet->findAny( rel_it.getOp2());
01114 if ( folder != 0 && any != 0)
01115 {
01116 if ( folder->getMyKind() != Any::FOLDER ) global_vars.err << MSG_ERROR << "Not a folder " << obj1 << " contains an FCO\n";
01117
01118 FolderRep * folder_obj = dynamic_cast< FolderRep * > ( folder );
01119 if (!folder_obj) global_vars.err << MSG_ERROR << "ERROR after dynamic_cast - folder_containment - folder " << obj1 << " is 0\n";
01120
01121 std::string card = "0..*";
01122
01123 if ( any->getMyKind() != Any::FOLDER)
01124 {
01125 ::FCO * fco = dynamic_cast< ::FCO *>( any);
01126 if ( !fco) global_vars.err << MSG_ERROR << "ERROR after dynamic cast - folder containment - fco " << obj2 << " is 0\n";
01127 else folder_obj->addFCO( fco, card);
01128 }
01129 else
01130 {
01131 FolderRep * sub_f = dynamic_cast< FolderRep *>( any);
01132 if ( !sub_f) global_vars.err << MSG_ERROR << "ERROR after dynamic cast - folder containment - subfolder " << obj2 << " is 0\n";
01133 else folder_obj->addSubFolderRep( sub_f, card);
01134 }
01135 }
01136 else
01137 {
01138 if ( folder == 0 )
01139 global_vars.err << MSG_ERROR << "No folder peer present in folder_containment relation. " << obj1 << " missing.\n";
01140 if ( any == 0 )
01141 global_vars.err << MSG_ERROR << "No element peer present in folder_containment relation. " << obj2 << " missing.\n";
01142 }
01143 }
01144 }
01145
01146
01147 #if(NEEDED_FOR_METAINTERPRETER_ONLY)
01148 void Component::hasAspectManager( Relation & rel_it)
01149 {
01150 if ( rel_it.getOperation() == Relation::HAS_ASPECT_OP )
01151 {
01152 ObjPointer obj1 = rel_it.getOp1();
01153 ObjPointer obj2 = rel_it.getOp2();
01154
01155 ::FCO* model = m_sheet->findFCO( rel_it.getOp1());
01156 Any* aspect = m_sheet->findAny( rel_it.getOp2());
01157 if ( model != 0 && aspect != 0)
01158 {
01159 ModelRep * model_obj = dynamic_cast< ModelRep * > ( model );
01160 AspectRep * aspect_obj = dynamic_cast< AspectRep * > ( aspect );
01161 if (!aspect_obj)
01162 global_vars.err << MSG_ERROR << "ERROR after dynamic_cast - has aspect - aspect " << obj2 << " is 0\n";
01163 if (!model_obj || !aspect_obj || model->getMyKind() != Any::MODEL )
01164 global_vars.err << MSG_ERROR << "ERROR after dynamic_cast " << (aspect_obj?"aspect is 0":(model_obj?"model is 0":"wrong kind")) << "\n";
01165 else
01166 model_obj->addAspect( aspect_obj);
01167 }
01168 else
01169 {
01170 if ( model == 0 )
01171 global_vars.err << MSG_ERROR << "No model peer present in has_aspect relation. " << obj1 << " missing.\n";
01172 if ( aspect == 0 )
01173 global_vars.err << MSG_ERROR << "No aspect peer present in has_aspect relation. " << obj2 << " missing.\n";
01174 }
01175 }
01176 }
01177
01178
01179 void Component::aspectMemberManager( Relation & rel_it)
01180 {
01181 if ( rel_it.getOperation() == Relation::ASPECT_MEMBER_OP )
01182 {
01183 ObjPointer obj1 = rel_it.getOp1();
01184 ObjPointer obj2 = rel_it.getOp2();
01185
01186 Any* aspect = m_sheet->findAny( rel_it.getOp1());
01187 ::FCO* member = m_sheet->findFCO( rel_it.getOp2());
01188 if ( aspect != 0 && member != 0)
01189 {
01190 if ( aspect->getMyKind() != Any::ASPECT ) global_vars.err << MSG_ERROR << "Not an aspect " << obj1 << "\n";
01191
01192 AspectRep * aspect_obj = dynamic_cast< AspectRep * > ( aspect );
01193 if ( !aspect_obj) global_vars.err << MSG_ERROR << "ERROR after dynamic_cast - aspect member - aspect " << obj1 << " is 0\n";
01194
01195 if ( rel_it.getOp3() != BON::FCO() &&
01196 rel_it.getOp4() != BON::FCO())
01197 {
01198 std::string rolename = Connection( rel_it.getOp3())->getAttribute("Rolename")->getStringValue();
01199 bool is_a_port = Connection( rel_it.getOp3())->getAttribute("IsPort")->getBooleanValue();
01200 std::string card = Connection( rel_it.getOp3())->getAttribute("Cardinality")->getStringValue();
01201
01202 ModelRep * model = dynamic_cast<ModelRep*>( m_sheet->findFCO( rel_it.getOp4()));
01203 if ( model != 0)
01204 {
01205 RoleRep role(
01206 rolename,
01207 member,
01208 model,
01209 is_a_port,
01210 card,
01211 false,
01212 false);
01213
01214 aspect_obj->addRRole( role);
01215 }
01216 else
01217 global_vars.err << MSG_ERROR << "Interal error: No model present in aspect_member relation. " << rel_it.getOp4() << " missing.\n";
01218 }
01219 else
01220 aspect_obj->addFCO( member);
01221 }
01222 else
01223 {
01224 if ( aspect == 0 )
01225 global_vars.err << MSG_ERROR << "No aspect peer present in aspect_member relation. " << obj1 << " missing.\n";
01226 if ( member == 0 )
01227 global_vars.err << MSG_ERROR << "No member peer present in aspect_member relation. " << obj2 << " missing.\n";
01228 }
01229 }
01230 }
01231
01232
01233 void Component::hasConstraintManager( Relation & rel_it)
01234 {
01235 if ( rel_it.getOperation() == Relation::HAS_CONSTRAINT_OP )
01236 {
01237 ObjPointer obj1 = rel_it.getOp1();
01238 ObjPointer obj2 = rel_it.getOp2();
01239
01240 Any* any = m_sheet->findAny( rel_it.getOp1());
01241 Any* constraint = m_sheet->findAny( rel_it.getOp2());
01242 if ( any != 0 && constraint != 0)
01243 {
01244 ConstraintRep *constraint_obj = dynamic_cast< ConstraintRep * >(constraint);
01245 if (any && (any->isFCO() || any->getMyKind() == Any::FOLDER))
01246 {
01247 any->addInitialConstraintRep( constraint_obj);
01248 constraint_obj->attachedTo();
01249 }
01250 else
01251 global_vars.err << MSG_ERROR << obj2 << " constraint is owned by " << obj1 << " which is neither FCO nor Folder\n";
01252 }
01253 else
01254 {
01255 if ( any == 0 )
01256 global_vars.err << MSG_ERROR << "No owner (FCO or Folder) peer present in has_constraint relation. " << obj1 << " missing.\n";
01257 if ( constraint == 0 )
01258 global_vars.err << MSG_ERROR << "No Constraint peer present in has_constraint relation. " << obj2 << " missing.\n";
01259 }
01260 }
01261 }
01262 #endif
01263
01264
01265 void Component::hasAttributeManager( Relation & rel_it)
01266 {
01267 if ( rel_it.getOperation() == Relation::HAS_ATTRIBUTE_OP )
01268 {
01269 ObjPointer obj1 = rel_it.getOp1();
01270 ObjPointer obj2 = rel_it.getOp2();
01271
01272 ::FCO* fco = m_sheet->findFCO( rel_it.getOp1());
01273 Any* attr = m_sheet->findAny( rel_it.getOp2());
01274 if ( fco != 0 && attr != 0)
01275 {
01276 AttributeRep * attr_obj = dynamic_cast< AttributeRep *>( attr);
01277 fco->addInitialAttribute( attr_obj);
01278 if ( !attr_obj->isGlobal())
01279 attr_obj->addOwner( fco);
01280 }
01281 else
01282 {
01283 if ( fco == 0 )
01284 global_vars.err << MSG_ERROR << "No fco peer present in has_attribute relation. " << obj1 << " missing.\n";
01285 if ( attr == 0 )
01286 global_vars.err << MSG_ERROR << "No attribute peer present in has_attribute relation. " << obj2 << " missing.\n";
01287 }
01288 }
01289 }
01290
01291
01296 void Component::CHECK()
01297 {
01298 #ifdef _DEBUG
01299 Relation_Iterator rel_it = m_relations.begin();
01300
01301 for( ; rel_it != m_relations.end(); ++rel_it)
01302 {
01303 if (rel_it->getOperation() == Relation::ASSOCIATION_OP)
01304 {
01305 bool three_op = rel_it->getOp3() != BON::FCO();
01306 if( rel_it->getOp1() == BON::FCO() ||
01307 rel_it->getOp2() == BON::FCO() ||
01308 rel_it->getOp3() == BON::FCO() ||
01309 rel_it->getOp4() == BON::FCO() ||
01310 rel_it->getOp5() == BON::FCO() )
01311 global_vars.err << MSG_ERROR << "Internal error: Assocation has one operand 0\n";
01312 Entity ent1 = entitySearch( rel_it->getOp1());
01313 Entity ent2 = entitySearch( rel_it->getOp2());
01314 Entity ent3 = entitySearch( rel_it->getOp3());
01315
01316 ObjPointer o1 = rel_it->getOp1();
01317
01318 ObjPointer ptr, o2 = rel_it->getOp2();
01319
01320 if ( ent1 == Entity( BON::Folder(), BON::FCO()) )
01321 {
01322 ptr = rel_it->getOp1();
01323 m_entities.push_back( Entity( BON::Folder(), rel_it->getOp1()));
01324 if ( ptr != BON::FCO())
01325 global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() << " is not present in Entities\n" <<
01326 ptr->getName() << " : " << ptr->getObjectMeta().name() << " has been inserted";
01327 else
01328 global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() << " is null\n";
01329 }
01330 if ( ent2 == Entity( BON::Folder(), BON::FCO()))
01331 {
01332 ptr = rel_it->getOp2();
01333 m_entities.push_back( Entity( BON::Folder(), rel_it->getOp2()));
01334 if ( ptr != BON::FCO())
01335 global_vars.err << "Internal error: Operand 2 of " << rel_it->getOperationStr() << " is not present in Entities\n" <<
01336 ptr->getName() << " : " << ptr->getObjectMeta().name() << " has been inserted";
01337 else
01338 global_vars.err << "Internal error: Operand 2 of " << rel_it->getOperationStr() << " is null\n";
01339 }
01340 if ( ent3 == Entity( BON::Folder(), BON::FCO()))
01341 {
01342 if ( three_op )
01343 {
01344 ptr = rel_it->getOp3();
01345 m_entities.push_back( Entity( BON::Folder(), rel_it->getOp3()));
01346 global_vars.err << "Internal error: Operand 3 of " << rel_it->getOperationStr() << " is not present in Entities\n" <<
01347 ptr->getName() << " : " << ptr->getObjectMeta().name() << " has been inserted";
01348 }
01349 else
01350 {
01351 global_vars.err << "Internal error: Association without Connection class: " << o1->getName() << " o " << o2->getName() << "\n";
01352 }
01353 }
01354 }
01355 else
01356 {
01357 if( rel_it->getOp1() == BON::FCO() ||
01358 rel_it->getOp2() == BON::FCO() )
01359 global_vars.err << "Internal error: " << rel_it->getOperationStr() << " has one operand 0\n";
01360
01361 Entity ent1 = entitySearch( rel_it->getOp1());
01362 Entity ent2 = entitySearch( rel_it->getOp2());
01363 ObjPointer ptr = BON::FCO();
01364 if ( ent1 == Entity( BON::Folder(), BON::FCO()))
01365 {
01366 ptr = rel_it->getOp1();
01367 m_entities.push_back( Entity( BON::Folder(), rel_it->getOp1()));
01368 if ( ptr != BON::FCO())
01369 global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() << " is not present in Entities\n" <<
01370 ptr->getName() << " : " << ptr->getObjectMeta().name() << " has been inserted";
01371 else
01372 global_vars.err << "Internal error: Operand 1 of " << rel_it->getOperationStr() + " is null\n";
01373 }
01374 if ( ent2 == Entity( BON::Folder(), BON::FCO()))
01375 {
01376 ptr = rel_it->getOp2();
01377 m_entities.push_back( Entity( BON::Folder(), rel_it->getOp2()));
01378 ObjPointer ptr2 = rel_it->getOp1();
01379 std::string peer1, peer2;
01380 if ( ptr2 != BON::FCO())
01381 peer1 = ptr2->getName() + " " + ptr2->getObjectMeta().name();
01382 if ( rel_it->getOp2())
01383 peer2 = rel_it->getOp2()->getName() + " " + rel_it->getOp2()->getObjectMeta().name();
01384 global_vars.err << "Internal error: Operand 2 of " << rel_it->getOperationStr() << " is not present in Entities\n" <<
01385 ptr->getName() << " : " << ptr->getObjectMeta().name() << " has been inserted\n" <<
01386 "Operand1: " << peer1 << "\n" <<
01387 "Operand2: " << peer2 << "\n";
01388
01389
01390 if (rel_it->getOperation() == Relation::HAS_ASPECT_OP )
01391 {
01392
01393 ObjPointer t_ptr = rel_it->getOp2();
01394 ObjPointer obj = t_ptr;
01395
01396 BON::Set set = BON::Set( obj);
01397 if (!set) global_vars.err << "Internal error: during set manipulation\n";
01398
01399 std::set<FCO> list = set->getMembers();
01400 std::set<FCO>::iterator list_it = list.begin();
01401 std::string mmm;
01402 while ( list_it != list.end())
01403 {
01404 FCO actual = *list_it;
01405 Relation rela( Relation::ASPECT_MEMBER_OP, t_ptr, actual);
01406 m_relations.push_back(rela);
01407 mmm += actual->getName() + "/" + actual->getObjectMeta().name() + "\n";
01408 ++list_it;
01409 }
01410 global_vars.err << "Internal error: Aspect members are:\n" << mmm << "\n";
01411 }
01412 }
01413 if ( rel_it->getOperation() == Relation::CONTAINMENT_OP ||
01414 rel_it->getOperation() == Relation::FOLDER_CONTAINMENT_OP )
01415 {
01416 if (rel_it->getOp3() == BON::FCO())
01417 global_vars.err << "Internal error: (Folder)Containment line object not present in m_relations list\n";
01418 }
01419 }
01420 }
01421
01422 Relation_Iterator rel_it1 = m_relations.begin();
01423
01424 for( ; rel_it1 != m_relations.end(); ++rel_it1)
01425 {
01426 Relation_Iterator rel_it2 = m_relations.begin();
01427
01428 for( ; rel_it2 != m_relations.end(); ++rel_it2)
01429 {
01430 if (rel_it1->getOperation() == Relation::HAS_ATTRIBUTE_OP &&
01431 rel_it2->getOperation() == Relation::HAS_ATTRIBUTE_OP )
01432 {
01433
01434 if ( rel_it1->getOp1() == rel_it2->getOp1()
01435 && rel_it1->getOp2() == rel_it2->getOp2()
01436 && rel_it1 != rel_it2)
01437 {
01438 ObjPointer o1 = rel_it1->getOp1();
01439
01440 ObjPointer o2 = rel_it1->getOp2();
01441 global_vars.err << "Internal error: Same attribute " << o2->getName() <<
01442 " contained twice by " << o1->getName() << "\n";
01443 }
01444 }
01445 }
01446 }
01447 #endif
01448 }
01449
01450 };