00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "BESContainerStorageVolatile.h"
00034 #include "BESFileContainer.h"
00035 #include "BESInternalError.h"
00036 #include "BESInfo.h"
00037 #include "TheBESKeys.h"
00038 #include "BESUtil.h"
00039
00047 BESContainerStorageVolatile::BESContainerStorageVolatile( const string &n )
00048 : BESContainerStorage( n )
00049 {
00050 string key = "BES.Data.RootDirectory" ;
00051 bool found = false ;
00052 _root_dir = TheBESKeys::TheKeys()->get_key( key, found ) ;
00053 if( _root_dir == "" )
00054 {
00055 string s = key + " not defined in bes configuration file" ;
00056 throw BESInternalError( s, __FILE__, __LINE__ ) ;
00057 }
00058
00059 key = (string)"BES.FollowSymLinks" ;
00060 string s_str =
00061 BESUtil::lowercase( TheBESKeys::TheKeys()->get_key( key, found ) ) ;
00062 if( found && ( s_str == "yes" || s_str == "on" || s_str == "true" ) )
00063 {
00064 _follow_sym_links = true ;
00065 }
00066 }
00067
00068 BESContainerStorageVolatile::~BESContainerStorageVolatile()
00069 {
00070 del_containers() ;
00071 }
00072
00082 BESContainer *
00083 BESContainerStorageVolatile::look_for( const string &sym_name )
00084 {
00085 BESContainer *ret_container = 0 ;
00086
00087 BESContainerStorageVolatile::Container_citer i ;
00088 i = _container_list.find( sym_name ) ;
00089 if( i != _container_list.end() )
00090 {
00091 BESContainer *c = (*i).second ;
00092 ret_container = c->ptr_duplicate() ;
00093 }
00094
00095 return ret_container ;
00096 }
00097
00113 void
00114 BESContainerStorageVolatile::add_container( const string &sym_name,
00115 const string &real_name,
00116 const string &type )
00117 {
00118
00119
00120 if( type == "" )
00121 {
00122 string s = "Unable to add container, type of data must be specified" ;
00123 throw BESInternalError( s, __FILE__, __LINE__ ) ;
00124 }
00125
00126
00127 BESContainerStorageVolatile::Container_citer i ;
00128 i = _container_list.find( sym_name ) ;
00129 if( i != _container_list.end() )
00130 {
00131 string s = (string)"A container with the name "
00132 + sym_name
00133 + " already exists" ;
00134 throw BESInternalError( s, __FILE__, __LINE__ ) ;
00135 }
00136
00137
00138
00139
00140 BESUtil::check_path( real_name, _root_dir, _follow_sym_links ) ;
00141
00142
00143 string new_r_name = _root_dir + "/" + real_name ;
00144
00145
00146 BESContainer *c = new BESFileContainer( sym_name, new_r_name, type ) ;
00147
00148
00149 _container_list[sym_name] = c ;
00150 }
00151
00169 void
00170 BESContainerStorageVolatile::add_container( BESContainer *c )
00171 {
00172 if( !c )
00173 {
00174 string s = "Unable to add container, container passed is null" ;
00175 throw BESInternalError( s, __FILE__, __LINE__ ) ;
00176 }
00177 if( c->get_container_type() == "" )
00178 {
00179 string s = "Unable to add container, type of data must be specified" ;
00180 throw BESInternalError( s, __FILE__, __LINE__ ) ;
00181 }
00182 string sym_name = c->get_symbolic_name() ;
00183 BESContainerStorageVolatile::Container_citer i ;
00184 i = _container_list.find( sym_name ) ;
00185 if( i != _container_list.end() )
00186 {
00187 string s = (string)"A container with the name "
00188 + sym_name
00189 + " already exists" ;
00190 throw BESInternalError( s, __FILE__, __LINE__ ) ;
00191 }
00192 _container_list[sym_name] = c ;
00193 }
00194
00201 bool
00202 BESContainerStorageVolatile::del_container( const string &s_name )
00203 {
00204 bool ret = false ;
00205 BESContainerStorageVolatile::Container_iter i ;
00206 i = _container_list.find( s_name ) ;
00207 if( i != _container_list.end() )
00208 {
00209 BESContainer *c = (*i).second;
00210 _container_list.erase( i ) ;
00211 delete c ;
00212 ret = true ;
00213 }
00214 return ret ;
00215 }
00216
00224 bool
00225 BESContainerStorageVolatile::del_containers( )
00226 {
00227 while( _container_list.size() != 0 )
00228 {
00229 Container_iter ci = _container_list.begin() ;
00230 BESContainer *c = (*ci).second ;
00231 _container_list.erase( ci ) ;
00232 if( c )
00233 {
00234 delete c ;
00235 }
00236 }
00237 return true ;
00238 }
00239
00254 void
00255 BESContainerStorageVolatile::show_containers( BESInfo &info )
00256 {
00257 info.add_tag( "name", get_name() ) ;
00258 BESContainerStorageVolatile::Container_iter i = _container_list.begin() ;
00259 for( ; i != _container_list.end(); i++ )
00260 {
00261 info.begin_tag( "container" ) ;
00262 BESContainer *c = (*i).second;
00263 string sym = c->get_symbolic_name() ;
00264 info.add_tag( "symbolicName", sym ) ;
00265 string real = c->get_real_name() ;
00266 info.add_tag( "realName", real ) ;
00267 string type = c->get_container_type() ;
00268 info.add_tag( "dataType", type ) ;
00269 info.end_tag( "container" ) ;
00270 }
00271 }
00272
00280 void
00281 BESContainerStorageVolatile::dump( ostream &strm ) const
00282 {
00283 strm << BESIndent::LMarg << "BESContainerStorageVolatile::dump - ("
00284 << (void *)this << ")" << endl ;
00285 BESIndent::Indent() ;
00286 strm << BESIndent::LMarg << "name: " << get_name() << endl ;
00287 if( _container_list.size() )
00288 {
00289 strm << BESIndent::LMarg << "containers:" << endl ;
00290 BESIndent::Indent() ;
00291 BESContainerStorageVolatile::Container_citer i
00292 = _container_list.begin() ;
00293 BESContainerStorageVolatile::Container_citer ie
00294 = _container_list.end() ;
00295 for( ; i != ie; i++ )
00296 {
00297 BESContainer *c = (*i).second;
00298 c->dump( strm ) ;
00299 }
00300 BESIndent::UnIndent() ;
00301 }
00302 else
00303 {
00304 strm << BESIndent::LMarg << "containers: none" << endl ;
00305 }
00306 BESIndent::UnIndent() ;
00307 }
00308