blob: 9be4b6e922f0382f1a61569be4e5fd0a39e1ad50 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_forms.hxx"
#ifndef FORMS_SOURCE_XFORMS_DATATYPEREPOSITORY_HXX
#include "datatyperepository.hxx"
#endif
#include "datatypes.hxx"
#ifndef _FRM_RESOURCE_HRC_
#include "frm_resource.hrc"
#endif
#include "frm_resource.hxx"
#include "frm_strings.hxx"
#ifndef _FRM_PROPERTY_HRC_
#include "property.hrc"
#endif
/** === begin UNO includes === **/
/** === end UNO includes === **/
#include <tools/debug.hxx>
#include <comphelper/enumhelper.hxx>
#include <functional>
#include <algorithm>
//........................................................................
namespace xforms
{
//........................................................................
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::RuntimeException;
using ::com::sun::star::uno::Any;
using ::com::sun::star::uno::Type;
using ::com::sun::star::uno::makeAny;
using ::com::sun::star::uno::Sequence;
using ::com::sun::star::util::VetoException;
using ::com::sun::star::container::NoSuchElementException;
using ::com::sun::star::container::ElementExistException;
using ::com::sun::star::container::XEnumeration;
using ::com::sun::star::lang::WrappedTargetException;
using ::com::sun::star::xsd::XDataType;
using namespace frm;
//====================================================================
//= ODataTypeRepository
//====================================================================
DBG_NAME( ODataTypeRepository )
//--------------------------------------------------------------------
ODataTypeRepository::ODataTypeRepository( )
{
DBG_CTOR( ODataTypeRepository, NULL );
// insert some basic types
::rtl::OUString sName( FRM_RES_STRING( RID_STR_DATATYPE_STRING ) );
m_aRepository[ sName ] = new OStringType( sName, ::com::sun::star::xsd::DataTypeClass::STRING );
sName = FRM_RES_STRING( RID_STR_DATATYPE_URL );
m_aRepository[ sName ] = new OStringType( sName, ::com::sun::star::xsd::DataTypeClass::anyURI );
sName = FRM_RES_STRING( RID_STR_DATATYPE_BOOLEAN );
m_aRepository[ sName ] = new OBooleanType( sName );
sName = FRM_RES_STRING( RID_STR_DATATYPE_DECIMAL );
m_aRepository[ sName ] = new ODecimalType( sName, ::com::sun::star::xsd::DataTypeClass::DECIMAL );
sName = FRM_RES_STRING( RID_STR_DATATYPE_FLOAT );
m_aRepository[ sName ] = new ODecimalType( sName, ::com::sun::star::xsd::DataTypeClass::FLOAT );
sName = FRM_RES_STRING( RID_STR_DATATYPE_DOUBLE );
m_aRepository[ sName ] = new ODecimalType( sName, ::com::sun::star::xsd::DataTypeClass::DOUBLE );
sName = FRM_RES_STRING( RID_STR_DATATYPE_DATE );
m_aRepository[ sName ] = new ODateType( sName );
sName = FRM_RES_STRING( RID_STR_DATATYPE_TIME );
m_aRepository[ sName ] = new OTimeType( sName );
sName = FRM_RES_STRING( RID_STR_DATATYPE_DATETIME );
m_aRepository[ sName ] = new ODateTimeType( sName );
sName = FRM_RES_STRING( RID_STR_DATATYPE_YEAR );
m_aRepository[ sName ] = new OShortIntegerType( sName, ::com::sun::star::xsd::DataTypeClass::gYear );
sName = FRM_RES_STRING( RID_STR_DATATYPE_MONTH );
m_aRepository[ sName ] = new OShortIntegerType( sName, ::com::sun::star::xsd::DataTypeClass::gMonth );
sName = FRM_RES_STRING( RID_STR_DATATYPE_DAY );
m_aRepository[ sName ] = new OShortIntegerType( sName, ::com::sun::star::xsd::DataTypeClass::gDay );
}
//--------------------------------------------------------------------
ODataTypeRepository::~ODataTypeRepository( )
{
DBG_DTOR( ODataTypeRepository, NULL );
}
//--------------------------------------------------------------------
ODataTypeRepository::Repository::iterator ODataTypeRepository::implLocate( const ::rtl::OUString& _rName, bool _bAllowMiss ) SAL_THROW( ( NoSuchElementException ) )
{
Repository::iterator aTypePos = m_aRepository.find( _rName );
if ( aTypePos == m_aRepository.end() && !_bAllowMiss )
throw NoSuchElementException( ::rtl::OUString(), *this );
return aTypePos;
}
//--------------------------------------------------------------------
Reference< XDataType > SAL_CALL ODataTypeRepository::getBasicDataType( sal_Int16 dataTypeClass ) throw (NoSuchElementException, RuntimeException)
{
Reference< XDataType > xReturn;
for ( Repository::const_iterator lookup = m_aRepository.begin();
( lookup != m_aRepository.end() ) && ! xReturn.is();
++lookup
)
{
if ( lookup->second->getIsBasic() && ( lookup->second->getTypeClass() == dataTypeClass ) )
xReturn = lookup->second.get();
}
if ( !xReturn.is() )
throw NoSuchElementException( ::rtl::OUString(), *this );
return xReturn;
}
//--------------------------------------------------------------------
Reference< XDataType > SAL_CALL ODataTypeRepository::cloneDataType( const ::rtl::OUString& sourceName, const ::rtl::OUString& newName ) throw (NoSuchElementException, ElementExistException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
Repository::iterator aTypePos = implLocate( newName, true );
if ( aTypePos != m_aRepository.end() )
throw ElementExistException( ::rtl::OUString(), *this );
aTypePos = implLocate( sourceName );
OXSDDataType* pClone = aTypePos->second->clone( newName );
m_aRepository[ newName ] = pClone;
return pClone;
}
//--------------------------------------------------------------------
void SAL_CALL ODataTypeRepository::revokeDataType( const ::rtl::OUString& typeName ) throw (NoSuchElementException, VetoException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
Repository::iterator aTypePos = implLocate( typeName );
if ( aTypePos->second->getIsBasic() )
throw VetoException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "This is a built-in type and cannot be removed." ) ), *this );
// TODO: localize this error message
m_aRepository.erase( aTypePos );
}
//--------------------------------------------------------------------
Reference< XDataType > SAL_CALL ODataTypeRepository::getDataType( const ::rtl::OUString& typeName ) throw (NoSuchElementException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
return implLocate( typeName, false )->second.get();
}
//--------------------------------------------------------------------
Reference< XEnumeration > SAL_CALL ODataTypeRepository::createEnumeration( ) throw (RuntimeException)
{
return new ::comphelper::OEnumerationByName( this );
}
//--------------------------------------------------------------------
Any SAL_CALL ODataTypeRepository::getByName( const ::rtl::OUString& aName ) throw (NoSuchElementException, WrappedTargetException, RuntimeException)
{
return makeAny( getDataType( aName ) );
}
//--------------------------------------------------------------------
Sequence< ::rtl::OUString > SAL_CALL ODataTypeRepository::getElementNames( ) throw (RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
Sequence< ::rtl::OUString > aNames( m_aRepository.size() );
::std::transform(
m_aRepository.begin(),
m_aRepository.end(),
aNames.getArray(),
::std::select1st< Repository::value_type >()
);
return aNames;
}
//--------------------------------------------------------------------
sal_Bool SAL_CALL ODataTypeRepository::hasByName( const ::rtl::OUString& aName ) throw (RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
return m_aRepository.find( aName ) != m_aRepository.end();
}
//--------------------------------------------------------------------
Type SAL_CALL ODataTypeRepository::getElementType( ) throw (RuntimeException)
{
return ::getCppuType( static_cast< Reference< XDataType >* >( NULL ) );
}
//--------------------------------------------------------------------
sal_Bool SAL_CALL ODataTypeRepository::hasElements( ) throw (RuntimeException)
{
return !m_aRepository.empty();
}
//--------------------------------------------------------------------
// type specific implementation of registerProperties, using explicit
// template instantiations
template<>
void OValueLimitedType<com::sun::star::util::Date>::registerProperties()
{
OValueLimitedType_Base::registerProperties();
REGISTER_VOID_PROP( XSD_MAX_INCLUSIVE_DATE, m_aMaxInclusive, ValueType );
REGISTER_VOID_PROP( XSD_MAX_EXCLUSIVE_DATE, m_aMaxExclusive, ValueType );
REGISTER_VOID_PROP( XSD_MIN_INCLUSIVE_DATE, m_aMinInclusive, ValueType );
REGISTER_VOID_PROP( XSD_MIN_EXCLUSIVE_DATE, m_aMinExclusive, ValueType );
}
template<>
void OValueLimitedType<com::sun::star::util::Time>::registerProperties()
{
OValueLimitedType_Base::registerProperties();
REGISTER_VOID_PROP( XSD_MAX_INCLUSIVE_TIME, m_aMaxInclusive, ValueType );
REGISTER_VOID_PROP( XSD_MAX_EXCLUSIVE_TIME, m_aMaxExclusive, ValueType );
REGISTER_VOID_PROP( XSD_MIN_INCLUSIVE_TIME, m_aMinInclusive, ValueType );
REGISTER_VOID_PROP( XSD_MIN_EXCLUSIVE_TIME, m_aMinExclusive, ValueType );
}
template<>
void OValueLimitedType<com::sun::star::util::DateTime>::registerProperties()
{
OValueLimitedType_Base::registerProperties();
REGISTER_VOID_PROP( XSD_MAX_INCLUSIVE_DATE_TIME, m_aMaxInclusive, ValueType );
REGISTER_VOID_PROP( XSD_MAX_EXCLUSIVE_DATE_TIME, m_aMaxExclusive, ValueType );
REGISTER_VOID_PROP( XSD_MIN_INCLUSIVE_DATE_TIME, m_aMinInclusive, ValueType );
REGISTER_VOID_PROP( XSD_MIN_EXCLUSIVE_DATE_TIME, m_aMinExclusive, ValueType );
}
template<>
void OValueLimitedType<double>::registerProperties()
{
OValueLimitedType_Base::registerProperties();
REGISTER_VOID_PROP( XSD_MAX_INCLUSIVE_DOUBLE, m_aMaxInclusive, ValueType );
REGISTER_VOID_PROP( XSD_MAX_EXCLUSIVE_DOUBLE, m_aMaxExclusive, ValueType );
REGISTER_VOID_PROP( XSD_MIN_INCLUSIVE_DOUBLE, m_aMinInclusive, ValueType );
REGISTER_VOID_PROP( XSD_MIN_EXCLUSIVE_DOUBLE, m_aMinExclusive, ValueType );
}
template<>
void OValueLimitedType<sal_Int16>::registerProperties()
{
OValueLimitedType_Base::registerProperties();
REGISTER_VOID_PROP( XSD_MAX_INCLUSIVE_INT, m_aMaxInclusive, ValueType );
REGISTER_VOID_PROP( XSD_MAX_EXCLUSIVE_INT, m_aMaxExclusive, ValueType );
REGISTER_VOID_PROP( XSD_MIN_INCLUSIVE_INT, m_aMinInclusive, ValueType );
REGISTER_VOID_PROP( XSD_MIN_EXCLUSIVE_INT, m_aMinExclusive, ValueType );
}
//........................................................................
} // namespace xforms
//........................................................................