ReloadableXMLFile::ReloadableXMLFile(const DOMElement* e, Category& log)
- : m_root(e), m_local(true), m_validate(false), m_filestamp(0), m_reloadInterval(0), m_lock(NULL), m_log(log),
+ : m_root(e), m_local(true), m_validate(false), m_autocommit(true), m_filestamp(0), m_reloadInterval(0), m_lock(NULL), m_log(log),
m_shutdown(false), m_reload_wait(NULL), m_reload_thread(NULL)
{
#ifdef _DEBUG
auto_ptr_char temp2(source);
m_backing=temp2.get();
XMLToolingConfig::getConfig().getPathResolver()->resolve(m_backing, PathResolver::XMLTOOLING_RUN_FILE);
- log.debug("backup remote resource with (%s)", m_backing.c_str());
+ log.debug("backup remote resource to (%s)", m_backing.c_str());
}
source = e->getAttributeNS(NULL,reloadInterval);
if (source && *source) {
DOMDocument* doc=NULL;
if (m_local || backup) {
auto_ptr_XMLCh widenit(backup ? m_backing.c_str() : m_source.c_str());
+ // Use library-wide lock for now, nothing else is using it anyway.
+ Locker locker(backup ? getBackupLock() : NULL);
LocalFileInputSource src(widenit.get());
Wrapper4InputSource dsrc(&src, false);
if (m_validate)
m_log.infoStream() << "loaded XML resource (" << (backup ? m_backing : m_source) << ")" << logging::eol;
- if (!backup && !m_backing.empty()) {
+ if (!backup && m_autocommit && !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 << *doc;
}
SharedLock locker(m_lock, false);
return load();
}
+
+Lockable* ReloadableXMLFile::getBackupLock()
+{
+ return &XMLToolingConfig::getConfig();
+}
* the document, and the root element of the tree to load
*/
virtual std::pair<bool,xercesc::DOMElement*> load();
-
+
+ /**
+ * Accesses a lock interface protecting use of backup file associated with the
+ * object.
+ *
+ * <p>The lock is <strong>NOT</strong> acquired automatically.
+ *
+ * @return pointer to a lock interface, or NULL if unnecessary
+ */
+ virtual Lockable* getBackupLock();
+
/** Root of the original DOM element passed into constructor. */
const xercesc::DOMElement* m_root;
/** Path to backup copy for remote resource. */
std::string m_backing;
-
+
+ /** Indicates whether loading process needs to defer creation of backup file. */
+ bool m_autocommit;
+
/** Last modification of local resource. */
time_t m_filestamp;