diff options
Diffstat (limited to 'configmgr/source/treemgr/treeimpl.cxx')
-rw-r--r-- | configmgr/source/treemgr/treeimpl.cxx | 129 |
1 files changed, 82 insertions, 47 deletions
diff --git a/configmgr/source/treemgr/treeimpl.cxx b/configmgr/source/treemgr/treeimpl.cxx index 732a1d7b66b8..f75266d87130 100644 --- a/configmgr/source/treemgr/treeimpl.cxx +++ b/configmgr/source/treemgr/treeimpl.cxx @@ -2,9 +2,9 @@ * * $RCSfile: treeimpl.cxx,v $ * - * $Revision: 1.18 $ + * $Revision: 1.19 $ * - * last change: $Author: jb $ $Date: 2001-06-21 12:02:38 $ + * last change: $Author: jb $ $Date: 2001-07-05 17:05:51 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -86,7 +86,7 @@ inline static Name nodeName(INode const& aNode) { - return Name(aNode.getName(),Name::NoValidate()); + return makeName(aNode.getName(),Name::NoValidate()); } //----------------------------------------------------------------------------- // class TreeImplBuilder - friend of TreeImpl @@ -284,35 +284,40 @@ void TreeImpl::disposeData() } //----------------------------------------------------------------------------- -void ElementTreeImpl::doGetPathRoot(Path::Components& rPath) const +void ElementTreeImpl::doFinishRootPath(Path::Rep& rPath) const { - rPath = AbsolutePath::detachedRoot().components(); + rPath.prepend( doGetRootName() ); + rPath.prepend( AbsolutePath::detachedRoot().rep() ); } //----------------------------------------------------------------------------- -void RootTreeImpl::doGetPathRoot(Path::Components& rPath) const +void RootTreeImpl::doFinishRootPath(Path::Rep& rPath) const { - rPath = m_aContextPath.components(); + rPath.prepend( m_aRootPath.rep() ); } //----------------------------------------------------------------------------- -void TreeImpl::implGetContextPath(Path::Components& rPath) const + +void TreeImpl::implPrependRootPath(Path::Rep& rPath) const { if (m_pParentTree) { + rPath.prepend( doGetRootName() ); OSL_ASSERT(m_nParentNode); - m_pParentTree->implGetContextPath(rPath); - m_pParentTree->appendPathTo(m_nParentNode,rPath); + m_pParentTree->prependLocalPathTo(m_nParentNode,rPath); + m_pParentTree->implPrependRootPath(rPath); } else - doGetPathRoot(rPath); + { + doFinishRootPath( rPath ); + } } //----------------------------------------------------------------------------- -AbsolutePath TreeImpl::getContextPath() const +AbsolutePath TreeImpl::getRootPath() const { - Path::Components aPath; - implGetContextPath(aPath); + Path::Rep aPath; + implPrependRootPath(aPath); return AbsolutePath(aPath); } //----------------------------------------------------------------------------- @@ -473,7 +478,7 @@ void TreeImpl::recoverFailedCommit(SubtreeChange& rRootChange) void TreeImpl::adjustToChanges(NodeChangesInformation& rLocalChanges, SubtreeChange const& aExternalChange) { - OSL_PRECOND( getRootName().toString() == aExternalChange.getNodeName(), "Name of change does not match actual node" ); + OSL_PRECOND( getSimpleRootName().toString() == aExternalChange.getNodeName(), "Name of change does not match actual node" ); TreeDepth nDepth = getAvailableDepth(); @@ -484,7 +489,7 @@ void TreeImpl::adjustToChanges(NodeChangesInformation& rLocalChanges, SubtreeCha void TreeImpl::adjustToChanges(NodeChangesInformation& rLocalChanges, NodeOffset nNode, SubtreeChange const& aExternalChange) { OSL_PRECOND( isValidNode(nNode), "ERROR: Valid node required for adjusting to changes" ); - OSL_PRECOND( getNodeName(nNode).toString() == aExternalChange.getNodeName(), "Name of change does not match actual node" ); + OSL_PRECOND( getSimpleNodeName(nNode).toString() == aExternalChange.getNodeName(), "Name of change does not match actual node" ); TreeDepth nDepth = remainingDepth(getAvailableDepth(),depthTo(nNode)); @@ -531,7 +536,7 @@ void TreeImpl::doFinishCommit(SubtreeChange& rSubtreeChange, NodeOffset nNode) OSL_ASSERT(isValidNode(nNode)); Node* pNode = node(nNode); - OSL_ENSURE(rSubtreeChange.getNodeName() == getNodeName(nNode).toString(), "ERROR: Change name does not match node"); + OSL_ENSURE(rSubtreeChange.getNodeName() == getSimpleNodeName(nNode).toString(), "ERROR: Change name does not match node"); if (pNode->isSetNode()) { OSL_ENSURE(rSubtreeChange.isSetNodeChange(),"ERROR: Change type GROUP does not match set"); @@ -555,7 +560,7 @@ void TreeImpl::doRevertCommit(SubtreeChange& rSubtreeChange, NodeOffset nNode) OSL_ASSERT(isValidNode(nNode)); Node* pNode = node(nNode); - OSL_ENSURE(rSubtreeChange.getNodeName() == getNodeName(nNode).toString(), "ERROR: Change name does not match node"); + OSL_ENSURE(rSubtreeChange.getNodeName() == getSimpleNodeName(nNode).toString(), "ERROR: Change name does not match node"); if (pNode->isSetNode()) { OSL_ENSURE(rSubtreeChange.isSetNodeChange(),"ERROR: Change type GROUP does not match set"); @@ -579,7 +584,7 @@ void TreeImpl::doFailedCommit(SubtreeChange& rSubtreeChange, NodeOffset nNode) OSL_ASSERT(isValidNode(nNode)); Node* pNode = node(nNode); - OSL_ENSURE(rSubtreeChange.getNodeName() == getNodeName(nNode).toString(), "ERROR: Change name does not match node"); + OSL_ENSURE(rSubtreeChange.getNodeName() == getSimpleNodeName(nNode).toString(), "ERROR: Change name does not match node"); if (pNode->isSetNode()) { OSL_ENSURE(rSubtreeChange.isSetNodeChange(),"ERROR: Change type GROUP does not match set"); @@ -603,7 +608,7 @@ void TreeImpl::doAdjustToChanges(NodeChangesInformation& rLocalChanges, SubtreeC OSL_ASSERT(isValidNode(nNode)); Node* pNode = node(nNode); - OSL_ENSURE(rSubtreeChange.getNodeName() == getNodeName(nNode).toString(), "ERROR: Change name does not match node"); + OSL_ENSURE(rSubtreeChange.getNodeName() == getSimpleNodeName(nNode).toString(), "ERROR: Change name does not match node"); if (pNode->isSetNode()) { @@ -653,7 +658,7 @@ void TreeImpl::doFinishSubCommitted(SubtreeChange& aChangesParent, NodeOffset nP { if ( it->ISA(SubtreeChange) ) { - NodeOffset nNode = findChild(nParentNode, Name(it->getNodeName(), Name::NoValidate()) ); + NodeOffset nNode = findChild(nParentNode, makeNodeName(it->getNodeName(), Name::NoValidate()) ); OSL_ENSURE( nNode != 0, "Changed sub-node not found in tree"); doFinishCommit(static_cast<SubtreeChange&>(*it),nNode); @@ -661,7 +666,7 @@ void TreeImpl::doFinishSubCommitted(SubtreeChange& aChangesParent, NodeOffset nP else { OSL_ENSURE(it->ISA(ValueChange), "Unexpected change type for child of group node; change is ignored"); - OSL_ENSURE(0 == findChild(nParentNode, Name(it->getNodeName(), Name::NoValidate())), + OSL_ENSURE(0 == findChild(nParentNode, makeNodeName(it->getNodeName(), Name::NoValidate())), "Found sub(tree) node where a value was expected"); } } @@ -678,7 +683,7 @@ void TreeImpl::doRevertSubCommitted(SubtreeChange& aChangesParent, NodeOffset nP { if ( it->ISA(SubtreeChange) ) { - NodeOffset nNode = findChild(nParentNode, Name(it->getNodeName(), Name::NoValidate()) ); + NodeOffset nNode = findChild(nParentNode, makeNodeName(it->getNodeName(), Name::NoValidate()) ); OSL_ENSURE( nNode != 0, "Changed sub-node not found in tree"); doRevertCommit(static_cast<SubtreeChange&>(*it),nNode); @@ -686,7 +691,7 @@ void TreeImpl::doRevertSubCommitted(SubtreeChange& aChangesParent, NodeOffset nP else { OSL_ENSURE(it->ISA(ValueChange), "Unexpected change type for child of group node; change is ignored"); - OSL_ENSURE(0 == findChild(nParentNode, Name(it->getNodeName(), Name::NoValidate())), + OSL_ENSURE(0 == findChild(nParentNode, makeNodeName(it->getNodeName(), Name::NoValidate())), "Found sub(tree) node where a value was expected"); } } @@ -703,7 +708,7 @@ void TreeImpl::doFailedSubCommitted(SubtreeChange& aChangesParent, NodeOffset nP { if ( it->ISA(SubtreeChange) ) { - NodeOffset nNode = findChild(nParentNode, Name(it->getNodeName(), Name::NoValidate()) ); + NodeOffset nNode = findChild(nParentNode, makeNodeName(it->getNodeName(), Name::NoValidate()) ); OSL_ENSURE( nNode != 0, "Changed node not found in tree"); doFailedCommit(static_cast<SubtreeChange&>(*it),nNode); @@ -711,7 +716,7 @@ void TreeImpl::doFailedSubCommitted(SubtreeChange& aChangesParent, NodeOffset nP else { OSL_ENSURE(it->ISA(ValueChange), "Unexpected change type for child of group node; change is ignored"); - OSL_ENSURE(0 == findChild(nParentNode, Name(it->getNodeName(), Name::NoValidate())), + OSL_ENSURE(0 == findChild(nParentNode, makeNodeName(it->getNodeName(), Name::NoValidate())), "Found sub(tree) node where a value was expected"); } } @@ -729,7 +734,7 @@ void TreeImpl::doAdjustToSubChanges(NodeChangesInformation& rLocalChanges, Subtr { if ( it->ISA(SubtreeChange) ) { - NodeOffset nNode = findChild(nParentNode, Name(it->getNodeName(), Name::NoValidate()) ); + NodeOffset nNode = findChild(nParentNode, makeNodeName(it->getNodeName(), Name::NoValidate()) ); OSL_ENSURE( nNode != 0 || depthTo(nParentNode) >= getAvailableDepth(), "Changed node not found in tree"); if (nNode != 0) @@ -741,7 +746,7 @@ void TreeImpl::doAdjustToSubChanges(NodeChangesInformation& rLocalChanges, Subtr else { OSL_ENSURE(it->ISA(ValueChange), "Unexpected change type for child of group node; change is ignored"); - OSL_ENSURE(0 == findChild(nParentNode, Name(it->getNodeName(), Name::NoValidate())), + OSL_ENSURE(0 == findChild(nParentNode, makeNodeName(it->getNodeName(), Name::NoValidate())), "Found sub(tree) node where a value was expected"); } } @@ -757,7 +762,7 @@ NodeOffset TreeImpl::parent(NodeOffset nNode) const return node(nNode)->parent(); } //----------------------------------------------------------------------------- -inline // is private +inline // is protected and should be used only here Name TreeImpl::implGetOriginalName(NodeOffset nNode) const { OSL_ASSERT(isValidNode(nNode)); @@ -766,18 +771,37 @@ Name TreeImpl::implGetOriginalName(NodeOffset nNode) const } //----------------------------------------------------------------------------- +Path::Component ElementTreeImpl::doGetRootName() const +{ + return makeExtendedName( implGetOriginalName( root() ) ); +} + +//----------------------------------------------------------------------------- -Name TreeImpl::getNodeName(NodeOffset nNode) const +Path::Component RootTreeImpl::doGetRootName() const { - if (nNode == root()) return getRootName(); + return m_aRootPath.getLocalName(); +} +//----------------------------------------------------------------------------- + + +Name TreeImpl::getSimpleNodeName(NodeOffset nNode) const +{ + if (nNode == root()) return getSimpleRootName(); return implGetOriginalName(nNode); } //----------------------------------------------------------------------------- -Name TreeImpl::getRootName() const +Name TreeImpl::getSimpleRootName() const +{ + return doGetRootName().getName(); +} +//----------------------------------------------------------------------------- + +Path::Component TreeImpl::getExtendedRootName() const { - return implGetOriginalName(root()); + return doGetRootName(); } //----------------------------------------------------------------------------- @@ -795,19 +819,17 @@ TreeDepth TreeImpl::depthTo(NodeOffset nNode) const } //----------------------------------------------------------------------------- -void TreeImpl::appendPathTo(NodeOffset nNode, Path::Components& rNames) +void TreeImpl::prependLocalPathTo(NodeOffset nNode, Path::Rep& rNames) { - // nNode == 0 is handled correctly ... - OSL_ASSERT(nNode == 0 || isValidNode(nNode)); - - Path::Components::size_type nStart = rNames.size(); + OSL_ASSERT(isValidNode(nNode)); - for (; nNode != 0; nNode = parent(nNode) ) + for (; nNode != root(); nNode = parent(nNode) ) { OSL_ENSURE( isValidNode(nNode), "ERROR: Configuration: node has invalid parent"); - rNames.push_back( getNodeName(nNode) ); + rNames.prepend( Path::wrapSimpleName( implGetOriginalName(nNode) ) ); } - std::reverse(rNames.begin() + nStart, rNames.end()); + + OSL_ASSERT(nNode == root()); } //----------------------------------------------------------------------------- @@ -847,7 +869,7 @@ NodeOffset TreeImpl::findChild(NodeOffset nParent, Name const& aName) const NodeOffset const nAfterLast = nodeCount() + root(); while (++nPos < nAfterLast) { - if(parent(nPos) == nParent && getNodeName(nPos) == aName) + if(parent(nPos) == nParent && implGetOriginalName(nPos) == aName) return nPos; } return 0; @@ -961,12 +983,15 @@ ElementTreeImpl const* RootTreeImpl::doCastToElementTree() const //----------------------------------------------------------------------------- RootTreeImpl::RootTreeImpl( NodeFactory& rNodeFactory, - AbsolutePath const& aContextPath, + AbsolutePath const& aRootPath, ISubtree& rCacheNode, TreeDepth nDepth, TemplateProvider const& aTemplateProvider) : TreeImpl() -, m_aContextPath(aContextPath) +, m_aRootPath(aRootPath) { + OSL_ENSURE( aRootPath.getLocalName().getName().toString() == rCacheNode.getName(), + "Constructing root node: Path does not match node name"); + TreeImpl::build(rNodeFactory,rCacheNode,nDepth,aTemplateProvider); } //----------------------------------------------------------------------------- @@ -1029,6 +1054,16 @@ void ElementTreeImpl::disposeData() } //----------------------------------------------------------------------------- +Path::Component ElementTreeImpl::makeExtendedName(Name const& _aSimpleName) const +{ + OSL_ENSURE(this->isTemplateInstance(), "ElementTree: Cannot discover the type this instantiatiates"); + + Name aTypeName = this->isTemplateInstance() ? this->getTemplate()->getName() : Name(); + + return Path::makeCompositeName(_aSimpleName, aTypeName); +} +//----------------------------------------------------------------------------- + // ownership handling //----------------------------------------------------------------------------- @@ -1039,7 +1074,7 @@ void ElementTreeImpl::attachTo(ISubtree& rOwningSet, Name const& aElementName) if (m_pOwnedNode) { - OSL_ENSURE(this->getRootName() == aElementName,"ElementTree: Attaching with unexpected element name"); + OSL_ENSURE(this->getSimpleRootName() == aElementName,"ElementTree: Attaching with unexpected element name"); m_pOwnedNode->setName(aElementName.toString()); std::auto_ptr<INode> aNode(m_pOwnedNode); @@ -1056,7 +1091,7 @@ void ElementTreeImpl::detachFrom(ISubtree& rOwningSet, Name const& aElementName) OSL_ENSURE(!m_pOwnedNode,"ERROR: Cannot detach a already owned node from a subtree"); if (!m_pOwnedNode) { - OSL_ENSURE(this->getRootName() == aElementName,"ElementTree: Detaching with unexpected element name"); + OSL_ENSURE(this->getSimpleRootName() == aElementName,"ElementTree: Detaching with unexpected element name"); std::auto_ptr<INode> aNode( rOwningSet.removeChild(aElementName.toString()) ); OSL_ENSURE(aNode.get(),"ERROR: Detached node not found in the given subtree"); @@ -1083,7 +1118,7 @@ void ElementTreeImpl::releaseTo(std::auto_ptr<INode>& rNewOwner) OSL_ENSURE(m_pOwnedNode,"ERROR: Cannot release a non-owned node"); if (m_pOwnedNode) { - Name aNodeName = getRootName(); + Name aNodeName = getSimpleRootName(); m_pOwnedNode->setName( aNodeName.toString() ); } |