blob: f317e72395cff4bab1c2455a239643950b606b00 [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.
*/
/*
* $Id: PSVIItem.cpp 568078 2007-08-21 11:43:25Z amassari $
*/
#include <xercesc/framework/psvi/PSVIItem.hpp>
#include <xercesc/framework/psvi/XSValue.hpp>
#include <xercesc/framework/psvi/XSComplexTypeDefinition.hpp>
#include <xercesc/validators/datatype/DatatypeValidatorFactory.hpp>
XERCES_CPP_NAMESPACE_BEGIN
PSVIItem::PSVIItem( MemoryManager* const manager ):
fMemoryManager(manager),
fValidationContext(0),
fNormalizedValue(0),
fDefaultValue(0),
fCanonicalValue(0),
fValidityState(VALIDITY_NOTKNOWN),
fAssessmentType(VALIDATION_FULL),
fIsSpecified(false),
fType(0),
fMemberType(0)
{
}
void PSVIItem::reset(
const XMLCh* const validationContext
, const XMLCh* const normalizedValue
, const VALIDITY_STATE validityState
, const ASSESSMENT_TYPE assessmentType
)
{
// this is just a wrapper method; fValidationContext will
// be valid as long as and no longer than the thing to which
// validationContext points
fValidationContext = validationContext;
fNormalizedValue = normalizedValue;
fValidityState = validityState;
fAssessmentType = assessmentType;
}
void PSVIItem::setValidationAttempted(PSVIItem::ASSESSMENT_TYPE attemptType)
{
fAssessmentType = attemptType;
}
void PSVIItem::setValidity(PSVIItem::VALIDITY_STATE validity)
{
fValidityState = validity;
}
XSValue* PSVIItem::getActualValue() const
{
/***
* assessment
* VALIDATION_PARTIAL
* VALIDATION_FULL
* validity
* VALIDITY_VALID
***/
if ((fAssessmentType==VALIDATION_NONE) || (fValidityState!=VALIDITY_VALID))
return 0;
/***
* XSSimpleType or
* XSComplexType's CONTENTTYPE_SIMPLE
* allowed
***/
if ((!fType) ||
((fType->getTypeCategory() == XSTypeDefinition::COMPLEX_TYPE) &&
(((XSComplexTypeDefinition*)fType)->getContentType() != XSComplexTypeDefinition::CONTENTTYPE_SIMPLE)))
return 0;
/***
* Resolve dv
*
* 1. If fMemberType is not null, use the fMemberType->fDataTypeValidator
* 2. If fType is XSSimpleType, use fType->fDataTypeValidator
* 3. If fType is XSComplexType, use fType->fXSSimpleTypeDefinition-> fDataTypeValidator
*
***/
DatatypeValidator *dv = 0;
if (fMemberType)
{
/***
* Now that fType is either XSSimpleTypeDefinition or
* XSComlextTypeDefinition with CONTENTTYPE_SIMPLE, the
* fMemberType must be XSSimpleTypeDefinition if present
***/
dv=((XSSimpleTypeDefinition*) fMemberType)->getDatatypeValidator();
}
else if (fType->getTypeCategory() == XSTypeDefinition::SIMPLE_TYPE)
{
dv=((XSSimpleTypeDefinition*) fType)->getDatatypeValidator();
}
else
{
XSSimpleTypeDefinition* simType = ((XSComplexTypeDefinition*)fType)->getSimpleType();
if (simType)
dv = simType->getDatatypeValidator();
}
if (!dv) return 0;
/***
* Get the ultimate base dv in the datatype registry
***/
DatatypeValidator *basedv = DatatypeValidatorFactory::getBuiltInBaseValidator(dv);
if (!basedv) return 0;
XSValue::Status status=XSValue::st_Init;
return XSValue::getActualValue(fNormalizedValue
, XSValue::getDataType(basedv->getTypeLocalName())
, status
, XSValue::ver_10
, false
, fMemoryManager);
}
XERCES_CPP_NAMESPACE_END