summaryrefslogtreecommitdiff
path: root/configmgr/source/treecache/cachecontroller.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/source/treecache/cachecontroller.cxx')
-rw-r--r--configmgr/source/treecache/cachecontroller.cxx719
1 files changed, 0 insertions, 719 deletions
diff --git a/configmgr/source/treecache/cachecontroller.cxx b/configmgr/source/treecache/cachecontroller.cxx
deleted file mode 100644
index 765f7df8d2e2..000000000000
--- a/configmgr/source/treecache/cachecontroller.cxx
+++ /dev/null
@@ -1,719 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: cachecontroller.cxx,v $
- * $Revision: 1.21 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_configmgr.hxx"
-
-#include "cachecontroller.hxx"
-#include "disposetimer.hxx"
-#include "cachewritescheduler.hxx"
-#include "builddata.hxx"
-#include "localizedtreeactions.hxx"
-#include "configexcept.hxx"
-#include "tracer.hxx"
-#include <com/sun/star/lang/DisposedException.hpp>
-#include <com/sun/star/container/NoSuchElementException.hpp>
-#include <osl/diagnose.h>
-#include <rtl/logfile.hxx>
-
-#ifndef _CONFIGMGR_BOOTSTRAP_HXX
-#include "bootstrap.hxx"
-#endif
-
-
-#define RTL_LOGFILE_OU2A(rtlOUString) (::rtl::OUStringToOString((rtlOUString), RTL_TEXTENCODING_ASCII_US).getStr())
-
-namespace configmgr
-{
-// -------------------------------------------------------------------------
- namespace backend
- {
-
-static const rtl::OUString kCacheDisposeDelay(
- RTL_CONSTASCII_USTRINGPARAM( CONTEXT_ITEM_PREFIX_ "CacheDisposeDelay"));
-static const rtl::OUString kCacheDisposeInterval(
- RTL_CONSTASCII_USTRINGPARAM( CONTEXT_ITEM_PREFIX_ "CacheDisposeInterval"));
-static const rtl::OUString kCacheWriteInterval(
- RTL_CONSTASCII_USTRINGPARAM( CONTEXT_ITEM_PREFIX_ "CacheWriteInterval"));
-// -------------------------------------------------------------------------
-
-OTreeDisposeScheduler* CacheController::createDisposer(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _xContext)
-{
- ContextReader aReader(_xContext);
- sal_uInt32 c_nDefaultDelay = 0;
- rtl::OUString sDefaultDelay;
- aReader.getBestContext()->getValueByName(kCacheDisposeDelay) >>= sDefaultDelay;
- c_nDefaultDelay = sDefaultDelay.toInt32()==0?900:sDefaultDelay.toInt32() ;
-
- sal_uInt32 c_nDefaultInterval = 0;
- rtl::OUString sDefaultInterval;
- aReader.getBestContext()->getValueByName(kCacheDisposeInterval) >>= sDefaultInterval;
- c_nDefaultInterval = sDefaultInterval.toInt32()==0?60:sDefaultInterval.toInt32();
-
- TimeInterval aDelay(c_nDefaultDelay);
- TimeInterval aInterval(c_nDefaultInterval);
-
- return new OTreeDisposeScheduler(*this, aDelay, aInterval);
-}
-
-// -----------------------------------------------------------------------------
-
-OCacheWriteScheduler* CacheController::createCacheWriter(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _xContext)
-{
- ContextReader aReader(_xContext);
- sal_uInt32 c_nDefaultInterval=0;
- rtl::OUString sDefaultInterval;
- aReader.getBestContext()->getValueByName(kCacheWriteInterval) >>= sDefaultInterval;
- c_nDefaultInterval = sDefaultInterval.toInt32()==0?2:sDefaultInterval.toInt32();
-
- TimeInterval aInterval(c_nDefaultInterval);
- return new OCacheWriteScheduler(*this, aInterval);
-}
-// ----------------------------------------------------------------------------
-
-rtl::Reference<CacheLoadingAccess> CacheController::getCacheAlways(RequestOptions const & _aOptions)
-{
- rtl::Reference<CacheLoadingAccess> aResult = m_aCacheMap.get(_aOptions);
- if (!aResult.is())
- {
- rtl::Reference<CacheLoadingAccess> aNewCache( new CacheLoadingAccess() );
- aResult = m_aCacheMap.insert(_aOptions,aNewCache);
- }
- return aResult;
-}
-
-// -------------------------------------------------------------------------
-
-// disposing
-// -------------------------------------------------------------------------
-void CacheController::disposeAll(bool _bFlushRemainingUpdates)
-{
- CFG_TRACE_INFO("CacheController: Disposing all data" );
- CacheMap::Map aReleaseList;
-
- if (m_pDisposer)
- {
- m_pDisposer->stopAndClearTasks();
- m_aCacheMap.swap(aReleaseList); // move data out of m_aCacheMap and empty m_aCacheMap
- }
-
- if (_bFlushRemainingUpdates)
- {
- for (CacheMap::Map::iterator it = aReleaseList.begin(); it != aReleaseList.end(); ++it)
- saveAllPendingChanges(it->second,it->first);
- }
- // free all the trees
- aReleaseList.clear();
-}
-
-// -------------------------------------------------------------------------
-void CacheController::dispose() SAL_THROW((com::sun::star::uno::RuntimeException))
-{
- UnoApiLock aLock;
-
- CFG_TRACE_INFO("CacheController: dispose()" );
-
- RTL_LOGFILE_CONTEXT_AUTHOR(aLog, "configmgr::backend::CacheController", "jb99855", "configmgr: CacheController::dispose(), disable lazy write cache.");
- m_bDisposing = true; // we are in dispose, handling of errors must be something different.
-
- // writing of pending updates
- this->flushCacheWriter();
-
- // cleaning the cache
- this->disposeAll(true);
-}
-
-// -------------------------------------------------------------------------
-CacheController::CacheController(rtl::Reference< backend::IMergedDataProvider > const & _xBackend,
- const uno::Reference<uno::XComponentContext>& xContext)
-: m_aNotifier()
-, m_xBackend(_xBackend)
-, m_aCacheMap()
-, m_aTemplates()
-, m_pDisposer()
-, m_pCacheWriter()
-, m_bDisposing(false)
-{
- m_pDisposer = this->createDisposer(xContext);
- m_pCacheWriter = this->createCacheWriter(xContext);
-}
-
-// -------------------------------------------------------------------------
-CacheController::~CacheController()
-{
- OSL_ENSURE(m_bDisposing == true, "CacheController::dispose() wasn't called, something went wrong.");
-
- delete m_pDisposer;
- delete m_pCacheWriter;
-}
-
-// -------------------------------------------------------------------------
-void CacheController::closeModules(std::vector< rtl::Reference<CacheLine> > & _aList, RequestOptions const & _aOptions)
-{
- //Remove listeners from Backend as module no longer in cache
- for (sal_uInt32 i =0; i < _aList.size(); ++i)
- {
- rtl::OUString aModuleName = _aList[i]->getModuleName();
- ComponentRequest aRequest(aModuleName, _aOptions);
- m_xBackend->removeRequestListener(this, aRequest);
- }
-}
-// -------------------------------------------------------------------------
-#if 0
-static
-std::auto_ptr<ISubtree> reduceSubtreeForLocale(std::auto_ptr<ISubtree> _pSubtree, RequestOptions const & _aOptions)
-{
- OSL_ENSURE(!_pSubtree.get() || !isLocalizedValueSet(*_pSubtree), "Unexpected node. Expecting a subtree, Found a single localized value.");
-
- std::auto_ptr<ISubtree> aRet;
-
- std::auto_ptr<INode> aReduced = reduceExpandedForLocale(_pSubtree, _aOptions.getLocale());
-
- if (aReduced.get())
- {
- if (ISubtree* pReduced =aReduced->asISubtree())
- {
- aRet.reset(pReduced);
- aReduced.release();
- }
- else
- {
- OSL_ENSURE(false, "Tree unexpectedly reduced to non-tree");
- }
- }
- else
- OSL_ENSURE(!_pSubtree.get(), "Tree unexpectedly reduced to nothing");
-
- return aRet;
-}
-#endif
-
-// -------------------------------------------------------------------------
-sharable::TreeFragment * CacheController::loadComponent(ComponentRequest const & _aRequest)
-{
- CFG_TRACE_INFO("CacheController: loading component '%s'", OUSTRING2ASCII(_aRequest.getComponentName()));
-
- RTL_LOGFILE_CONTEXT_AUTHOR(aLog, "configmgr::backend::CacheController", "jb99855", "configmgr: CacheController::loadComponent()");
- RTL_LOGFILE_CONTEXT_TRACE1(aLog, "component: %s", RTL_LOGFILE_OU2A(_aRequest.getComponentName().toString()) );
-
- rtl::Reference<CacheLoadingAccess> aCache = this->getCacheAlways(_aRequest.getOptions());
-
- OSL_ENSURE(aCache.is(), "Could not create CacheAccess");
-
- sharable::TreeFragment * aTemplateResultAdddress;
-
- OSL_ENSURE(!_aRequest.isForcingReload(),"CacheController: No support for forced requests");
- if (aCache->hasModule(_aRequest.getComponentName()))
- {
- CFG_TRACE_INFO_NI("CacheController: found node in cache");
- if (_aRequest.getOptions().isRefreshEnabled())
- {
- refreshComponent(_aRequest);
- }
- aCache->acquireModule(_aRequest.getComponentName());
- }
- else
- {
- ResultHolder< ComponentInstance > aData = this->loadDirectly(_aRequest,true);
-
- CFG_TRACE_INFO_NI("CacheController: adding loaded data to the cache");
-
- aCache->createModule(_aRequest.getComponentName());
-
- aCache->addComponentData(aData.instance(), true);
- if (aData.instance().templateData().get()!=NULL)
- aTemplateResultAdddress = addTemplates(aData.mutableInstance().componentTemplateData() );
-
- // notify the new data to all clients
- m_aNotifier.notifyCreated(_aRequest);
- }
-
- return aCache->getTreeAddress(_aRequest.getComponentName());
-}
-// -------------------------------------------------------------------------
-
-ResultHolder< ComponentInstance > CacheController::getComponentData(ComponentRequest const & _aRequest,
- bool _bAddListenter ) SAL_THROW((com::sun::star::uno::Exception))
-{
- // TODO: Insert check here, if the data is in the cache already - and then clone
- RTL_LOGFILE_CONTEXT_AUTHOR(aLog, "configmgr::backend::CacheController", "jb99855", "configmgr: CacheController::getComponentData()");
- RTL_LOGFILE_CONTEXT_TRACE1(aLog, "component: %s", RTL_LOGFILE_OU2A(_aRequest.getComponentName().toString()) );
-
- ResultHolder< ComponentInstance > aRet = this->loadDirectly(_aRequest, _bAddListenter);
-
- return aRet;
-}
-// -------------------------------------------------------------------------
-
-ResultHolder< NodeInstance > CacheController::getDefaultData(NodeRequest const & _aRequest) SAL_THROW((com::sun::star::uno::Exception))
-{
- // TODO: Insert check here, if the data is in the cache already - and then clone
- RTL_LOGFILE_CONTEXT_AUTHOR(aLog, "configmgr::backend::CacheController", "jb99855", "configmgr: CacheController::getDefaultData()");
- RTL_LOGFILE_CONTEXT_TRACE1(aLog, "path: %s", RTL_LOGFILE_OU2A(_aRequest.getPath().toString()) );
-
- ResultHolder< NodeInstance > aRet = this->loadDefaultsDirectly(_aRequest);
-
- return aRet;
-}
-// -------------------------------------------------------------------------
-
-configuration::AbsolutePath CacheController::encodeTemplateLocation(const rtl::OUString& _rName, const rtl::OUString &_rModule) const
-{
- namespace Path = configuration::Path;
-
-// static const
-// Component aTemplateRoot = wrapSimpleName(rtl::OUString::createFromAscii("org.openoffice.Templates"));
-
- Path::Component aTemplateModule = Path::wrapSimpleName(_rModule);
- Path::Component aTemplateName = Path::wrapSimpleName(_rName);
-
- Path::Rep aResult(aTemplateName);
- aResult.prepend(aTemplateModule);
-// aResult.prepend(aTemplateRoot);
-
- return configuration::AbsolutePath(aResult);
-}
-// -------------------------------------------------------------------------
-#if 0
-static
-configuration::AbsolutePath templateLoadLocation(const configuration::AbsolutePath &_rTemplateLocation)
-{
- namespace Path = configuration::Path;
-
- static const
- Path::Component aTemplateRoot = Path::wrapSimpleName(rtl::OUString::createFromAscii("org.openoffice.Templates"));
-
- Path::Rep aResult(_rTemplateLocation.rep());
- aResult.prepend(aTemplateRoot);
-
- return configuration::AbsolutePath(aResult);
-}
-#endif
-// -------------------------------------------------------------------------
-std::auto_ptr<ISubtree> CacheController::loadTemplateData(TemplateRequest const & _aTemplateRequest) SAL_THROW((com::sun::star::uno::Exception))
-{
- std::auto_ptr<ISubtree> aMultiTemplates;
- ResultHolder< TemplateInstance > aTemplateInstance = m_xBackend->getTemplateData(_aTemplateRequest);
- if (aTemplateInstance.is())
- {
- OSL_ASSERT(aTemplateInstance->name().getLength() == 0);
- if (ISubtree * pMulti = aTemplateInstance->data()->asISubtree())
- {
- aTemplateInstance.releaseAndClear();
- aMultiTemplates.reset(pMulti);
- }
- else
- OSL_ENSURE(false,"Requested multiple templates, got non-subtree node");
- }
- else
- OSL_ENSURE(false,"Requested configuration template does not exist");
-
- if (aMultiTemplates.get() == NULL)
- {
- CFG_TRACE_ERROR_NI("CacheController: could not load the templates");
- throw uno::Exception(::rtl::OUString::createFromAscii("The template description could not be loaded. The template does not exist."), NULL);
- }
-
- return aMultiTemplates;
-}
-// -------------------------------------------------------------------------
-sharable::TreeFragment * CacheController::addTemplates ( backend::ComponentDataStruct const & _aComponentInstance )
-{
- OSL_PRECOND(_aComponentInstance.data.get(), "addTemplates: Data must not be NULL");
- rtl::OUString aModuleName = _aComponentInstance.name;
- m_aTemplates.createModule(aModuleName);
- configuration::AbsolutePath aTemplateLocation = configuration::AbsolutePath::makeModulePath(_aComponentInstance.name);
- sharable::TreeFragment * aTemplateAddr = NULL;
-
- if (!m_aTemplates.hasNode(aTemplateLocation ))
- {
- CFG_TRACE_INFO_NI("CacheController: cache miss for that template - loading from backend");
- aTemplateAddr = m_aTemplates.addTemplates(_aComponentInstance );
- }
- OSL_ASSERT (aTemplateAddr != NULL);
- return aTemplateAddr;
- }
-// -------------------------------------------------------------------------
-
-sharable::TreeFragment * CacheController::loadTemplate(TemplateRequest const & _aRequest) SAL_THROW((com::sun::star::uno::Exception))
-{
-
- OSL_ENSURE(_aRequest.getTemplateName().getLength() != 0, "CacheController::loadTemplate : invalid template name !");
- RTL_LOGFILE_CONTEXT_AUTHOR(aLog, "configmgr::backend::CacheController", "jb99855", "configmgr: CacheController::loadTemplate()");
- RTL_LOGFILE_CONTEXT_TRACE2(aLog, "requested template: %s/%s",
- RTL_LOGFILE_OU2A(_aRequest.getComponentName().toString()) ,
- _aRequest.isComponentRequest() ?
- "*" : RTL_LOGFILE_OU2A(_aRequest.getComponentName().toString()) );
-
-
- configuration::AbsolutePath aTemplateLocation = encodeTemplateLocation(_aRequest.getTemplateName(), _aRequest.getComponentName());
-
- rtl::OUString aModuleName = aTemplateLocation.getModuleName();
-
- configuration::AbsolutePath aTemplateParent (aTemplateLocation.getParentPath());
-
- //Load-if-not-there (componentwise)
- if (!m_aTemplates.hasNode(aTemplateParent))
- {
- OSL_ENSURE(aTemplateLocation.getDepth() > 1, "CacheController::ensureTemplate : invalid template location !");
- TemplateRequest aTemplateRequest = TemplateRequest::forComponent(_aRequest.getComponentName());
-
- std::auto_ptr<ISubtree> aMultiTemplates = loadTemplateData(aTemplateRequest);
- //add-if-not-loaded
- addTemplates(backend::ComponentDataStruct(aMultiTemplates, aModuleName));
-
- }
- sharable::TreeFragment * aTemplateAddr = m_aTemplates.getTemplateTree(aTemplateLocation);
- if (aTemplateAddr == NULL)
- throw uno::Exception(::rtl::OUString::createFromAscii("Unknown template. Type description could not be found in the given module."), NULL);
-
- return m_aTemplates.getTreeAddress(aTemplateLocation.getModuleName());
-}
-// -----------------------------------------------------------------------------
-
-ResultHolder< TemplateInstance > CacheController::getTemplateData(TemplateRequest const & _aRequest)
- SAL_THROW((com::sun::star::uno::Exception))
-{
- RTL_LOGFILE_CONTEXT_AUTHOR(aLog, "configmgr::backend::CacheController", "jb99855", "configmgr: CacheController::getTemplateData()");
- RTL_LOGFILE_CONTEXT_TRACE2(aLog, "requested template: %s/%s",
- RTL_LOGFILE_OU2A(_aRequest.getComponentName().toString()) ,
- _aRequest.isComponentRequest() ?
- "*" : RTL_LOGFILE_OU2A(_aRequest.getComponentName().toString()) );
-
- configuration::AbsolutePath aTemplateLocation = encodeTemplateLocation(_aRequest.getTemplateName(), _aRequest.getComponentName());
-
- loadTemplate(_aRequest);
- //configuration::AbsolutePath aTemplateLocation = ensureTemplate(_aRequest.getTemplateName(), _aRequest.getComponentName());
-
- sharable::TreeFragment * aTemplateAddr = m_aTemplates.getTemplateTree(aTemplateLocation);
- if (aTemplateAddr == NULL)
- throw uno::Exception(::rtl::OUString::createFromAscii("Unknown template. Type description could not be found in the given module."), NULL);
-
- std::auto_ptr<INode> aResultTree = data::convertTree(aTemplateAddr, true);
-
- TemplateInstance aResult(aResultTree,_aRequest.getTemplateName(), _aRequest.getComponentName());
-
- return ResultHolder< TemplateInstance >(aResult);
-}
-// -----------------------------------------------------------------------------
-
-void CacheController::saveAndNotify(UpdateRequest const & _anUpdate) SAL_THROW((com::sun::star::uno::Exception))
-{
- RTL_LOGFILE_CONTEXT_AUTHOR(aLog, "configmgr::backend::CacheController", "jb99855", "configmgr: CacheController::saveAndNotify()");
- RTL_LOGFILE_CONTEXT_TRACE1(aLog, "location: %s", RTL_LOGFILE_OU2A(_anUpdate.getUpdateRoot().toString()) );
- try
- {
- // ---------- preworking on the changes ----------
- // caller must own a read lock on this cache line
- CFG_TRACE_INFO("CacheController: saving an update for '%s'",OUSTRING2ASCII(_anUpdate.getUpdateRoot().toString()));
-
- rtl::Reference<CacheLoadingAccess> aCache = m_aCacheMap.get(_anUpdate.getOptions());
-
- OSL_ENSURE(aCache.is(), "No cache data to update in saveAndNotify");
-
- if (!aCache.is()) throw lang::DisposedException(rtl::OUString::createFromAscii("Tree to be updated was already disposed"), NULL);
-
- aCache->addChangesToPending(_anUpdate.getUpdate());
-
- if ( _anUpdate.isSyncRequired()|| m_bDisposing ) // cannot do it asynchronously
- {
- CFG_TRACE_INFO_NI("Running synchronous write");
- savePendingChanges( aCache, getComponentRequest(_anUpdate) );
- }
-
- else
- {
- CFG_TRACE_INFO_NI("Posting asynchronous write");
- m_pCacheWriter->scheduleWrite( getComponentRequest(_anUpdate) );
- }
-
- CFG_TRACE_INFO_NI("Notifying the changes");
- // notify the changes to all clients
- m_aNotifier.notifyChanged(_anUpdate);
- }
- catch(configuration::Exception& ex)
- {
- CFG_TRACE_ERROR_NI("Got unexpected exception: %s", ex.what());
- configapi::ExceptionMapper e(ex);
- e.unhandled();
- }
-
-}
-// -----------------------------------------------------------------------------
-
-void CacheController::flushPendingUpdates()SAL_THROW((com::sun::star::uno::Exception))
-{
- CacheMap::Map aFlushList = m_aCacheMap.copy();
-
- for (CacheMap::Map::iterator it = aFlushList.begin(); it != aFlushList.end(); ++it)
- saveAllPendingChanges(it->second,it->first);
-}
-
-void CacheController::flushCacheWriter()SAL_THROW(())
-{
- //OSL_ASSERT(m_bDisposing);
-
- if (m_pCacheWriter)
- {
- CFG_TRACE_INFO("CacheController: flushing all pending updates");
-
- m_pCacheWriter->stopAndWriteCache();
- }
-}
-// -----------------------------------------------------------------------------
-
-bool CacheController::normalizeResult(std::auto_ptr<ISubtree> & _aResult, RequestOptions const & _aOptions)
-{
-
- if (_aResult.get()==NULL) return false;
-
- if (_aOptions.isForAllLocales()) return true;
-
- std::auto_ptr<INode> aReduced = reduceExpandedForLocale(_aResult, _aOptions.getLocale());
-
- std::auto_ptr<ISubtree> aReducedTree;
- if (aReduced.get())
- {
- if (ISubtree* pReducedTree =aReduced->asISubtree())
- {
- aReduced.release();
- aReducedTree.reset(pReducedTree);
- }
- else
- {
- OSL_ENSURE(false, "Tree unexpectedly reduced to non-tree");
- }
- }
- else
- OSL_ENSURE(false, "Tree unexpectedly reduced to nothing");
-
-
- _aResult = aReducedTree;
- bool retCode = _aResult.get()!=NULL ? true : false;
- return retCode;
-}
-// -----------------------------------------------------------------------------
-
-ResultHolder< ComponentInstance > CacheController::loadDirectly(ComponentRequest const & _aRequest, bool _bAddListenter) SAL_THROW((com::sun::star::uno::Exception))
-{
- CFG_TRACE_INFO("CacheController: loading data for component '%s' from the backend", OUSTRING2ASCII(_aRequest.getComponentName()));
-
- configuration::AbsolutePath aRequestPath = configuration::AbsolutePath::makeModulePath(_aRequest.getComponentName());
-
- NodeRequest aNodeRequest(aRequestPath, _aRequest.getOptions());
-
- ResultHolder< ComponentInstance > aResult = m_xBackend->getNodeData(_aRequest, this, _bAddListenter?this:NULL);
-
- OSL_PRECOND(aResult.mutableInstance().mutableData().get(), "loadDirectly: Data must not be NULL");
-
- CFG_TRACE_INFO_NI("- loading data completed - normalizing result");
-
- if (!normalizeResult( aResult.mutableInstance().mutableData(),_aRequest.getOptions()))
- {
- CFG_TRACE_ERROR_NI(" - cannot normalized result: failing");
-
- rtl::OUString sMsg(RTL_CONSTASCII_USTRINGPARAM("Requested data at '"));
- sMsg += aRequestPath.toString();
- sMsg += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("'is not available: "));
-
- throw com::sun::star::container::NoSuchElementException(sMsg,NULL);
- }
-
- CFG_TRACE_INFO_NI(" - returning normalized defaults");
-
- return aResult;
-}
-// -----------------------------------------------------------------------------
-
-ResultHolder< NodeInstance > CacheController::loadDefaultsDirectly(NodeRequest const & _aRequest) SAL_THROW((com::sun::star::uno::Exception))
-{
- CFG_TRACE_INFO("CacheController: loading defaults for '%s' from the backend", OUSTRING2ASCII(_aRequest.getPath().toString()));
-
- ResultHolder< NodeInstance > aResult = m_xBackend->getDefaultData(_aRequest);
-
- CFG_TRACE_INFO_NI("- loading defaultscompleted - normalizing result");
-
- normalizeResult(aResult.mutableInstance().mutableData(),_aRequest.getOptions());
-
- CFG_TRACE_INFO_NI(" - returning normalized defaults");
-
- return aResult;
-}
-// -----------------------------------------------------------------------------
-
-void CacheController::saveDirectly(UpdateRequest const & _anUpdate) SAL_THROW((com::sun::star::uno::Exception))
-{
- m_xBackend->updateNodeData(_anUpdate);
-}
-// -----------------------------------------------------------------------------
-
-void CacheController::savePendingChanges(rtl::Reference<CacheLoadingAccess> const & _aCache, ComponentRequest const & _aComponent) SAL_THROW((com::sun::star::uno::Exception))
-{
- CFG_TRACE_INFO("CacheController: saving updates for tree: '%s'", OUSTRING2ASCII(_aComponent.getComponentName()));
-
- try
- {
- CFG_TRACE_INFO2("CacheController: saving updates for tree: '%s'", OUSTRING2ASCII(_aComponent.getComponentName()));
-
- std::auto_ptr<SubtreeChange> aChangeData = _aCache->releasePendingChanges(_aComponent.getComponentName());
-
- if (aChangeData.get())
- {
- CFG_TRACE_INFO_NI("- found changes - sending to backend");
-
- configuration::AbsolutePath aRootPath = configuration::AbsolutePath::makeModulePath(_aComponent.getComponentName());
-
- backend::UpdateRequest anUpdateSpec(aChangeData.get(),aRootPath,_aComponent.getOptions());
-
- // anUpdateSpec.setRequestId(pInfo->getRequestId(_aRootPath));
-
- this->saveDirectly(anUpdateSpec);
-
- CFG_TRACE_INFO_NI("- saving changes completed successfully");
- }
- else
- CFG_TRACE_WARNING_NI("- no changes found - cannot save");
- }
- catch(uno::Exception& e)
- {
- (void)e;
- CFG_TRACE_ERROR_NI("CacheController: saving tree '%s' failed: %s",
- OUSTRING2ASCII(_aComponent.getComponentName()),
- OUSTRING2ASCII(e.Message) );
-
- refreshComponent(_aComponent);
- CFG_TRACE_INFO_NI("- component data invalidated");
-
- throw;
- }
-}
-// -----------------------------------------------------------------------------
-
-bool CacheController::saveAllPendingChanges(rtl::Reference<CacheLoadingAccess> const & _aCache, RequestOptions const & _aOptions)
- SAL_THROW((com::sun::star::uno::RuntimeException))
-{
- CFG_TRACE_INFO("CacheController: Saving all pending changes for cache line");
- OSL_ASSERT(_aCache.is());
-
- std::vector< rtl::OUString > aPendingModules;
- _aCache->findPendingChangedModules(aPendingModules);
-
- CFG_TRACE_INFO_NI("Found %d changed modules",int(aPendingModules.size()));
-
- bool bSuccess = true;
- for (std::vector< rtl::OUString >::iterator it = aPendingModules.begin();
- it != aPendingModules.end();
- ++it )
- {
- try
- {
- this->savePendingChanges(_aCache, ComponentRequest(*it,_aOptions) );
- }
- catch (uno::Exception & )
- {
- CFG_TRACE_ERROR_NI("CacheController: Exception while saving one module - ignoring");
- bSuccess = false;
- }
- }
- CFG_TRACE_INFO_NI("Done saving pending changes for cache line");
-
- return bSuccess;
-}
-// -----------------------------------------------------------------------------
-
-
-//-----------------------------------------------------------------------------
-void CacheController::freeComponent(ComponentRequest const & _aRequest) SAL_THROW(())
-{
- CFG_TRACE_INFO("CacheController: releasing module '%s' for user '%s' with locale '%s'",
- OUSTRING2ASCII(_aRequest.getComponentName()),
- OUSTRING2ASCII(_aRequest.getOptions().getEntity()),
- OUSTRING2ASCII(_aRequest.getOptions().getLocale()) );
-
- rtl::Reference<CacheLoadingAccess> aCache = m_aCacheMap.get(_aRequest.getOptions());
-
- OSL_ENSURE(aCache.is(), "Releasing a nonexisting module");
-
- if (aCache.is())
- {
- if (aCache->releaseModule(_aRequest.getComponentName()) == 0)
- {
- // start the cleanup
- m_pDisposer->scheduleCleanup(_aRequest.getOptions());
- }
- }
-}
-// -----------------------------------------------------------------------------
-void CacheController::dataChanged(const ComponentRequest& _aRequest) SAL_THROW(())
-{
- refreshComponent(_aRequest);
-}
-// -----------------------------------------------------------------------------
-void CacheController::refreshAllComponents() SAL_THROW((com::sun::star::uno::Exception))
-{
- CacheMap::Map aRefreshList = m_aCacheMap.copy();
-
- for (CacheMap::Map::iterator i = aRefreshList.begin();
- i != aRefreshList.end(); ++i)
- {
- if (!i->second->isEmpty())
- {
- ExtendedCacheData aCacheData = i->second->m_aData;
- RequestOptions aOption = i->first;
- CacheData::ModuleList aModuleList = aCacheData.accessModuleList();
- for (CacheData::ModuleList::iterator itr = aModuleList.begin();
- itr != aModuleList.end(); ++itr)
- {
- //Check the cacheline has atleast one client reference
-
-
- if (itr->second->clientReferences() > 0)
- {
- ComponentRequest aRequest(itr->first,i->first);
- refreshComponent(aRequest);
- } else
- {
- // FIXME: otherwise dispose now
- // XXX: (lo) refresh all, preventing cache corruption.
- // An unused component should be purged from the cache
- // instead of being refreshed
- ComponentRequest aRequest(itr->first,i->first);
- refreshComponent(aRequest);
- }
- }
- }
- }
-}
-
-// -------------------------------------------------------------------------
- } // namespace
-
-// -------------------------------------------------------------------------
-} // namespace