From: Scott Cantor Date: Fri, 16 Mar 2012 18:46:13 +0000 (+0000) Subject: https://issues.shibboleth.net/jira/browse/CPPOST-68 X-Git-Tag: 2.5.0~21 X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-opensaml.git;a=commitdiff_plain;h=5767553fb279f13895e8979022acad1bb6377f90 https://issues.shibboleth.net/jira/browse/CPPOST-68 --- diff --git a/saml/saml2/metadata/AbstractMetadataProvider.h b/saml/saml2/metadata/AbstractMetadataProvider.h index 0ee9e5f..d458b4c 100644 --- a/saml/saml2/metadata/AbstractMetadataProvider.h +++ b/saml/saml2/metadata/AbstractMetadataProvider.h @@ -83,6 +83,7 @@ namespace opensaml { void outputStatus(std::ostream& os) const; void emitChangeEvent() const; + void emitChangeEvent(const EntityDescriptor&) const; std::pair getEntityDescriptor(const Criteria& criteria) const; const EntitiesDescriptor* getEntitiesDescriptor(const char* name, bool requireValidMetadata=true) const; const xmltooling::Credential* resolve(const xmltooling::CredentialCriteria* criteria=nullptr) const; diff --git a/saml/saml2/metadata/ObservableMetadataProvider.h b/saml/saml2/metadata/ObservableMetadataProvider.h index 5333afc..fab712b 100644 --- a/saml/saml2/metadata/ObservableMetadataProvider.h +++ b/saml/saml2/metadata/ObservableMetadataProvider.h @@ -59,6 +59,11 @@ namespace opensaml { */ virtual void emitChangeEvent() const; + /** + * Convenience method for notifying every registered Observer of an event. + */ + virtual void emitChangeEvent(const EntityDescriptor& entity) const; + public: virtual ~ObservableMetadataProvider(); @@ -79,6 +84,15 @@ namespace opensaml { * @param provider the provider being observed */ virtual void onEvent(const ObservableMetadataProvider& provider) const=0; + + /** + * Called when a provider signals an event has occured. + * The provider is already locked. + * + * @param provider the provider being observed + * @param entity the entity that underwent modification + */ + virtual void onEvent(const ObservableMetadataProvider& provider, const EntityDescriptor& entity) const; }; /** diff --git a/saml/saml2/metadata/impl/AbstractMetadataProvider.cpp b/saml/saml2/metadata/impl/AbstractMetadataProvider.cpp index 3eb0a97..229d881 100644 --- a/saml/saml2/metadata/impl/AbstractMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/AbstractMetadataProvider.cpp @@ -104,6 +104,14 @@ void AbstractMetadataProvider::emitChangeEvent() const ObservableMetadataProvider::emitChangeEvent(); } +void AbstractMetadataProvider::emitChangeEvent(const EntityDescriptor& entity) const +{ + for (credmap_t::iterator c = m_credentialMap.begin(); c!=m_credentialMap.end(); ++c) + for_each(c->second.begin(), c->second.end(), xmltooling::cleanup()); + m_credentialMap.clear(); + ObservableMetadataProvider::emitChangeEvent(entity); +} + void AbstractMetadataProvider::indexEntity(EntityDescriptor* site, time_t& validUntil, bool replace) const { // If child expires later than input, reset child, otherwise lower input to match. diff --git a/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp b/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp index 6b39787..42320e1 100644 --- a/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/DynamicMetadataProvider.cpp @@ -232,7 +232,7 @@ pair DynamicMetadataProvider::get m_lock->wrlock(); // Notify observers. - emitChangeEvent(); + emitChangeEvent(*entity2); // Record the proper refresh time. m_cacheMap[entity2->getEntityID()] = now + cacheExp; diff --git a/saml/saml2/metadata/impl/ObservableMetadataProvider.cpp b/saml/saml2/metadata/impl/ObservableMetadataProvider.cpp index b89f450..a2a7248 100644 --- a/saml/saml2/metadata/impl/ObservableMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/ObservableMetadataProvider.cpp @@ -47,7 +47,13 @@ ObservableMetadataProvider::~ObservableMetadataProvider() void ObservableMetadataProvider::emitChangeEvent() const { Lock lock(m_observerLock); - for_each(m_observers.begin(), m_observers.end(), boost::bind(&Observer::onEvent, _1, boost::ref(*this))); + for_each(m_observers.begin(), m_observers.end(), boost::bind(&Observer::onEvent, _1, boost::cref(*this))); +} + +void ObservableMetadataProvider::emitChangeEvent(const EntityDescriptor& entity) const +{ + Lock lock(m_observerLock); + for_each(m_observers.begin(), m_observers.end(), boost::bind(&Observer::onEvent, _1, boost::cref(*this), boost::cref(entity))); } void ObservableMetadataProvider::addObserver(const Observer* newObserver) const @@ -74,3 +80,8 @@ ObservableMetadataProvider::Observer::Observer() ObservableMetadataProvider::Observer::~Observer() { } + +void ObservableMetadataProvider::Observer::onEvent(const ObservableMetadataProvider& provider, const EntityDescriptor&) const +{ + onEvent(provider); +}