Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
PropertyMgr.cpp
Go to the documentation of this file.
1 // hide deprecation warnings here... the whole file is deprecated
2 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
3 // ============================================================================
4 // Include files
5 // ============================================================================
6 // STD& STL
7 // ============================================================================
8 #include <algorithm>
9 #include <functional>
10 #include <iostream>
11 #include <sstream>
12 #include <stdexcept>
13 #include <string>
14 // ============================================================================
15 // GaudiKernel
16 // ============================================================================
17 #include "GaudiKernel/Bootstrap.h"
23 // ============================================================================
24 
26 
27 namespace {
28  // ==========================================================================
30  constexpr struct NoCaseCmp_t {
31  inline bool operator()( const std::string& v1, const std::string& v2 ) const {
32  return v1.size() == v2.size() && std::equal( std::begin( v1 ), std::end( v1 ), std::begin( v2 ),
33  []( char c1, char c2 ) { return toupper( c1 ) == toupper( c2 ); } );
34  }
35  } noCaseCmp{};
36  // ==========================================================================
38  struct PropByName {
39  std::string m_name;
40 
41  inline bool operator()( const PropertyBase* p ) const { return p && noCaseCmp( p->name(), m_name ); }
42  };
43  // ==========================================================================
44 } // namespace
45 // ====================================================================
46 // constructor from the interface
47 // ====================================================================
48 PropertyMgr::PropertyMgr( IInterface* iface ) : m_pOuter( iface ) {
49  addRef(); // initial reference count set to 1
50 }
51 // ====================================================================
52 // Declare a remote property
53 // ====================================================================
55  if ( !rsvc ) return nullptr;
56  const std::string& nam = rname.empty() ? name : rname;
57  PropertyBase* p = property( nam, rsvc->getProperties() );
58  m_remoteProperties.emplace_back( name, std::make_pair( rsvc, nam ) );
59  return p;
60 }
61 // ============================================================================
62 // Declare a property
63 // ============================================================================
65  assertUniqueName( name );
66  m_todelete.emplace_back( new typename GaudiHandleBase::PropertyType( name, ref ) );
67  Property* p = m_todelete.back().get();
68  //
69  p->setDocumentation( doc );
71  //
72  return p;
73 }
74 // ============================================================================
76  const std::string& doc ) {
77  assertUniqueName( name );
78  m_todelete.emplace_back( new typename GaudiHandleArrayBase::PropertyType( name, ref ) );
79  Property* p = m_todelete.back().get();
80  //
81  p->setDocumentation( doc );
83  //
84  return p;
85 }
86 
87 // ============================================================================
89  const std::string& doc ) {
90  assertUniqueName( name );
91  m_todelete.emplace_back( new typename DataObjectHandleBase::PropertyType( name, ref ) );
92  Property* p = m_todelete.back().get();
93  //
94  p->setDocumentation( doc );
96  //
97  return p;
98 }
99 // ====================================================================
100 // get the property by name form the proposed list
101 // ====================================================================
102 PropertyBase* PropertyMgr::property( const std::string& name, const std::vector<PropertyBase*>& props ) const {
103  auto it = std::find_if( props.begin(), props.end(), PropByName{name} );
104  return ( it != props.end() ) ? *it : nullptr; // RETURN
105 }
106 // ====================================================================
107 // retrieve the property by name
108 // ====================================================================
109 PropertyBase* PropertyMgr::property( const std::string& name ) const {
110  // local property ?
111  PropertyBase* lp = property( name, m_properties );
112  if ( lp ) return lp; // RETURN
113  // look for remote property
114  for ( const auto& it : m_remoteProperties ) {
115  if ( !noCaseCmp( it.first, name ) ) continue; // CONTINUE
116  const IProperty* p = it.second.first;
117  if ( !p ) continue;
118  return property( it.second.second, p->getProperties() ); // RETURN
119  }
120  return nullptr; // RETURN
121 }
122 // ====================================================================
123 /* set a property from another property
124  * Implementation of IProperty::setProperty
125  */
126 // =====================================================================
128  PropertyBase* pp = property( p.name() );
129  try {
130  if ( pp && pp->assign( p ) ) return StatusCode::SUCCESS;
131  } // RETURN
132  catch ( ... ) {}
133  //
134  return StatusCode::FAILURE;
135 }
136 // ====================================================================
137 /* set a property from the stream
138  * Implementation of IProperty::setProperty
139  */
140 // =====================================================================
142  std::string name, value;
143  StatusCode sc = Gaudi::Parsers::parse( name, value, i );
144  return sc.isFailure() ? sc : setProperty( name, value );
145 }
146 // =====================================================================
147 /* set a property from the string
148  * Implementation of IProperty::setProperty
149  */
150 // =====================================================================
152  PropertyBase* p = property( n );
153  return ( p && p->fromString( v ) ) ? StatusCode::SUCCESS : StatusCode::FAILURE;
154 }
155 // =====================================================================
156 /* Retrieve the value of a property
157  * Implementation of IProperty::getProperty
158  */
159 // =====================================================================
161  try {
162  const PropertyBase* pp = property( p->name() );
163  if ( pp && pp->load( *p ) ) return StatusCode::SUCCESS; // RETURN
164  } catch ( ... ) {}
165  return StatusCode::FAILURE; // RETURN
166 }
167 // =====================================================================
168 /* Get the property by name
169  * Implementation of IProperty::getProperty
170  */
171 // =====================================================================
172 const PropertyBase& PropertyMgr::getProperty( const std::string& name ) const {
173  const PropertyBase* p = property( name );
174  if ( !p ) throw std::out_of_range( "Property " + name + " not found." ); // Not found
175  return *p; // RETURN
176 }
177 // =====================================================================
178 /* Get the property by name
179  * Implementation of IProperty::getProperty
180  */
181 // =====================================================================
183  // get the property
184  const PropertyBase* p = property( n );
185  if ( !p ) return StatusCode::FAILURE;
186  // convert the value into the string
187  v = p->toString();
188  //
189  return StatusCode::SUCCESS;
190 }
191 // =====================================================================
192 // Implementation of IProperty::getProperties
193 // =====================================================================
195 // =====================================================================
196 // Implementation of IInterface::queryInterface
197 // =====================================================================
198 StatusCode PropertyMgr::queryInterface( const InterfaceID& iid, void** pinterface ) {
199  // try local interfaces
200  StatusCode sc = base_class::queryInterface( iid, pinterface );
201  if ( sc.isSuccess() ) return sc;
202  // fall back on the owner
203  return m_pOuter ? m_pOuter->queryInterface( iid, pinterface ) : sc; // FAILURE
204 }
205 // =====================================================================
206 // Implementation of IProperty::hasProperty
207 // =====================================================================
208 bool PropertyMgr::hasProperty( const std::string& name ) const {
209  return any_of( begin( m_properties ), end( m_properties ),
210  [&name]( const PropertyBase* prop ) { return noCaseCmp( prop->name(), name ); } );
211 }
212 void PropertyMgr::assertUniqueName( const std::string& name ) const {
213  if ( LIKELY( !hasProperty( name ) ) ) return;
214  auto msgSvc = Gaudi::svcLocator()->service<IMessageSvc>( "MessageSvc" );
215  if ( !msgSvc ) std::cerr << "error: cannot get MessageSvc!" << std::endl;
216  auto owner = SmartIF<INamedInterface>( m_pOuter );
217  MsgStream log( msgSvc, owner ? owner->name() : "PropertyMgr" );
218  log << MSG::WARNING << "duplicated property name '" << name << "', see https://its.cern.ch/jira/browse/GAUDI-1023"
219  << endmsg;
220 }
221 // =====================================================================
222 // The END
223 // =====================================================================
StatusCode setProperty(IProperty *component, const std::string &name, const TYPE &value, const std::string &doc)
simple function to set the property of the given object from the value
Definition: Property.h:1178
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
T empty(T...args)
void setDocumentation(std::string value)
set the documentation string
Definition: Property.h:86
virtual bool load(PropertyBase &dest) const =0
export the property value to the destination
virtual bool assign(const PropertyBase &source)=0
import the property value form the source
const std::string name() const
property name
Definition: Property.h:36
bool isSuccess() const
Definition: StatusCode.h:267
T endl(T...args)
Gaudi::Details::PropertyBase * property(const std::string &name) const
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
Gaudi::Details::PropertyBase * declareRemoteProperty(const std::string &name, IProperty *rsvc, const std::string &rname="")
Declare a remote property.
StatusCode parse(GaudiUtils::HashMap< K, V > &result, const std::string &input)
Basic parser for the types of HashMap used in DODBasicMapper.
T end(T...args)
void assertUniqueName(const std::string &name) const
Throw an exception if the name is already present in the list of properties (see GAUDI-1023).
virtual std::string toString() const =0
value -> string
Gaudi::Details::PropertyBase Property
backward compatibility hack for old Property base class
Definition: PropertyFwd.h:25
bool isFailure() const
Definition: StatusCode.h:130
virtual StatusCode fromString(const std::string &value)=0
string -> value
DataObjectHandleProperty.h GaudiKernel/DataObjectHandleProperty.h.
STL class.
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:76
T push_back(T...args)
Interface ID class.
Definition: IInterface.h:29
GAUDI_API ISvcLocator * svcLocator()
class GAUDI_API[[deprecated("will be removed in v29r0, consider using PropertyHolder instead")]] PropertyMgr
Definition: PropertyMgr.h:33
bool hasProperty(const std::string &name) const override
Return true if we have a property with the given name.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
Gaudi::Details::PropertyBase * declareProperty(const std::string &name, TYPE &value, const std::string &doc="none")
Declare a property (templated)
Definition of the basic interface.
Definition: IInterface.h:244
The IMessage is the interface implemented by the message service.
Definition: IMessageSvc.h:37
T make_pair(T...args)
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: Property.h:32
virtual const std::vector< Gaudi::Details::PropertyBase * > & getProperties() const =0
Get list of properties.
#define LIKELY(x)
Definition: Kernel.h:88
T get(T...args)
T find_if(T...args)
T size(T...args)
Base class of array&#39;s of various gaudihandles.
Definition: GaudiHandle.h:330
STL class.
virtual Out operator()(const vector_of_const_< In > &inputs) const =0
DataObjectHandleBase GaudiKernel/DataObjectHandleBase.h.
T begin(T...args)
T any_of(T...args)
Properties m_properties
Collection of all declared properties.
Definition: PropertyMgr.h:137
T back(T...args)
constexpr static const auto FAILURE
Definition: StatusCode.h:86
std::vector< std::unique_ptr< Gaudi::Details::PropertyBase > > m_todelete
Properties to be deleted.
Definition: PropertyMgr.h:141
Base class to handles to be used in lieu of naked pointers to various Gaudi components.
Definition: GaudiHandle.h:89
AttribStringParser::Iterator begin(const AttribStringParser &parser)
StatusCode queryInterface(const InterfaceID &iid, void **pinterface) override
The IProperty is the basic interface for all components which have properties that can be set or get...
Definition: IProperty.h:20
const std::vector< Gaudi::Details::PropertyBase * > & getProperties() const override
get all properties
T equal(T...args)
void toupper(std::string &s)
IInterface * m_pOuter
Interface hub reference (ApplicationMgr)
Definition: PropertyMgr.h:143
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
RemoteProperties m_remoteProperties
Collection of all declared remote properties.
Definition: PropertyMgr.h:139
GAUDI_API Gaudi::Details::PropertyBase * getProperty(const IProperty *p, const std::string &name)
simple function which gets the property with given name from the component
Definition: Property.cpp:204
virtual StatusCode queryInterface(const InterfaceID &ti, void **pp)=0
Set the void** to the pointer to the requested interface of the instance.
T emplace_back(T...args)