Add provider Id, track last update, report in status method.
authorScott Cantor <cantor.2@osu.edu>
Wed, 21 Sep 2011 17:11:10 +0000 (17:11 +0000)
committerScott Cantor <cantor.2@osu.edu>
Wed, 21 Sep 2011 17:11:10 +0000 (17:11 +0000)
saml/saml2/metadata/AbstractMetadataProvider.h
saml/saml2/metadata/DynamicMetadataProvider.h
saml/saml2/metadata/MetadataProvider.h
saml/saml2/metadata/impl/AbstractMetadataProvider.cpp
saml/saml2/metadata/impl/DynamicMetadataProvider.cpp
saml/saml2/metadata/impl/MetadataProvider.cpp
saml/saml2/metadata/impl/XMLMetadataProvider.cpp

index 9670e57..8e256cd 100644 (file)
@@ -81,6 +81,7 @@ namespace opensaml {
             using MetadataProvider::getEntityDescriptor;
             using MetadataProvider::getEntitiesDescriptor;
 
+            void outputStatus(std::ostream& os) const;
             void emitChangeEvent() const;
             std::pair<const EntityDescriptor*,const RoleDescriptor*> getEntityDescriptor(const Criteria& criteria) const;
             const EntitiesDescriptor* getEntitiesDescriptor(const char* name, bool requireValidMetadata=true) const;
@@ -90,6 +91,9 @@ namespace opensaml {
                 ) const;
 
         protected:
+            /** Time of last update for reporting. */
+            mutable time_t m_lastUpdate;
+
             /** Embedded KeyInfoResolver instance. */
             xmltooling::KeyInfoResolver* m_resolver;
 
index 26c8f2a..179bc2e 100644 (file)
@@ -54,6 +54,7 @@ namespace opensaml {
             void init();
             xmltooling::Lockable* lock();
             void unlock();
+            const char* getId() const;
             const xmltooling::XMLObject* getMetadata() const;
             std::pair<const EntityDescriptor*,const RoleDescriptor*> getEntityDescriptor(const Criteria& criteria) const;
 
@@ -70,6 +71,7 @@ namespace opensaml {
             virtual EntityDescriptor* resolve(const Criteria& criteria) const;
 
         private:
+            std::string m_id;
             mutable xmltooling::RWLock* m_lock;
             double m_refreshDelayFactor;
             time_t m_minCacheDuration, m_maxCacheDuration;
index 63c74e7..571d4bd 100644 (file)
@@ -97,6 +97,13 @@ namespace opensaml {
             virtual ~MetadataProvider();
 
             /**
+             * Returns an identifier for the provider for logging/status purposes.
+             *
+             * @return an identifier, or null
+             */
+            virtual const char* getId() const;
+
+            /**
              * Adds a metadata filter to apply to any resolved metadata. Will not be applied
              * to metadata that is already loaded.
              *
index d642634..9dd9bc4 100644 (file)
@@ -37,6 +37,7 @@
 #include <xmltooling/security/Credential.h>
 #include <xmltooling/security/KeyInfoResolver.h>
 #include <xmltooling/security/SecurityHelper.h>
+#include <xmltooling/util/DateTime.h>
 #include <xmltooling/util/Threads.h>
 #include <xmltooling/util/XMLHelper.h>
 
@@ -50,7 +51,7 @@ static const XMLCh _KeyInfoResolver[] = UNICODE_LITERAL_15(K,e,y,I,n,f,o,R,e,s,o
 static const XMLCh type[] =             UNICODE_LITERAL_4(t,y,p,e);
 
 AbstractMetadataProvider::AbstractMetadataProvider(const DOMElement* e)
-    : ObservableMetadataProvider(e), m_resolver(nullptr), m_credentialLock(nullptr)
+    : ObservableMetadataProvider(e), m_lastUpdate(0),  m_resolver(nullptr), m_credentialLock(nullptr)
 {
     e = XMLHelper::getFirstChildElement(e, _KeyInfoResolver);
     if (e) {
@@ -71,6 +72,24 @@ AbstractMetadataProvider::~AbstractMetadataProvider()
     delete m_resolver;
 }
 
+void AbstractMetadataProvider::outputStatus(ostream& os) const
+{
+    os << "<MetadataProvider";
+
+    if (getId() && *getId()) {
+        os << " id='" << getId() << "'";
+    }
+
+    if (m_lastUpdate > 0) {
+        DateTime ts(m_lastUpdate);
+        ts.parseDateTime();
+        auto_ptr_char timestamp(ts.getFormattedString());
+        os << " lastUpdate='" << timestamp.get() << "'";
+    }
+
+    os << "/>";
+}
+
 void AbstractMetadataProvider::emitChangeEvent() const
 {
     for (credmap_t::iterator c = m_credentialMap.begin(); c!=m_credentialMap.end(); ++c)
index a6af29e..9a65d01 100644 (file)
@@ -47,6 +47,7 @@ using namespace std;
 #  define min(a,b)            (((a) < (b)) ? (a) : (b))
 # endif
 
+static const XMLCh id[] =                   UNICODE_LITERAL_2(i,d);
 static const XMLCh maxCacheDuration[] =     UNICODE_LITERAL_16(m,a,x,C,a,c,h,e,D,u,r,a,t,i,o,n);
 static const XMLCh minCacheDuration[] =     UNICODE_LITERAL_16(m,i,n,C,a,c,h,e,D,u,r,a,t,i,o,n);
 static const XMLCh refreshDelayFactor[] =   UNICODE_LITERAL_18(r,e,f,r,e,s,h,D,e,l,a,y,F,a,c,t,o,r);
@@ -64,6 +65,7 @@ namespace opensaml {
 DynamicMetadataProvider::DynamicMetadataProvider(const DOMElement* e)
     : AbstractMetadataProvider(e),
       m_validate(XMLHelper::getAttrBool(e, false, validate)),
+        m_id(XMLHelper::getAttrString(e, "Dynamic", id)),
         m_lock(RWLock::create()),
         m_refreshDelayFactor(0.75),
         m_minCacheDuration(XMLHelper::getAttrInt(e, 600, minCacheDuration)),
@@ -116,6 +118,11 @@ void DynamicMetadataProvider::init()
 {
 }
 
+const char* DynamicMetadataProvider::getId() const
+{
+    return m_id.c_str();
+}
+
 pair<const EntityDescriptor*,const RoleDescriptor*> DynamicMetadataProvider::getEntityDescriptor(const Criteria& criteria) const
 {
     Category& log = Category::getInstance(SAML_LOGCAT".MetadataProvider.Dynamic");
@@ -235,6 +242,8 @@ pair<const EntityDescriptor*,const RoleDescriptor*> DynamicMetadataProvider::get
         cacheExp = SAMLTIME_MAX;
         indexEntity(entity2.release(), cacheExp, true);
 
+        m_lastUpdate = now;
+
         // Downgrade back to a read lock.
         m_lock->unlock();
         m_lock->rdlock();
index 6498750..de18ceb 100644 (file)
@@ -137,6 +137,11 @@ MetadataProvider::~MetadataProvider()
     for_each(m_filters.begin(), m_filters.end(), xmltooling::cleanup<MetadataFilter>());
 }
 
+const char* MetadataProvider::getId() const
+{
+    return nullptr;
+}
+
 void MetadataProvider::addMetadataFilter(MetadataFilter* newFilter)
 {
     m_filters.push_back(newFilter);
index f0e5963..45e9fab 100644 (file)
@@ -93,6 +93,10 @@ namespace opensaml {
                 }
             }
 
+            const char* getId() const {
+                return m_id.c_str();
+            }
+
             const XMLObject* getMetadata() const {
                 return m_object;
             }
@@ -236,6 +240,7 @@ pair<bool,DOMElement*> XMLMetadataProvider::load(bool backup)
         generateFeed();
     if (changed)
         emitChangeEvent();
+    m_lastUpdate = time(nullptr);
 
     // Tracking cacheUntil through the tree is TBD, but
     // validUntil is the tightest interval amongst the children.