+ throw;
+ }
+}
+
+pair<bool,DOMElement*> ReloadableXMLFile::load()
+{
+ // If this method is used, we're responsible for managing failover to a
+ // backup of a remote resource (if available), and for backing up remote
+ // resources.
+ try {
+ pair<bool,DOMElement*> ret = load(false);
+ if (!m_backing.empty()) {
+ m_log.debug("backing up remote resource to (%s)", m_backing.c_str());
+ try {
+ Locker locker(getBackupLock());
+ ofstream backer(m_backing.c_str());
+ backer << *(ret.second->getOwnerDocument());
+ }
+ catch (exception& ex) {
+ m_log.crit("exception while backing up resource: %s", ex.what());
+ }
+ }
+ return ret;
+ }
+ catch (long&) {
+ // If there's an HTTP error or the document hasn't changed,
+ // use the backup iff we have no "valid" resource in place.
+ // That prevents reload of the backup copy any time the document
+ // hasn't changed.
+ if (!m_loaded && !m_backing.empty())
+ return load(true);
+ throw;
+ }
+ catch (exception&) {
+ // Same as above, but for general load/parse errors.
+ if (!m_loaded && !m_backing.empty())