Rework observer constness, fix SOAP client virtual method.
authorScott Cantor <cantor.2@osu.edu>
Fri, 30 Mar 2007 02:19:06 +0000 (02:19 +0000)
committerScott Cantor <cantor.2@osu.edu>
Fri, 30 Mar 2007 02:19:06 +0000 (02:19 +0000)
saml/Makefile.am
saml/binding/SOAPClient.h
saml/saml.vcproj
saml/saml2/metadata/ChainingMetadataProvider.h
saml/saml2/metadata/MetadataProvider.h
saml/saml2/metadata/ObservableMetadataProvider.h
saml/saml2/metadata/impl/ChainingMetadataProvider.cpp
saml/saml2/metadata/impl/ObservableMetadataProvider.cpp [deleted file]
samltest/security/AbstractPKIXTrustEngineTest.h

index b0f0d75..2bb57f2 100644 (file)
@@ -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 \
index ddbe2e1..337b4fa 100644 (file)
@@ -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.
index 63aa25d..0494d9c 100644 (file)
                                                        >\r
                                                </File>\r
                                                <File\r
-                                                       RelativePath=".\saml2\metadata\impl\ObservableMetadataProvider.cpp"\r
-                                                       >\r
-                                               </File>\r
-                                               <File\r
                                                        RelativePath=".\saml2\metadata\impl\SignatureMetadataFilter.cpp"\r
                                                        >\r
                                                </File>\r
index 2de6229..5963ad0 100644 (file)
@@ -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<const xmltooling::Credential*>::size_type resolve(
index bf5df48..a3c39b3 100644 (file)
@@ -23,6 +23,8 @@
 #ifndef __saml2_metadataprov_h__
 #define __saml2_metadataprov_h__
 
+#include <saml/base.h>
+#include <xmltooling/exceptions.h>
 #include <xmltooling/XMLObject.h>
 #include <xmltooling/security/CredentialResolver.h>
 
index 76fe77f..3d6a579 100644 (file)
@@ -24,6 +24,7 @@
 #define __saml2_obsmetadataprov_h__
 
 #include <saml/saml2/metadata/MetadataProvider.h>
+#include <xmltooling/util/Threads.h>
 
 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 Observer*>::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<Observer*>::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<const Observer*>::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<Observer*> m_observers;
+            mutable xmltooling::Mutex* m_observerLock;
+            mutable std::vector<const Observer*> m_observers;
         };
 
 #if defined (_MSC_VER)
index 2f222fd..5e48c26 100644 (file)
@@ -81,7 +81,7 @@ ChainingMetadataProvider::~ChainingMetadataProvider()
     for_each(m_providers.begin(), m_providers.end(), xmltooling::cleanup<MetadataProvider>());
 }
 
-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 (file)
index a64af43..0000000
+++ /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<Observer>());
-}
-
-void ObservableMetadataProvider::emitChangeEvent()
-{
-    for (std::vector<Observer*>::const_iterator i=m_observers.begin(); i!=m_observers.end(); i++) {
-        (*i)->onEvent(*this);
-    }
-}
index 5e746a3..7188a1d 100644 (file)
@@ -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<const MetadataCredentialCriteria*>(criteria);
             return new SampleIterator();