//$Id$ /**======================================================== * * @file NodeApplication_Impl.h * * @Brief This file contains the implementation of * the NodeApplication interface. * * @author Tao Lu * @author Gan Deng *========================================================*/ #ifndef NODEAPPLICATION_IMPL_H #define NODEAPPLICATION_IMPL_H #include /**/ "ace/pre.h" #include "ace/config-all.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ #include "ciao/Deployment_CoreS.h" #include "ciao/Server_init.h" #include "ciao/CIAO_common.h" #include "ciao/Object_Set_T.h" #include "tao/ORB.h" #include "ace/Synch.h" #include "ace/Synch_Traits.h" #include "ace/SString.h" #include "ace/Hash_Map_Manager_T.h" #include "NodeApp_Configurator.h" #include "Container_Base.h" using CIAO::Utility::write_IOR; /** * * @class NodeApplication_Impl * * @brief This class implements the NodeApplication interface. * This interface is semantically very simillar to container * in the old DnC spec. However this class will also be used * as a Server for hosting home/component. This way we reduce the * complexity of the framework by omitting the componentserver layer. * * @@TODO add configuration capabilities. Threading is one of them. * * @@Assumptions: * 1. Now the implementation is not thread safe. * // @@Gan, the above assumption is _really_ bad. Could you please * use the lock in the imeplementation to do some simple * prootections. **/ namespace CIAO { // @@ Gan, as we discussed before can you please wrap this // implementation in a namespace Node_Application or whatever to // signify that it belongs to another software piece of CIAO? class NodeApplication_Impl : public virtual POA_Deployment::NodeApplication { public: NodeApplication_Impl (CORBA::ORB_ptr o, PortableServer::POA_ptr p, NodeApp_Configurator &c, const Static_Config_EntryPoints_Maps* static_entrypts_maps =0); /// Default destructor. virtual ~NodeApplication_Impl (void); /** * @method finishLaunch * * @brief This operation dose 2 things. * 1. Get the external connction (facet and Event source) * and connect them to the local receptacle/event sink. * 2. If the start augment is true, start the Components. * @Note: * The connection containes the object ref of the provided object * reference (facet/event consumer) of components from other NodeApplications. * However the name field stores the name of the port on the local component. */ virtual void finishLaunch (const Deployment::Connections & providedReference, CORBA::Boolean start, CORBA::Boolean add_connection ACE_ENV_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException, Deployment::StartError, Deployment::InvalidConnection)); /** * @method start */ virtual void start (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException, Deployment::StartError)); /*------------- CIAO specific IDL operations (idl)---------- * *-----------------------------------------------------------*/ /** * @method ciao_preactivate */ virtual void ciao_preactivate (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException, Deployment::StartError)); /** * @method ciao_postactivate */ virtual void ciao_postactivate (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException, Deployment::StartError)); /** * @method ciao_passivate */ virtual void ciao_passivate (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException, Deployment::StopError)); /// Initialize the NodeApplication virtual CORBA::Long init (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException)); /// Start install homes and components. virtual ::Deployment::ComponentInfos * install (const ::Deployment::NodeImplementationInfo & node_impl_info ACE_ENV_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException, ::Deployment::UnknownImplId, ::Deployment::ImplEntryPointNotFound, ::Deployment::InstallationFailure, ::Components::InvalidConfiguration)); /// Get the object reference of the NodeApplicationManager. /// This might come in handy later. virtual ::CORBA::Object_ptr get_node_application_manager (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException)); /// Access the readonly attribute. virtual ::Deployment::Properties * properties (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException)); /// Remove a component instance from the NodeApplication virtual void remove_component (const char * inst_name ACE_ENV_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((::CORBA::SystemException, ::Components::RemoveFailure)); virtual void activate_component (const char * name ACE_ENV_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((::CORBA::SystemException, ::Components::RemoveFailure)); virtual void passivate_component (const char * name ACE_ENV_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((::CORBA::SystemException, ::Components::RemoveFailure)); /// Remove everything inside including all components and homes. virtual void remove (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException)); /// Create a container interface, which will be hosted in this NodeApplication. virtual ::Deployment::Container_ptr create_container (const ::Deployment::Properties &properties ACE_ENV_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException, ::Components::CreateFailure, ::Components::InvalidConfiguration)); /// Remove a container interface. virtual void remove_container (::Deployment::Container_ptr cref ACE_ENV_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException, ::Components::RemoveFailure)); /// Get all container object refs virtual ::Deployment::Containers * get_containers ( ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException)); /*------------- CIAO specific helper functions (C++)--------- * *-----------------------------------------------------------*/ /// Get the containing POA. This operation does *not* /// increase the reference count of the POA. virtual PortableServer::POA_ptr _default_POA (void); /// Return the cached object reference of this NodeApplication object. /// This operation does *NOT* increase the reference count. ::Deployment::NodeApplication_ptr get_objref (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS); protected: virtual void finishLaunch_i (const Deployment::Connections & providedReference, CORBA::Boolean start, CORBA::Boolean add_connection ACE_ENV_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException, Deployment::StartError, Deployment::InvalidConnection)); /// Create and initialize all the containers virtual CORBA::Long create_all_containers ( const ::Deployment::ContainerImplementationInfos & container_infos ACE_ENV_ARG_DECL_WITH_DEFAULTS) ACE_THROW_SPEC ((CORBA::SystemException)); /// Create a "key" for the connection virtual ACE_CString * create_connection_key (const Deployment::Connection & connection); /// To build a map between a component instance and its container typedef ACE_Hash_Map_Manager_Ex, ACE_Equal_To, ACE_Null_Mutex> Component_Container_Map; typedef Component_Container_Map::iterator Component_Container_Iterator; Component_Container_Map component_container_map_; /// To store all created Component object. typedef ACE_Hash_Map_Manager_Ex, ACE_Equal_To, ACE_Null_Mutex> CCMComponent_Map; typedef CCMComponent_Map::iterator Component_Iterator; CCMComponent_Map component_objref_map_; /// A Map which stores all the connection cookies typedef ACE_Hash_Map_Manager_Ex, ACE_Equal_To, ACE_Null_Mutex> Cookie_Map; typedef Cookie_Map::iterator Cookie_Map_Iterator; Cookie_Map cookie_map_; /// Synchronize access to the object set. TAO_SYNCH_MUTEX lock_; /// Keep a list of managed Container objects. Object_Set container_set_; /// Keep a pointer to the managing ORB serving this servant. CORBA::ORB_var orb_; /// Keep a pointer to the managing POA. // @@Gan/Jai, which POA is this? Same as the component POA or a // different one. My sense is that its different. Could you please //document it? PortableServer::POA_var poa_; // Configurator for allocating NodeApp resources and policies NodeApp_Configurator &configurator_; /// Cached properties Deployment::Properties properties_; /// And a reference to the NodeApplicationManager that created us. ::CORBA::Object_var node_app_manager_; /// Cache the object reference (of ourselves). ::Deployment::NodeApplication_var objref_; const Static_Config_EntryPoints_Maps* static_entrypts_maps_; private: /// Default constructor, noop NodeApplication_Impl(void); }; } #if defined (__ACE_INLINE__) # include "NodeApplication_Impl.inl" #endif /* __ACE_INLINE__ */ #include /**/ "ace/post.h" #endif /* NODEAPPLICATION_IMPL_H */