26 #include <boost/algorithm/string/predicate.hpp>
27 #include <boost/filesystem.hpp>
32 #define ON_DEBUG if ( outputLevel() <= MSG::DEBUG )
33 #define ON_VERBOSE if ( outputLevel() <= MSG::VERBOSE )
35 #define DEBMSG ON_DEBUG debug()
36 #define VERMSG ON_VERBOSE verbose()
67 error() <<
"Unable to initialize Service base class" <<
endmsg;
71 auto p_incSvc = service<IIncidentSvc>(
"IncidentSvc",
true );
74 error() <<
"unable to get the IncidentSvc" <<
endmsg;
77 p_incSvc->addListener(
this, IncidentType::BeginOutputFile, 100,
true );
78 p_incSvc->addListener(
this, IncidentType::BeginInputFile, 100,
true );
89 for (
auto& io : m_iostack ) { io->release(); }
100 if ( 0 == iocomponent ) {
return false; }
102 IoRegistry_t::const_iterator io = m_ioregistry.
find( ioname );
103 return io != m_ioregistry.end();
113 if ( 0 == iocomponent ) {
return false; }
116 DEBMSG <<
"io_contains: c: " << ioname <<
" f: " << fname <<
endmsg;
119 if ( fit.first == fit.second ) {
123 for ( it = fit.first; it != fit.second; ++it ) {
127 error() <<
"IIoComponent " << ioname <<
" has empty old filename" <<
endmsg;
147 if ( !iocomponent ) {
148 error() <<
"io_register (component) received a NULL pointer !" <<
endmsg;
152 DEBMSG <<
"--> io_register(" << ioname <<
")" <<
endmsg;
153 auto itr = m_ioregistry.find( ioname );
154 if ( itr == m_ioregistry.end() ) {
155 DEBMSG <<
" registering IoComponent \"" << ioname <<
"\"" <<
endmsg;
157 m_ioregistry[ioname] = iocomponent;
158 m_iostack.push_back( iocomponent );
160 info() <<
"IoComponent[" << iocomponent->
name() <<
"] already registered @" << (
void*)itr->second <<
endmsg;
179 << fname <<
")" <<
endmsg;
181 if ( !io_hasitem( iocomponent ) ) {
182 if ( !io_register( iocomponent ).isSuccess() ) {
183 error() <<
"could not register component [" << iocomponent->
name() <<
"] "
184 <<
"with the I/O component manager !" <<
endmsg;
190 if ( fit.first != fit.second ) {
191 for (
iodITR it = fit.first; it != fit.second; ++it ) {
195 info() <<
"IoComponent " << ioname <<
" has already had file " << fname <<
" registered with i/o mode "
199 warning() <<
"IoComponent " << ioname <<
" has already had file " << fname
200 <<
" registered with a different i/o mode " << ioe.
m_iomode <<
" - now trying " << iomode <<
endmsg;
210 [&](
const std::string& pf ) { return boost::algorithm::contains( tmp_name, pf ); } );
211 IoComponentEntry ioc( fname, ( special_case ? tmp_name : boost::filesystem::absolute( tmp_name ).
string() ), iomode );
224 if ( iocomponent !=
nullptr && findComp( iocomponent, pit ) ) {
226 [](
const auto& itr ) { return itr.second.m_oldfname; } );
242 DEBMSG <<
"--> io_retrieve(" << ioname <<
"," << fname <<
")" <<
endmsg;
245 if ( !findComp( iocomponent, ofname, it ) ) {
246 DEBMSG <<
"could not find c: " << ioname <<
" old_f: " << ofname <<
endmsg;
250 IoDict_t::iterator it;
251 for ( it = m_cdict.equal_range( iocomponent ).first; it != m_cdict.equal_range( iocomponent ).second; ++it ) {
253 if ( it->second.m_oldfname == ofname ) {
254 DEBMSG <<
"retrieving new name for the component " << iocomponent->
name() <<
" old name: " << ofname
255 <<
", new name: " << it->second.m_newfname <<
endmsg;
256 fname = it->second.m_newfname;
262 DEBMSG <<
"Unexpected error! Unable to find entry in the dictionary corresponding to old filename: " << ofname
275 debug() <<
"--> io_reinitialize()" <<
endmsg;
276 debug() <<
"reinitializing I/O subsystem..." <<
endmsg;
277 debug() <<
"Listing all monitored entries: " <<
std::endl;
282 for (
auto& io : m_iostack ) {
283 DEBMSG <<
" [" << io->name() <<
"]->io_reinit()..." <<
endmsg;
284 if ( !io->io_reinit().isSuccess() ) {
286 error() <<
"problem in [" << io->name() <<
"]->io_reinit() !" <<
endmsg;
297 DEBMSG <<
"--> io_update(" << ioc->
name() <<
"," << old_fname <<
"," << new_fname <<
")" <<
endmsg;
299 IoDict_t::iterator it;
300 for ( it = m_cdict.equal_range( ioc ).first; it != m_cdict.equal_range( ioc ).second; ++it ) {
302 if ( it->second.m_oldfname == old_fname ) {
303 DEBMSG <<
"updating " << ioc->
name() <<
" f: " << old_fname <<
" -> " << new_fname <<
endmsg;
304 it->second.m_newfname = new_fname;
316 DEBMSG <<
"--> io_update(" << ioc->
name() <<
"," << work_dir <<
")" <<
endmsg;
318 IoDict_t::iterator it;
319 for ( it = m_cdict.equal_range( ioc ).first; it != m_cdict.equal_range( ioc ).second; ++it ) {
321 switch ( it->second.m_iomode ) {
323 it->second.m_newfname = it->second.m_oldabspath;
328 if ( oldPath.is_relative() && oldPath.filename() == oldPath.relative_path() ) {
339 it->second.m_newfname = newfname.string();
342 it->second.m_newfname = it->second.m_oldabspath;
349 error() <<
"Unable to update IoComponent for the mode " << it->second.m_iomode <<
endmsg;
362 DEBMSG <<
"-->io_update_all for the directory " << work_dir <<
endmsg;
364 for ( IoStack_t::iterator io = m_iostack.begin(), ioEnd = m_iostack.end(); io != ioEnd; ++io ) {
365 if ( !io_update( *io, work_dir ).isSuccess() ) {
367 error() <<
"problem in [" << ( *io )->name() <<
"]->io_update() !" <<
endmsg;
381 debug() <<
"--> io_finalize()" <<
endmsg;
382 debug() <<
"finalizing I/O subsystem..." <<
endmsg;
383 debug() <<
"Listing all monitored entries: " <<
std::endl;
389 for ( IoStack_t::reverse_iterator io = m_iostack.rbegin(), ioEnd = m_iostack.rend(); io != ioEnd; ++io ) {
390 DEBMSG <<
" [" << ( *io )->name() <<
"]->io_finalize()..." <<
endmsg;
391 if ( !( *io )->io_finalize().isSuccess() ) {
393 error() <<
"problem in [" << ( *io )->name() <<
"]->io_finalize() !" <<
endmsg;
405 if ( !findComp(
c, pit ) ) {
409 return std::any_of( pit.first, pit.second, [&]( IoDict_t::const_reference i ) { return i.second.m_oldfname == f; } );
416 pit = m_cdict.equal_range(
c );
417 return pit.first != pit.second;
424 pit.first = m_cdict.end();
425 pit.second = m_cdict.end();
427 auto itr = m_ioregistry.find(
c );
428 return ( itr != m_ioregistry.end() ) && findComp( itr->second, pit );
437 ost <<
"Listing all IoComponents (" << m_cdict.size() <<
"): " <<
endl;
438 for (
const auto& i : m_cdict ) { ost <<
" " << i.first->name() <<
" " << i.second <<
endl; }
449 if ( i.
type() == IncidentType::BeginInputFile ) {
455 if ( findComp( fi->
source(), pit ) ) {
457 while ( pit.first != pit.second ) {
468 }
else if ( i.
type() == IncidentType::BeginOutputFile ) {
474 if ( findComp( fi->
source(), pit ) ) {
476 while ( pit.first != pit.second ) {