Unverified Commit 7e2c0e23 authored by Giuseppe Carboni's avatar Giuseppe Carboni Committed by GitHub
Browse files

Fix #882, introduced named ComponentProxies (#893)

parent da220bbe
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -2,12 +2,16 @@
#define ACTIVESURFACEPROXY_H
#define ACTIVESURFACEPROXY_H


#include <ActiveSurfaceBossC.h>
#include <ActiveSurfaceBossC.h>
#include <lanC.h>
#include <usdC.h>


#include "ComponentProxy.h"
#include "ComponentProxy.h"


namespace ActiveSurface
namespace ActiveSurface
{
{
    PROXY_COMPONENT(ActiveSurfaceBoss);
    PROXY_COMPONENT(ActiveSurfaceBoss);
    PROXY_COMPONENT(lan);
    PROXY_COMPONENT(USD);
};
};


#endif
#endif
+148 −133
Original line number Original line Diff line number Diff line
@@ -3,8 +3,6 @@


#include <string>
#include <string>


#include <boost/shared_ptr.hpp>

#include <acsContainerServices.h>
#include <acsContainerServices.h>
#include <ComponentErrors.h>
#include <ComponentErrors.h>


@@ -30,10 +28,10 @@ typedef ComponentProxy<COMPONENT_TYPE, \
 * m_antennaBoss->yourAntennaBossMethod(methodParameters); 
 * m_antennaBoss->yourAntennaBossMethod(methodParameters); 
 * 
 * 
 * The Proxy operator '.' permits access to proxy methods:
 * The Proxy operator '.' permits access to proxy methods:
 * .setComponentName();
 * .setComponentInterface();
 * .setError();
 * .setError();
 * .resetError();
 * .resetError();
 * .loadDefault();
 * .load();
 * .unload();
 * .unload();
 * .getComponentVar();
 * .getComponentVar();
 *
 *
@@ -48,195 +46,212 @@ typedef ComponentProxy<COMPONENT_TYPE, \
 * Defining new proxies should follow the simple AntennaBoss example and should
 * Defining new proxies should follow the simple AntennaBoss example and should
 * be done in this module.
 * be done in this module.
 */
 */
template <typename ComponentClass, typename ComponentVar>
template <typename ComponentClass, typename ComponentVar> class ComponentProxy
class ComponentProxy
{
{
    public:
    public:
        ComponentProxy();
        ComponentProxy();
        ComponentProxy(const char*, maci::ContainerServices*);
        ComponentProxy(const char* interface, maci::ContainerServices* container_services);
        ComponentProxy(const char* interface, maci::ContainerServices* container_services, const char* name);
        virtual ~ComponentProxy();
        virtual ~ComponentProxy();
        void loadDefault(); //throw (ComponentErrors::CouldntGetComponentExImpl);
        void load() const;
        void unload();
        void unload() const;
        //ComponentVar getComponentVar(){ return m_component_var; };
        //ComponentVar getComponentVar(){ return m_component_var; };
        ComponentVar& operator->(); //throw (ComponentErrors::CouldntGetComponentExImpl);
        ComponentVar& operator->() const; //throw (ComponentErrors::CouldntGetComponentExImpl);
        void setError(){ m_error = true;};
        void setError() const { m_error = true; };
        void resetError(){ m_error = false;};
        void resetError() const { m_error = false; };
        bool isError(){ return m_error;};
        bool isError() const { return m_error; };
        void setComponentName(const char*);
        void setComponentInterface(const char*);
        void setContainerServices(maci::ContainerServices*);
        void setContainerServices(maci::ContainerServices*);
        void setComponentName(const char*);
    private:
    private:
        // We only allow to create an instance via factory methods or explicit
        // We only allow to create an instance via factory methods or explicit
        // constructor thus we disable copy contructor and assignment operator
        // constructor thus we disable copy contructor and assignment operator
        ComponentProxy(const ComponentProxy&);
        ComponentProxy(const ComponentProxy&) = delete;
        ComponentProxy& operator=(const ComponentProxy&);
        ComponentProxy& operator=(const ComponentProxy&) = delete;
        std::string m_name; 

        std::string m_IDL;
        mutable std::string m_name;
        maci::ContainerServices* m_services;
        maci::ContainerServices* m_services;
        ComponentVar m_component_var;
        mutable bool m_error;
        bool m_error;
        mutable ComponentVar m_component_var;
};
};


