BESDefineResponseHandler.cc
Go to the documentation of this file.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 <iostream>
00034
00035 using std::endl ;
00036
00037 #include "BESDefineResponseHandler.h"
00038 #include "BESSilentInfo.h"
00039 #include "BESDefine.h"
00040 #include "BESDefinitionStorageList.h"
00041 #include "BESDefinitionStorage.h"
00042 #include "BESDataNames.h"
00043 #include "BESSyntaxUserError.h"
00044 #include "BESResponseNames.h"
00045
00046 BESDefineResponseHandler::BESDefineResponseHandler( const string &name )
00047 : BESResponseHandler( name )
00048 {
00049 }
00050
00051 BESDefineResponseHandler::~BESDefineResponseHandler( )
00052 {
00053 }
00054
00081 void
00082 BESDefineResponseHandler::execute( BESDataHandlerInterface &dhi )
00083 {
00084 dhi.action_name = DEFINE_RESPONSE_STR ;
00085 BESInfo *info = new BESSilentInfo() ;
00086 _response = info ;
00087
00088 string def_name = dhi.data[DEF_NAME] ;
00089 string store_name = dhi.data[STORE_NAME] ;
00090 if( store_name == "" )
00091 store_name = PERSISTENCE_VOLATILE ;
00092 BESDefinitionStorage *store =
00093 BESDefinitionStorageList::TheList()->find_persistence( store_name ) ;
00094 if( store )
00095 {
00096 store->del_definition( def_name ) ;
00097
00098 BESDefine *dd = new BESDefine ;
00099 dhi.first_container() ;
00100 while( dhi.container )
00101 {
00102 dd->add_container( dhi.container ) ;
00103 dhi.next_container() ;
00104 }
00105 dd->set_agg_cmd( dhi.data[AGG_CMD] ) ;
00106 dd->set_agg_handler( dhi.data[AGG_HANDLER] ) ;
00107 dhi.data[AGG_CMD] = "" ;
00108 dhi.data[AGG_HANDLER] = "" ;
00109
00110 store->add_definition( def_name, dd ) ;
00111 }
00112 else
00113 {
00114 string err_str = (string)"Uanble to add definition \"" + def_name
00115 + "\" to \"" + store_name
00116 + "\" store. Store does not exist" ;
00117 throw BESSyntaxUserError( err_str, __FILE__, __LINE__ ) ;
00118 }
00119 }
00120
00134 void
00135 BESDefineResponseHandler::transmit( BESTransmitter *transmitter,
00136 BESDataHandlerInterface &dhi )
00137 {
00138 if( _response )
00139 {
00140
00141
00142
00143 BESInfo *info = dynamic_cast<BESInfo *>(_response) ;
00144 if( !info )
00145 throw BESInternalError( "cast error", __FILE__, __LINE__ ) ;
00146 info->transmit( transmitter, dhi ) ;
00147 }
00148 }
00149
00156 void
00157 BESDefineResponseHandler::dump( ostream &strm ) const
00158 {
00159 strm << BESIndent::LMarg << "BESDefineResponseHandler::dump - ("
00160 << (void *)this << ")" << endl ;
00161 BESIndent::Indent() ;
00162 BESResponseHandler::dump( strm ) ;
00163 BESIndent::UnIndent() ;
00164 }
00165
00166 BESResponseHandler *
00167 BESDefineResponseHandler::DefineResponseBuilder( const string &name )
00168 {
00169 return new BESDefineResponseHandler( name ) ;
00170 }