00001
00002
00003
00004
00005 #include "eirods_structured_object.h"
00006 #include "eirods_resource_manager.h"
00007
00008 extern eirods::resource_manager resc_mgr;
00009
00010 namespace eirods {
00011
00012
00013
00014 structured_object::structured_object() :
00015 file_object(),
00016 sub_file_path_(""),
00017 offset_(0),
00018 spec_coll_(0),
00019 data_type_(""),
00020 opr_type_(0) {
00021 }
00022
00023
00024
00025 structured_object::structured_object( const structured_object& _rhs ) :
00026 file_object( _rhs ) {
00027 addr_ = _rhs.addr_;
00028 sub_file_path_ = _rhs.sub_file_path_;
00029 offset_ = _rhs.offset_;
00030 spec_coll_ = _rhs.spec_coll_;
00031 data_type_ = _rhs.data_type_;
00032 opr_type_ = _rhs.opr_type_;
00033
00034 }
00035
00036
00037
00038 structured_object::structured_object( subFile_t& _sub ) :
00039 file_object(),
00040 sub_file_path_(""),
00041 offset_(0),
00042 spec_coll_(0),
00043 data_type_(""),
00044 opr_type_(0) {
00045
00046
00047
00048 addr_ = _sub.addr;
00049 sub_file_path_ = _sub.subFilePath;
00050 offset_ = _sub.offset;
00051 spec_coll_ = _sub.specColl;
00052 mode( _sub.mode );
00053 flags( _sub.flags );
00054
00055
00056
00057 physical_path_ = _sub.subFilePath;
00058 logical_path(spec_coll_->objPath);
00059
00060 }
00061
00062
00063
00064 structured_object::~structured_object() {
00065 }
00066
00067
00068
00069 structured_object& structured_object::operator=( const structured_object& _rhs ) {
00070
00071
00072 file_object::operator=( _rhs );
00073
00074 addr_ = _rhs.addr_;
00075 sub_file_path_ = _rhs.sub_file_path_;
00076 offset_ = _rhs.offset_;
00077 spec_coll_ = _rhs.spec_coll_;
00078 data_type_ = _rhs.data_type_;
00079 opr_type_ = _rhs.opr_type_;
00080
00081 return *this;
00082
00083 }
00084
00085
00086
00087 error structured_object::resolve(
00088 const std::string& _interface,
00089 plugin_ptr& _ptr ) {
00090
00091
00092
00093 if( RESOURCE_INTERFACE != _interface ) {
00094 std::stringstream msg;
00095 msg << "structured_object does not support a [";
00096 msg << _interface;
00097 msg << "] for plugin resolution";
00098 return ERROR( SYS_INVALID_INPUT_PARAM, msg.str() );
00099 }
00100
00101
00102
00103 resource_ptr resc_ptr;
00104 eirods::error err = resc_mgr.resolve(
00105 "struct file",
00106 resc_ptr );
00107 if( err.ok() ) {
00108 _ptr = boost::dynamic_pointer_cast< resource >( resc_ptr );
00109 return SUCCESS();
00110
00111 } else {
00112
00113
00114 error init_err = resc_mgr.init_from_type(
00115 "structfile",
00116 "struct file",
00117 "struct_file_inst",
00118 "empty context",
00119 resc_ptr );
00120 if( !init_err.ok() ) {
00121 return PASSMSG( "failed to load resource plugin", init_err );
00122
00123 }
00124
00125 }
00126
00127
00128
00129 rodsServerHost_t* tmpRodsServerHost = 0;
00130 int status = resolveHost( &addr_, &tmpRodsServerHost );
00131 if( status < 0 ) {
00132 std::stringstream msg;
00133 msg << "resolveHost error for [";
00134 msg << addr_.hostAddr;
00135 return ERROR( status, msg.str() );
00136 }
00137
00138 resc_ptr->set_property< rodsServerHost_t* >( RESOURCE_HOST, tmpRodsServerHost );
00139
00140 resc_ptr->set_property<long>( RESOURCE_ID, -1 );
00141 resc_ptr->set_property<long>( RESOURCE_FREESPACE, -1 );
00142 resc_ptr->set_property<long>( RESOURCE_QUOTA, -1 );
00143
00144 resc_ptr->set_property<int>( RESOURCE_STATUS, INT_RESC_STATUS_UP );
00145
00146 resc_ptr->set_property<std::string>( RESOURCE_ZONE, addr_.zoneName );
00147 resc_ptr->set_property<std::string>( RESOURCE_NAME, "structfile" );
00148 resc_ptr->set_property<std::string>( RESOURCE_LOCATION, addr_.hostAddr );
00149 resc_ptr->set_property<std::string>( RESOURCE_TYPE, "structfile" );
00150 resc_ptr->set_property<std::string>( RESOURCE_CLASS, "cache" );
00151 resc_ptr->set_property<std::string>( RESOURCE_PATH, physical_path_ );
00152 resc_ptr->set_property<std::string>( RESOURCE_INFO, "blank info" );
00153 resc_ptr->set_property<std::string>( RESOURCE_COMMENTS, "blank comments" );
00154 resc_ptr->set_property<std::string>( RESOURCE_CREATE_TS, "create?" );
00155 resc_ptr->set_property<std::string>( RESOURCE_MODIFY_TS, "modify?" );
00156
00157 _ptr = boost::dynamic_pointer_cast< resource >( resc_ptr );
00158 return SUCCESS();
00159
00160 }
00161
00162
00163
00164 error structured_object::get_re_vars(
00165 keyValPair_t& _kvp ) {
00166 file_object::get_re_vars( _kvp );
00167
00168
00169 addKeyVal( &_kvp, HOST_ADDR_KW, addr_.hostAddr );
00170 addKeyVal( &_kvp, ZONE_NAME_KW, addr_.zoneName );
00171
00172 std::stringstream pn;
00173 pn << addr_.portNum;
00174 addKeyVal( &_kvp, PORT_NUM_KW, pn.str().c_str() );
00175
00176
00177
00178 addKeyVal( &_kvp, SUB_FILE_PATH_KW, sub_file_path_.c_str() );
00179
00180 std::stringstream off;
00181 off << offset_;
00182 addKeyVal( &_kvp, OFFSET_KW, off.str().c_str() );
00183
00184 addKeyVal( &_kvp, DATA_TYPE_KW, data_type_.c_str() );
00185
00186 std::stringstream opr;
00187 opr << opr_type_;
00188 addKeyVal( &_kvp, OPR_TYPE_KW, opr.str().c_str() );
00189
00190
00191
00192 if( spec_coll_ ) {
00193 std::stringstream coll_class;
00194 coll_class << spec_coll_->collClass;
00195 addKeyVal( &_kvp, SPEC_COLL_CLASS_KW, coll_class.str().c_str() );
00196
00197 std::stringstream type;
00198 type << spec_coll_->type;
00199 addKeyVal( &_kvp, SPEC_COLL_TYPE_KW, type.str().c_str() );
00200
00201 addKeyVal( &_kvp, SPEC_COLL_OBJ_PATH_KW, spec_coll_->objPath );
00202 addKeyVal( &_kvp, SPEC_COLL_RESOURCE_KW, spec_coll_->resource );
00203 addKeyVal( &_kvp, SPEC_COLL_RESC_HIER_KW, spec_coll_->rescHier );
00204 addKeyVal( &_kvp, SPEC_COLL_PHY_PATH_KW, spec_coll_->phyPath );
00205 addKeyVal( &_kvp, SPEC_COLL_CACHE_DIR_KW, spec_coll_->cacheDir );
00206
00207 std::stringstream dirty;
00208 dirty << spec_coll_->cacheDirty;
00209 addKeyVal( &_kvp, SPEC_COLL_CACHE_DIRTY, dirty.str().c_str() );
00210
00211 std::stringstream repl;
00212 repl << spec_coll_->replNum;
00213 addKeyVal( &_kvp, SPEC_COLL_REPL_NUM, repl.str().c_str() );
00214
00215 }
00216
00217 return SUCCESS();
00218
00219 }
00220
00221 };
00222
00223
00224