template <typename ComponentClass, typename ComponentVar>
template <typename ComponentClass, typename ComponentVar> ComponentProxy<ComponentClass, ComponentVar>::ComponentProxy() :
ComponentProxy<ComponentClass, ComponentVar>::ComponentProxy() :
    m_IDL(""),
    m_name(""),
    m_name(""),
                                 m_services(NULL),
    m_services(nullptr),
                                 m_error(false)
    m_error(false),
    m_component_var(ComponentClass::_nil())
{
}

template <typename ComponentClass, typename ComponentVar> ComponentProxy<ComponentClass, ComponentVar>::ComponentProxy(const char* interface, maci::ContainerServices * services) :
    m_IDL(interface),
    m_name(""),
    m_services(services),
    m_error(false),
    m_component_var(ComponentClass::_nil())
{
{
    m_component_var = ComponentClass::_nil();
}
}


template <typename ComponentClass, typename ComponentVar>
template <typename ComponentClass, typename ComponentVar> ComponentProxy<ComponentClass, ComponentVar>::ComponentProxy(const char* interface, maci::ContainerServices * services, const char* name) :
ComponentProxy<ComponentClass, ComponentVar>::ComponentProxy(const char * name,
    m_IDL(interface),
                                 maci::ContainerServices * services) :
    m_name(name),
    m_name(name),
    m_services(services),
    m_services(services),
                                 m_error(false)
    m_error(false),
    m_component_var(ComponentClass::_nil())
{
{
    m_component_var = ComponentClass::_nil();
}
}


template <typename ComponentClass, typename ComponentVar>
template <typename ComponentClass, typename ComponentVar> ComponentProxy<ComponentClass, ComponentVar>::~ComponentProxy()
ComponentProxy<ComponentClass, ComponentVar>::~ComponentProxy()
{
{
    this->unload();
    unload();
}
}


