29#include <SimoxUtility/algorithm/string/string_tools.h>
42 "HistoryLength", 1000,
"Length of condition history kept by the conditionhandler");
50 const TermImplBasePtr& expression,
51 const EventBasePtr& e,
53 bool reportDatafields,
54 const DatafieldRefList& refs,
55 const Ice::Current&
c)
58 listener, expression, e,
"", onlyFireOnce, reportDatafields, refs,
c);
63 const TermImplBasePtr& expression,
64 const EventBasePtr& e,
65 const std::string& desc,
67 bool reportDatafields,
68 const DatafieldRefList& refs,
69 const Ice::Current&
c)
73 ARMARX_DEBUG <<
"Installing condition: " << root << std::endl;
74 root->addChild(expression);
82 literal->checkConfig.reportAlways = !onlyFireOnce;
83 literal->checkConfig.reportDatafieldValues = reportDatafields;
86 std::unique_lock lock(conditionRegistryMutex);
89 installChecks(literals,
c);
92 std::pair<int, ConditionRootBasePtr> entry;
93 entry.first = generateId();
96 conditionRegistry.insert(entry);
98 ConditionIdentifier id;
99 id.uniqueId = entry.first;
101 ARMARX_DEBUG <<
"Installed condition: " << root << std::endl;
109 ARMARX_DEBUG <<
"Removing condition " <<
id.uniqueId << std::endl;
111 std::unique_lock lock(conditionRegistryMutex);
112 ConditionRegistry::iterator iter = conditionRegistry.find(
id.uniqueId);
114 if (iter == conditionRegistry.end())
125 removeChecks(literals,
c);
128 std::pair<int, ConditionRootBasePtr> tmp = *iter;
129 conditionRegistry.erase(iter);
132 std::unique_lock lockHistory(conditionHistoryMutex);
133 conditionHistory.insert(tmp);
135 if (
int(conditionHistory.size()) > historyLength)
137 conditionHistory.erase(conditionHistory.begin());
146 ConditionRegistry::iterator iter;
147 std::vector<int> conditionIds;
150 std::unique_lock lock(conditionRegistryMutex);
152 if (!conditionRegistry.empty())
154 for (iter = conditionRegistry.begin(); iter != conditionRegistry.end(); iter++)
156 conditionIds.push_back(iter->first);
161 if (!conditionIds.empty())
163 for (
int id : conditionIds)
169 std::unique_lock lockHistory(conditionHistoryMutex);
170 conditionHistory.clear();
178 std::unique_lock lock(conditionRegistryMutex);
180 return conditionRegistry;
186 std::unique_lock lock(conditionHistoryMutex);
188 return conditionHistory;
195 std::unique_lock lock(conditionRegistryMutex);
196 auto it = conditionRegistry.find(
id);
198 if (it != conditionRegistry.end())
204 std::unique_lock lock(conditionHistoryMutex);
205 auto it = conditionHistory.find(
id);
207 if (it != conditionHistory.end())
218 return "ConditionHandler";
224 return observerNames;
237 simox::alg::trim(observers);
239 if (!observers.empty())
241 observerNames = simox::alg::split(observers,
",");
244 useObservers(observerNames);
257 preCacheObservers(observerNames);
267 ConditionHandler::generateId()
269 std::unique_lock lock(idMutex);
274 ConditionHandler::useObservers(std::vector<std::string>& names)
276 std::unique_lock lock(iceManagerMutex);
278 std::vector<std::string>::iterator iter = names.begin();
280 while (iter != names.end())
288 ConditionHandler::preCacheObservers(std::vector<std::string>& names)
290 std::unique_lock lock(iceManagerMutex);
292 std::vector<std::string>::iterator iter =
names.begin();
294 while (iter !=
names.end())
302 ConditionHandler::getObserver(std::string observerName)
304 std::unique_lock lock(iceManagerMutex);
305 ObserverInterfacePrx proxy;
310 ObserverInterfacePrx::checkedCast(proxy);
314 throw InvalidConditionException(
"Observer \"" + observerName +
"\" does not exist.");
321 ConditionHandler::installChecks(std::vector<LiteralImplPtr>& literals,
const Ice::Current&
c)
323 std::vector<LiteralImplPtr>::iterator iter = literals.begin();
325 while (iter != literals.end())
327 ObserverInterfacePrx proxy =
328 getObserver((*iter)->checkConfig.dataFieldIdentifier->observerName);
329 (*iter)->installCheck(
c.adapter, proxy);
336 ConditionHandler::removeChecks(std::vector<LiteralImplPtr>& literals,
const Ice::Current&
c)
338 std::vector<LiteralImplPtr>::iterator iter = literals.begin();
340 while (iter != literals.end())
342 ObserverInterfacePrx proxy =
343 getObserver((*iter)->checkConfig.dataFieldIdentifier->observerName);
344 (*iter)->removeCheck(
c.adapter, proxy);
ComponentPropertyDefinitions(std::string prefix, bool hasObjectNameParameter=true)
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Property< PropertyType > getProperty(const std::string &name)
ConditionHandlerPropertyDefinitions(std::string prefix)
void onInitComponent() override
Pure virtual hook for the subclass.
ConditionIdentifier installConditionWithDescription(const EventListenerInterfacePrx &listener, const TermImplBasePtr &expression, const EventBasePtr &e, const std::string &desc, bool onlyFireOnce, bool reportDatafields, const DatafieldRefList &refs, const Ice::Current &c=Ice::emptyCurrent) override
Installs a condition.
virtual void onInitConditionHandler()
Framework hook.
ConditionRegistry getActiveConditions(const Ice::Current &c=Ice::emptyCurrent) override
Retrieve the list of active conditions.
void removeCondition(const ConditionIdentifier &id, const Ice::Current &c=Ice::emptyCurrent) override
Removes a condition.
ConditionIdentifier installCondition(const EventListenerInterfacePrx &listener, const TermImplBasePtr &expression, const EventBasePtr &e, bool onlyFireOnce, bool reportDatafields, const DatafieldRefList &refs, const Ice::Current &c=Ice::emptyCurrent) override
Installs a condition.
ConditionRegistry getPastConditions(const Ice::Current &c=Ice::emptyCurrent) override
Retrieve the list of conditions that have been registered in the past.
Ice::StringSeq getObserverNames(const Ice::Current &c=Ice::emptyCurrent) override
Retrieve the list of known observers as provided in the config file.
void onConnectComponent() override
Pure virtual hook for the subclass.
PropertyDefinitionsPtr createPropertyDefinitions() override
virtual void onStartConditionHandler()
Framework hook.
ConditionRootBasePtr getCondition(Ice::Int id, const Ice::Current &c=Ice::emptyCurrent) override
void removeAllConditions(const Ice::Current &c=Ice::emptyCurrent) override
Removes all conditions.
std::string getDefaultName() const override
Retrieve default name of component.
ConditionRoot Condition roots are top-level nodes of the expression tree.
static std::vector< LiteralImplPtr > ExtractLiterals(const TermImplBasePtr &expression)
bool usingProxy(const std::string &name, const std::string &endpoints="")
Registers a proxy for retrieval after initialization and adds it to the dependency list.
Ice::ObjectPrx getProxy(long timeoutMs=0, bool waitForScheduler=true) const
Returns the proxy of this object (optionally it waits for the proxy)
void setMetaInfo(const std::string &id, const VariantBasePtr &value)
Allows to set meta information that can be queried live via Ice interface on the ArmarXManager.
std::string prefix
Prefix of the properties such as namespace, domain, component name, etc.
PropertyDefinition< PropertyType > & defineOptionalProperty(const std::string &name, PropertyType defaultValue, const std::string &description="", PropertyDefinitionBase::PropertyConstness constness=PropertyDefinitionBase::eConstant)
The Variant class is described here: Variants.
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
const simox::meta::IntEnumNames names
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
IceInternal::Handle< ConditionRoot > ConditionRootPtr
Typedef of ConditionRootPtr as IceInternal::Handle<ConditionRoot> for convenience.
IceInternal::Handle< LiteralImpl > LiteralImplPtr
Typedef of LiteralImplPtr as IceInternal::Handle<LiteralImpl> for convenience.