source: icXML/icXML-devel/src/icxercesc/validators/datatype/QNameDatatypeValidator.cpp @ 3104

Last change on this file since 3104 was 3103, checked in by cameron, 6 years ago

Initial imports for icXML v0.9

File size: 7.2 KB
Line 
1/*
2 * Unless required by applicable law or agreed to in writing, software
3 * distributed under the License is distributed on an "AS IS" BASIS,
4 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5 * See the License for the specific language governing permissions and
6 * limitations under the License.
7 */
8
9/*
10 * $Id: QNameDatatypeValidator.cpp 676911 2008-07-15 13:27:32Z amassari $
11 */
12
13// ---------------------------------------------------------------------------
14//  Includes
15// ---------------------------------------------------------------------------
16#include <icxercesc/validators/datatype/QNameDatatypeValidator.hpp>
17#include <xercesc/validators/datatype/InvalidDatatypeFacetException.hpp>
18#include <xercesc/validators/datatype/InvalidDatatypeValueException.hpp>
19#include <icxercesc/internal/ValidationContextImpl.hpp>
20#include <icxercesc/util/XMLChar.hpp>
21
22XERCES_CPP_NAMESPACE_BEGIN
23
24// ---------------------------------------------------------------------------
25//  Constructors and Destructor
26// ---------------------------------------------------------------------------
27QNameDatatypeValidator::QNameDatatypeValidator(MemoryManager* const manager)
28:AbstractStringValidator(0, 0, 0, DatatypeValidator::QName, manager)
29{
30
31}
32
33QNameDatatypeValidator::~QNameDatatypeValidator()
34{
35
36}
37
38QNameDatatypeValidator::QNameDatatypeValidator(
39                                                  DatatypeValidator*            const baseValidator
40                                                , RefHashTableOf<KVStringPair>* const facets
41                                                , RefArrayVectorOf<XMLCh>*      const enums
42                                                , const int                           finalSet
43                                                , MemoryManager* const                manager)
44:AbstractStringValidator(baseValidator, facets, finalSet, DatatypeValidator::QName, manager)
45{
46        init(enums, manager);
47}
48
49DatatypeValidator* QNameDatatypeValidator::newInstance
50(
51          RefHashTableOf<KVStringPair>* const facets
52        , RefArrayVectorOf<XMLCh>* const      enums
53        , const int                           finalSet
54        , MemoryManager* const                manager
55)
56{
57        return (DatatypeValidator*) new (manager) QNameDatatypeValidator(this, facets, enums, finalSet, manager);
58}
59
60// ---------------------------------------------------------------------------
61//  Utilities
62// ---------------------------------------------------------------------------
63
64void QNameDatatypeValidator::checkValueSpace(const XMLCh* const content
65                                                                                         , MemoryManager* const manager)
66{
67        //
68        // check 3.2.18.c0 must: QName
69        //
70
71        if ( !XMLChar1_0::isValidQName(content, XMLString::stringLen(content)) )
72        {
73                ThrowXMLwithMemMgr1(InvalidDatatypeValueException
74                                , XMLExcepts::VALUE_QName_Invalid
75                                , content
76                                , manager);
77        }
78}
79
80void QNameDatatypeValidator::checkContent( const XMLCh*             const content
81                                                                                  ,      ValidationContext* const context
82                                                                                  ,      bool                     asBase
83                                                                                  ,      MemoryManager*     const manager
84                                                                                  )
85{
86        //validate against base validator if any
87        QNameDatatypeValidator *pBaseValidator = (QNameDatatypeValidator*) this->getBaseValidator();
88        if (pBaseValidator)
89                pBaseValidator->checkContent(content, context, true, manager);
90
91        int thisFacetsDefined = getFacetsDefined();
92
93        // we check pattern first
94        if ( (thisFacetsDefined & DatatypeValidator::FACET_PATTERN ) != 0 )
95        {
96                if (getRegex()->matches(content, manager) ==false)
97                {
98                        ThrowXMLwithMemMgr2(InvalidDatatypeValueException
99                                        , XMLExcepts::VALUE_NotMatch_Pattern
100                                        , content
101                                        , getPattern()
102                                        , manager);
103                }
104        }
105
106        // if this is a base validator, we only need to check pattern facet
107        // all other facet were inherited by the derived type
108        if (asBase)
109        {
110                return;
111        }
112
113        checkValueSpace(content, manager);
114
115        int colonPos = 0;
116        XMLCh* prefix = 0;
117        ArrayJanitor<XMLCh>  jan(prefix, manager);
118
119        if (context)
120        {
121                prefix = XMLString::replicate(content, manager);
122                jan.reset(prefix, manager);
123        // normalizeContent(prefix, manager); // does nothing in the AbstractStringValidator
124                colonPos = XMLString::indexOf(content, chColon);
125
126                if (colonPos > 0)
127                {                       
128            if (context->isPrefixUnknown(prefix))
129                        {
130                                ThrowXMLwithMemMgr1(InvalidDatatypeValueException
131                                        , XMLExcepts::VALUE_QName_Invalid2
132                                        , content
133                                        , manager);
134                        }
135                }
136        }
137
138        if ((thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) != 0 && (getEnumeration() != 0) && context)
139        {
140                XMLCh* localName;
141                if (colonPos > 0)
142                {
143                        localName = prefix + colonPos + 1;
144                }
145                else
146                {
147                        localName = prefix;
148                }
149
150                XMLCh* enumPrefix;
151                XMLCh* enumLocalName;
152                XMLSize_t i=0;
153                XMLSize_t enumLength = getEnumeration()->size();
154                bool foundURIId = false;
155                const XMLCh* normURI = 0;
156                // The +=2 is because the enumeration has prefix:localname as one entry followed
157                // by the URI string for the prefix as the next entry.
158                for ( ; i < enumLength; i+=2)
159                {
160            enumPrefix = getEnumeration()->elementAt(i); //XMLString::replicate(getEnumeration()->elementAt(i), manager);
161            // ArrayJanitor<XMLCh>  janEnum(enumPrefix, manager);
162                        colonPos = XMLString::indexOf(enumPrefix, chColon, 0, manager);
163
164                        if (colonPos != -1)
165                        {
166                                enumLocalName = enumPrefix + colonPos + 1;
167                // enumPrefix[colonPos] = chNull;
168                        }
169                        else
170                        {
171                                enumLocalName = enumPrefix;
172                        }
173
174                        if (XMLString::equals(localName, enumLocalName))
175                        {
176                if (colonPos == -1)
177                                        break;
178
179                                // now need to see if the prefix URI's are the same
180                                if (!foundURIId)
181                                {
182                                        normURI = context->getURIForPrefix(prefix);
183                                        foundURIId = true;
184                                }
185                                if (XMLString::equals(normURI, getEnumeration()->elementAt(i + 1)))
186                                {
187                                        break;
188                                }
189                        }
190                }
191
192                if (i == enumLength)
193                {
194                        ThrowXMLwithMemMgr1(InvalidDatatypeValueException, XMLExcepts::VALUE_NotIn_Enumeration, content, manager);
195                }
196        }
197        checkAdditionalFacet(content, manager);
198}
199
200//
201//  Check vs base
202//         check common facets
203//         check enumeration
204//         check Additional Facet Constraint
205//
206void QNameDatatypeValidator::inspectFacetBase(MemoryManager* const manager)
207{
208
209        QNameDatatypeValidator *pBaseValidator = (QNameDatatypeValidator*) getBaseValidator();
210        int thisFacetsDefined = getFacetsDefined();
211
212        if ( (!thisFacetsDefined && !getEnumeration()) ||
213                 (!pBaseValidator)                      )
214                return;
215
216        // check 4.3.5.c0 must: enumeration values from the value space of base
217        if ( ((thisFacetsDefined & DatatypeValidator::FACET_ENUMERATION) != 0) &&
218                (getEnumeration() !=0))
219        {
220                XMLSize_t i = 0;
221                XMLSize_t enumLength = getEnumeration()->size();
222                // The +=2 is because the enumeration has prefix:localname as one entry followed
223                // by the URI string for the prefix as the next entry.
224                for ( ; i < enumLength; i+=2)
225                {
226                        // ask parent do a complete check
227                        pBaseValidator->checkContent(getEnumeration()->elementAt(i), (ValidationContext*)0, false, manager);
228#if 0
229// spec says that only base has to checkContent
230                        // enum shall pass this->checkContent() as well.
231                        checkContent(getEnumeration()->elementAt(i), (ValidationContext*)0, false, manager);
232#endif
233                }
234        }
235
236        checkAdditionalFacetConstraints(manager);
237
238} //end of inspectFacetBase
239
240/***
241 * Support for Serialization/De-serialization
242 ***/
243
244IMPL_XSERIALIZABLE_TOCREATE(QNameDatatypeValidator)
245
246void QNameDatatypeValidator::serialize(XSerializeEngine& serEng)
247{
248        AbstractStringValidator::serialize(serEng);
249}
250
251XERCES_CPP_NAMESPACE_END
252
253/**
254  * End of file QNameDatatypeValidator.cpp
255  */
Note: See TracBrowser for help on using the repository browser.