template <typename ComponentClass, typename ComponentVar>
template <typename ComponentClass, typename ComponentVar> void ComponentProxy<ComponentClass, ComponentVar>::load() const
void
ComponentProxy<ComponentClass, ComponentVar>::loadDefault()
//throw (ComponentErrors::CouldntGetComponentExImpl)
{
{
    if(m_name == "")
    if(m_services == nullptr)
    {
    {
        CUSTOM_LOG(LM_FULL_INFO, 
        CUSTOM_LOG(LM_FULL_INFO, "ComponentLoader::load", (LM_WARNING, "Trying to load component without Container Services"));
                   "ComponentLoader::loadDefault",
        _EXCPT(ComponentErrors::CouldntGetComponentExImpl, impl, "ComponentLoader::load()");
                   (LM_WARNING, "Trying to load component without name " )
                   );
        _EXCPT(ComponentErrors::CouldntGetComponentExImpl, impl,
                   "ComponentLoader::loadDefault()");
        throw impl;
        throw impl;
        return;
    }
    }
    if(m_services == NULL)
    if(!CORBA::is_nil(m_component_var) && isError())
    {
        // if reference was already taken, but an error was found, dispose the reference
        try
        {
        {
        CUSTOM_LOG(LM_FULL_INFO, 
                   "ComponentLoader::loadDefault",
                   (LM_WARNING, "Trying to load component without Container Services " )
                   );
        _EXCPT(ComponentErrors::CouldntGetComponentExImpl, impl,
                   "ComponentLoader::loadDefault()");
        throw impl;
        return;
    }
    if ((!CORBA::is_nil(m_component_var)) && (m_error)) { 
    // if reference was already taken, but an error was found 
    // dispose the reference
        try {
            m_services->releaseComponent((const char*)m_component_var->name());
            m_services->releaseComponent((const char*)m_component_var->name());
            CUSTOM_LOG(LM_FULL_INFO, 
            CUSTOM_LOG(LM_FULL_INFO, "ComponentLoader::load", (LM_DEBUG, ("released " + m_name).c_str()));
                       "ComponentLoader::loadDefault",
        }
                       (LM_DEBUG, ("released " + this->m_name).c_str())
        catch(...)
                       );
        {
        }catch (...) { //dispose silently...if an error...no matter
            //dispose silently...if there is an error it does not matter
        }
        }
        m_component_var = ComponentClass::_nil();
        m_component_var = ComponentClass::_nil();
    }
    }
    if (CORBA::is_nil(m_component_var)) {

    if(CORBA::is_nil(m_component_var))
    {
        //only if it has not been retrieved yet
        //only if it has not been retrieved yet
        try {
        try
            m_component_var = m_services->getDefaultComponent<ComponentClass>(m_name.c_str());
        {
            CUSTOM_LOG(LM_FULL_INFO, 
            if(m_name != "")
                       "ComponentLoader::loadDefault",
            {
                       (LM_DEBUG, ("loaded " + this->m_name).c_str())
                m_component_var = m_services->getComponent<ComponentClass>(m_name.c_str());
                       );
            }
            m_error = false;
            else if(m_IDL != "")
        } catch (maciErrType::CannotGetComponentExImpl& ex) {
            {
            _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,
                // No name but IDL type was set, use getDefaultComponent and set name
                           Impl, ex, "ComponentLoader::loadDefault()");
                m_component_var = m_services->getDefaultComponent<ComponentClass>(m_IDL.c_str());
                m_name = m_component_var->name();
            }
            else
            {
                // No name and no interface found, cannot proceed
                CUSTOM_LOG(LM_FULL_INFO, "ComponentLoader::load", (LM_WARNING, "Trying to load component without name or interface type"));
                _EXCPT(ComponentErrors::CouldntGetComponentExImpl, impl, "ComponentLoader::load()");
                throw impl;
            }

            CUSTOM_LOG(LM_FULL_INFO, "ComponentLoader::load", (LM_DEBUG, ("loaded " + m_name).c_str()));
            resetError();
        }
        catch(maciErrType::CannotGetComponentExImpl& ex)
        {
            _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl, Impl, ex, "ComponentLoader::load()");
            Impl.setComponentName(m_name.c_str());
            Impl.setComponentName(m_name.c_str());
            m_component_var = ComponentClass::_nil();
            m_component_var = ComponentClass::_nil();
            setError();
            throw Impl;
            throw Impl;
        } catch (maciErrType::NoPermissionExImpl& ex) {
        }
            _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,
        catch(maciErrType::NoPermissionExImpl& ex)
                           Impl, ex, "ComponentLoader::loadDefault()");
        {
            _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl, Impl, ex, "ComponentLoader::load()");
            Impl.setComponentName(m_name.c_str());
            Impl.setComponentName(m_name.c_str());
            m_component_var = ComponentClass::_nil();
            m_component_var = ComponentClass::_nil();
            setError();
            throw Impl;
            throw Impl;
        } catch (maciErrType::NoDefaultComponentExImpl& ex) {
        }
            _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,
        catch(maciErrType::NoDefaultComponentExImpl& ex)
                           Impl, ex, "ComponentLoader::loadDefault()");
        {
            _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl, Impl, ex, "ComponentLoader::load()");
            Impl.setComponentName(m_name.c_str());
            Impl.setComponentName(m_name.c_str());
            m_component_var = ComponentClass::_nil();
            m_component_var = ComponentClass::_nil();
            setError();
            throw Impl;
            throw Impl;
        }
        }
    }
    }
}
}


