https://issues.shibboleth.net/jira/browse/CPPXT-52
[shibboleth/cpp-xmltooling.git] / xmltooling / util / ReloadableXMLFile.h
index f150863..8ae62cf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2006 Internet2
+ *  Copyright 2001-2009 Internet2
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #ifndef __xmltooling_reloadable_h__
 #define __xmltooling_reloadable_h__
 
+#include <xmltooling/logging.h>
 #include <xmltooling/Lockable.h>
-#include <xmltooling/util/Threads.h>
 
 #include <ctime>
 #include <string>
+#include <xercesc/dom/DOM.hpp>
 
 namespace xmltooling {
 
+    class XMLTOOL_API RWLock;
+
     /**
      * Base class for file-based XML configuration.
      */
     class XMLTOOL_API ReloadableXMLFile : protected virtual Lockable
     {
-        MAKE_NONCOPYABLE(ReloadableXMLFile);
-        
+    MAKE_NONCOPYABLE(ReloadableXMLFile);
     protected:
         /**
          * Constructor taking a DOM element supporting the following content:
@@ -50,16 +52,19 @@ namespace xmltooling {
          *  <dt>validate</dt>
          *  <dd>use a validating parser</dd>
          *  <dt>reloadChanges</dt>
-         *  <dd>enables monitoring of resources for changes</dd>
+         *  <dd>enables monitoring of local file for changes</dd>
+         *  <dt>reloadInterval</dt>
+         *  <dd>enables periodic refresh of remote file</dd>
+         *  <dt>backingFilePath</dt>
+         *  <dd>location for backup of remote resource</dd>
          * </dl>
          * 
-         * @param e DOM to supply configuration
+         * @param e     DOM to supply configuration
+         * @param log   logging object to use
          */
-        ReloadableXMLFile(const DOMElement* e);
+        ReloadableXMLFile(const xercesc::DOMElement* e, logging::Category& log);
     
-        virtual ~ReloadableXMLFile() {
-            delete m_lock;
-        }
+        virtual ~ReloadableXMLFile();
 
         /**
          * Loads configuration material.
@@ -71,19 +76,10 @@ namespace xmltooling {
          * @return a pair consisting of a flag indicating whether to take ownership of
          *      the document, and the root element of the tree to load
          */
-        virtual std::pair<bool,DOMElement*> load();
+        virtual std::pair<bool,xercesc::DOMElement*> load();
         
-        /**
-         * Overrideable method to determine whether a remote resource remains valid.
-         * 
-         * @return  true iff the resource remains valid and should not be reloaded
-         */
-        virtual bool isValid() const {
-            return true;
-        }
-
         /** Root of the original DOM element passed into constructor. */
-        const DOMElement* m_root;
+        const xercesc::DOMElement* m_root;
         
         /** Indicates whether resources is local or remote. */
         bool m_local;
@@ -93,20 +89,31 @@ namespace xmltooling {
         
         /** Resource location, may be a local path or a URI. */
         std::string m_source;
+
+        /** Path to backup copy for remote resource. */
+        std::string m_backing;
         
-        /** Last modification of local resource. */
+        /** Last modification of local resource or reload of remote resource. */
         time_t m_filestamp;
-        
+
+        /** Time in seconds to wait before trying for new copy of remote resource. */
+        time_t m_reloadInterval;
+
+        /** Caching tag associated with remote resource. */
+        std::string m_cacheTag;
+
         /** Shared lock for guarding reloads. */
         RWLock* m_lock;
+        
+        /** Logging object. */
+        logging::Category& m_log;
 
     public:
         Lockable* lock();
+        void unlock();
 
-        void unlock() {
-            if (m_lock)
-                m_lock->unlock();
-        }
+    private:
+        std::pair<bool,xercesc::DOMElement*> load(bool backup);
     };
 
 };