DecimalDatatypeValidator.cpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:20k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 2001, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Log: DecimalDatatypeValidator.cpp,v $
  58.  * Revision 1.19  2001/10/09 20:53:22  peiyongz
  59.  * Optimization: save get***() to temp var
  60.  *
  61.  * Revision 1.18  2001/10/02 18:59:29  peiyongz
  62.  * Invalid_Facet_Tag to display the tag name
  63.  *
  64.  * Revision 1.17  2001/10/01 21:04:40  peiyongz
  65.  * DTV Reorganization:fix to memory leak in compare() method.
  66.  *
  67.  * Revision 1.16  2001/10/01 16:16:38  peiyongz
  68.  * DTV Reorganization:derived from AbstractNumericValidator
  69.  *
  70.  * Revision 1.15  2001/09/20 13:11:42  knoaman
  71.  * Regx  + misc. fixes
  72.  *
  73.  * Revision 1.14  2001/08/22 18:28:01  peiyongz
  74.  * Memory leak: delete the bufffer allocated by ::toString()
  75.  *
  76.  * Revision 1.13  2001/08/21 18:42:53  peiyongz
  77.  * Bugzilla# 2816: cleanUp() declared with external linkage and called
  78.  *                          before defined as inline
  79.  *
  80.  * Revision 1.12  2001/08/15 18:08:44  peiyongz
  81.  * Fix to potential leakage in strEnumeration
  82.  *
  83.  * Revision 1.11  2001/07/17 21:30:12  peiyongz
  84.  * bug fix: numBase->getMinInclusive()->toString()
  85.  *
  86.  * Revision 1.10  2001/06/20 17:56:32  peiyongz
  87.  * support for "fixed" option on constrainning facets
  88.  *
  89.  * Revision 1.8  2001/05/29 19:49:34  tng
  90.  * Schema: Constraint Checking Fix in datatypeValidators.  By Pei Yong Zhang.
  91.  *
  92.  * Revision 1.7  2001/05/28 21:11:18  tng
  93.  * Schema: Various DatatypeValidator fix.  By Pei Yong Zhang
  94.  *
  95.  * Revision 1.6  2001/05/18 20:18:02  tng
  96.  * Schema: More exception messages in XMLBigDecimal/XMLBigInteger/DecimalDatatypeValidator.  By Pei Yong Zhang.
  97.  *
  98.  * Revision 1.5  2001/05/18 13:36:45  tng
  99.  * Schema: Catch RegularExpression exception and NumberFormatException
  100.  *
  101.  * Revision 1.4  2001/05/18 13:23:46  tng
  102.  * Schema: Exception messages in DatatypeValidator.  By Pei Yong Zhang.
  103.  *
  104.  * Revision 1.3  2001/05/11 17:17:23  tng
  105.  * Schema: DatatypeValidator fixes.  By Pei Yong Zhang.
  106.  *
  107.  * Revision 1.2  2001/05/11 13:27:28  tng
  108.  * Copyright update.
  109.  *
  110.  * Revision 1.1  2001/05/10 20:51:29  tng
  111.  * Schema: Add DecimalDatatypeValidator and XMLBigDecimal, XMLBigInteger.  By Pei Yong Zhang.
  112.  *
  113.  */
  114. // ---------------------------------------------------------------------------
  115. //  Includes
  116. // ---------------------------------------------------------------------------
  117. #include <validators/datatype/DecimalDatatypeValidator.hpp>
  118. #include <validators/schema/SchemaSymbols.hpp>
  119. #include <validators/datatype/InvalidDatatypeFacetException.hpp>
  120. #include <validators/datatype/InvalidDatatypeValueException.hpp>
  121. #include <util/NumberFormatException.hpp>
  122. static const int BUF_LEN = 64;
  123. static XMLCh value1[BUF_LEN+1];
  124. static XMLCh value2[BUF_LEN+1];
  125. // ---------------------------------------------------------------------------
  126. //  Constructors and Destructor
  127. // ---------------------------------------------------------------------------
  128. DecimalDatatypeValidator::DecimalDatatypeValidator()
  129. :AbstractNumericValidator(0, 0, 0, DatatypeValidator::Decimal)
  130. , fTotalDigits(0)
  131. , fFractionDigits(0)
  132. {}
  133. DecimalDatatypeValidator::DecimalDatatypeValidator(
  134.                           DatatypeValidator*            const baseValidator
  135.                         , RefHashTableOf<KVStringPair>* const facets
  136.                         , RefVectorOf<XMLCh>*           const enums
  137.                         , const int                           finalSet)
  138. :AbstractNumericValidator(baseValidator, facets, finalSet, DatatypeValidator::Decimal)
  139. , fTotalDigits(0)
  140. , fFractionDigits(0)
  141. {
  142.     init(enums);
  143. }
  144. DecimalDatatypeValidator::~DecimalDatatypeValidator()
  145. {}
  146. // -----------------------------------------------------------------------
  147. // Compare methods
  148. // -----------------------------------------------------------------------
  149. int DecimalDatatypeValidator::compare(const XMLCh* const lValue
  150.                                     , const XMLCh* const rValue)
  151. {
  152.     XMLBigDecimal * lObj = new XMLBigDecimal(lValue);
  153.     Janitor<XMLBigDecimal> jname1(lObj);
  154.     XMLBigDecimal * rObj = new XMLBigDecimal(rValue);
  155.     Janitor<XMLBigDecimal> jname2(rObj);
  156.     return compareValues(lObj, rObj);
  157. }
  158. DatatypeValidator* DecimalDatatypeValidator::newInstance(
  159.                                       RefHashTableOf<KVStringPair>* const facets
  160.                                     , RefVectorOf<XMLCh>*           const enums
  161.                                     , const int                           finalSet)
  162. {
  163.     return (DatatypeValidator*) new DecimalDatatypeValidator(this, facets, enums, finalSet);
  164. }
  165. // -----------------------------------------------------------------------
  166. // ctor provided to be used by derived classes
  167. // -----------------------------------------------------------------------
  168. DecimalDatatypeValidator::DecimalDatatypeValidator(DatatypeValidator*            const baseValidator
  169.                                                  , RefHashTableOf<KVStringPair>* const facets
  170.                                                  , const int                           finalSet
  171.                                                  , const ValidatorType                 type)
  172. :AbstractNumericValidator(baseValidator, facets, finalSet, type)
  173. , fTotalDigits(0)
  174. , fFractionDigits(0)
  175. {
  176.     //do not invoke init here !!!
  177. }
  178. void DecimalDatatypeValidator::assignAdditionalFacet(const XMLCh* const key
  179.                                                    , const XMLCh* const value)
  180. {
  181.     if (XMLString::compareString(key, SchemaSymbols::fgELT_TOTALDIGITS)==0)
  182.     {
  183.         int val;
  184.         try
  185.         {
  186.             val = XMLString::parseInt(value);
  187.         }
  188.         catch (NumberFormatException)
  189.         {
  190.             ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_TotalDigit, value);
  191.         }
  192.         // check 4.3.11.c0 must: totalDigits > 0
  193.         if ( val <= 0 )
  194.             ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_NonNeg_TotalDigit, value);
  195.         setTotalDigits(val);
  196.         setFacetsDefined(DatatypeValidator::FACET_TOTALDIGITS);
  197.     }
  198.     else if (XMLString::compareString(key, SchemaSymbols::fgELT_FRACTIONDIGITS)==0)
  199.     {
  200.         int val;
  201.         try
  202.         {
  203.             val = XMLString::parseInt(value);
  204.         }
  205.         catch (NumberFormatException)
  206.         {
  207.             ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_FractDigit, value);
  208.         }
  209.         // check 4.3.12.c0 must: fractionDigits > 0
  210.         if ( val < 0 )
  211.             ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_NonNeg_FractDigit, value);
  212.         setFractionDigits(val);
  213.         setFacetsDefined(DatatypeValidator::FACET_FRACTIONDIGITS);
  214.     }
  215.     else
  216.     {
  217.         ThrowXML1(InvalidDatatypeFacetException
  218.                 , XMLExcepts::FACET_Invalid_Tag
  219.                 , key);
  220.     }
  221. }
  222. void DecimalDatatypeValidator::inheritAdditionalFacet()
  223. {
  224.     DecimalDatatypeValidator *numBase = (DecimalDatatypeValidator*) getBaseValidator();
  225.     if (!numBase)
  226.         return;
  227.     int thisFacetsDefined = getFacetsDefined();  
  228.     int baseFacetsDefined = numBase->getFacetsDefined();
  229.     // inherit totalDigits         
  230.     if ((( baseFacetsDefined & DatatypeValidator::FACET_TOTALDIGITS) != 0) &&          
  231.         (( thisFacetsDefined & DatatypeValidator::FACET_TOTALDIGITS) == 0) )              
  232.     {          
  233.         setTotalDigits(numBase->fTotalDigits);              
  234.         setFacetsDefined(DatatypeValidator::FACET_TOTALDIGITS);              
  235.     }
  236.           
  237.     // inherit fractionDigits          
  238.     if ((( baseFacetsDefined & DatatypeValidator::FACET_FRACTIONDIGITS) != 0) &&          
  239.         (( thisFacetsDefined & DatatypeValidator::FACET_FRACTIONDIGITS) == 0) )              
  240.     {          
  241.         setFractionDigits(numBase->fFractionDigits);              
  242.         setFacetsDefined(DatatypeValidator::FACET_FRACTIONDIGITS);              
  243.     }
  244. }
  245. void DecimalDatatypeValidator::checkAdditionalFacetConstraints() const
  246. {
  247.     int thisFacetsDefined = getFacetsDefined();
  248.     // check 4.3.12.c1 must: fractionDigits <= totalDigits
  249.     if ( ((thisFacetsDefined & DatatypeValidator::FACET_FRACTIONDIGITS) != 0) &&
  250.          ((thisFacetsDefined & DatatypeValidator::FACET_TOTALDIGITS) != 0) )
  251.     {
  252.         if ( fFractionDigits > fTotalDigits )
  253.         {
  254.             XMLString::binToText(getFractionDigits(), value1, BUF_LEN, 10);
  255.             XMLString::binToText(getTotalDigits(), value2, BUF_LEN, 10);
  256.             ThrowXML2(InvalidDatatypeFacetException
  257.                                  , XMLExcepts::FACET_TotDigit_FractDigit
  258.                                  , value2
  259.                                  , value1);
  260.         }
  261.     }
  262. }
  263. void DecimalDatatypeValidator::checkAdditionalFacetConstraintsBase() const
  264. {
  265.     DecimalDatatypeValidator *numBase = (DecimalDatatypeValidator*) getBaseValidator();
  266.     if (!numBase)
  267.         return;
  268.     int thisFacetsDefined = getFacetsDefined();
  269.     int baseFacetsDefined = numBase->getFacetsDefined();
  270.     // check 4.3.11.c1 error: totalDigits > base.totalDigits
  271.     // totalDigits != base.totalDigits if (base.fixed)
  272.     if (( thisFacetsDefined & DatatypeValidator::FACET_TOTALDIGITS) != 0)
  273.     {
  274.         if ( (( baseFacetsDefined & DatatypeValidator::FACET_TOTALDIGITS) != 0) &&
  275.             ( fTotalDigits > numBase->fTotalDigits ))
  276.         {
  277.             XMLString::binToText(fTotalDigits, value1, BUF_LEN, 10);
  278.             XMLString::binToText(numBase->fTotalDigits, value2, BUF_LEN, 10);
  279.             ThrowXML2(InvalidDatatypeFacetException
  280.                                  , XMLExcepts::FACET_totalDigit_base_totalDigit
  281.                                  , value1
  282.                                  , value2);
  283.         }
  284.         if ( (( baseFacetsDefined & DatatypeValidator::FACET_TOTALDIGITS) != 0) &&
  285.             (( numBase->getFixed() & DatatypeValidator::FACET_TOTALDIGITS) != 0) &&
  286.             ( fTotalDigits != numBase->fTotalDigits ))
  287.         {
  288.             XMLString::binToText(fTotalDigits, value1, BUF_LEN, 10);
  289.             XMLString::binToText(numBase->fTotalDigits, value2, BUF_LEN, 10);
  290.             ThrowXML2(InvalidDatatypeFacetException
  291.                                  , XMLExcepts::FACET_totalDigit_base_fixed
  292.                                  , value1
  293.                                  , value2);
  294.         }                    
  295.     }
  296.     if (( thisFacetsDefined & DatatypeValidator::FACET_FRACTIONDIGITS) != 0)
  297.     {
  298.         // check question error: fractionDigits > base.fractionDigits ???
  299.         if ( (( baseFacetsDefined & DatatypeValidator::FACET_FRACTIONDIGITS) != 0) &&
  300.             ( fFractionDigits > numBase->fFractionDigits ))
  301.         {
  302.             XMLString::binToText(fFractionDigits, value1, BUF_LEN, 10);
  303.             XMLString::binToText(numBase->fFractionDigits, value2, BUF_LEN, 10);
  304.             ThrowXML2(InvalidDatatypeFacetException
  305.                                  , XMLExcepts::FACET_fractDigit_base_fractDigit
  306.                                  , value1
  307.                                  , value2);
  308.                         }
  309.         // check question error: fractionDigits > base.totalDigits ???
  310.         if ( (( baseFacetsDefined & DatatypeValidator::FACET_TOTALDIGITS) != 0) &&
  311.             ( fFractionDigits > numBase->fTotalDigits ))
  312.         {
  313.             XMLString::binToText(fFractionDigits, value1, BUF_LEN, 10);
  314.             XMLString::binToText(numBase->fTotalDigits, value2, BUF_LEN, 10);
  315.             ThrowXML2(InvalidDatatypeFacetException
  316.                                  , XMLExcepts::FACET_fractDigit_base_totalDigit
  317.                                  , value1
  318.                                  , value2);
  319.         }
  320.         // fractionDigits != base.fractionDigits if (base.fixed)
  321.         if ( (( baseFacetsDefined & DatatypeValidator::FACET_FRACTIONDIGITS) != 0) &&
  322.             (( numBase->getFixed() & DatatypeValidator::FACET_FRACTIONDIGITS) != 0) &&
  323.             ( fFractionDigits != numBase->fFractionDigits ))
  324.         {
  325.             XMLString::binToText(fFractionDigits, value1, BUF_LEN, 10);
  326.             XMLString::binToText(numBase->fFractionDigits, value2, BUF_LEN, 10);
  327.             ThrowXML2(InvalidDatatypeFacetException
  328.                                  , XMLExcepts::FACET_fractDigit_base_fixed
  329.                                  , value1
  330.                                  , value2);
  331.         }
  332.     }
  333. }
  334. int  DecimalDatatypeValidator::compareValues(const XMLNumber* const lValue
  335.                                            , const XMLNumber* const rValue)
  336. {
  337.     return XMLBigDecimal::compareValues((XMLBigDecimal*) lValue, (XMLBigDecimal*) rValue);
  338. }
  339. void  DecimalDatatypeValidator::setMaxInclusive(const XMLCh* const value)
  340. {
  341.     fMaxInclusive = new XMLBigDecimal(value);
  342. }
  343. void  DecimalDatatypeValidator::setMaxExclusive(const XMLCh* const value)
  344. {
  345.     fMaxExclusive = new XMLBigDecimal(value);
  346. }
  347. void  DecimalDatatypeValidator::setMinInclusive(const XMLCh* const value)
  348. {
  349.     fMinInclusive = new XMLBigDecimal(value);
  350. }
  351. void  DecimalDatatypeValidator::setMinExclusive(const XMLCh* const value)
  352. {
  353.     fMinExclusive = new XMLBigDecimal(value);
  354. }
  355. void DecimalDatatypeValidator::setEnumeration()
  356. {
  357.     // check 4.3.5.c0 must: enumeration values from the value space of base
  358.     //
  359.     // 1. shall be from base value space
  360.     // 2. shall be from current value space as well ( shall go through boundsCheck() )
  361.     //
  362.     if (!fStrEnumeration)
  363.         return;
  364.     int i = 0;
  365.     int enumLength = fStrEnumeration->size();
  366.     DecimalDatatypeValidator *numBase = (DecimalDatatypeValidator*) getBaseValidator();
  367.     if (numBase)
  368.     {
  369.         try
  370.         {
  371.             for ( i = 0; i < enumLength; i++)
  372.             {
  373.                 numBase->checkContent(fStrEnumeration->elementAt(i), false);
  374.             }
  375.         }              
  376.         catch (XMLException&)
  377.         {
  378.             ThrowXML1(InvalidDatatypeFacetException
  379.                     , XMLExcepts::FACET_enum_base
  380.                     , fStrEnumeration->elementAt(i));
  381.         }
  382.     }
  383.     // We put the this->checkContent in a separate loop
  384.     // to not block original message with in that method.
  385.     // 
  386.     for ( i = 0; i < enumLength; i++)
  387.     {
  388.         checkContent(fStrEnumeration->elementAt(i), false);
  389.     }              
  390.     fEnumeration = new RefVectorOf<XMLNumber>(enumLength, true);
  391.     fEnumerationInherited = false;
  392.     for ( i = 0; i < enumLength; i++)
  393.     {
  394.         fEnumeration->insertElementAt(new XMLBigDecimal(fStrEnumeration->elementAt(i)), i);
  395.     }              
  396. }
  397. // -----------------------------------------------------------------------
  398. // Abstract interface from AbstractNumericValidator
  399. // -----------------------------------------------------------------------
  400. void DecimalDatatypeValidator::checkContent( const XMLCh* const content, bool asBase)
  401. {
  402.     //validate against base validator if any
  403.     DecimalDatatypeValidator *pBase = (DecimalDatatypeValidator*) this->getBaseValidator();
  404.     if (pBase)
  405.         pBase->checkContent(content, true);
  406.     int thisFacetsDefined = getFacetsDefined();
  407.     // we check pattern first
  408.     if ( (thisFacetsDefined & DatatypeValidator::FACET_PATTERN ) != 0 )
  409.     {
  410.         // lazy construction
  411.         if (getRegex() ==0) {
  412.             try {
  413.                 setRegex(new RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
  414.             }
  415.             catch (XMLException &e)
  416.             {
  417.                 ThrowXML1(InvalidDatatypeValueException, XMLExcepts::RethrowError, e.getMessage());
  418.             }
  419.         }
  420.         if (getRegex()->matches(content) ==false)
  421.         {
  422.             ThrowXML2(InvalidDatatypeValueException
  423.                     , XMLExcepts::VALUE_NotMatch_Pattern
  424.                     , content
  425.                     , getPattern());
  426.         }
  427.     }
  428.     // if this is a base validator, we only need to check pattern facet
  429.     // all other facet were inherited by the derived type
  430.     if (asBase)
  431.         return;
  432.     try {
  433.         XMLBigDecimal theValue(content);
  434.         XMLBigDecimal *theData = &theValue;
  435.         if (getEnumeration())
  436.         {
  437.             int i=0;
  438.             int enumLength = getEnumeration()->size();
  439.             for ( ; i < enumLength; i++)
  440.             {
  441.                 if (compareValues(theData, (XMLBigDecimal*) getEnumeration()->elementAt(i)) ==0 )
  442.                     break;
  443.             }
  444.             if (i == enumLength)
  445.                 ThrowXML1(InvalidDatatypeValueException, XMLExcepts::VALUE_NotIn_Enumeration, content);
  446.         }
  447.         boundsCheck(theData);
  448.         if ( (thisFacetsDefined & DatatypeValidator::FACET_FRACTIONDIGITS) != 0 )
  449.         {
  450.             if ( theData->getScale() > fFractionDigits )
  451.             {
  452.                 XMLCh* value = theData->toString();
  453.                 ArrayJanitor<XMLCh> jan(value);
  454.                 XMLString::binToText(theData->getScale(), value1, BUF_LEN, 10);
  455.                 XMLString::binToText(fFractionDigits, value2, BUF_LEN, 10);
  456.                 ThrowXML3(InvalidDatatypeFacetException
  457.                                  , XMLExcepts::VALUE_exceed_fractDigit
  458.                                  , value
  459.                                  , value1
  460.                                  , value2);
  461.             }
  462.         }
  463.         if ( (thisFacetsDefined & DatatypeValidator::FACET_TOTALDIGITS) != 0 )
  464.         {
  465.             if ( theData->getTotalDigit() > fTotalDigits )
  466.             {
  467.                 XMLCh* value = theData->toString();
  468.                 ArrayJanitor<XMLCh> jan(value);
  469.                 XMLString::binToText(theData->getTotalDigit(), value1, BUF_LEN, 10);
  470.                 XMLString::binToText(fTotalDigits, value2, BUF_LEN, 10);
  471.                 ThrowXML3(InvalidDatatypeFacetException
  472.                                  , XMLExcepts::VALUE_exceed_totalDigit
  473.                                  , value
  474.                                  , value1
  475.                                  , value2);
  476.             }
  477.         }
  478.     }
  479.     catch (XMLException &e)
  480.     {
  481.        ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::RethrowError, e.getMessage());
  482.     }
  483. }
  484. /**
  485.   * End of file DecimalDatatypeValidator::cpp
  486.   */