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 "BESContainerStorageCatalog.h"
00034 #include "BESContainer.h"
00035 #include "BESCatalogUtils.h"
00036 #include "BESInternalError.h"
00037 #include "BESForbiddenError.h"
00038 #include "BESInfo.h"
00039 #include "BESServiceRegistry.h"
00040 #include "GNURegex.h"
00041 #include "Error.h"
00042
00043 using namespace libdap ;
00044
00066 BESContainerStorageCatalog::BESContainerStorageCatalog( const string &n )
00067 : BESContainerStorageVolatile( n )
00068 {
00069 _utils = BESCatalogUtils::Utils( n ) ;
00070 _root_dir = _utils->get_root_dir() ;
00071 _follow_sym_links = _utils->follow_sym_links() ;
00072 }
00073
00074 BESContainerStorageCatalog::~BESContainerStorageCatalog()
00075 {
00076 }
00077
00106 void
00107 BESContainerStorageCatalog::add_container( const string &sym_name,
00108 const string &real_name,
00109 const string &type )
00110 {
00111
00112
00113
00114
00115 string::size_type stopat = real_name.length() - 1 ;
00116 while( real_name[stopat] == '/' )
00117 {
00118 stopat-- ;
00119 }
00120 string new_name = real_name.substr( 0, stopat + 1 ) ;
00121
00122 string basename ;
00123 string::size_type slash = new_name.rfind( "/" ) ;
00124 if( slash != string::npos )
00125 {
00126 basename = new_name.substr( slash+1, new_name.length() - slash ) ;
00127 }
00128 else
00129 {
00130 basename = new_name ;
00131 }
00132 if( !_utils->include( basename ) || _utils->exclude( basename ) )
00133 {
00134 string s = "Attempting to create a container with real name "
00135 + real_name + " which is on the exclude list" ;
00136 throw BESForbiddenError( s, __FILE__, __LINE__ ) ;
00137 }
00138
00139
00140
00141 string new_type = type ;
00142 if( new_type == "" )
00143 {
00144 BESCatalogUtils::match_citer i = _utils->match_list_begin() ;
00145 BESCatalogUtils::match_citer ie = _utils->match_list_end() ;
00146 bool done = false ;
00147 for( ; i != ie && !done; i++ )
00148 {
00149 BESCatalogUtils::type_reg match = (*i) ;
00150 try
00151 {
00152 Regex reg_expr( match.reg.c_str() ) ;
00153 if( reg_expr.match( real_name.c_str(), real_name.length() ) ==
00154 static_cast<int>(real_name.length()) )
00155 {
00156 new_type = match.type ;
00157 done = true ;
00158 }
00159 }
00160 catch( Error &e )
00161 {
00162 string serr = (string)"Unable to match data type, "
00163 + "malformed Catalog TypeMatch parameter "
00164 + "in bes configuration file around "
00165 + match.reg + ": " + e.get_error_message() ;
00166 throw BESInternalError( serr, __FILE__, __LINE__ ) ;
00167 }
00168 }
00169 }
00170 BESContainerStorageVolatile::add_container( sym_name, real_name, new_type );
00171 }
00172
00182 bool
00183 BESContainerStorageCatalog::isData( const string &inQuestion,
00184 list<string> &provides )
00185 {
00186 string node_type = "" ;
00187 BESCatalogUtils::match_citer i = _utils->match_list_begin() ;
00188 BESCatalogUtils::match_citer ie = _utils->match_list_end() ;
00189 bool done = false ;
00190 for( ; i != ie && !done; i++ )
00191 {
00192 BESCatalogUtils::type_reg match = (*i) ;
00193 try
00194 {
00195 Regex reg_expr( match.reg.c_str() ) ;
00196 if( reg_expr.match( inQuestion.c_str(), inQuestion.length() ) ==
00197 static_cast<int>(inQuestion.length()) )
00198 {
00199 node_type = match.type ;
00200 done = true ;
00201 }
00202 }
00203 catch( Error &e )
00204 {
00205 string serr = (string)"Unable to determine data products (is data), "
00206 + "malformed Catalog TypeMatch parameter "
00207 + "in bes configuration file around "
00208 + match.reg + ": " + e.get_error_message() ;
00209 throw BESInternalError( serr, __FILE__, __LINE__ ) ;
00210 }
00211 }
00212
00213 BESServiceRegistry::TheRegistry()->services_handled( node_type, provides ) ;
00214
00215 return done ;
00216 }
00217
00225 void
00226 BESContainerStorageCatalog::dump( ostream &strm ) const
00227 {
00228 strm << BESIndent::LMarg << "BESContainerStorageCatalog::dump - ("
00229 << (void *)this << ")" << endl ;
00230 BESIndent::Indent() ;
00231 strm << BESIndent::LMarg << "name: " << get_name() << endl ;
00232 strm << BESIndent::LMarg << "utils: " << get_name() << endl ;
00233 BESIndent::Indent() ;
00234 _utils->dump( strm ) ;
00235 BESIndent::UnIndent() ;
00236 BESIndent::UnIndent() ;
00237 }
00238