Convert logging to log4shib via compile time switch.
[shibboleth/opensaml2.git] / saml / saml2 / metadata / impl / ChainingMetadataProvider.cpp
index f3b23f8..25bc3db 100644 (file)
 #include "exceptions.h"
 #include "saml2/metadata/ChainingMetadataProvider.h"
 
-#include <xmltooling/util/XMLHelper.h>
 #include <xercesc/util/XMLUniDefs.hpp>
+#include <xmltooling/logging.h>
+#include <xmltooling/util/XMLHelper.h>
+
 
 using namespace opensaml::saml2md;
 using namespace opensaml;
 using namespace xmlsignature;
+using namespace xmltooling::logging;
 using namespace xmltooling;
 using namespace std;
 
@@ -42,16 +45,18 @@ namespace opensaml {
     };
 };
 
-static const XMLCh GenericMetadataProvider[] =      UNICODE_LITERAL_16(M,e,t,a,d,a,t,a,P,r,o,v,i,d,e,r);
-static const XMLCh type[] =                         UNICODE_LITERAL_4(t,y,p,e);
+static const XMLCh _MetadataProvider[] =    UNICODE_LITERAL_16(M,e,t,a,d,a,t,a,P,r,o,v,i,d,e,r);
+static const XMLCh type[] =                 UNICODE_LITERAL_4(t,y,p,e);
 
 ChainingMetadataProvider::ChainingMetadataProvider(const DOMElement* e) : ObservableMetadataProvider(e), m_tlsKey(NULL)
 {
-    try {
-        e = e ? xmltooling::XMLHelper::getFirstChildElement(e, GenericMetadataProvider) : NULL;
-        while (e) {
-            auto_ptr_char temp(e->getAttributeNS(NULL,type));
-            if (temp.get()) {
+    Category& log=Category::getInstance(SAML_LOGCAT".Metadata");
+    e = e ? XMLHelper::getFirstChildElement(e, _MetadataProvider) : NULL;
+    while (e) {
+        auto_ptr_char temp(e->getAttributeNS(NULL,type));
+        if (temp.get() && *temp.get()) {
+            try {
+                log.info("building MetadataProvider of type %s", temp.get());
                 auto_ptr<MetadataProvider> provider(
                     SAMLConfig::getConfig().MetadataProviderManager.newPlugin(temp.get(), e)
                     );
@@ -61,12 +66,11 @@ ChainingMetadataProvider::ChainingMetadataProvider(const DOMElement* e) : Observ
                 m_providers.push_back(provider.get());
                 provider.release();
             }
-            e = XMLHelper::getNextSiblingElement(e, GenericMetadataProvider);
+            catch (exception& ex) {
+                log.error("error building MetadataProvider: %s", ex.what());
+            }
         }
-    }
-    catch (XMLToolingException&) {
-        for_each(m_providers.begin(), m_providers.end(), xmltooling::cleanup<MetadataProvider>());
-        throw;
+        e = XMLHelper::getNextSiblingElement(e, _MetadataProvider);
     }
     m_tlsKey = ThreadKey::create(NULL);
 }
@@ -77,14 +81,21 @@ ChainingMetadataProvider::~ChainingMetadataProvider()
     for_each(m_providers.begin(), m_providers.end(), xmltooling::cleanup<MetadataProvider>());
 }
 
-void ChainingMetadataProvider::onEvent(MetadataProvider& provider)
+void ChainingMetadataProvider::onEvent(const ObservableMetadataProvider& provider) const
 {
     emitChangeEvent();
 }
 
 void ChainingMetadataProvider::init()
 {
-    for_each(m_providers.begin(), m_providers.end(), mem_fun<void,MetadataProvider>(&MetadataProvider::init));
+    for (vector<MetadataProvider*>::const_iterator i=m_providers.begin(); i!=m_providers.end(); ++i) {
+        try {
+            (*i)->init();
+        }
+        catch (exception& ex) {
+            Category::getInstance(SAML_LOGCAT".Metadata").error("failure initializing MetadataProvider: %s", ex.what());
+        }
+    }
 }
 
 Lockable* ChainingMetadataProvider::lock()
@@ -102,14 +113,6 @@ void ChainingMetadataProvider::unlock()
     }
 }
 
-const KeyResolver* ChainingMetadataProvider::getKeyResolver() const
-{
-    // Check for a locked provider.
-    void* ptr=m_tlsKey->getData();
-    return ptr ? reinterpret_cast<MetadataProvider*>(ptr)->getKeyResolver() : NULL;
-    
-}
-
 const XMLObject* ChainingMetadataProvider::getMetadata() const
 {
     throw XMLToolingException("getMetadata operation not implemented on this provider.");
@@ -174,3 +177,25 @@ const EntityDescriptor* ChainingMetadataProvider::getEntityDescriptor(const SAML
 
     return NULL;
 }
+
+const Credential* ChainingMetadataProvider::resolve(const CredentialCriteria* criteria) const
+{
+    // Check for a locked provider.
+    void* ptr=m_tlsKey->getData();
+    if (!ptr)
+        throw MetadataException("No locked MetadataProvider, where did the role object come from?");
+
+    return reinterpret_cast<MetadataProvider*>(ptr)->resolve(criteria);
+}
+
+vector<const Credential*>::size_type ChainingMetadataProvider::resolve(
+    vector<const Credential*>& results, const CredentialCriteria* criteria
+    ) const
+{
+    // Check for a locked provider.
+    void* ptr=m_tlsKey->getData();
+    if (!ptr)
+        throw MetadataException("No locked MetadataProvider, where did the role object come from?");
+
+    return reinterpret_cast<MetadataProvider*>(ptr)->resolve(results, criteria);
+}