1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File : Superv_Component_i.cxx
23 // Author : André RIBES (EDF), Eric Fayolle (EDF)
26 #include "Superv_Component_i.hxx"
28 DSC_EXCEPTION_CXX(Superv_Component_i,BadFabType);
29 DSC_EXCEPTION_CXX(Superv_Component_i,BadType);
30 DSC_EXCEPTION_CXX(Superv_Component_i,BadCast);
31 DSC_EXCEPTION_CXX(Superv_Component_i,UnexpectedState);
32 DSC_EXCEPTION_CXX(Superv_Component_i,PortAlreadyDefined);
33 DSC_EXCEPTION_CXX(Superv_Component_i,PortNotDefined);
34 DSC_EXCEPTION_CXX(Superv_Component_i,PortNotConnected);
35 DSC_EXCEPTION_CXX(Superv_Component_i,NilPort);
36 DSC_EXCEPTION_CXX(Superv_Component_i,BadProperty);
38 std::map<std::string, port_factory*> Superv_Component_i::_factory_map;
40 Superv_Component_i::Superv_Component_i(CORBA::ORB_ptr orb,
41 PortableServer::POA_ptr poa,
42 PortableServer::ObjectId * contId,
43 const char *instanceName,
44 const char *interfaceName,
46 Engines_DSC_i(orb, poa, contId, instanceName, interfaceName)
49 std::cerr << "--Superv_Component_i : MARK 1 ---- " << instanceName << "----" << std::endl;
52 Superv_Component_i::Superv_Component_i(CORBA::ORB_ptr orb,
53 PortableServer::POA_ptr poa,
54 Engines::Container_ptr container,
55 const char *instanceName,
56 const char *interfaceName,
59 Engines_DSC_i(orb, poa, container, instanceName, interfaceName,notif,regist)
62 std::cerr << "--Superv_Component_i : MARK 1 ---- " << instanceName << "----" << std::endl;
67 Superv_Component_i::~Superv_Component_i()
69 my_superv_ports_it = my_superv_ports.begin();
70 for(;my_superv_ports_it != my_superv_ports.end();my_superv_ports_it++)
71 delete my_superv_ports_it->second;
75 Superv_Component_i::register_factory(const std::string & factory_name,
76 port_factory * factory_ptr)
78 factory_map_t::iterator it = _factory_map.find(factory_name);
80 if (it == _factory_map.end() )
82 _factory_map[factory_name] = factory_ptr;
87 Superv_Component_i::get_factory(const std::string & factory_name)
89 port_factory * rtn_factory = NULL;
90 factory_map_t::iterator it = _factory_map.find(factory_name);
92 if (it != _factory_map.end() )
94 rtn_factory = _factory_map[factory_name];
101 Superv_Component_i::create_provides_data_port(const std::string& port_fab_type)
104 provides_port * rtn_port = NULL;
105 std::string factory_name;
106 std::string type_name;
109 search_result = port_fab_type.find("_");
110 factory_name = port_fab_type.substr(0,search_result);
111 type_name = port_fab_type.substr(search_result+1, port_fab_type.length());
113 port_factory * factory = get_factory(factory_name);
115 rtn_port = factory->create_data_servant(type_name);
118 if (rtn_port == NULL)
119 throw BadFabType( LOC(OSS()<< "Impossible d'accéder à la fabrique "
126 Superv_Component_i::create_uses_data_port(const std::string& port_fab_type)
129 uses_port * rtn_proxy = NULL;
130 std::string factory_name;
131 std::string type_name;
134 search_result = port_fab_type.find("_");
135 factory_name = port_fab_type.substr(0,search_result);
136 type_name = port_fab_type.substr(search_result+1, port_fab_type.length());
138 port_factory * factory = get_factory(factory_name);
140 rtn_proxy = factory->create_data_proxy(type_name);
143 if (rtn_proxy == NULL)
144 throw BadFabType( LOC(OSS()<< "Impossible d'accéder à la fabrique "
151 Superv_Component_i::add_port(const char * port_fab_type,
152 const char * port_type,
153 const char * port_name)
154 throw (PortAlreadyDefined, BadFabType, BadType, BadProperty)
156 assert(port_fab_type);
160 std::string s_port_type(port_type);
161 if (s_port_type == "provides") {
162 provides_port * port = create_provides_data_port(port_fab_type);
163 add_port(port, port_name);
165 else if (s_port_type == "uses") {
167 std::cerr << "---- Superv_Component_i::add_port : MARK 1 ---- " << std::endl;
169 uses_port * port = create_uses_data_port(port_fab_type);
171 std::cerr << "---- Superv_Component_i::add_port : MARK 2 ---- " << std::endl;
173 add_port(port, port_name);
176 throw BadType( LOC(OSS()<< "Le port_type doit être soit 'provides' soit 'uses' not "
182 Superv_Component_i::add_port(provides_port * port,
183 const char* provides_port_name)
184 throw (PortAlreadyDefined, NilPort, BadProperty)
187 assert(provides_port_name);
191 Ports::PortProperties_var portproperties=port->get_port_properties();
192 Ports::Port_var portref=port->get_port_ref();
193 Engines_DSC_interface::add_provides_port(portref,
197 superv_port_t * new_superv_port = new superv_port_t();
198 new_superv_port->p_ref = port;
199 my_superv_ports[provides_port_name] = new_superv_port;
202 catch (const Engines::DSC::PortAlreadyDefined&) {
203 throw PortAlreadyDefined( LOC(OSS()<< "Le port provides "
204 << provides_port_name <<" existe déjà."));
206 catch (const Engines::DSC::NilPort&) {
207 throw NilPort( LOC(OSS()<< "Le pointeur sur port provides est nul."));
209 catch (const Engines::DSC::BadProperty&) {
210 throw BadProperty( LOC(OSS()<< "La propriété est mal définie"));
215 Superv_Component_i::add_port(uses_port * port,
216 const char* uses_port_name)
217 throw (PortAlreadyDefined, NilPort, BadProperty)
220 assert(uses_port_name);
223 Ports::PortProperties_var portproperties=port->get_port_properties();
224 Engines_DSC_interface::add_uses_port(port->get_repository_id(),
227 superv_port_t * new_superv_port = new superv_port_t();
228 new_superv_port->u_ref = port;
229 my_superv_ports[uses_port_name] = new_superv_port;
231 catch (const Engines::DSC::PortAlreadyDefined&) {
232 throw PortAlreadyDefined( LOC(OSS()<< "Le port uses "
233 << uses_port_name <<" existe déjà."));
235 catch (const Engines::DSC::NilPort&) {
236 throw NilPort( LOC(OSS()<< "Le pointeur sur port uses est nul."));
238 catch (const Engines::DSC::BadProperty&) {
239 throw BadProperty( LOC(OSS()<< "La propriété est mal définie"));
244 Superv_Component_i::get_port(provides_port *& port,
245 const char * provides_port_name)
246 throw (PortNotDefined,PortNotConnected)
248 assert(provides_port_name);
251 Ports::Port_var portref=Engines_DSC_interface::get_provides_port(provides_port_name, false);
252 port = my_superv_ports[provides_port_name]->p_ref;
253 } catch (const Engines::DSC::PortNotDefined&) {
254 throw PortNotDefined( LOC(OSS()<< "Le port provides "
255 << provides_port_name <<" n'existe pas."));
256 } catch (const Engines::DSC::PortNotConnected&) {
257 throw PortNotConnected( LOC(OSS()<< "Le port provides " << provides_port_name
258 << " n'est pas connecté."));
263 Superv_Component_i::get_port(uses_port *& port,
264 const char * uses_port_name)
265 throw (PortNotDefined, PortNotConnected)
267 assert(uses_port_name);
270 Engines::DSC::uses_port * portseq=Engines_DSC_i::get_uses_port(uses_port_name);
272 port = my_superv_ports[uses_port_name]->u_ref;
273 } catch (const Engines::DSC::PortNotDefined&) {
274 throw PortNotDefined( LOC(OSS()<< "Le port uses "
275 << uses_port_name <<" n'existe pas."));
276 } catch (const Engines::DSC::PortNotConnected&) {
277 throw PortNotConnected( LOC(OSS()<< "Le port uses " << uses_port_name
278 << " n'est pas connecté."));
285 Superv_Component_i::provides_port_changed(const char* provides_port_name,
287 const Engines::DSC::Message message)
289 my_superv_ports_it = my_superv_ports.find(provides_port_name);
290 if (my_superv_ports_it != my_superv_ports.end())
291 my_superv_ports[provides_port_name]->p_ref->provides_port_changed(connection_nbr,
296 Superv_Component_i::uses_port_changed(const char* uses_port_name,
297 Engines::DSC::uses_port * new_uses_port,
298 const Engines::DSC::Message message)
300 my_superv_ports_it = my_superv_ports.find(uses_port_name);
301 if (my_superv_ports_it != my_superv_ports.end())
302 my_superv_ports[uses_port_name]->u_ref->uses_port_changed(new Engines::DSC::uses_port(*new_uses_port),
304 //delete the copy made by the caller
305 delete new_uses_port;
311 Superv_Component_i::get_uses_port_names(std::vector<std::string> & port_names,
312 const std::string servicename) const {
314 port_names.reserve(my_superv_ports.size());
316 superv_ports::const_iterator it;
318 for (it=my_superv_ports.begin(); it!=my_superv_ports.end();++it)
319 if( (*it).second->p_ref == NULL ) port_names.push_back((*it).first);