ManagedIceObject.h
Go to the documentation of this file.
1 /*
2 * This file is part of ArmarX.
3 *
4 * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5 *
6 * ArmarX is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * ArmarX is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * @package ArmarXCore::core
19 * @author Kai Welke (welke at kit dot edu)
20 * @author Jan Issac (jan dot issac at gmx dot de)
21 * @date 2011
22 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
23 * GNU General Public License
24 */
25 
26 #pragma once
27 
28 #include <ArmarXCore/core/system/ImportExport.h> // for ARMARXCORE_IMPORT_EXPORT
29 #include <ArmarXCore/core/exceptions/local/ExpressionException.h> // for ARMARX_CHECK_EXPRESSION
30 #include <ArmarXCore/core/exceptions/LocalException.h> // for LocalException
31 #include <ArmarXCore/core/logging/Logging.h> // for Logging
32 #include <ArmarXCore/core/ArmarXFwd.h> // for ArmarXManagerPtr, etc
33 #include <ArmarXCore/core/IceManager.h> // for IceManagerPtr
35 
36 #include <Ice/Handle.h> // for Handle
37 #include <Ice/Object.h> // for Object
38 #include <Ice/ProxyF.h> // for ObjectPrx
39 #include <IceUtil/Handle.h> // for HandleBase
40 
41 #include <type_traits>
42 #include <typeindex>
43 #include <string> // for string
44 #include <vector> // for vector
45 #include <memory> // for unique_ptr
46 
47 // Forward declarations
49 {
50  inline namespace fundamentals_v2
51  {
52  template <typename T>
53  class observer_ptr;
54 
55  template<typename _Tp>
57  make_observer(_Tp* __p) noexcept;
58  }
59 }
60 
61 namespace Ice
62 {
63 
64  class Communicator;
65  ICE_API ::Ice::LocalObject* upCast(::Ice::Communicator*);
66  typedef ::IceInternal::Handle< ::Ice::Communicator> CommunicatorPtr;
67 
68  class ObjectAdapter;
69  ICE_API ::Ice::LocalObject* upCast(::Ice::ObjectAdapter*);
70  typedef ::IceInternal::Handle< ::Ice::ObjectAdapter> ObjectAdapterPtr;
71 
72 }
73 
75 {
76  class Profiler;
77  using ProfilerPtr = std::shared_ptr<Profiler>;
78 }
79 namespace armarx
80 {
81  template<class> class SimplePeriodicTask;
82 #define TYPEDEF_PTRS_SHARED(T) \
83  class T; \
84  using T##Ptr = ::std::shared_ptr<T>; \
85  using Const##T##Ptr = ::std::shared_ptr<const T>
86 
87 #define TYPEDEF_PTRS_HANDLE(T) \
88  class T; \
89  using T##Ptr = IceUtil::Handle<T>
90 
91  template<class T, class...Args>
92  auto make_shared(Args&& ...args)
93  {
94  if constexpr(
95  std::is_base_of_v<IceUtil::Shared, T> ||
96  std::is_base_of_v<IceUtil::SimpleShared, T>
97  )
98  {
99  return IceUtil::Handle<T>(
100  new T(std::forward<Args>(args)...)
101  );
102  }
103  else
104  {
105  return std::make_shared<T>(std::forward<Args>(args)...);
106  }
107  }
108 }
109 namespace armarx
110 {
111  class VariantBase;
112  typedef ::IceInternal::Handle<::armarx::VariantBase> VariantBasePtr;
113  using StringVariantBaseMap = std::map<std::string, VariantBasePtr>;
114 
118  class ManagedIceObject;
119 
120  struct ManagedIceObjectConnectivity;
121 
122 
124 
126 
166  virtual public Ice::Object,
167  virtual public Logging
168 
169  {
170  private:
171  friend class Component;
173  std::map<std::pair<std::type_index, std::string>, std::unique_ptr<ManagedIceObjectPlugin>> _plugins;
174 
175  void foreach_plugin(std::function<void(std::type_index, std::string const&, ManagedIceObjectPlugin*)> const& f,
176  int line, const char* file, const char* function);
177 
178  protected:
179 
180  std::unique_ptr<ManagedIceObjectPlugin>& getPluginPointer(std::type_info const& type, std::string const& prefix);
181 
182 
183  template <class PluginT, class...ParamsT>
184  PluginT* addPlugin(const std::string prefix = "", ParamsT && ...params)
185  {
186  static_assert(std::is_base_of_v<ManagedIceObjectPlugin, PluginT>);
187  auto& ptr = getPluginPointer(typeid(PluginT), prefix);
188  if (ptr)
189  {
190  auto tptr = dynamic_cast<PluginT*>(ptr.get());
191  ARMARX_CHECK_NOT_NULL(tptr) << "Plugin is of wrong type. This should be impossible!";
192  return tptr;
193  }
194  PluginT* tptr = new PluginT(*this, prefix, std::forward<ParamsT>(params)...);
195  ptr.reset(tptr);
196  return tptr;
197  }
198 
199  template<class PluginT, class...ParamsT>
200  void addPlugin(PluginT*& targ, const std::string prefix = "", ParamsT && ...params)
201  {
202  ARMARX_CHECK_NULL(targ) << "This is an out parameter";
203  targ = addPlugin<PluginT>(prefix, std::forward<ParamsT>(params)...);
204  }
205 
206  template<class PluginT, class...ParamsT>
207  void addPlugin(std::experimental::observer_ptr<PluginT>& targ, const std::string prefix = "", ParamsT && ...params)
208  {
209  ARMARX_CHECK_NULL(targ) << "This is an out parameter";
210  targ = std::experimental::make_observer(addPlugin<PluginT>(prefix, std::forward<ParamsT>(params)...));
211  }
212 
213 
214  private:
215  friend class ArmarXObjectScheduler;
216  friend class ArmarXManager;
217 
218  public:
219  using PeriodicTaskPtr = IceUtil::Handle<SimplePeriodicTask<std::function<void(void)>>>;
220 
225 
226  ManagedIceObject(ManagedIceObject const& other);
227 
228 
234  std::string getName() const;
235 
242  static std::string generateSubObjectName(const std::string& superObjectName, const std::string& subObjectName);
243 
255  std::string generateSubObjectName(const std::string& subObjectName);
256 
263  Ice::ObjectPrx getProxy(long timeoutMs = 0, bool waitForScheduler = true) const;
264  template<class Prx>
265  Prx getProxy(long timeoutMs = 0, bool waitForScheduler = true) const
266  {
267  return Prx::checkedCast(getProxy(timeoutMs, waitForScheduler));
268  }
269  template<class Prx>
270  void getProxy(Prx& prx, long timeoutMs = 0, bool waitForScheduler = true) const
271  {
272  prx = Prx::checkedCast(getProxy(timeoutMs, waitForScheduler));
273  }
274 
280  int getState() const;
281 
282 
283 
284  ArmarXObjectSchedulerPtr getObjectScheduler() const;
285 
291  ManagedIceObjectConnectivity getConnectivity() const;
292 
298  ArmarXManagerPtr getArmarXManager() const;
299 
305  IceManagerPtr getIceManager() const;
306 
315  bool usingProxy(const std::string& name,
316  const std::string& endpoints = "");
317 
318  void waitForProxy(std::string const& name, bool addToDependencies);
319 
330  template <class ProxyType>
331  ProxyType getProxy(const std::string& name,
332  bool addToDependencies = false,
333  const std::string& endpoints = "",
334  bool throwOnProxyError = true)
335  {
336  waitForProxy(name, addToDependencies);
337 
338  // return proxy
339  try
340  {
341  return getIceManager()->getProxy<ProxyType>(name, endpoints);
342  }
343  catch (...)
344  {
345  if (throwOnProxyError)
346  {
347  throw;
348  }
349  else
350  {
351  return nullptr;
352  }
353  }
354  }
355 
362  template <class ProxyTarg, class...Args>
363  void getProxy(IceInternal::ProxyHandle<ProxyTarg>& proxy, const std::string& name, Args&& ...args)
364  {
365  using ProxyType = IceInternal::ProxyHandle<ProxyTarg>;
366  proxy = getProxy<ProxyType>(name, std::forward<Args>(args)...);
367  }
368  template <class ProxyTarg, class...Args>
369  void getProxy(const std::string& name, IceInternal::ProxyHandle<ProxyTarg>& proxy, Args&& ...args)
370  {
371  using ProxyType = IceInternal::ProxyHandle<ProxyTarg>;
372  proxy = getProxy<ProxyType>(name, std::forward<Args>(args)...);
373  }
374  template <class ProxyTarg, class...Args>
375  void getProxy(IceInternal::ProxyHandle<ProxyTarg>& proxy, const char* name, Args&& ...args)
376  {
377  using ProxyType = IceInternal::ProxyHandle<ProxyTarg>;
378  proxy = getProxy<ProxyType>(name, std::forward<Args>(args)...);
379  }
380  template <class ProxyTarg, class...Args>
381  void getProxy(const char* name, IceInternal::ProxyHandle<ProxyTarg>& proxy, Args&& ...args)
382  {
383  using ProxyType = IceInternal::ProxyHandle<ProxyTarg>;
384  proxy = getProxy<ProxyType>(name, std::forward<Args>(args)...);
385  }
386 
388  template <class ProxyType>
389  inline void getProxy(ProxyType& proxy, const char* name,
390  bool addToDependencies = false,
391  const std::string& endpoints = "",
392  bool throwOnProxyError = true)
393  {
394  getProxy<ProxyType>(proxy, std::string(name), addToDependencies, endpoints, throwOnProxyError);
395  }
396 
400  std::vector<std::string> getUnresolvedDependencies() const;
401 
402  static std::string GetObjectStateAsString(int state);
403 
407  Profiler::ProfilerPtr getProfiler() const;
408 
412  void enableProfiler(bool enable);
413 
419  Ice::ObjectAdapterPtr getObjectAdapter() const;
420 
427  void usingTopic(const std::string& name, bool orderedPublishing = false);
428 
434  bool unsubscribeFromTopic(const std::string& name);
435 
441  void offeringTopic(const std::string& name);
442 
443  void preambleGetTopic(std::string const& name);
444 
452  template <class TopicProxyType>
453  TopicProxyType getTopic(const std::string& name)
454  {
455  preambleGetTopic(name);
456 
457  // retrieve topic
458  return getIceManager()->getTopic<TopicProxyType>(name);
459  }
460 
471  template <class TopicProxyType>
472  void getTopic(TopicProxyType& topicProxy, const std::string& name)
473  {
474  topicProxy = getTopic<TopicProxyType>(name);
475  }
476 
480  void waitForObjectScheduler();
481 
490  virtual std::string getDefaultName() const = 0;
491 
498  void setMetaInfo(const std::string& id, const VariantBasePtr& value);
499  VariantBasePtr getMetaInfo(const std::string& id);
500  StringVariantBaseMap getMetaInfoMap() const;
501 
502  void startPeriodicTask(const std::string& uniqueName,
503  std::function<void(void)> f,
504  int periodMs,
505  bool assureMeanInterval = false,
506  bool forceSystemTime = true);
507  bool stopPeriodicTask(const std::string& name);
508  PeriodicTaskPtr getPeriodicTask(const std::string& name);
509  protected:
514  ~ManagedIceObject() override;
515 
523  bool removeProxyDependency(const std::string& name);
524 
525 
529  void terminate();
530 
534  void setName(std::string name);
535 
542  virtual void onInitComponent() = 0;
543  virtual void preOnInitComponent() {}
544  virtual void postOnInitComponent() {}
545 
554  virtual void onConnectComponent() = 0;
555  virtual void preOnConnectComponent() {}
556  virtual void postOnConnectComponent() {}
557 
565  virtual void onDisconnectComponent() {}
566  virtual void preOnDisconnectComponent() {}
567  virtual void postOnDisconnectComponent() {}
568 
572  virtual void onExitComponent() {}
573  virtual void preOnExitComponent() {}
574  virtual void postOnExitComponent() {}
575 
576  Ice::CommunicatorPtr getCommunicator() const;
577 
578  private:
579  // init sets members and calls onInitComponent hook
580  void init(IceManagerPtr iceManager);
581  // start sets members and calls onConnectComponent hook
582  void start(Ice::ObjectPrx& proxy, const Ice::ObjectAdapterPtr& objectAdapter);
583  void disconnect();
584  // exit sets members and calls onExitComponent hook
585  void exit();
586 
587  void setObjectState(int newState);
588 
589  private:
590  struct Impl;
591  std::unique_ptr<Impl> impl;
592 
597  static void Noop(ManagedIceObject* object);
598 
603  static void EnableProfilerOn(ManagedIceObject* object);
604  };
605 
606 }
607 
ManagedIceObjectPlugin.h
std::experimental
Definition: ManagedIceObject.h:48
armarx::StringVariantBaseMap
std::map< std::string, VariantBasePtr > StringVariantBaseMap
Definition: ManagedIceObject.h:113
armarx::ManagedIceObject::postOnExitComponent
virtual void postOnExitComponent()
Definition: ManagedIceObject.h:574
LocalException.h
armarx::ManagedIceObject::postOnDisconnectComponent
virtual void postOnDisconnectComponent()
Definition: ManagedIceObject.h:567
armarx::VariantBasePtr
::IceInternal::Handle<::armarx::VariantBase > VariantBasePtr
Definition: ManagedIceObject.h:111
armarx::ManagedIceObject::NullPtr
static const ManagedIceObjectPtr NullPtr
A nullptr to be used when a const ref to a nullptr is required.
Definition: ManagedIceObject.h:224
ARMARX_CHECK_NOT_NULL
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Definition: ExpressionException.h:204
armarx::Profiler
Definition: ManagedIceObject.h:74
armarx::ManagedIceObject::getProxy
void getProxy(ProxyType &proxy, const char *name, bool addToDependencies=false, const std::string &endpoints="", bool throwOnProxyError=true)
Overload to allow using string literals as name (solve ambiguous overload).
Definition: ManagedIceObject.h:389
armarx::ManagedIceObject::postOnInitComponent
virtual void postOnInitComponent()
Definition: ManagedIceObject.h:544
std::experimental::fundamentals_v2::make_observer
observer_ptr< _Tp > make_observer(_Tp *__p) noexcept
armarx::ManagedIceObject::addPlugin
PluginT * addPlugin(const std::string prefix="", ParamsT &&...params)
Definition: ManagedIceObject.h:184
armarx::ManagedIceObject::onExitComponent
virtual void onExitComponent()
Hook for subclass.
Definition: ManagedIceObject.h:572
std::experimental::fundamentals_v2::observer_ptr
Definition: ManagedIceObject.h:53
armarx::ManagedIceObject::getProxy
void getProxy(const char *name, IceInternal::ProxyHandle< ProxyTarg > &proxy, Args &&...args)
Definition: ManagedIceObject.h:381
armarx::ManagedIceObject::onDisconnectComponent
virtual void onDisconnectComponent()
Hook for subclass.
Definition: ManagedIceObject.h:565
armarx::ManagedIceObject::preOnExitComponent
virtual void preOnExitComponent()
Definition: ManagedIceObject.h:573
Ice::CommunicatorPtr
::IceInternal::Handle< ::Ice::Communicator > CommunicatorPtr
Definition: IceManager.h:48
armarx::ManagedIceObject::getTopic
void getTopic(TopicProxyType &topicProxy, const std::string &name)
Assigns a proxy of the specified topic to topicProxy.
Definition: ManagedIceObject.h:472
IceInternal::Handle< ManagedIceObject >
armarx::ManagedIceObject::getProxy
void getProxy(Prx &prx, long timeoutMs=0, bool waitForScheduler=true) const
Definition: ManagedIceObject.h:270
armarx::ManagedIceObject::postOnConnectComponent
virtual void postOnConnectComponent()
Definition: ManagedIceObject.h:556
cxxopts::value
std::shared_ptr< Value > value()
Definition: cxxopts.hpp:926
armarx::ManagedIceObject::addPlugin
void addPlugin(std::experimental::observer_ptr< PluginT > &targ, const std::string prefix="", ParamsT &&...params)
Definition: ManagedIceObject.h:207
armarx::ManagedIceObject::preOnDisconnectComponent
virtual void preOnDisconnectComponent()
Definition: ManagedIceObject.h:566
armarx::ManagedIceObject::preOnInitComponent
virtual void preOnInitComponent()
Definition: ManagedIceObject.h:543
armarx::ArmarXObjectScheduler
Takes care of the lifecycle management of ManagedIceObjects.
Definition: ArmarXObjectScheduler.h:74
armarx::Profiler::Profiler
The armarx::Profiler::Profiler class can be used for timing executions within the ArmarX framework.
Definition: Profiler.h:88
boost::process::posix::terminate
void terminate(const Process &p)
Definition: terminate.hpp:20
armarx::make_shared
auto make_shared(Args &&...args)
Definition: ManagedIceObject.h:92
armarx::ManagedIceObject::getProxy
ProxyType getProxy(const std::string &name, bool addToDependencies=false, const std::string &endpoints="", bool throwOnProxyError=true)
Retrieves a proxy object.
Definition: ManagedIceObject.h:331
IceManager.h
armarx::ProxyType
ProxyType
Definition: ProxyPropertyDefinition.h:41
armarx::ManagedIceObject::preOnConnectComponent
virtual void preOnConnectComponent()
Definition: ManagedIceObject.h:555
armarx::Component
Baseclass for all ArmarX ManagedIceObjects requiring properties.
Definition: Component.h:95
ExpressionException.h
armarx::ManagedIceObject::getProxy
void getProxy(IceInternal::ProxyHandle< ProxyTarg > &proxy, const char *name, Args &&...args)
Definition: ManagedIceObject.h:375
ArmarXFwd.h
Ice
Definition: DBTypes.cpp:64
Ice::ObjectAdapterPtr
::IceInternal::Handle< ::Ice::ObjectAdapter > ObjectAdapterPtr
Definition: IceManager.h:51
armarx::ManagedIceObject
The ManagedIceObject is the base class for all ArmarX objects.
Definition: ManagedIceObject.h:165
armarx::Logging
Base Class for all Logging classes.
Definition: Logging.h:232
armarx::ManagedIceObject::addPlugin
void addPlugin(PluginT *&targ, const std::string prefix="", ParamsT &&...params)
Definition: ManagedIceObject.h:200
armarx::ManagedIceObject::getTopic
TopicProxyType getTopic(const std::string &name)
Returns a proxy of the specified topic.
Definition: ManagedIceObject.h:453
IceUtil::Handle
Definition: forward_declarations.h:29
armarx::Profiler::ProfilerPtr
std::shared_ptr< Profiler > ProfilerPtr
Definition: ManagedIceObject.h:77
Ice::upCast
ICE_API ::Ice::LocalObject * upCast(::Ice::Properties *)
ARMARX_CHECK_NULL
#define ARMARX_CHECK_NULL(ptr)
Definition: ExpressionException.h:210
ImportExport.h
armarx::ManagedIceObjectPlugin
Definition: ManagedIceObjectPlugin.h:50
ARMARXCORE_IMPORT_EXPORT
#define ARMARXCORE_IMPORT_EXPORT
Definition: ImportExport.h:38
Logging.h
T
float T
Definition: UnscentedKalmanFilterTest.cpp:35
armarx::ManagedIceObject::getProxy
void getProxy(IceInternal::ProxyHandle< ProxyTarg > &proxy, const std::string &name, Args &&...args)
Assigns a proxy to proxy.
Definition: ManagedIceObject.h:363
armarx::ManagedIceObject::getProxy
void getProxy(const std::string &name, IceInternal::ProxyHandle< ProxyTarg > &proxy, Args &&...args)
Definition: ManagedIceObject.h:369
armarx::ManagedIceObject::getProxy
Prx getProxy(long timeoutMs=0, bool waitForScheduler=true) const
Definition: ManagedIceObject.h:265
armarx::ArmarXManager
Main class of an ArmarX process.
Definition: ArmarXManager.h:95
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:28
armarx::SimplePeriodicTask
Usage:
Definition: ApplicationNetworkStats.h:32