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;
*/
virtual void emitChangeEvent() const;
+ /**
+ * Convenience method for notifying every registered Observer of an event.
+ */
+ virtual void emitChangeEvent(const EntityDescriptor& entity) const;
+
public:
virtual ~ObservableMetadataProvider();
* @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;
};
/**
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.
m_lock->wrlock();
// Notify observers.
- emitChangeEvent();
+ emitChangeEvent(*entity2);
// Record the proper refresh time.
m_cacheMap[entity2->getEntityID()] = now + cacheExp;
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
ObservableMetadataProvider::Observer::~Observer()
{
}
+
+void ObservableMetadataProvider::Observer::onEvent(const ObservableMetadataProvider& provider, const EntityDescriptor&) const
+{
+ onEvent(provider);
+}