Changeset 201 in pacpusframework


Ignore:
Timestamp:
10/28/13 15:24:14 (11 years ago)
Author:
Marek Kurdej
Message:

Major: rethrow PacpusException on parameter parsing, set configurationState to ComponentBase::CONFIGURED_FAILED.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/Pacpus/kernel/ComponentBase.h

    r199 r201  
    5959using ::boost::program_options::value;
    6060
    61 /** ComponentBase
    62  * @brief Base class of a Pacpus component.
    63  */
     61/// @brief Base class of a Pacpus component.
    6462class PACPUSLIB_API ComponentBase
    6563{
     
    6765
    6866public:
    69     /**
    70      * Enumeration of the state that can take a component, the three last states suppose
    71      * that the component is started.
    72      */
    73     enum COMPONENT_STATE
    74     {
    75       STOPPED,
    76       NOT_MONITORED,
    77       MONITOR_OK,
    78       MONITOR_NOK
     67    /// Enumeration of the state that can take a component, the three last states suppose
     68    /// that the component is started.
     69    enum COMPONENT_STATE {
     70        STOPPED,
     71        NOT_MONITORED,
     72        MONITOR_OK,
     73        MONITOR_NOK
    7974    };
    8075
    81     /** Resulting state of a component after its configuration. */
    82     enum COMPONENT_CONFIGURATION
    83     {
    84       CONFIGURED_OK,
    85       NOT_CONFIGURED,
    86       CONFIGURATION_DELAYED,
    87       CONFIGURED_FAILED
     76    /// Resulting state of a component after its configuration.
     77    enum COMPONENT_CONFIGURATION {
     78        CONFIGURED_OK,
     79        NOT_CONFIGURED,
     80        CONFIGURATION_DELAYED,
     81        CONFIGURED_FAILED
    8882    };
    8983
    90     /** Ctor of ComponentBase.
    91      * @param name Name of your component.
    92      */
     84    /// Ctor of ComponentBase.
     85    /// @param name Name of your component.
    9386    ComponentBase(const QString& name);
    9487
    95     /** Dtor of ComponentBase. */
     88    /// Dtor of ComponentBase.
    9689    virtual ~ComponentBase();
    9790
    98     /** Return the state of the component.
    99      * @return Value of the current state.
    100      */
     91    /// Returns the state of the component.
     92    /// @return Value of the current state.
    10193    COMPONENT_STATE getState();
    10294
    103     /** Check whether the component if configurer or not.
    104      * @return True if the component is configured, otherwise false.
    105      */
     95    /// Checks whether the component if configurer or not.
     96    /// @return @b true if the component is configured, otherwise @b false.
    10697    bool isConfigured() const;
    10798
    108     /** Return the name of the component.
    109      * @return Name of the component.
    110      */
     99    /// Returns the name of the component.
     100    /// @return Name of the component.
    111101    QString getName() const;
    112102
     103    /// @todo DOC
    113104    InputInterfaceBase * getInput(QString name) const;
    114105
     106    /// @todo DOC
    115107    OutputInterfaceBase * getOutput(QString name) const;
    116108
    117109protected:
    118     /** Change the state of the component.
    119      * @param state New component state.
    120      */
     110    /// Changes the state of the component.
     111    /// @param state New component state.
    121112    void setState(COMPONENT_STATE state);
    122113
    123     /** Called when the component starts, you must override this function. */
     114    /// Called when the component starts, you must override this function.
    124115    virtual void startActivity() = 0;
    125116
    126     /** Called when the component stops, you must override this function. */
     117    /// Called when the component stops, you must override this function.
    127118    virtual void stopActivity() = 0;
    128119
    129     /** Called by the ComponentManager, it configure the component thanks a XML node.
    130      * @param config Component's XML node.
    131      * @return State of the configuration.
    132      * FIXME: 'config' should be const, but we can't change the prototype without breaking
    133      * old stuff.
    134      */
     120    /// Called by the ComponentManager, it configure the component thanks a XML node.
     121    /// @param config Component's XML node.
     122    /// @return State of the configuration.
     123    /// @todo FIXME: 'config' should be const, but it will be a breaking change
     124    /// old stuff.
    135125    virtual COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config) = 0;
    136126
    137127    // virtual QString getType() = 0;
    138128
    139     // Not Pure virtual, no need to implement if not needed !!!
     129    /// @todo FIXME: should be pure virtual, but it will be a breaking change
    140130    virtual void addInputs() {}
    141131    virtual void addOutputs() {}
    142132
     133    /// Returns an object permitting to add component parameters.
    143134    ::boost::program_options::options_description_easy_init addParameters();
    144135   
  • trunk/src/PacpusLib/ComponentBase.cpp

    r182 r201  
    99#include <Pacpus/kernel/ComponentManager.h>
    1010#include <Pacpus/kernel/Log.h>
     11#include <Pacpus/kernel/PacpusException.h>
    1112
    1213#include <boost/program_options/parsers.hpp>
     
    210211    vector<string> xargs = convertAttributesToArgumentVector(cfg.getProperties());
    211212   
    212     boost::program_options::variables_map vm;
     213    po::variables_map vm;
    213214    try {
    214215        po::store(
     
    220221        po::notify(vm);
    221222    } catch (po::error & e) {
    222         LOG_ERROR(e.what());
    223         throw;
     223        LOG_WARN(e.what());
     224        throw PacpusException(e.what());
    224225    }
    225226
  • trunk/src/PacpusLib/ComponentManager.cpp

    r199 r201  
    1313#include <Pacpus/kernel/InputOutputBase.h>
    1414#include <Pacpus/kernel/Log.h>
     15#include <Pacpus/kernel/PacpusException.h>
    1516
    1617#include <QDomNodeList>
     
    290291        if (NULL == component) {
    291292            LOG_WARN("component '" << componentName << "' does not exist");
    292         } else {
    293             component->param.localCopy(cfg.qDomElement());
     293            continue;
     294        }
     295
     296        component->param.localCopy(cfg.qDomElement());
     297        try {
    294298            component->parseParameters(cfg);
    295299            component->setConfigurationState(component->configureComponent(cfg));
     300        } catch (PacpusException & e) {
     301            LOG_ERROR("component '" << componentName << "' has thrown an exception");
     302            LOG_ERROR(e.what());
     303            component->setConfigurationState(ComponentBase::CONFIGURED_FAILED);
    296304        }
    297305    } // for
    298306
    299307    // Third, if some components requested a delayed configuration, retry
    300     for (int i = 0; i < componentsNodeList.size(); ++i) {
     308    for (int i = 0, iend = componentsNodeList.size(); i < iend; ++i) {
    301309        cfg.localCopy(componentsNodeList.item(i).toElement());
    302310        QString componentName = cfg.getComponentName();
     
    305313        if (NULL == component) {
    306314            LOG_WARN("component '" << componentName << "' does not exist");
     315            continue;
     316        }
     317         
     318        // Pacpus 2.0 : add inputs and outputs
     319        component->addInputs();
     320        component->addOutputs();
     321
     322        if (ComponentBase::CONFIGURATION_DELAYED == component->configurationState()) {
     323            LOG_DEBUG("try to configure component '" << componentName << "'");
     324
     325            // copy locally the config parameters of the component
     326            component->param.localCopy(cfg.qDomElement());
     327            component->setConfigurationState(component->configureComponent(cfg));
     328        }
     329
     330        if (ComponentBase::CONFIGURED_OK == component->configurationState()) {
     331            --componentsToConfigureCount;
    307332        } else {
    308            // Pacpus 2.0 : add inputs and outputs
    309             component->addInputs();
    310             component->addOutputs();
    311 
    312             if (ComponentBase::CONFIGURATION_DELAYED == component->configurationState()) {
    313                 LOG_DEBUG("try to configure component '" << componentName << "'");
    314 
    315                 // copy locally the config parameters of the component
    316                 component->param.localCopy(cfg.qDomElement());
    317                 component->setConfigurationState(component->configureComponent(cfg));
    318             }
    319 
    320             if (ComponentBase::CONFIGURED_OK == component->configurationState()) {
    321                 --componentsToConfigureCount;
    322             } else {
    323                 LOG_ERROR("cannot configure component '" << componentName << "'"
    324                           << ". Dependencies with other components are too complex"
    325                           << ". It was not configured, please review your configuration and/or your component"
    326                           );
    327                 component->setConfigurationState(ComponentBase::CONFIGURED_FAILED);
    328             }
     333            LOG_ERROR("cannot configure component '" << componentName << "'"
     334                        << ". Dependencies with other components are too complex"
     335                        << ". It was not configured, please review your configuration and/or your component"
     336                        );
     337            component->setConfigurationState(ComponentBase::CONFIGURED_FAILED);
    329338        }
    330339    } // for
     
    338347    QDomNodeList connectionsNodeList = xmlTree_->getAllConnections();
    339348
    340     for (int i = 0; i < connectionsNodeList.size(); ++i) {
     349    for (int i = 0, iend = connectionsNodeList.size(); i < iend; ++i) {
    341350        cfg.localCopy(connectionsNodeList.item(i).toElement());
    342351        QString connectionInput = cfg.getConnectionInput();
     
    372381}
    373382
    374 bool ComponentManager::start(const QString& componentName)
     383bool ComponentManager::start(const QString & componentName)
    375384{
    376385    LOG_TRACE("start(component=" << componentName << ")");
     
    382391    }
    383392
     393    if (ComponentBase::CONFIGURED_OK != component->configurationState()) {
     394        LOG_WARN("cannot start component '" << componentName << "'.  It has not been configured properly!");
     395        return false;
     396    }
     397
    384398    LOG_INFO("starting component '" << componentName << "'...");
    385399    if (!component->startComponent()) {
     
    402416}
    403417
    404 bool ComponentManager::stop(ComponentBase* component) const
     418bool ComponentManager::stop(ComponentBase * component) const
    405419{
    406420    if (!component) {
     
    414428}
    415429
    416 bool ComponentManager::stop(const QString& componentName)
     430bool ComponentManager::stop(const QString & componentName)
    417431{
    418432    LOG_TRACE("stop(component=" << componentName << ")");
     
    432446}
    433447
    434 ComponentBase* ComponentManager::getComponent(const QString& name)
     448ComponentBase * ComponentManager::getComponent(const QString & name)
    435449{
    436450    LOG_TRACE("getComponent(name=" << name << ")");
Note: See TracChangeset for help on using the changeset viewer.