https://issues.shibboleth.net/jira/browse/CPPOST-68
authorScott Cantor <cantor.2@osu.edu>
Fri, 16 Mar 2012 18:46:13 +0000 (18:46 +0000)
committerScott Cantor <cantor.2@osu.edu>
Fri, 16 Mar 2012 18:46:13 +0000 (18:46 +0000)
saml/saml2/metadata/AbstractMetadataProvider.h
saml/saml2/metadata/ObservableMetadataProvider.h
saml/saml2/metadata/impl/AbstractMetadataProvider.cpp
saml/saml2/metadata/impl/DynamicMetadataProvider.cpp
saml/saml2/metadata/impl/ObservableMetadataProvider.cpp

index 0ee9e5f..d458b4c 100644 (file)
@@ -83,6 +83,7 @@ namespace opensaml {
 
             void outputStatus(std::ostream& os) const;
             void emitChangeEvent() const;
+            void emitChangeEvent(const EntityDescriptor&) const;
             std::pair<const EntityDescriptor*,const RoleDescriptor*> 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;
index 5333afc..fab712b 100644 (file)
@@ -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;
             };
             
             /**
index 3eb0a97..229d881 100644 (file)
@@ -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<Credential>());
+    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.
index 6b39787..42320e1 100644 (file)
@@ -232,7 +232,7 @@ pair<const EntityDescriptor*,const RoleDescriptor*> DynamicMetadataProvider::get
         m_lock->wrlock();
 
         // Notify observers.
-        emitChangeEvent();
+        emitChangeEvent(*entity2);
 
         // Record the proper refresh time.
         m_cacheMap[entity2->getEntityID()] = now + cacheExp;
index b89f450..a2a7248 100644 (file)
@@ -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);
+}