/**
* DynamicMetadataProvider.cpp
*
- * Base class for caching metadata providers.
+ * Simple implementation of a dynamic caching MetadataProvider.
*/
#include "internal.h"
+#include "binding/SAMLArtifact.h"
#include "saml2/metadata/Metadata.h"
#include "saml2/metadata/DynamicMetadataProvider.h"
-#include <xercesc/framework/Wrapper4InputSource.hpp>\r
-#include <xercesc/framework/URLInputSource.hpp>\r
-#include <xercesc/util/XMLUniDefs.hpp>\r
-#include <xmltooling/logging.h>\r
+#include <xercesc/framework/Wrapper4InputSource.hpp>
+#include <xercesc/framework/URLInputSource.hpp>
+#include <xercesc/util/XMLUniDefs.hpp>
+#include <xmltooling/logging.h>
#include <xmltooling/util/XMLHelper.h>
using namespace opensaml::saml2md;
using namespace xmltooling;
using namespace std;
-static const XMLCh validate[] = UNICODE_LITERAL_8(v,a,l,i,d,a,t,e);\r
+static const XMLCh validate[] = UNICODE_LITERAL_8(v,a,l,i,d,a,t,e);
namespace opensaml {
namespace saml2md {
DynamicMetadataProvider::DynamicMetadataProvider(const DOMElement* e)
: AbstractMetadataProvider(e), m_lock(RWLock::create())
{
- const XMLCh* flag=e ? e->getAttributeNS(NULL,validate) : NULL;\r
- m_validate=(XMLString::equals(flag,xmlconstants::XML_TRUE) || XMLString::equals(flag,xmlconstants::XML_ONE));\r
+ const XMLCh* flag=e ? e->getAttributeNS(NULL,validate) : NULL;
+ m_validate=(XMLString::equals(flag,xmlconstants::XML_TRUE) || XMLString::equals(flag,xmlconstants::XML_ONE));
}
DynamicMetadataProvider::~DynamicMetadataProvider()
delete m_lock;
}
-const EntityDescriptor* DynamicMetadataProvider::getEntityDescriptor(const char* name, bool strict) const
+pair<const EntityDescriptor*,const RoleDescriptor*> DynamicMetadataProvider::getEntityDescriptor(const Criteria& criteria) const
{
// Check cache while holding the read lock.
- const EntityDescriptor* entity = AbstractMetadataProvider::getEntityDescriptor(name, strict);
- if (entity)
+ pair<const EntityDescriptor*,const RoleDescriptor*> entity = AbstractMetadataProvider::getEntityDescriptor(criteria);
+ if (entity.first) // even if the role isn't found, we're done
+ return entity;
+
+ string name;
+ if (criteria.entityID_ascii)
+ name = criteria.entityID_ascii;
+ else if (criteria.entityID_unicode) {
+ auto_ptr_char temp(criteria.entityID_unicode);
+ name = temp.get();
+ }
+ else if (criteria.artifact)
+ name = criteria.artifact->getSource();
+ else
return entity;
Category& log = Category::getInstance(SAML_LOGCAT".MetadataProvider.Dynamic");
- log.info("resolving metadata for (%s)", name);
+ log.info("resolving metadata for (%s)", name.c_str());
// Try resolving it.
- auto_ptr<EntityDescriptor> entity2(resolve(name));
+ auto_ptr<EntityDescriptor> entity2(resolve(name.c_str()));
// Filter it, which may throw.
doFilters(*entity2.get());
- log.info("caching resolved metadata for (%s)", name);
+ log.info("caching resolved metadata for (%s)", name.c_str());
// Translate cacheDuration into validUntil.
if (entity2->getCacheDuration())
m_lock->rdlock();
// Rinse and repeat.
- return getEntityDescriptor(name, strict);
+ return getEntityDescriptor(criteria);
}
EntityDescriptor* DynamicMetadataProvider::resolve(const char* entityID) const
{
- try {\r
- DOMDocument* doc=NULL;\r
- auto_ptr_XMLCh widenit(entityID);\r
- URLInputSource src(widenit.get());\r
- Wrapper4InputSource dsrc(&src,false);\r
- if (m_validate)\r
- doc=XMLToolingConfig::getConfig().getValidatingParser().parse(dsrc);\r
- else\r
- doc=XMLToolingConfig::getConfig().getParser().parse(dsrc);\r
-\r
+ try {
+ DOMDocument* doc=NULL;
+ auto_ptr_XMLCh widenit(entityID);
+ URLInputSource src(widenit.get());
+ Wrapper4InputSource dsrc(&src,false);
+ if (m_validate)
+ doc=XMLToolingConfig::getConfig().getValidatingParser().parse(dsrc);
+ else
+ doc=XMLToolingConfig::getConfig().getParser().parse(dsrc);
+
// Wrap the document for now.
XercesJanitor<DOMDocument> docjanitor(doc);
"Root of metadata instance not recognized: $1", params(1,xmlObject->getElementQName().toString().c_str())
);
}
- xmlObject.release();\r
- return entity;\r
- }\r
- catch (XMLException& e) {\r
- auto_ptr_char msg(e.getMessage());\r
- Category::getInstance(SAML_LOGCAT".MetadataProvider.Dynamic").error(\r
- "Xerces error while resolving entityID (%s): %s", entityID, msg.get()\r
- );\r
- throw MetadataException(msg.get());\r
- }\r
- catch (exception& e) {\r
- Category::getInstance(SAML_LOGCAT".MetadataProvider.Dynamic").error(\r
- "error while resolving entityID (%s): %s", entityID, e.what()\r
- );\r
- throw;\r
- }\r
+ xmlObject.release();
+ return entity;
+ }
+ catch (XMLException& e) {
+ auto_ptr_char msg(e.getMessage());
+ Category::getInstance(SAML_LOGCAT".MetadataProvider.Dynamic").error(
+ "Xerces error while resolving entityID (%s): %s", entityID, msg.get()
+ );
+ throw MetadataException(msg.get());
+ }
+ catch (exception& e) {
+ Category::getInstance(SAML_LOGCAT".MetadataProvider.Dynamic").error(
+ "error while resolving entityID (%s): %s", entityID, e.what()
+ );
+ throw;
+ }
}