template <typename ComponentClass, typename ComponentVar>
template <typename ComponentClass, typename ComponentVar> void ComponentProxy<ComponentClass, ComponentVar>::unload() const
void
ComponentProxy<ComponentClass, ComponentVar>::unload()
{
{
    if (!CORBA::is_nil(m_component_var)) { 
    if(!CORBA::is_nil(m_component_var))
        try {
    {
            m_services->releaseComponent((const char*)m_component_var->name());
        try
            CUSTOM_LOG(LM_FULL_INFO, 
        {
                       "ComponentLoader::loadDefault",
            m_services->releaseComponent(m_name.c_str());
                       (LM_DEBUG, ("releasing " + this->m_name).c_str())
            CUSTOM_LOG(LM_FULL_INFO, "ComponentLoader::unload", (LM_DEBUG, ("releasing " + m_name).c_str()));
                       );
        }
        }catch (maciErrType::CannotReleaseComponentExImpl& ex) {
        catch(maciErrType::CannotReleaseComponentExImpl& ex)
            _ADD_BACKTRACE(ComponentErrors::CouldntReleaseComponentExImpl,
        {
                           Impl,ex,"ComponentLoader::unload()");
            _ADD_BACKTRACE(ComponentErrors::CouldntReleaseComponentExImpl, Impl, ex, "ComponentLoader::unload()");
            Impl.setComponentName(m_name.c_str());
            Impl.setComponentName(m_name.c_str());
            CUSTOM_EXCPT_LOG(Impl, LM_WARNING);
            CUSTOM_EXCPT_LOG(Impl, LM_WARNING);
        }catch (...) { 
        }
            _EXCPT(ComponentErrors::UnexpectedExImpl, impl,
        catch(...)
                   "ComponentLoader::unload()");
        {
            _EXCPT(ComponentErrors::UnexpectedExImpl, impl, "ComponentLoader::unload()");
            CUSTOM_EXCPT_LOG(impl, LM_WARNING);
            CUSTOM_EXCPT_LOG(impl, LM_WARNING);
        }
        }

        m_component_var = ComponentClass::_nil();
        m_component_var = ComponentClass::_nil();
    } 
    } 
}
}


template <typename ComponentClass, typename ComponentVar>
template <typename ComponentClass, typename ComponentVar> void ComponentProxy<ComponentClass, ComponentVar>::setComponentInterface(const char* interface)
void
{
ComponentProxy<ComponentClass, ComponentVar>::setComponentName(const char* name)
    if(m_IDL == "")
    {
        m_IDL = std::string(interface);
    }
    else
    {
    {
    if(m_name == "")
        m_name = std::string(name);
    else{
        //TODO: throw exception?
        //TODO: throw exception?
        CUSTOM_LOG(LM_FULL_INFO, 
        CUSTOM_LOG(LM_FULL_INFO, "ComponentLoader::setComponentInterface", (LM_DEBUG, ("ComponentInterface already defined: " + m_IDL).c_str()));
                   "ComponentLoader::setComponentName",
                   (LM_DEBUG, ("ComponentName already defined: " + this->m_name).c_str())
                   );
    }
    }
}
}


template <typename ComponentClass, typename ComponentVar>
template <typename ComponentClass, typename ComponentVar> void ComponentProxy<ComponentClass, ComponentVar>::setContainerServices(maci::ContainerServices* services)
void
{
ComponentProxy<ComponentClass, ComponentVar>::setContainerServices(
    if(m_services == nullptr)
    maci::ContainerServices* services)
    {
    {
    if(m_services == NULL)
        m_services = services;
        m_services = services;
    else{
    }
    else
    {
        //TODO: throw exception?
        //TODO: throw exception?
        CUSTOM_LOG(LM_FULL_INFO, 
        CUSTOM_LOG(LM_FULL_INFO, "ComponentLoader::setContainerServices", (LM_DEBUG, "ContainerServices already defined"));
                   "ComponentLoader::setContainerServices",
                   (LM_DEBUG, "ContainerServices already defined")
                   );
    }
    }
}
}


template <typename ComponentClass, typename ComponentVar>
template <typename ComponentClass, typename ComponentVar> void ComponentProxy<ComponentClass, ComponentVar>::setComponentName(const char* name)
ComponentVar&
ComponentProxy<ComponentClass, ComponentVar>::operator->()
//throw (ComponentErrors::CouldntGetComponentExImpl)
{
{
    loadDefault();
    if(m_name == "")
    //return m_component_var.out();
    {
    return m_component_var;
        m_name = std::string(name);
    }
    else
    {
        //TODO: throw exception?
        CUSTOM_LOG(LM_FULL_INFO, "ComponentLoader::setComponentName", (LM_DEBUG, ("Component name already defined: " + m_name).c_str()));
    }
}
}


