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

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: AbstractStringValidator.cpp,v $
  58.  * Revision 1.6  2001/10/15 20:57:27  tng
  59.  * Schema: we should propagate the exception thrown from checkContent.
  60.  *
  61.  * Revision 1.5  2001/10/09 21:00:54  peiyongz
  62.  * . init() take 1 arg,
  63.  * . make inspectFacetBase() virtual to allow ListDTV provide its own method,
  64.  * . reorganize init() into assignFacet(), inspectFacet(), inspectFacetBase() and
  65.  * inheritFacet() to improve mantainability.
  66.  * . macro to simplify code
  67.  * . save get***() to temp vars
  68.  *
  69.  * Revision 1.4  2001/09/24 15:30:16  peiyongz
  70.  * DTV Reorganization: init() to be invoked from derived class' ctor to allow
  71.  *        correct resolution of virtual methods like assignAdditionalFacet(),
  72.  *        inheritAdditionalFacet(), etc.
  73.  *
  74.  * Revision 1.3  2001/09/19 18:48:27  peiyongz
  75.  * DTV reorganization:getLength() added, move inline to class declaration to avoid inline
  76.  * function interdependency.
  77.  *
  78.  * Revision 1.2  2001/09/18 21:16:42  peiyongz
  79.  * DTV reorganization: temp vars to replace repeated invocation of getFacetsDefined()
  80.  *
  81.  * Revision 1.1  2001/09/18 14:45:04  peiyongz
  82.  * DTV reorganization
  83.  *
  84.  *
  85.  */
  86. // ---------------------------------------------------------------------------
  87. //  Includes
  88. // ---------------------------------------------------------------------------
  89. #include <validators/datatype/AbstractStringValidator.hpp>
  90. #include <validators/schema/SchemaSymbols.hpp>
  91. #include <validators/datatype/InvalidDatatypeFacetException.hpp>
  92. #include <validators/datatype/InvalidDatatypeValueException.hpp>
  93. #include <util/NumberFormatException.hpp>
  94. static const int BUF_LEN = 64;
  95. static XMLCh value1[BUF_LEN+1];
  96. static XMLCh value2[BUF_LEN+1];
  97. #define  REPORT_FACET_ERROR(val1, val2, except_code)    
  98.    XMLString::binToText(val1, value1, BUF_LEN, 10);     
  99.    XMLString::binToText(val2, value2, BUF_LEN, 10);     
  100.    ThrowXML2(InvalidDatatypeFacetException              
  101.            , except_code                                
  102.            , value1                                     
  103.            , value2);
  104. #define  REPORT_VALUE_ERROR(data, val1, val2, except_code)      
  105.    XMLString::binToText(val1, value1, BUF_LEN, 10);             
  106.    XMLString::binToText(val2, value2, BUF_LEN, 10);             
  107.    ThrowXML3(InvalidDatatypeValueException                      
  108.            , except_code                                        
  109.            , data                                               
  110.            , value1                                             
  111.            , value2);
  112. // ---------------------------------------------------------------------------
  113. //  Constructors and Destructor
  114. // ---------------------------------------------------------------------------
  115. AbstractStringValidator::~AbstractStringValidator()
  116. {
  117.     //~RefVectorOf will delete all adopted elements
  118.     if (fEnumeration && !fEnumerationInherited)
  119.     {
  120.         delete fEnumeration;
  121.         fEnumeration = 0;
  122.     }
  123. }
  124. AbstractStringValidator::AbstractStringValidator(
  125.                           DatatypeValidator*            const baseValidator
  126.                         , RefHashTableOf<KVStringPair>* const facets
  127.                         , const int                           finalSet
  128.                         , const ValidatorType                 type)
  129. :DatatypeValidator(baseValidator, facets, finalSet, type)
  130. ,fLength(0)
  131. ,fMaxLength(SchemaSymbols::fgINT_MAX_VALUE)
  132. ,fMinLength(0)
  133. ,fEnumerationInherited(false)
  134. ,fEnumeration(0)
  135. {
  136.     // init() is invoked from derived class's ctor instead of from
  137.     // here to allow correct resolution of virutal method, such as
  138.     // assigneAdditionalFacet(), inheritAdditionalFacet().
  139. }
  140. void AbstractStringValidator::init(RefVectorOf<XMLCh>*           const enums)
  141. {
  142.     if (enums)
  143.         setEnumeration(enums, false);
  144.     assignFacet();
  145.     inspectFacet();
  146.     inspectFacetBase();
  147.     inheritFacet();
  148. }
  149. //
  150. //   Assign facets
  151. //        assign common facets
  152. //        assign additional facet
  153. //
  154. void AbstractStringValidator::assignFacet()
  155. {
  156.     RefHashTableOf<KVStringPair>* facets = getFacets();
  157.     if (!facets)
  158.         return;
  159.     XMLCh* key;
  160.     XMLCh* value;
  161.     RefHashTableOfEnumerator<KVStringPair> e(facets);
  162.     while (e.hasMoreElements())
  163.     {
  164.         KVStringPair pair = e.nextElement();
  165.         key = pair.getKey();
  166.         value = pair.getValue();
  167.         if (XMLString::compareString(key, SchemaSymbols::fgELT_LENGTH)==0)
  168.         {
  169.             int val;
  170.             try
  171.             {
  172.                 val = XMLString::parseInt(value);
  173.             }
  174.             catch (NumberFormatException nfe)
  175.             {
  176.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_Len, value);
  177.             }
  178.             if ( val < 0 )
  179.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_NonNeg_Len, value);
  180.                 setLength(val);
  181.                 setFacetsDefined(DatatypeValidator::FACET_LENGTH);
  182.         }
  183.         else if (XMLString::compareString(key, SchemaSymbols::fgELT_MINLENGTH)==0)
  184.         {
  185.             int val;
  186.             try
  187.             {
  188.                 val = XMLString::parseInt(value);
  189.             }
  190.             catch (NumberFormatException nfe)
  191.             {
  192.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_minLen, value);
  193.             }
  194.             if ( val < 0 )
  195.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_NonNeg_minLen, value);
  196.             setMinLength(val);
  197.             setFacetsDefined(DatatypeValidator::FACET_MINLENGTH);
  198.         }
  199.         else if (XMLString::compareString(key, SchemaSymbols::fgELT_MAXLENGTH)==0)
  200.         {
  201.             int val;
  202.             try
  203.             {
  204.                 val = XMLString::parseInt(value);
  205.             }
  206.             catch (NumberFormatException nfe)
  207.             {
  208.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_Invalid_maxLen, value);
  209.             }
  210.             if ( val < 0 )
  211.                 ThrowXML1(InvalidDatatypeFacetException, XMLExcepts::FACET_NonNeg_maxLen, value);
  212.             setMaxLength(val);
  213.             setFacetsDefined(DatatypeValidator::FACET_MAXLENGTH);
  214.         }
  215.         else if (XMLString::compareString(key, SchemaSymbols::fgELT_PATTERN)==0)
  216.         {
  217.             setPattern(value);
  218.             if (getPattern())
  219.                 setFacetsDefined(DatatypeValidator::FACET_PATTERN);
  220.             // do not construct regex until needed
  221.         }
  222.         else if (XMLString::compareString(key, SchemaSymbols::fgATT_FIXED)==0)
  223.         {
  224.             unsigned int val;
  225.             bool         retStatus;
  226.             try
  227.             {
  228.                 retStatus = XMLString::textToBin(value, val);
  229.             }
  230.             catch (RuntimeException)
  231.             {
  232.                 ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_internalError_fixed);
  233.             }
  234.             if (!retStatus)
  235.             {
  236.                 ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_internalError_fixed);
  237.             }
  238.             setFixed(val);
  239.             //no setFacetsDefined here
  240.         }
  241.         //
  242.         // else if (XMLString::compareString(key, SchemaSymbols::fgELT_SPECIAL_TOKEN)==0)
  243.         // TODO
  244.         //
  245.         // Note: whitespace is taken care of by TraverseSchema.
  246.         //
  247.         else
  248.         {
  249.             assignAdditionalFacet(key, value);
  250.         }
  251.     }//while
  252. }//end of assigneFacet()
  253. //
  254. // Check facet among self
  255. //         check common facets
  256. //         check Additional Facet Constraint
  257. //
  258. void AbstractStringValidator::inspectFacet()
  259. {
  260.     int thisFacetsDefined = getFacetsDefined();
  261.     if (!thisFacetsDefined)
  262.         return;
  263.     // check 4.3.1.c1 error: length & (maxLength | minLength)
  264.     if ((thisFacetsDefined & DatatypeValidator::FACET_LENGTH) != 0)
  265.     {
  266.         if ((thisFacetsDefined & DatatypeValidator::FACET_MAXLENGTH) != 0)
  267.             ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
  268.         else if (((thisFacetsDefined & DatatypeValidator::FACET_MINLENGTH) != 0))
  269.             ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_minLen);
  270.     }
  271.     // check 4.3.2.c1 must: minLength <= maxLength
  272.     if ((thisFacetsDefined & (DatatypeValidator::FACET_MINLENGTH
  273.         |DatatypeValidator::FACET_MAXLENGTH)) != 0)
  274.     {
  275.         int thisMinLength = getMinLength();
  276.         int thisMaxLength = getMaxLength();
  277.         if ( thisMinLength > thisMaxLength )
  278.         {
  279.             REPORT_FACET_ERROR(thisMaxLength
  280.                              , thisMinLength
  281.                              , XMLExcepts::FACET_maxLen_minLen)
  282.         }
  283.     }
  284. }// end of inspectFacet()
  285. //
  286. //  Check vs base
  287. //         check common facets
  288. //         check enumeration
  289. //         check Additional Facet Constraint
  290. //
  291. void AbstractStringValidator::inspectFacetBase()
  292. {
  293.     AbstractStringValidator *pBaseValidator = (AbstractStringValidator*) getBaseValidator();
  294.     int thisFacetsDefined = getFacetsDefined();
  295.     if ( (!thisFacetsDefined && !fEnumeration) ||
  296.          (!pBaseValidator)                      )
  297.         return;
  298.     int baseFacetsDefined = pBaseValidator->getFacetsDefined();
  299.     int thisLength    = getLength();
  300.     int thisMinLength = getMinLength();
  301.     int thisMaxLength = getMaxLength();
  302.     int baseLength    = pBaseValidator->getLength();
  303.     int baseMinLength = pBaseValidator->getMinLength();
  304.     int baseMaxLength = pBaseValidator->getMaxLength();
  305.     int baseFixed     = pBaseValidator->getFixed();
  306.     /***
  307.        check facets against base.facets
  308.        Note: later we need to check the "fix" option of the base type
  309.             and apply that to every individual facet.
  310.     ***/
  311.     /***
  312.                 Non coexistence of derived' length and base'    (minLength | maxLength)
  313.                                    base'    length and derived' (minLength | maxLength)
  314.     ***/
  315.     // check 4.3.1.c1 error: length & (base.maxLength | base.minLength)
  316.     if ((thisFacetsDefined & DatatypeValidator::FACET_LENGTH) !=0)
  317.     {
  318.         if ((baseFacetsDefined & DatatypeValidator::FACET_MAXLENGTH) !=0)
  319.             ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
  320.         else if ((baseFacetsDefined & DatatypeValidator::FACET_MINLENGTH) !=0)
  321.             ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_minLen);
  322.     }
  323.     // check 4.3.1.c1 error: base.length & (maxLength | minLength)
  324.     if ((baseFacetsDefined & DatatypeValidator::FACET_LENGTH) !=0)
  325.     {
  326.         if ((thisFacetsDefined & DatatypeValidator::FACET_MAXLENGTH) !=0)
  327.             ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_maxLen);
  328.         else if ((thisFacetsDefined & DatatypeValidator::FACET_MINLENGTH) !=0)
  329.             ThrowXML(InvalidDatatypeFacetException, XMLExcepts::FACET_Len_minLen);
  330.     }
  331.     // check 4.3.1.c2 error: length != base.length
  332.     if (((thisFacetsDefined & DatatypeValidator::FACET_LENGTH) !=0) &&
  333.         ((baseFacetsDefined & DatatypeValidator::FACET_LENGTH) !=0))
  334.     {
  335.         if ( thisLength != baseLength )
  336.         {
  337.             REPORT_FACET_ERROR(thisLength
  338.                              , baseLength
  339.                              , XMLExcepts::FACET_Len_baseLen)
  340.         }
  341.     }
  342.     /***
  343.                                    |---  derived   ---|
  344.                 base.minLength <= minLength <= maxLength <= base.maxLength
  345.                 |-------------------        base      -------------------|
  346.     ***/
  347.     // check 4.3.2.c1 must: minLength <= base.maxLength
  348.     if (((thisFacetsDefined & DatatypeValidator::FACET_MINLENGTH ) != 0) &&
  349.         ((baseFacetsDefined & DatatypeValidator::FACET_MAXLENGTH ) != 0))
  350.     {
  351.         if ( thisMinLength > baseMaxLength )
  352.         {
  353.             REPORT_FACET_ERROR(thisMinLength
  354.                              , baseMaxLength
  355.                              , XMLExcepts::FACET_minLen_basemaxLen)
  356.         }
  357.     }
  358.     // check 4.3.2.c2 error: minLength < base.minLength
  359.     if (((thisFacetsDefined & DatatypeValidator::FACET_MINLENGTH) !=0) &&
  360.         ((baseFacetsDefined & DatatypeValidator::FACET_MINLENGTH) != 0))
  361.     {
  362.         if ((baseFixed & DatatypeValidator::FACET_MINLENGTH) !=0)
  363.         {
  364.             if ( thisMinLength != baseMinLength )
  365.             {
  366.                 REPORT_FACET_ERROR(thisMinLength
  367.                                  , baseMinLength
  368.                                  , XMLExcepts::FACET_minLen_base_fixed)
  369.             }
  370.         }
  371.         else
  372.         {
  373.             if ( thisMinLength < baseMinLength )
  374.             {
  375.                 REPORT_FACET_ERROR(thisMinLength
  376.                                  , baseMinLength
  377.                                  , XMLExcepts::FACET_minLen_baseminLen)
  378.             }
  379.         }
  380.     }
  381.     // check 4.3.2.c1 must: base.minLength <= maxLength
  382.     if (((baseFacetsDefined & DatatypeValidator::FACET_MINLENGTH) !=0) &&
  383.         ((thisFacetsDefined & DatatypeValidator::FACET_MAXLENGTH) !=0))
  384.     {
  385.         if ( baseMinLength > thisMaxLength )
  386.         {
  387.             REPORT_FACET_ERROR(thisMaxLength
  388.                              , baseMinLength
  389.                              , XMLExcepts::FACET_maxLen_baseminLen)
  390.         }
  391.     }
  392.     // check 4.3.3.c1 error: maxLength > base.maxLength
  393.     if (((thisFacetsDefined & DatatypeValidator::FACET_MAXLENGTH) !=0) &&
  394.         ((baseFacetsDefined & DatatypeValidator::FACET_MAXLENGTH) !=0))
  395.     {
  396.         if ((baseFixed & DatatypeValidator::FACET_MAXLENGTH) !=0)
  397.         {
  398.             if ( thisMaxLength != baseMaxLength )
  399.             {
  400.                 REPORT_FACET_ERROR(thisMaxLength
  401.                                  , baseMaxLength
  402.                                  , XMLExcepts::FACET_maxLen_base_fixed)
  403.             }
  404.         }
  405.         else
  406.         {
  407.             if ( thisMaxLength > baseMaxLength )
  408.             {
  409.                 REPORT_FACET_ERROR(thisMaxLength
  410.                                  , baseMaxLength
  411.                                  , XMLExcepts::FACET_maxLen_basemaxLen)
  412.             }
  413.         }
  414.     }
  415.     // check 4.3.5.c0 must: enumeration values from the value space of base
  416.     if ( ((thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) != 0) &&
  417.         (getEnumeration() !=0))
  418.     {
  419.         int i = 0;
  420.         int enumLength = getEnumeration()->size();
  421.         for ( ; i < enumLength; i++)
  422.         {
  423.             // ask parent do a complete check
  424.             pBaseValidator->checkContent(getEnumeration()->elementAt(i), false);
  425.             // enum shall pass this->checkContent() as well.
  426.             checkContent(getEnumeration()->elementAt(i), false);
  427.         }
  428.     }
  429.     checkAdditionalFacetConstraints();
  430. } //end of inspectFacetBase
  431. //
  432. //  Inherit facet from base
  433. //    a. inherit common facets
  434. //    b. inherit additional facet
  435. //
  436. void AbstractStringValidator::inheritFacet()
  437. {
  438.     /***
  439.         P3. Inherit facets from base.facets
  440.         The reason of this inheriting (or copying values) is to ease
  441.         schema constraint checking, so that we need NOT trace back to our
  442.         very first base validator in the hierachy. Instead, we are pretty
  443.         sure checking against immediate base validator is enough.
  444.     ***/
  445.     AbstractStringValidator *pBaseValidator = (AbstractStringValidator*) getBaseValidator();
  446.     if (!pBaseValidator)
  447.         return;
  448.     int thisFacetsDefined = getFacetsDefined();
  449.     int baseFacetsDefined = pBaseValidator->getFacetsDefined();
  450.     // inherit length
  451.     if (((baseFacetsDefined & DatatypeValidator::FACET_LENGTH) != 0) &&
  452.         ((thisFacetsDefined & DatatypeValidator::FACET_LENGTH) == 0))
  453.     {
  454.         setLength(pBaseValidator->getLength());
  455.         setFacetsDefined(DatatypeValidator::FACET_LENGTH);
  456.     }
  457.     // inherit minLength
  458.     if (((baseFacetsDefined & DatatypeValidator::FACET_MINLENGTH) !=0) &&
  459.         ((thisFacetsDefined & DatatypeValidator::FACET_MINLENGTH) == 0))
  460.     {
  461.         setMinLength(pBaseValidator->getMinLength());
  462.         setFacetsDefined(DatatypeValidator::FACET_MINLENGTH);
  463.     }
  464.     // inherit maxLength
  465.     if (((baseFacetsDefined & DatatypeValidator::FACET_MAXLENGTH) !=0) &&
  466.         ((thisFacetsDefined & DatatypeValidator::FACET_MAXLENGTH) == 0))
  467.     {
  468.         setMaxLength(pBaseValidator->getMaxLength());
  469.         setFacetsDefined(DatatypeValidator::FACET_MAXLENGTH);
  470.     }
  471.     // inherit enumeration
  472.     if (((baseFacetsDefined & DatatypeValidator::FACET_ENUMERATION) !=0) &&
  473.         ((thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) == 0))
  474.     {
  475.         setEnumeration(pBaseValidator->getEnumeration(), true);
  476.     }
  477.     // we don't inherit pattern
  478.     // inherit "fixed" option
  479.     setFixed(getFixed() | pBaseValidator->getFixed());
  480.     // inherit additional facet
  481.     inheritAdditionalFacet();
  482. } // end of inheritance
  483. // -----------------------------------------------------------------------
  484. // Compare methods
  485. // -----------------------------------------------------------------------
  486. int AbstractStringValidator::compare(const XMLCh* const lValue
  487.                                    , const XMLCh* const rValue)
  488. {
  489.     return XMLString::compareString(lValue, rValue);
  490. }
  491. void AbstractStringValidator::validate( const XMLCh* const content)
  492. {
  493.     checkContent(content, false);
  494. }
  495. void AbstractStringValidator::checkContent( const XMLCh* const content, bool asBase)
  496. {
  497.     //validate against base validator if any
  498.     AbstractStringValidator *pBaseValidator = (AbstractStringValidator*) this->getBaseValidator();
  499.     if (pBaseValidator)
  500.         pBaseValidator->checkContent(content, true);
  501.     int thisFacetsDefined = getFacetsDefined();
  502.     // we check pattern first
  503.     if ( (thisFacetsDefined & DatatypeValidator::FACET_PATTERN ) != 0 )
  504.     {
  505.         // lazy construction
  506.         if (getRegex() ==0) {
  507.             try {
  508.                 setRegex(new RegularExpression(getPattern(), SchemaSymbols::fgRegEx_XOption));
  509.             }
  510.             catch (XMLException &e)
  511.             {
  512.                 ThrowXML1(InvalidDatatypeValueException, XMLExcepts::RethrowError, e.getMessage());
  513.             }
  514.         }
  515.         if (getRegex()->matches(content) ==false)
  516.         {
  517.             ThrowXML2(InvalidDatatypeValueException
  518.                     , XMLExcepts::VALUE_NotMatch_Pattern
  519.                     , content
  520.                     , getPattern());
  521.         }
  522.     }
  523.     // if this is a base validator, we only need to check pattern facet
  524.     // all other facet were inherited by the derived type
  525.     if (asBase)
  526.         return;
  527.     checkValueSpace(content);
  528.     unsigned int length = getLength(content);
  529.     if (((thisFacetsDefined & DatatypeValidator::FACET_MAXLENGTH) != 0) &&
  530.         (length > getMaxLength()))
  531.     {
  532.         REPORT_VALUE_ERROR(content
  533.                          , length
  534.                          , getMaxLength()
  535.                          , XMLExcepts::VALUE_GT_maxLen)
  536.     }
  537.     if (((thisFacetsDefined & DatatypeValidator::FACET_MINLENGTH) != 0) &&
  538.         (length < getMinLength()))
  539.     {
  540.         REPORT_VALUE_ERROR(content
  541.                          , length
  542.                          , getMinLength()
  543.                          , XMLExcepts::VALUE_LT_minLen)
  544.     }
  545.     if (((thisFacetsDefined & DatatypeValidator::FACET_LENGTH) != 0) &&
  546.         (length != getLength()))
  547.     {
  548.         REPORT_VALUE_ERROR(content
  549.                          , length
  550.                          , getLength()
  551.                          , XMLExcepts::VALUE_NE_Len)
  552.     }
  553.     if ((thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) != 0 &&
  554.         (getEnumeration() != 0))
  555.     {
  556.         int i=0;
  557.         int enumLength = getEnumeration()->size();
  558.         for ( ; i < enumLength; i++)
  559.         {
  560.             if (XMLString::compareString(content, getEnumeration()->elementAt(i))==0)
  561.                 break;
  562.         }
  563.         if (i == enumLength)
  564.             ThrowXML1(InvalidDatatypeValueException, XMLExcepts::VALUE_NotIn_Enumeration, content);
  565.     }
  566.     checkAdditionalFacet(content);
  567. }
  568. /**
  569.   * End of file AbstractStringValidator.cpp
  570.   */