Linefeeds.
[shibboleth/cpp-xmltooling.git] / xmltooling / util / ReloadableXMLFile.cpp
index 6a35afa..a28ff5b 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
- *  Copyright 2001-2007 Internet2\r
- * \r
+ *  Copyright 2001-2009 Internet2\r
+ *\r
  * Licensed under the Apache License, Version 2.0 (the "License");\r
  * you may not use this file except in compliance with the License.\r
  * You may obtain a copy of the License at\r
 \r
 /**\r
  * @file ReloadableXMLFile.cpp\r
- * \r
+ *\r
  * Base class for file-based XML configuration.\r
  */\r
 \r
 #include "internal.h"\r
 #include "util/NDC.h"\r
+#include "util/PathResolver.h"\r
 #include "util/ReloadableXMLFile.h"\r
 #include "util/XMLConstants.h"\r
 #include "util/XMLHelper.h"\r
 \r
 #include <xercesc/framework/LocalFileInputSource.hpp>\r
 #include <xercesc/framework/Wrapper4InputSource.hpp>\r
-#include <xercesc/framework/URLInputSource.hpp>\r
 #include <xercesc/util/XMLUniDefs.hpp>\r
 \r
+using namespace xmltooling::logging;\r
 using namespace xmltooling;\r
-using namespace log4cpp;\r
+using namespace xercesc;\r
 using namespace std;\r
 \r
 static const XMLCh uri[] =              UNICODE_LITERAL_3(u,r,i);\r
@@ -78,20 +79,22 @@ ReloadableXMLFile::ReloadableXMLFile(const DOMElement* e, Category& log)
     }\r
     else\r
         m_local=false;\r
