From 58ed1144be743e1ebfa0f5081e9185d771e45678 Mon Sep 17 00:00:00 2001 From: Scott Cantor Date: Fri, 30 Mar 2007 02:19:06 +0000 Subject: [PATCH] Rework observer constness, fix SOAP client virtual method. --- saml/Makefile.am | 1 - saml/binding/SOAPClient.h | 2 +- saml/saml.vcproj | 4 --- saml/saml2/metadata/ChainingMetadataProvider.h | 2 +- saml/saml2/metadata/MetadataProvider.h | 2 ++ saml/saml2/metadata/ObservableMetadataProvider.h | 34 ++++++++++++------- .../metadata/impl/ChainingMetadataProvider.cpp | 2 +- .../metadata/impl/ObservableMetadataProvider.cpp | 39 ---------------------- samltest/security/AbstractPKIXTrustEngineTest.h | 2 +- 9 files changed, 28 insertions(+), 60 deletions(-) delete mode 100644 saml/saml2/metadata/impl/ObservableMetadataProvider.cpp diff --git a/saml/Makefile.am b/saml/Makefile.am index b0f0d75..2bb57f2 100644 --- a/saml/Makefile.am +++ b/saml/Makefile.am @@ -141,7 +141,6 @@ libsaml_la_SOURCES = \ saml2/metadata/impl/MetadataImpl.cpp \ saml2/metadata/impl/MetadataProvider.cpp \ saml2/metadata/impl/MetadataSchemaValidators.cpp \ - saml2/metadata/impl/ObservableMetadataProvider.cpp \ saml2/metadata/impl/SignatureMetadataFilter.cpp \ saml2/metadata/impl/WhitelistMetadataFilter.cpp \ saml2/metadata/impl/XMLMetadataProvider.cpp \ diff --git a/saml/binding/SOAPClient.h b/saml/binding/SOAPClient.h index ddbe2e1..337b4fa 100644 --- a/saml/binding/SOAPClient.h +++ b/saml/binding/SOAPClient.h @@ -68,7 +68,7 @@ namespace opensaml { * @param peer peer to send message to, expressed in metadata criteria terms * @param endpoint URL of endpoint to recieve message */ - void send(const soap11::Envelope& env, saml2md::MetadataCredentialCriteria& peer, const char* endpoint); + virtual void send(const soap11::Envelope& env, saml2md::MetadataCredentialCriteria& peer, const char* endpoint); /** * Override applies SecurityPolicy to envelope before returning it. diff --git a/saml/saml.vcproj b/saml/saml.vcproj index 63aa25d..0494d9c 100644 --- a/saml/saml.vcproj +++ b/saml/saml.vcproj @@ -359,10 +359,6 @@ > - - diff --git a/saml/saml2/metadata/ChainingMetadataProvider.h b/saml/saml2/metadata/ChainingMetadataProvider.h index 2de6229..5963ad0 100644 --- a/saml/saml2/metadata/ChainingMetadataProvider.h +++ b/saml/saml2/metadata/ChainingMetadataProvider.h @@ -93,7 +93,7 @@ namespace opensaml { const EntitiesDescriptor* getEntitiesDescriptor(const char* name, bool requireValidMetadata=true) const; const EntityDescriptor* getEntityDescriptor(const char* id, bool requireValidMetadata=true) const; const EntityDescriptor* getEntityDescriptor(const SAMLArtifact* artifact) const; - void onEvent(MetadataProvider& provider); + void onEvent(const MetadataProvider& provider) const; const xmltooling::Credential* resolve(const xmltooling::CredentialCriteria* criteria=NULL) const; std::vector::size_type resolve( diff --git a/saml/saml2/metadata/MetadataProvider.h b/saml/saml2/metadata/MetadataProvider.h index bf5df48..a3c39b3 100644 --- a/saml/saml2/metadata/MetadataProvider.h +++ b/saml/saml2/metadata/MetadataProvider.h @@ -23,6 +23,8 @@ #ifndef __saml2_metadataprov_h__ #define __saml2_metadataprov_h__ +#include +#include #include #include diff --git a/saml/saml2/metadata/ObservableMetadataProvider.h b/saml/saml2/metadata/ObservableMetadataProvider.h index 76fe77f..3d6a579 100644 --- a/saml/saml2/metadata/ObservableMetadataProvider.h +++ b/saml/saml2/metadata/ObservableMetadataProvider.h @@ -24,6 +24,7 @@ #define __saml2_obsmetadataprov_h__ #include +#include namespace opensaml { @@ -44,18 +45,24 @@ namespace opensaml { * * @param e DOM to supply configuration for provider */ - ObservableMetadataProvider(const DOMElement* e=NULL) : MetadataProvider(e) {} + ObservableMetadataProvider(const DOMElement* e=NULL) + : MetadataProvider(e), m_observerLock(xmltooling::Mutex::create()) { + } /** * Convenience method for notifying every registered Observer of an event. */ - virtual void emitChangeEvent(); + virtual void emitChangeEvent() const { + xmltooling::Lock lock(m_observerLock); + for (std::vector::const_iterator i=m_observers.begin(); i!=m_observers.end(); i++) { + (*i)->onEvent(*this); + } + } public: - /** - * Destructor will delete any installed filters. - */ - virtual ~ObservableMetadataProvider(); + virtual ~ObservableMetadataProvider() { + delete m_observerLock; + } /** * An observer of metadata provider changes. @@ -73,7 +80,7 @@ namespace opensaml { * * @param provider the provider being observed */ - virtual void onEvent(MetadataProvider& provider)=0; + virtual void onEvent(const MetadataProvider& provider) const=0; }; /** @@ -81,18 +88,20 @@ namespace opensaml { * * @param newObserver metadata observer to add */ - virtual void addObserver(Observer* newObserver) { + virtual void addObserver(const Observer* newObserver) const { + xmltooling::Lock lock(m_observerLock); m_observers.push_back(newObserver); } /** - * Removes a metadata observer. The caller must delete the observer if necessary. + * Removes a metadata observer. * * @param oldObserver metadata observer to remove * @return the old observer */ - virtual Observer* removeObserver(Observer* oldObserver) { - for (std::vector::iterator i=m_observers.begin(); i!=m_observers.end(); i++) { + virtual const Observer* removeObserver(const Observer* oldObserver) const { + xmltooling::Lock lock(m_observerLock); + for (std::vector::iterator i=m_observers.begin(); i!=m_observers.end(); i++) { if (oldObserver==(*i)) { m_observers.erase(i); return oldObserver; @@ -102,7 +111,8 @@ namespace opensaml { } private: - std::vector m_observers; + mutable xmltooling::Mutex* m_observerLock; + mutable std::vector m_observers; }; #if defined (_MSC_VER) diff --git a/saml/saml2/metadata/impl/ChainingMetadataProvider.cpp b/saml/saml2/metadata/impl/ChainingMetadataProvider.cpp index 2f222fd..5e48c26 100644 --- a/saml/saml2/metadata/impl/ChainingMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/ChainingMetadataProvider.cpp @@ -81,7 +81,7 @@ ChainingMetadataProvider::~ChainingMetadataProvider() for_each(m_providers.begin(), m_providers.end(), xmltooling::cleanup()); } -void ChainingMetadataProvider::onEvent(MetadataProvider& provider) +void ChainingMetadataProvider::onEvent(const MetadataProvider& provider) const { emitChangeEvent(); } diff --git a/saml/saml2/metadata/impl/ObservableMetadataProvider.cpp b/saml/saml2/metadata/impl/ObservableMetadataProvider.cpp deleted file mode 100644 index a64af43..0000000 --- a/saml/saml2/metadata/impl/ObservableMetadataProvider.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2001-2007 Internet2 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * ObservableMetadataProvider.cpp - * - * A metadata provider that notifies interested parties of changes. - */ - -#include "internal.h" -#include "saml2/metadata/ObservableMetadataProvider.h" - -using namespace opensaml::saml2md; -using namespace std; - -ObservableMetadataProvider::~ObservableMetadataProvider() -{ - for_each(m_observers.begin(),m_observers.end(),xmltooling::cleanup()); -} - -void ObservableMetadataProvider::emitChangeEvent() -{ - for (std::vector::const_iterator i=m_observers.begin(); i!=m_observers.end(); i++) { - (*i)->onEvent(*this); - } -} diff --git a/samltest/security/AbstractPKIXTrustEngineTest.h b/samltest/security/AbstractPKIXTrustEngineTest.h index 5e746a3..7188a1d 100644 --- a/samltest/security/AbstractPKIXTrustEngineTest.h +++ b/samltest/security/AbstractPKIXTrustEngineTest.h @@ -77,7 +77,7 @@ namespace { }; PKIXValidationInfoIterator* getPKIXValidationInfoIterator( - const CredentialResolver& credResolver, CredentialCriteria* criteria=NULL, const KeyInfoResolver* keyInfoResolver=NULL + const CredentialResolver& credResolver, CredentialCriteria* criteria=NULL ) const { dynamic_cast(criteria); return new SampleIterator(); -- 2.1.4