SAGA Adaptor CPI v.1.0
adaptor.hpp
Go to the documentation of this file.
00001 //  Copyright (c) 2005-2009 Hartmut Kaiser
00002 //  Copyright (c) 2005-2007 Andre Merzky (andre@merzky.net)
00003 // 
00004 //  Distributed under the Boost Software License, Version 1.0. (See accompanying 
00005 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
00006 
00007 #ifndef SAGA_SAGA_ADAPTORS_ADAPTOR_HPP
00008 #define SAGA_SAGA_ADAPTORS_ADAPTOR_HPP
00009 
00010 #include <boost/thread/thread.hpp>
00011 #include <boost/thread/recursive_mutex.hpp>
00012 
00013 #include <boost/version.hpp>
00014 #include <boost/plugin.hpp>
00015 #include <boost/plugin/export_plugin.hpp>
00016 #include <boost/thread.hpp>
00017 #include <boost/tokenizer.hpp>
00018 #include <boost/preprocessor/cat.hpp>
00019 #include <boost/preprocessor/stringize.hpp>
00020 
00021 #include <saga/saga/adaptors/adaptor_data.hpp>
00022 #include <saga/saga/adaptors/adaptor_suite.hpp>
00023 #include <saga/saga/adaptors/adaptor_suite_data.hpp>
00024 #include <saga/saga/adaptors/utils/utils.hpp>
00025 
00026 #include <saga/impl/engine/adaptor_selector.hpp>
00027 #include <saga/saga/uuid.hpp>
00028 
00030 #ifndef SAGA_ADAPTOR_NAME
00031 # ifndef SAGA_ENGINE
00032 #   error "SAGA_ADAPTOR_NAME needs to be defined for saga adaptor macros"
00033 # else
00034 #   define SAGA_ADAPTOR_NAME engine   // needed for get_name()
00035 # endif
00036 #endif
00037 
00039 #ifndef SAGA_ADAPTOR_LIB_NAME
00040 #define SAGA_ADAPTOR_LIB_NAME                                                 \
00041         BOOST_PP_CAT(libsaga_adaptor_, SAGA_ADAPTOR_NAME )                    \
00042     
00043 #endif
00044 
00046 namespace saga 
00047 {
00048     // definition of cpi names
00049     namespace adaptors
00050     {
00051         // general usage
00052         char const* const attribute_cpi        = "attribute_cpi";
00053         char const* const permissions_cpi      = "permissions_cpi";
00054 
00055         char const* const context_cpi          = "context_cpi";
00056         char const* const url_cpi              = "url_cpi";
00057 
00058         // file package
00059         char const* const namespace_entry_cpi  = "namespace_entry_cpi";
00060         char const* const namespace_dir_cpi    = "namespace_dir_cpi";
00061         char const* const file_cpi             = "file_cpi";
00062         char const* const directory_cpi        = "directory_cpi";
00063         
00064         // locical_file package
00065         char const* const logical_file_cpi      = "logical_file_cpi";
00066         char const* const logical_directory_cpi = "logical_directory_cpi";
00067         
00068         // job package
00069         char const* const job_cpi              = "job_cpi";
00070         char const* const job_service_cpi      = "job_service_cpi";
00071         
00072         // stream package
00073         char const* const stream_cpi           = "stream_cpi";
00074         char const* const stream_server_cpi    = "stream_server_cpi";
00075 
00076         // RPC package
00077         char const* const rpc_cpi              = "rpc_cpi";
00078         
00079         // information services package
00080         char const* const advert_cpi           = "advert_cpi";
00081         char const* const advert_directory_cpi = "advert_directory_cpi";
00082         
00083         // Service discovery package
00084         char const* const discoverer_cpi       = "discoverer_cpi";
00085 
00086         // cpr package
00087         char const* const cpr_job_cpi          = "cpr_job_cpi";
00088         char const* const cpr_job_service_cpi  = "cpr_job_service_cpi";
00089         char const* const cpr_checkpoint_cpi   = "cpr_checkpoint_cpi";
00090         char const* const cpr_directory_cpi    = "cpr_directory_cpi";
00091 
00092         //Information System Navigator
00093         char const* const navigator_cpi        = "navigator_cpi";
00094         
00095         // return the name of the implementing CPI for a saga object type
00096         inline std::string 
00097         get_cpi_name(saga::object::type type) 
00098         {
00099             switch (type) {
00100             case saga::object::Context:           return context_cpi;
00101             case saga::object::URL:               return url_cpi;
00102             case saga::object::NSEntry:           return namespace_entry_cpi;
00103             case saga::object::NSDirectory:       return namespace_dir_cpi;
00104             case saga::object::File:              return file_cpi;
00105             case saga::object::Directory:         return directory_cpi;
00106             case saga::object::LogicalFile:       return logical_file_cpi;
00107             case saga::object::LogicalDirectory:  return logical_directory_cpi;
00108             case saga::object::Job:               return job_cpi;
00109             case saga::object::JobService:        return job_service_cpi;
00110             case saga::object::Stream:            return stream_cpi;
00111             case saga::object::StreamServer:      return stream_server_cpi;
00112             case saga::object::RPC:               return rpc_cpi;
00113             case saga::object::Advert:            return advert_cpi;
00114             case saga::object::AdvertDirectory:   return advert_directory_cpi;
00115             case saga::object::ServiceDiscoverer: return discoverer_cpi;
00116             case saga::object::CPRJob:            return cpr_job_cpi;
00117             case saga::object::CPRJobService:     return cpr_job_service_cpi;
00118             case saga::object::CPRCheckpoint:     return cpr_checkpoint_cpi;
00119             case saga::object::CPRDirectory:      return cpr_directory_cpi;
00120             case saga::object::EntityNavigator:   return navigator_cpi;
00121             default:
00122                 break;
00123             }
00124             return "Unknown";
00125         }
00126     }
00127     
00129 
00130     class adaptor
00131     {
00132     private:
00133         // this mutex is used to synchronize access to the adaptor member data
00134         typedef boost::recursive_mutex mutex_type;
00135         mutex_type mtx_;
00136 
00137     protected:
00138         // this uuid identifies the adaptor object
00139         saga::uuid adaptor_uuid_;
00140     
00141     public:
00142         virtual ~adaptor (void) {}
00143         virtual impl::adaptor_selector::adaptor_info_list_type 
00144                 adaptor_register (saga::impl::session *) = 0;
00145 
00146         // support functions for the adaptor_data helper class
00147         void lock_data() 
00148         {
00149 #if BOOST_VERSION < 103500
00150             boost::detail::thread::lock_ops<mutex_type>::lock(mtx_);
00151 #else
00152             mtx_.lock();
00153 #endif
00154         }
00155         void unlock_data() 
00156         {
00157 #if BOOST_VERSION < 103500
00158             boost::detail::thread::lock_ops<mutex_type>::unlock(mtx_);
00159 #else
00160             mtx_.unlock();
00161 #endif
00162         }
00163         
00164         // access the identifying uuid of this adaptor
00165         saga::uuid const & get_uuid() const
00166         {
00167             return adaptor_uuid_;
00168         }
00169 
00170         // access the identifying name of this adaptor
00171         virtual std::string get_name() const = 0;
00172 
00173 
00174         // get adaptor_suite, if any is available
00175         template <class Adaptor_Suite>
00176         Adaptor_Suite & get_adaptor_suite (void)
00177         {
00178           return saga::adaptors::utils::get_singleton <Adaptor_Suite> ();
00179         }
00180 
00181         // initialize the adaptor using the preferences, return false to 
00182         // cancel adaptor loading
00183         virtual bool init(saga::impl::session *,
00184             saga::ini::ini const& glob_ini, saga::ini::ini const& adap_ini) 
00185         { return true; }
00186     };
00189 } // namespace saga
00190 
00192 //  Forward the SAGA_ADAPTOR_REGISTER macro to the correct BOOST_PLUGIN macro 
00193 //  sequence
00194 #define SAGA_ADAPTOR_REGISTER(ActualType)                                     \
00195         BOOST_PLUGIN_EXPORT_LIST (SAGA_ADAPTOR_LIB_NAME)                      \
00196         BOOST_PLUGIN_EXPORT      (SAGA_ADAPTOR_LIB_NAME, saga::adaptor,       \
00197                                   ActualType,        "adaptor");              \
00198     
00199 
00200 #endif // SAGA_SAGA_ADAPTORS_ADAPTOR_HPP
00201 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines