summaryrefslogtreecommitdiff
path: root/configmgr/source/backend/schemabuilder.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/source/backend/schemabuilder.cxx')
-rw-r--r--configmgr/source/backend/schemabuilder.cxx539
1 files changed, 0 insertions, 539 deletions
diff --git a/configmgr/source/backend/schemabuilder.cxx b/configmgr/source/backend/schemabuilder.cxx
deleted file mode 100644
index ec41b5489e2a..000000000000
--- a/configmgr/source/backend/schemabuilder.cxx
+++ /dev/null
@@ -1,539 +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: schemabuilder.cxx,v $
- * $Revision: 1.18 $
- *
- * 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 "schemabuilder.hxx"
-#include "treenodefactory.hxx"
-#include "matchlocale.hxx"
-#include <com/sun/star/configuration/backend/SchemaAttribute.hpp>
-#include <rtl/ustrbuf.hxx>
-
-#ifndef INCLUDED_ALGORITHM
-#include <algorithm>
-#define INCLUDED_ALGORITHM
-#endif
-#ifndef INCLUDED_VECTOR
-#include <vector>
-#define INCLUDED_VECTOR
-#endif
-
-namespace configmgr
-{
-// -----------------------------------------------------------------------------
- namespace backend
- {
-// -----------------------------------------------------------------------------
-
- namespace SchemaAttribute = backenduno::SchemaAttribute;
-// -----------------------------------------------------------------------------
-//#if OSL_DEBUG_LEVEL > 0
-// currently not used in debug builds
-#if 0
- static void check_if_complete(MergedComponentData & md, uno::Reference< uno::XComponentContext > const & xContext)
- {
- uno::Reference< backenduno::XSchemaHandler >
- test(new SchemaBuilder(xContext, rtl::OUString(),md,NULL));
- }
-#endif
-// -----------------------------------------------------------------------------
-
-SchemaBuilder::SchemaBuilder(uno::Reference< uno::XComponentContext > const & xContext, const rtl::OUString& aExpectedComponentName, MergedComponentData & rData, ITemplateDataProvider* aTemplateProvider )
-: m_aData(rData)
-, m_aContext(xContext)
-//, m_aContext(xContext,static_cast<backenduno::XSchemaHandler*>(this), aExpectedComponentName, aTemplateProvider )
-, m_aFactory()
-{
- m_aContext = DataBuilderContext(xContext,static_cast<backenduno::XSchemaHandler*>(this), aExpectedComponentName, aTemplateProvider );
-}
-// -----------------------------------------------------------------------------
-
-SchemaBuilder::~SchemaBuilder( )
-{
-
-}
-// -----------------------------------------------------------------------------
-
-// -----------------------------------------------------------------------------
-// XSchemaHandler
-
-void SAL_CALL SchemaBuilder::startSchema( )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (!this->isDone())
- m_aContext.raiseMalformedDataException("Schema builder: Unexpected Restart of Schema");
-
- m_aData.clear();
-
- OSL_ASSERT(!m_aContext.hasActiveComponent());
- OSL_ASSERT( m_aContext.isDone());
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::endSchema( )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (!this->isDone())
- m_aContext.raiseMalformedDataException("Schema builder: Unexpected End of Schema");
-
- substituteInstances();
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::importComponent( const rtl::OUString& /*aName*/ )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- //OSL_TRACE("WARNING: Configuration schema parser: Cross-component references are not yet supported\n");
-}
-// -----------------------------------------------------------------------------
-
-
-void SAL_CALL SchemaBuilder::startComponent( const rtl::OUString& aName )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (m_aData.hasSchema())
- m_aContext.raiseElementExistException("Schema builder: The component schema is already loaded", rtl::OUString());
-
- m_aContext.startActiveComponent(aName);
-
- std::auto_ptr<ISubtree> apSchema =
- m_aFactory.createGroup(aName,0,getComponentRootAttributes());
-
- ISubtree * pSchema = m_aData.setSchemaRoot(apSchema);
-
- m_aContext.pushNode(pSchema);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::endComponent( )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- m_aContext.popNode();
-
- m_aContext.endActiveComponent();
-}
-// -----------------------------------------------------------------------------
-
-bool SchemaBuilder::isExtensible(sal_Int16 aSchemaAttributes)
-{
- sal_Int16 const aValidAttributes = aSchemaAttributes & SchemaAttribute::EXTENSIBLE;
-
- if (aValidAttributes != aSchemaAttributes)
- m_aContext.raiseIllegalArgumentException("Schema builder: Illegal attribute specified for node.",2);
-
- return (aValidAttributes != 0);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::startGroupTemplate( const backenduno::TemplateIdentifier& aTemplate, sal_Int16 aAttributes )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (aTemplate.Component.getLength() == 0)
- m_aContext.raiseIllegalArgumentException("Schema builder: Starting template without owning component",1);
-
- m_aContext.startActiveComponent(aTemplate.Component);
-
- if (m_aData.hasTemplate(aTemplate.Name))
- m_aContext.raiseElementExistException("Schema builder: Template already exists",aTemplate.Name);
-
- rtl::OUString aName = m_aData.getTemplateAccessor(aTemplate);
- bool bExtensible = isExtensible(aAttributes);
-
- std::auto_ptr<ISubtree> aTemplateTree =
- m_aFactory.createGroup(aName,bExtensible,getTemplateBaseAttributes());
-
- ISubtree * pTree = m_aData.addTemplate(aTemplateTree,aTemplate);
-
- m_aContext.pushNode(pTree);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::startSetTemplate( const backenduno::TemplateIdentifier& aTemplate, sal_Int16 aAttributes, const backenduno::TemplateIdentifier& aItemType )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (aTemplate.Component.getLength() == 0)
- m_aContext.raiseIllegalArgumentException("Schema builder: Starting template without owning component",1);
-
- m_aContext.startActiveComponent(aTemplate.Component);
-
- if (m_aData.hasTemplate(aTemplate.Name))
- m_aContext.raiseElementExistException("Schema builder: Template already exists",aTemplate.Name);
-
- rtl::OUString aName = m_aData.getTemplateAccessor(aTemplate);
- backenduno::TemplateIdentifier aFullType = m_aContext.completeComponent(aItemType);
- bool bExtensible = isExtensible(aAttributes);
-
- std::auto_ptr<ISubtree> aTemplateTree =
- m_aFactory.createSet( aName,aFullType,bExtensible,getTemplateBaseAttributes());
-
- ISubtree * pTree = m_aData.addTemplate(aTemplateTree,aTemplate);
-
- m_aContext.pushNode(pTree);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::endTemplate( )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- m_aContext.popNode();
-
- m_aContext.endActiveComponent();
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::startGroup( const rtl::OUString& aName, sal_Int16 aAttributes )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- bool bExtensible = isExtensible(aAttributes);
-
- std::auto_ptr<ISubtree> aTree = m_aFactory.createGroup(aName,bExtensible,getNodeAttributes());
-
- ISubtree * pTree = m_aContext.addNodeToCurrent(aTree);
-
- m_aContext.pushNode(pTree);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::startSet( const rtl::OUString& aName, sal_Int16 aAttributes, const backenduno::TemplateIdentifier& aItemType )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- backenduno::TemplateIdentifier aFullType = m_aContext.completeComponent(aItemType);
- bool bExtensible = isExtensible(aAttributes);
-
- std::auto_ptr<ISubtree> aTree = m_aFactory.createSet(aName,aFullType,bExtensible,getNodeAttributes());
-
- ISubtree * pTree = m_aContext.addNodeToCurrent(aTree);
-
- m_aContext.pushNode(pTree);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::endNode( )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- m_aContext.popNode();
-
- if (m_aContext.isDone())
- m_aContext.raiseMalformedDataException("Schema builder: Incorrect Termination");
-}
-// -----------------------------------------------------------------------------
-
-node::Attributes SchemaBuilder::makePropertyAttributes(sal_Int16 aSchemaAttributes) const
-{
- const sal_uInt16 c_AllPropertyAttributes =
- SchemaAttribute::REQUIRED | SchemaAttribute::LOCALIZED;
-
- if ((aSchemaAttributes & c_AllPropertyAttributes) != aSchemaAttributes)
- m_aContext.raiseIllegalArgumentException("SchemaBuilder: Unreckognized Attribute for Property",2);
-
- node::Attributes aAttributes = getNodeAttributes();
-
- if (aSchemaAttributes & SchemaAttribute::REQUIRED)
- aAttributes.setNullable (false);
-
- return aAttributes;
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::addProperty( const rtl::OUString& aName, sal_Int16 aAttributes, const uno::Type& aType )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- // TODO: add type validation
- node::Attributes aValueAttributes = makePropertyAttributes(aAttributes);
-
- if (aAttributes & SchemaAttribute::LOCALIZED)
- {
- std::auto_ptr<ISubtree> aLocalizedProp =
- m_aFactory.createLocalizedContainer(aName,aType,aValueAttributes);
-
- m_aContext.addLocalizedToCurrent(aLocalizedProp);
- }
- else
- {
- std::auto_ptr<ValueNode> aPropertyValue =
- m_aFactory.getNodeFactory().createNullValueNode(aName,aType,aValueAttributes);
-
- m_aContext.addPropertyToCurrent(aPropertyValue);
- }
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::addPropertyWithDefault( const rtl::OUString& aName, sal_Int16 aAttributes, const uno::Any& aDefaultValue )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- // TODO: add parameter validation
- node::Attributes aValueAttributes = makePropertyAttributes(aAttributes);
-
- if (aAttributes & SchemaAttribute::LOCALIZED)
- {
- std::auto_ptr<ISubtree> aLocalizedProp =
- m_aFactory.createLocalizedContainer(aName,aDefaultValue.getValueType(),aValueAttributes);
-
- std::auto_ptr<ValueNode> aPropertyValue =
- m_aFactory.getNodeFactory().createValueNode(localehelper::getDefaultLanguage(),aDefaultValue,aValueAttributes);
-
- aLocalizedProp->addChild( base_ptr(aPropertyValue) );
-
- m_aContext.addLocalizedToCurrent(aLocalizedProp);
- }
- else
- {
- std::auto_ptr<ValueNode> aPropertyValue =
- m_aFactory.getNodeFactory().createValueNode(aName,aDefaultValue,aValueAttributes);
-
-
- m_aContext.addPropertyToCurrent( aPropertyValue);
- }
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::addInstance( const rtl::OUString& aName, const backenduno::TemplateIdentifier& aTemplate )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- backenduno::TemplateIdentifier aFullType = m_aContext.completeComponent(aTemplate);
-
- std::auto_ptr<ISubtree> aPlaceHolder =
- m_aFactory.createPlaceHolder(aName,aFullType);
-
- m_aContext.addNodeToCurrent(aPlaceHolder);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL SchemaBuilder::addItemType( const backenduno::TemplateIdentifier& aItemType )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if ( m_aContext.getCurrentParent().getElementTemplateName() != aItemType.Name ||
- m_aContext.getCurrentParent().getElementTemplateModule() != m_aContext.getTemplateComponent(aItemType) )
- {
- OSL_ENSURE(false, "SchemaBuilder: Multiple ItemTypes for Sets are currently not supported");
- m_aContext.raiseMalformedDataException("SchemaBuilder: Unsupported Feature: Multiple ItemTypes for Sets");
- }
-}
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-
-node::Attributes SchemaBuilder::getNodeAttributes() const
-{
- node::Attributes aResult = m_aContext.getCurrentAttributes();
- aResult.setState( node::isDefault );
- return aResult;
-}
-// -----------------------------------------------------------------------------
-
-node::Attributes SchemaBuilder::getComponentRootAttributes()
-{
- node::Attributes aResult;
- aResult.setState( node::isDefault );
- return aResult;
-}
-// -----------------------------------------------------------------------------
-
-node::Attributes SchemaBuilder::getTemplateBaseAttributes()
-{
- node::Attributes aResult;
- aResult.setState( node::isReplaced );
- return aResult;
-}
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-
-namespace
-{
- class SubstitutionHelper : NodeModification
- {
- MergedComponentData & m_rData;
- DataBuilderContext m_aContext;
- ComponentDataFactory m_aFactory;
-
- std::vector< rtl::OUString > m_aReplacementList;
- std::vector< ISubtree const * > m_aTemplateStack;
- public:
- SubstitutionHelper(DataBuilderContext const & aBaseContext, MergedComponentData & _rData, uno::XInterface * _pContext)
- : m_rData(_rData)
- , m_aContext(aBaseContext,_pContext)
- , m_aReplacementList()
- , m_aTemplateStack()
- {}
-
- void substituteInData();
- private:
- void substituteInComponent(ISubtree * _pComponent);
- void substituteInNode(ISubtree & _rNode);
- void substituteInList();
-
- void substitute(rtl::OUString const & _aName);
-
- virtual void handle(ValueNode&);
- virtual void handle(ISubtree&);
- };
-}
-// -----------------------------------------------------------------------------
-
-void SchemaBuilder::substituteInstances()
-{
- SubstitutionHelper helper(m_aContext, m_aData, static_cast<backenduno::XSchemaHandler*>(this));
-
- helper.substituteInData();
-}
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-namespace
-{
-// -----------------------------------------------------------------------------
- void SubstitutionHelper::substituteInData()
- {
- if (m_rData.hasTemplates())
- substituteInComponent(m_rData.getTemplatesTree());
-
- if (m_rData.hasSchema())
- substituteInComponent(m_rData.getSchemaTree());
- }
- // -----------------------------------------------------------------------------
-
- void SubstitutionHelper::substituteInComponent(ISubtree * _pComponent)
- {
- OSL_ENSURE(_pComponent,"ERROR: Trying to substitute in NULL component");
-
- if (_pComponent)
- {
- m_aContext.startActiveComponent(_pComponent->getName());
- this->substituteInNode(*_pComponent);
- m_aContext.endActiveComponent();
- }
- }
- // -----------------------------------------------------------------------------
-
- void SubstitutionHelper::substituteInNode(ISubtree & _rNode)
- {
- std::vector< rtl::OUString > aSaveInstances;
- aSaveInstances.swap(m_aReplacementList);
-
- // todo: own stack to check against infinite recursion
- m_aContext.pushNode(&_rNode);
-
- this->applyToChildren(_rNode); // fill the list
-
- this->substituteInList();
-
- m_aContext.popNode();
-
- aSaveInstances.swap(m_aReplacementList);
- }
- // -----------------------------------------------------------------------------
-
- void SubstitutionHelper::substituteInList()
- {
- for(std::vector< rtl::OUString >::iterator it = m_aReplacementList.begin();
- it != m_aReplacementList.end(); ++it)
- {
- this->substitute(*it);
- }
- }
- // -----------------------------------------------------------------------------
-
- void SubstitutionHelper::substitute(rtl::OUString const & _aName)
- {
-
- ISubtree & rParent = m_aContext.getCurrentParent();
-
- std::auto_ptr<INode> pReplacedNode = rParent.removeChild(_aName);
- OSL_ASSERT( pReplacedNode.get() != NULL );
-
- ISubtree * pReplacedInstance = pReplacedNode->asISubtree();
- OSL_ASSERT( pReplacedInstance != NULL );
-
- backenduno::TemplateIdentifier aTemplateName = m_aFactory.getInstanceType(*pReplacedInstance);
- if (aTemplateName.Component == m_aContext.getActiveComponent())
- {
- if (ISubtree const * pTemplate = m_rData.findTemplate(aTemplateName.Name))
- {
- std::vector< ISubtree const * >::iterator beg = m_aTemplateStack.begin(), end = m_aTemplateStack.end();
- if (std::find(beg,end,pTemplate) != end)
- m_aContext.raiseMalformedDataException("SchemaBuilder: Could not expand instances: Template is recursive");
-
- m_aTemplateStack.push_back(pTemplate);
-
- std::auto_ptr< INode > pTemplateInstance = pTemplate->clone();
-
- pTemplateInstance->setName(_aName);
- // TODO: adjust state/attributes here (?)
-
- ISubtree * pAddedTree = rParent.addChild(pTemplateInstance)->asISubtree();
-
- OSL_ENSURE(pAddedTree, "Could not obtain added template instance");
-
- this->substituteInNode(*pAddedTree);
-
- m_aTemplateStack.pop_back();
- }
- else
- {
- m_aContext.raiseMalformedDataException("SchemaBuilder: Could not expand instances: Template not found");
- }
- }
- //Import Template from different component
- else
- {
- TemplateRequest aTemplateRequest(aTemplateName.Name,
- aTemplateName.Component );
- ResultHolder< TemplateInstance > aResult = m_aContext.getTemplateData( aTemplateRequest );
-
- std::auto_ptr<INode> pTemplateInstance = aResult.extractDataAndClear();
- pTemplateInstance->setName(_aName);
-
- // Add template instance - must be a tree as any template
- OSL_VERIFY(
- rParent.addChild(pTemplateInstance)->asISubtree() );
- }
- }
- // -----------------------------------------------------------------------------
-
- void SubstitutionHelper::handle(ValueNode&)
- {
- }
- // -----------------------------------------------------------------------------
-
- void SubstitutionHelper::handle(ISubtree& _rTree)
- {
- if (m_aFactory.isInstancePlaceHolder(_rTree))
- m_aReplacementList.push_back(_rTree.getName());
-
- else
- substituteInNode(_rTree);
- }
-// -----------------------------------------------------------------------------
-}
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
- } // namespace backend
-
-// -------------------------------------------------------------------------
-} // namespace configmgr