-    \r
+\r
     if (source && *source) {\r
         const XMLCh* flag=e->getAttributeNS(NULL,validate);\r
         m_validate=(XMLString::equals(flag,xmlconstants::XML_TRUE) || XMLString::equals(flag,xmlconstants::XML_ONE));\r
 \r
         auto_ptr_char temp(source);\r
         m_source=temp.get();\r
-        \r
+\r
         if (!m_local && !strstr(m_source.c_str(),"://")) {\r
             log.warn("deprecated usage of uri/url attribute for a local resource, use path instead");\r
             m_local=true;\r
         }\r
 \r
         if (m_local) {\r
+            XMLToolingConfig::getConfig().getPathResolver()->resolve(m_source, PathResolver::XMLTOOLING_CFG_FILE);\r
+\r
             flag=e->getAttributeNS(NULL,reloadChanges);\r
             if (!XMLString::equals(flag,xmlconstants::XML_FALSE) && !XMLString::equals(flag,xmlconstants::XML_ZERO)) {\r
 #ifdef WIN32\r
@@ -114,6 +117,7 @@ ReloadableXMLFile::ReloadableXMLFile(const DOMElement* e, Category& log)
             if (source && *source) {\r
                 auto_ptr_char temp2(source);\r
                 m_backing=temp2.get();\r
+                XMLToolingConfig::getConfig().getPathResolver()->resolve(m_backing, PathResolver::XMLTOOLING_RUN_FILE);\r
                 log.debug("backup remote resource with (%s)", m_backing.c_str());\r
             }\r
             source = e->getAttributeNS(NULL,reloadInterval);\r
@@ -152,8 +156,8 @@ pair<bool,DOMElement*> ReloadableXMLFile::load(bool backup)
                 m_log.debug("loading configuration from external resource...");\r
 \r
             DOMDocument* doc=NULL;\r
-            auto_ptr_XMLCh widenit(backup ? m_backing.c_str() : m_source.c_str());\r
             if (m_local || backup) {\r
+                auto_ptr_XMLCh widenit(backup ? m_backing.c_str() : m_source.c_str());\r
                 LocalFileInputSource src(widenit.get());\r
                 Wrapper4InputSource dsrc(&src,false);\r
                 if (m_validate)\r
@@ -162,7 +166,7 @@ pair<bool,DOMElement*> ReloadableXMLFile::load(bool backup)
                     doc=XMLToolingConfig::getConfig().getParser().parse(dsrc);\r
             }\r
             else {\r
-                URLInputSource src(widenit.get());\r
+                URLInputSource src(m_root);\r
                 Wrapper4InputSource dsrc(&src,false);\r
                 if (m_validate)\r
                     doc=XMLToolingConfig::getConfig().getValidatingParser().parse(dsrc);\r
@@ -170,13 +174,13 @@ pair<bool,DOMElement*> ReloadableXMLFile::load(bool backup)
                     doc=XMLToolingConfig::getConfig().getParser().parse(dsrc);\r
             }\r
 \r
-            m_log.infoStream() << "loaded XML resource (" << (backup ? m_backing : m_source) << ")" << CategoryStream::ENDLINE;\r
+            m_log.infoStream() << "loaded XML resource (" << (backup ? m_backing : m_source) << ")" << logging::eol;\r
 \r
             if (!backup && !m_backing.empty()) {\r
                 m_log.debug("backing up remote resource to (%s)", m_backing.c_str());\r
                 try {\r
                     ofstream backer(m_backing.c_str());\r
-                    backer << *(doc->getDocumentElement());\r
+                    backer << *doc;\r
                 }\r
                 catch (exception& ex) {\r
                     m_log.crit("exception while backing up resource: %s", ex.what());\r
@@ -188,15 +192,15 @@ pair<bool,DOMElement*> ReloadableXMLFile::load(bool backup)
     }\r
     catch (XMLException& e) {\r
         auto_ptr_char msg(e.getMessage());\r
-        m_log.critStream() << "Xerces error while loading resource (" << (backup ? m_backing : m_source) << "): "\r
-            << msg.get() << CategoryStream::ENDLINE;\r
+        m_log.errorStream() << "Xerces error while loading resource (" << (backup ? m_backing : m_source) << "): "\r
+            << msg.get() << logging::eol;\r
         if (!backup && !m_backing.empty())\r
             return load(true);\r
         throw XMLParserException(msg.get());\r
     }\r
     catch (exception& e) {\r
-        m_log.critStream() << "error while loading configuration from ("\r
-            << (m_source.empty() ? "inline" : (backup ? m_backing : m_source)) << "): " << e.what() << CategoryStream::ENDLINE;\r
+        m_log.errorStream() << "error while loading configuration from ("\r
+            << (m_source.empty() ? "inline" : (backup ? m_backing : m_source)) << "): " << e.what() << logging::eol;\r
         if (!backup && !m_backing.empty())\r
             return load(true);\r
         throw;\r
@@ -207,7 +211,7 @@ Lockable* ReloadableXMLFile::lock()
 {\r
     if (!m_lock)\r
         return this;\r
-        \r
+\r
     m_lock->rdlock();\r
 \r
     // Check if we need to refresh.\r
@@ -223,12 +227,14 @@ Lockable* ReloadableXMLFile::lock()
 #endif\r
         if (m_filestamp>=stat_buf.st_mtime)\r
             return this;\r
-        \r
+\r
         // Elevate lock and recheck.\r
+        m_log.debug("timestamp of local resource changed, elevating to a write lock");\r
         m_lock->unlock();\r
         m_lock->wrlock();\r
         if (m_filestamp>=stat_buf.st_mtime) {\r
             // Somebody else handled it, just downgrade.\r
+            m_log.debug("update of local resource handled by another thread, downgrading lock");\r
             m_lock->unlock();\r
             m_lock->rdlock();\r
             return this;\r
@@ -247,10 +253,12 @@ Lockable* ReloadableXMLFile::lock()
             return this;\r
 \r
         // Elevate lock and recheck.\r
+        m_log.debug("reload interval for remote resource elapsed, elevating to a write lock");\r
         m_lock->unlock();\r
         m_lock->wrlock();\r
         if (now - m_filestamp < m_reloadInterval) {\r
             // Somebody else handled it, just downgrade.\r
+            m_log.debug("update of remote resource handled by another thread, downgrading lock");\r
             m_lock->unlock();\r
             m_lock->rdlock();\r
             return this;\r
@@ -259,7 +267,7 @@ Lockable* ReloadableXMLFile::lock()
         m_filestamp = now;\r
         m_log.info("reloading remote resource...");\r
     }\r
-    \r
+\r
     // Do this once...\r
     try {\r
         // At this point we're holding the write lock, so make sure we pop it.\r
@@ -270,8 +278,9 @@ Lockable* ReloadableXMLFile::lock()
     } catch (exception& ex) {\r
         m_log.crit("maintaining existing configuration, error reloading resource (%s): %s", m_source.c_str(), ex.what());\r
     }\r
-    \r
+\r
     // If we made it here, the swap may or may not have worked, but we need to relock.\r
+    m_log.debug("attempt to update resource complete, relocking");\r
     m_lock->rdlock();\r
     return this;\r
 }\r