template <typename ComponentClass, typename ComponentVar> ComponentVar& ComponentProxy<ComponentClass, ComponentVar>::operator->() const
{
    load();
    return m_component_var;
}


#endif
#endif
+3 −1
Original line number Original line Diff line number Diff line
@@ -33,6 +33,8 @@ compilation_test_LIBS = IRALibrary \
                              NoiseGeneratorStubs \
                              NoiseGeneratorStubs \
                              TotalPowerStubs \
                              TotalPowerStubs \
                              ActiveSurfaceBossStubs \
                              ActiveSurfaceBossStubs \
                              usdStubs \
                              lanStubs \
                              MinorServoBossStubs \
                              MinorServoBossStubs \
                              MinorServoStubs \
                              MinorServoStubs \
                              ReceiversBossStubs \
                              ReceiversBossStubs \
+7 −2
Original line number Original line Diff line number Diff line
@@ -20,7 +20,7 @@ int main()
    Backends::Holography_proxy m_holographyProxy;
    Backends::Holography_proxy m_holographyProxy;
    Backends::NoiseGenerator_proxy m_noiseProxy;
    Backends::NoiseGenerator_proxy m_noiseProxy;
    Backends::TotalPower_proxy m_totalPowerProxy;
    Backends::TotalPower_proxy m_totalPowerProxy;
    ActiveSurface::ActiveSurfaceBoss_proxy m_acitveSurfaceBossProxy;
    ActiveSurface::ActiveSurfaceBoss_proxy m_activeSurfaceBossProxy;
    MinorServo::MinorServoBoss_proxy m_minorservoBossProxy;
    MinorServo::MinorServoBoss_proxy m_minorservoBossProxy;
    MinorServo::WPServo_proxy m_wpServoProxy;
    MinorServo::WPServo_proxy m_wpServoProxy;
    Receivers::ReceiversBoss_proxy m_receiversBossProxy;
    Receivers::ReceiversBoss_proxy m_receiversBossProxy;
@@ -29,7 +29,12 @@ int main()
    Weather::GenericWeatherStation_proxy m_genericWeatherStationProxy;
    Weather::GenericWeatherStation_proxy m_genericWeatherStationProxy;
    Antenna::Mount_proxy m_mount;
    Antenna::Mount_proxy m_mount;


    m_totalPowerProxy.setComponentName("Backends/TotalPower");
    ActiveSurface::lan_proxy m_asLANProxy;
    m_asLANProxy.setComponentName("AS/SECTOR01/LAN01");
    ActiveSurface::USD_proxy m_asUSDProxy;
    m_asUSDProxy.setComponentName("AS/SECTOR01/LAN01/USD03");

    m_totalPowerProxy.setComponentInterface("BACKENDS/TotalPower");
    m_totalPowerProxy->calOn();
    m_totalPowerProxy->calOn();
    return 0;
    return 0;
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -46,7 +46,7 @@ void CRecvBossCore::initialize(maci::ContainerServices* services,CConfiguration
		_THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"CRecvBossCore::initialize()");
		_THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"CRecvBossCore::initialize()");
	}
	}
	m_calMux_proxy.setContainerServices(services);
	m_calMux_proxy.setContainerServices(services);
   m_calMux_proxy.setComponentName("IDL:alma/Backends/CalMux:1.0");
   m_calMux_proxy.setComponentInterface("IDL:alma/Backends/CalMux:1.0");
	ACS_LOG(LM_FULL_INFO,"CRecvBossCore::initialize()",(LM_INFO,"ReceiversBoss notification channel open"));
	ACS_LOG(LM_FULL_INFO,"CRecvBossCore::initialize()",(LM_INFO,"ReceiversBoss notification channel open"));
}
}


Loading