XMLSchemaValidatorpublic class XMLSchemaValidator extends Object implements RevalidationHandler, XMLDocumentFilter, FieldActivator, XMLComponentThe XML Schema validator. The validator implements a document
filter: receiving document events from the scanner; validating
the content and structure; augmenting the InfoSet, if applicable;
and notifying the parser of the information resulting from the
validation process.
This component requires the following features and properties from the
component manager that uses it:
- http://xml.org/sax/features/validation
- http://apache.org/xml/properties/internal/symbol-table
- http://apache.org/xml/properties/internal/error-reporter
- http://apache.org/xml/properties/internal/entity-resolver
|
Fields Summary |
---|
private static final boolean | DEBUG | protected static final String | VALIDATIONFeature identifier: validation. | protected static final String | SCHEMA_VALIDATIONFeature identifier: validation. | protected static final String | SCHEMA_FULL_CHECKINGFeature identifier: schema full checking | protected static final String | DYNAMIC_VALIDATIONFeature identifier: dynamic validation. | protected static final String | NORMALIZE_DATAFeature identifier: expose schema normalized value | protected static final String | SCHEMA_ELEMENT_DEFAULTFeature identifier: send element default value via characters() | protected static final String | SCHEMA_AUGMENT_PSVIFeature identifier: augment PSVI | protected static final String | ALLOW_JAVA_ENCODINGSFeature identifier: whether to recognize java encoding names | protected static final String | STANDARD_URI_CONFORMANT_FEATUREFeature identifier: standard uri conformant feature. | protected static final String | GENERATE_SYNTHETIC_ANNOTATIONSFeature: generate synthetic annotations | protected static final String | VALIDATE_ANNOTATIONSFeature identifier: validate annotations. | protected static final String | HONOUR_ALL_SCHEMALOCATIONSFeature identifier: honour all schemaLocations | protected static final String | USE_GRAMMAR_POOL_ONLYFeature identifier: use grammar pool only | protected static final String | CONTINUE_AFTER_FATAL_ERRORFeature identifier: whether to continue parsing a schema after a fatal error is encountered | protected static final String | PARSER_SETTINGS | public static final String | SYMBOL_TABLEProperty identifier: symbol table. | public static final String | ERROR_REPORTERProperty identifier: error reporter. | public static final String | ENTITY_RESOLVERProperty identifier: entity resolver. | public static final String | XMLGRAMMAR_POOLProperty identifier: grammar pool. | protected static final String | VALIDATION_MANAGER | protected static final String | ENTITY_MANAGER | protected static final String | SCHEMA_LOCATIONProperty identifier: schema location. | protected static final String | SCHEMA_NONS_LOCATIONProperty identifier: no namespace schema location. | protected static final String | JAXP_SCHEMA_SOURCEProperty identifier: JAXP schema source. | protected static final String | JAXP_SCHEMA_LANGUAGEProperty identifier: JAXP schema language. | private static final String[] | RECOGNIZED_FEATURESRecognized features. | private static final Boolean[] | FEATURE_DEFAULTSFeature defaults. | private static final String[] | RECOGNIZED_PROPERTIESRecognized properties. | private static final Object[] | PROPERTY_DEFAULTSProperty defaults. | protected static final int | ID_CONSTRAINT_NUM | protected ElementPSVImpl | fCurrentPSVIcurrent PSVI element info | protected final AugmentationsImpl | fAugmentations | protected final HashMap | fMayMatchFieldMapMap which is used to catch instance documents that try
and match a field several times in the same scope. | protected XMLString | fDefaultValue | protected boolean | fDynamicValidation | protected boolean | fSchemaDynamicValidation | protected boolean | fDoValidation | protected boolean | fFullChecking | protected boolean | fNormalizeData | protected boolean | fSchemaElementDefault | protected boolean | fAugPSVI | protected boolean | fIdConstraint | protected boolean | fUseGrammarPoolOnly | private String | fSchemaTypeSchema type: None, DTD, Schema | protected boolean | fEntityRef | protected boolean | fInCDATA | protected SymbolTable | fSymbolTableSymbol table. | private XMLLocator | fLocatorWhile parsing a document, keep the location of the document. | protected final XSIErrorReporter | fXSIErrorReporterError reporter. | protected XMLEntityResolver | fEntityResolverEntity resolver | protected ValidationManager | fValidationManager | protected ValidationState | fValidationState | protected XMLGrammarPool | fGrammarPool | protected String | fExternalSchemas | protected String | fExternalNoNamespaceSchema | protected Object | fJaxpSchemaSource | protected final XSDDescription | fXSDDescriptionSchema Grammar Description passed, to give a chance to application to supply the Grammar | protected final Hashtable | fLocationPairs | protected XMLDocumentHandler | fDocumentHandlerDocument handler. | protected XMLDocumentSource | fDocumentSource | static final int | INITIAL_STACK_SIZE | static final int | INC_STACK_SIZE | private static final boolean | DEBUG_NORMALIZATION | private final XMLString | fEmptyXMLStr | private static final int | BUFFER_SIZE | private final XMLString | fNormalizedStr | private boolean | fFirstChunk | private boolean | fTrailing | private short | fWhiteSpace | private boolean | fUnionType | private final XSGrammarBucket | fGrammarBucketSchema grammar resolver. | private final SubstitutionGroupHandler | fSubGroupHandler | private final XSSimpleType | fQNameDVthe DV usd to convert xsi:type to a QName | private final CMNodeFactory | nodeFactory | private final CMBuilder | fCMBuilderused to build content models | private final XMLSchemaLoader | fSchemaLoader | private String | fValidationRootString representation of the validation root. | private int | fSkipValidationDepthSkip validation: anything below this level should be skipped | private int | fNFullValidationDepthanything above this level has validation_attempted != full | private int | fNNoneValidationDepthanything above this level has validation_attempted != none | private int | fElementDepthElement depth: -2: validator not in pipeline; >= -1 current depth. | private boolean | fSubElementSeen sub elements. | private boolean[] | fSubElementStackSeen sub elements stack. | private XSElementDecl | fCurrentElemDeclCurrent element declaration. | private XSElementDecl[] | fElemDeclStackElement decl stack. | private boolean | fNilnil value of the current element | private boolean[] | fNilStacknil value stack | private XSNotationDecl | fNotationnotation value of the current element | private XSNotationDecl[] | fNotationStacknotation stack | private XSTypeDefinition | fCurrentTypeCurrent type. | private XSTypeDefinition[] | fTypeStacktype stack. | private XSCMValidator | fCurrentCMCurrent content model. | private XSCMValidator[] | fCMStackContent model stack. | private int[] | fCurrCMStatethe current state of the current content model | private int[] | fCMStateStackstack to hold content model states | private boolean | fStrictAssesswhether the curret element is strictly assessed | private boolean[] | fStrictAssessStackstrict assess stack | private final StringBuffer | fBufferTemporary string buffers. | private boolean | fAppendBufferWhether need to append characters to fBuffer | private boolean | fSawTextDid we see any character data? | private boolean[] | fSawTextStackstack to record if we saw character data | private boolean | fSawCharactersDid we see non-whitespace character data? | private boolean[] | fStringContentStack to record if we saw character data outside of element content | private final QName | fTempQNametemporary qname | private ValidatedInfo | fValidatedInfotemporary validated info | private ValidationState | fState4XsiType | private ValidationState | fState4ApplyDefault | protected XPathMatcherStack | fMatcherStackStack of active XPath matchers for identity constraints. All
active XPath matchers are notified of startElement
and endElement callbacks in order to perform their matches.
For each element with identity constraints, the selector of
each identity constraint is activated. When the selector matches
its XPath, then all the fields of the identity constraint are
activated.
Note: Once the activation scope is left, the
XPath matchers are automatically removed from the stack of
active matchers and no longer receive callbacks. | protected ValueStoreCache | fValueStoreCacheCache of value stores for identity constraint fields. |
Constructors Summary |
---|
public XMLSchemaValidator()Default constructor.
//
// Constructors
//
fState4XsiType.setExtraChecking(false);
fState4ApplyDefault.setFacetChecking(false);
|
Methods Summary |
---|
public com.sun.org.apache.xerces.internal.impl.xs.identity.XPathMatcher | activateField(com.sun.org.apache.xerces.internal.impl.xs.identity.Field field, int initialDepth)Request to activate the specified field. This method returns the
matcher for the field.
ValueStore valueStore =
fValueStoreCache.getValueStoreFor(field.getIdentityConstraint(), initialDepth);
setMayMatch(field, Boolean.TRUE);
XPathMatcher matcher = field.createMatcher(this, valueStore);
fMatcherStack.addMatcher(matcher);
matcher.startDocumentFragment();
return matcher;
| private void | activateSelectorFor(com.sun.org.apache.xerces.internal.impl.xs.identity.IdentityConstraint ic)
Selector selector = ic.getSelector();
FieldActivator activator = this;
if (selector == null)
return;
XPathMatcher matcher = selector.createMatcher(activator, fElementDepth);
fMatcherStack.addMatcher(matcher);
matcher.startDocumentFragment();
| void | addDefaultAttributes(com.sun.org.apache.xerces.internal.xni.QName element, com.sun.org.apache.xerces.internal.xni.XMLAttributes attributes, com.sun.org.apache.xerces.internal.impl.xs.XSAttributeGroupDecl attrGrp)
// Check after all specified attrs are scanned
// (1) report error for REQUIRED attrs that are missing (V_TAGc)
// REVISIT: should we check prohibited attributes?
// (2) report error for PROHIBITED attrs that are present (V_TAGc)
// (3) add default attrs (FIXED and NOT_FIXED)
//
if (DEBUG) {
System.out.println("==>addDefaultAttributes: " + element);
}
XSObjectList attrUses = attrGrp.getAttributeUses();
int useCount = attrUses.getLength();
XSAttributeUseImpl currUse;
XSAttributeDecl currDecl;
short constType;
ValidatedInfo defaultValue;
boolean isSpecified;
QName attName;
// for each attribute use
for (int i = 0; i < useCount; i++) {
currUse = (XSAttributeUseImpl) attrUses.item(i);
currDecl = currUse.fAttrDecl;
// get value constraint
constType = currUse.fConstraintType;
defaultValue = currUse.fDefault;
if (constType == XSConstants.VC_NONE) {
constType = currDecl.getConstraintType();
defaultValue = currDecl.fDefault;
}
// whether this attribute is specified
isSpecified = attributes.getValue(currDecl.fTargetNamespace, currDecl.fName) != null;
// Element Locally Valid (Complex Type)
// 4 The {attribute declaration} of each attribute use in the {attribute uses} whose
// {required} is true matches one of the attribute information items in the element
// information item's [attributes] as per clause 3.1 above.
if (currUse.fUse == SchemaSymbols.USE_REQUIRED) {
if (!isSpecified)
reportSchemaError(
"cvc-complex-type.4",
new Object[] { element.rawname, currDecl.fName });
}
// if the attribute is not specified, then apply the value constraint
if (!isSpecified && constType != XSConstants.VC_NONE) {
attName =
new QName(null, currDecl.fName, currDecl.fName, currDecl.fTargetNamespace);
String normalized = (defaultValue != null) ? defaultValue.stringValue() : "";
int attrIndex = attributes.addAttribute(attName, "CDATA", normalized);
if (attributes instanceof XMLAttributesImpl) {
XMLAttributesImpl attrs = (XMLAttributesImpl) attributes;
boolean schemaId =
defaultValue != null
&& defaultValue.memberType != null
? defaultValue.memberType.isIDType()
: currDecl.fType.isIDType();
attrs.setSchemaId(attrIndex, schemaId);
}
if (fAugPSVI) {
// PSVI: attribute is "schema" specified
Augmentations augs = attributes.getAugmentations(attrIndex);
AttributePSVImpl attrPSVI = new AttributePSVImpl();
augs.putItem(Constants.ATTRIBUTE_PSVI, attrPSVI);
attrPSVI.fDeclaration = currDecl;
attrPSVI.fTypeDecl = currDecl.fType;
attrPSVI.fMemberType = defaultValue.memberType;
attrPSVI.fNormalizedValue = normalized;
attrPSVI.fActualValue = defaultValue.actualValue;
attrPSVI.fActualValueType = defaultValue.actualValueType;
attrPSVI.fItemValueTypes = defaultValue.itemValueTypes;
attrPSVI.fValidationContext = fValidationRoot;
attrPSVI.fValidity = AttributePSVI.VALIDITY_VALID;
attrPSVI.fValidationAttempted = AttributePSVI.VALIDATION_FULL;
attrPSVI.fSpecified = true;
}
}
} // for
| public boolean | characterData(java.lang.String data, com.sun.org.apache.xerces.internal.xni.Augmentations augs)
fSawText = fSawText || data.length() > 0;
// REVISIT: this methods basically duplicates implementation of
// handleCharacters(). We should be able to reuse some code
// if whitespace == -1 skip normalization, because it is a complexType
// or a union type.
if (fNormalizeData && fWhiteSpace != -1 && fWhiteSpace != XSSimpleType.WS_PRESERVE) {
// normalize data
normalizeWhitespace(data, fWhiteSpace == XSSimpleType.WS_COLLAPSE);
fBuffer.append(fNormalizedStr.ch, fNormalizedStr.offset, fNormalizedStr.length);
} else {
if (fAppendBuffer)
fBuffer.append(data);
}
// When it's a complex type with element-only content, we need to
// find out whether the content contains any non-whitespace character.
boolean allWhiteSpace = true;
if (fCurrentType != null
&& fCurrentType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) {
XSComplexTypeDecl ctype = (XSComplexTypeDecl) fCurrentType;
if (ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_ELEMENT) {
// data outside of element content
for (int i = 0; i < data.length(); i++) {
if (!XMLChar.isSpace(data.charAt(i))) {
allWhiteSpace = false;
fSawCharacters = true;
break;
}
}
}
}
return allWhiteSpace;
| public void | characters(com.sun.org.apache.xerces.internal.xni.XMLString text, com.sun.org.apache.xerces.internal.xni.Augmentations augs)Character content.
text = handleCharacters(text);
// call handlers
if (fDocumentHandler != null) {
if (fNormalizeData && fUnionType) {
// for union types we can't normalize data
// thus we only need to send augs information if any;
// the normalized data for union will be send
// after normalization is performed (at the endElement())
if (augs != null)
fDocumentHandler.characters(fEmptyXMLStr, augs);
} else {
fDocumentHandler.characters(text, augs);
}
}
| public void | comment(com.sun.org.apache.xerces.internal.xni.XMLString text, com.sun.org.apache.xerces.internal.xni.Augmentations augs)A comment.
// call handlers
if (fDocumentHandler != null) {
fDocumentHandler.comment(text, augs);
}
| private short | convertToPrimitiveKind(short valueType)
/** Primitive datatypes. */
if (valueType <= XSConstants.NOTATION_DT) {
return valueType;
}
/** Types derived from string. */
if (valueType <= XSConstants.ENTITY_DT) {
return XSConstants.STRING_DT;
}
/** Types derived from decimal. */
if (valueType <= XSConstants.POSITIVEINTEGER_DT) {
return XSConstants.DECIMAL_DT;
}
/** Other types. */
return valueType;
| public void | doctypeDecl(java.lang.String rootElement, java.lang.String publicId, java.lang.String systemId, com.sun.org.apache.xerces.internal.xni.Augmentations augs)Notifies of the presence of the DOCTYPE line in the document.
// call handlers
if (fDocumentHandler != null) {
fDocumentHandler.doctypeDecl(rootElement, publicId, systemId, augs);
}
| public void | elementDefault(java.lang.String data)
// no-op
| java.lang.Object | elementLocallyValidComplexType(com.sun.org.apache.xerces.internal.xni.QName element, java.lang.Object textContent)
Object actualValue = null;
XSComplexTypeDecl ctype = (XSComplexTypeDecl) fCurrentType;
// Element Locally Valid (Complex Type)
// For an element information item to be locally valid with respect to a complex type definition all of the following must be true:
// 1 {abstract} is false.
// 2 If clause 3.2 of Element Locally Valid (Element) (3.3.4) did not apply, then the appropriate case among the following must be true:
if (!fNil) {
// 2.1 If the {content type} is empty, then the element information item has no character or element information item [children].
if (ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_EMPTY
&& (fSubElement || fSawText)) {
reportSchemaError("cvc-complex-type.2.1", new Object[] { element.rawname });
}
// 2.2 If the {content type} is a simple type definition, then the element information item has no element information item [children], and the normalized value of the element information item is valid with respect to that simple type definition as defined by String Valid (3.14.4).
else if (ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_SIMPLE) {
if (fSubElement)
reportSchemaError("cvc-complex-type.2.2", new Object[] { element.rawname });
XSSimpleType dv = ctype.fXSSimpleType;
try {
if (!fNormalizeData || fUnionType) {
fValidationState.setNormalizationRequired(true);
}
actualValue = dv.validate(textContent, fValidationState, fValidatedInfo);
} catch (InvalidDatatypeValueException e) {
reportSchemaError(e.getKey(), e.getArgs());
reportSchemaError("cvc-complex-type.2.2", new Object[] { element.rawname });
}
// REVISIT: eventually, this method should return the same actualValue as elementLocallyValidType...
// obviously it'll return null when the content is complex.
}
// 2.3 If the {content type} is element-only, then the element information item has no character information item [children] other than those whose [character code] is defined as a white space in [XML 1.0 (Second Edition)].
else if (ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_ELEMENT) {
if (fSawCharacters) {
reportSchemaError("cvc-complex-type.2.3", new Object[] { element.rawname });
}
}
// 2.4 If the {content type} is element-only or mixed, then the sequence of the element information item's element information item [children], if any, taken in order, is valid with respect to the {content type}'s particle, as defined in Element Sequence Locally Valid (Particle) (3.9.4).
if (ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_ELEMENT
|| ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_MIXED) {
// if the current state is a valid state, check whether
// it's one of the final states.
if (DEBUG) {
System.out.println(fCurrCMState);
}
if (fCurrCMState[0] >= 0 && !fCurrentCM.endContentModel(fCurrCMState)) {
String expected = expectedStr(fCurrentCM.whatCanGoHere(fCurrCMState));
reportSchemaError(
"cvc-complex-type.2.4.b",
new Object[] { element.rawname, expected });
}
// Constant space algorithm for a{n,m} for n > 1 and m <= unbounded
// After the DFA has completed, check that the number of transitions
// is within minOccurs and maxOccurs, unless maxOccurs is set to
// unbounded in which case only minOccurs is checked. Uses the user
// data stored in the validator, which was originally copied from
// the content model node.
Object userData = fCurrentCM.getUserData();
if (userData instanceof int[]) {
int minOccurs = ((int[]) userData)[0];
int maxOccurs = ((int[]) userData)[1];
int n = fCurrentCM.getOneTransitionCounter();
if (n < minOccurs) {
String expected = expectedStr(fCurrentCM.whatCanGoHere(fCurrCMState));
reportSchemaError(
"cvc-complex-type.2.4.b",
new Object[] { element.rawname, expected });
}
if (maxOccurs != SchemaSymbols.OCCURRENCE_UNBOUNDED && n > maxOccurs) {
String expected = expectedStr(fCurrentCM.whatCanGoHere(fCurrCMState));
reportSchemaError(
"cvc-complex-type.2.4.d",
new Object[] { expected });
}
}
}
}
return actualValue;
| java.lang.Object | elementLocallyValidType(com.sun.org.apache.xerces.internal.xni.QName element, java.lang.Object textContent)
if (fCurrentType == null)
return null;
Object retValue = null;
// Element Locally Valid (Type)
// 3 The appropriate case among the following must be true:
// 3.1 If the type definition is a simple type definition, then all of the following must be true:
if (fCurrentType.getTypeCategory() == XSTypeDefinition.SIMPLE_TYPE) {
// 3.1.2 The element information item must have no element information item [children].
if (fSubElement)
reportSchemaError("cvc-type.3.1.2", new Object[] { element.rawname });
// 3.1.3 If clause 3.2 of Element Locally Valid (Element) (3.3.4) did not apply, then the normalized value must be valid with respect to the type definition as defined by String Valid (3.14.4).
if (!fNil) {
XSSimpleType dv = (XSSimpleType) fCurrentType;
try {
if (!fNormalizeData || fUnionType) {
fValidationState.setNormalizationRequired(true);
}
retValue = dv.validate(textContent, fValidationState, fValidatedInfo);
} catch (InvalidDatatypeValueException e) {
reportSchemaError(e.getKey(), e.getArgs());
reportSchemaError(
"cvc-type.3.1.3",
new Object[] { element.rawname, textContent });
}
}
} else {
// 3.2 If the type definition is a complex type definition, then the element information item must be valid with respect to the type definition as per Element Locally Valid (Complex Type) (3.4.4);
retValue = elementLocallyValidComplexType(element, textContent);
}
return retValue;
| public void | emptyElement(com.sun.org.apache.xerces.internal.xni.QName element, com.sun.org.apache.xerces.internal.xni.XMLAttributes attributes, com.sun.org.apache.xerces.internal.xni.Augmentations augs)An empty element.
Augmentations modifiedAugs = handleStartElement(element, attributes, augs);
// in the case where there is a {value constraint}, and the element
// doesn't have any text content, change emptyElement call to
// start + characters + end
fDefaultValue = null;
// fElementDepth == -2 indicates that the schema validator was removed
// from the pipeline. then we don't need to call handleEndElement.
if (fElementDepth != -2)
modifiedAugs = handleEndElement(element, modifiedAugs);
// call handlers
if (fDocumentHandler != null) {
if (!fSchemaElementDefault || fDefaultValue == null) {
fDocumentHandler.emptyElement(element, attributes, modifiedAugs);
} else {
fDocumentHandler.startElement(element, attributes, modifiedAugs);
fDocumentHandler.characters(fDefaultValue, null);
fDocumentHandler.endElement(element, modifiedAugs);
}
}
| public void | endCDATA(com.sun.org.apache.xerces.internal.xni.Augmentations augs)The end of a CDATA section.
// call handlers
fInCDATA = false;
if (fDocumentHandler != null) {
fDocumentHandler.endCDATA(augs);
}
| public void | endDocument(com.sun.org.apache.xerces.internal.xni.Augmentations augs)The end of the document.
handleEndDocument();
// call handlers
if (fDocumentHandler != null) {
fDocumentHandler.endDocument(augs);
}
fLocator = null;
| public void | endElement(com.sun.org.apache.xerces.internal.xni.QName element, com.sun.org.apache.xerces.internal.xni.Augmentations augs)The end of an element.
// in the case where there is a {value constraint}, and the element
// doesn't have any text content, add a characters call.
fDefaultValue = null;
Augmentations modifiedAugs = handleEndElement(element, augs);
// call handlers
if (fDocumentHandler != null) {
if (!fSchemaElementDefault || fDefaultValue == null) {
fDocumentHandler.endElement(element, modifiedAugs);
} else {
fDocumentHandler.characters(fDefaultValue, null);
fDocumentHandler.endElement(element, modifiedAugs);
}
}
| final com.sun.org.apache.xerces.internal.xni.Augmentations | endElementPSVI(boolean root, com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar[] grammars, com.sun.org.apache.xerces.internal.xni.Augmentations augs)
if (fAugPSVI) {
augs = getEmptyAugs(augs);
// the 4 properties sent on startElement calls
fCurrentPSVI.fDeclaration = this.fCurrentElemDecl;
fCurrentPSVI.fTypeDecl = this.fCurrentType;
fCurrentPSVI.fNotation = this.fNotation;
fCurrentPSVI.fValidationContext = this.fValidationRoot;
// PSVI: validation attempted
// nothing below or at the same level has none or partial
// (which means this level is strictly assessed, and all chidren
// are full), so this one has full
if (fElementDepth > fNFullValidationDepth) {
fCurrentPSVI.fValidationAttempted = ElementPSVI.VALIDATION_FULL;
}
// nothing below or at the same level has full or partial
// (which means this level is not strictly assessed, and all chidren
// are none), so this one has none
else if (fElementDepth > fNNoneValidationDepth) {
fCurrentPSVI.fValidationAttempted = ElementPSVI.VALIDATION_NONE;
}
// otherwise partial, and anything above this level will be partial
else {
fCurrentPSVI.fValidationAttempted = ElementPSVI.VALIDATION_PARTIAL;
fNFullValidationDepth = fNNoneValidationDepth = fElementDepth - 1;
}
if (fDefaultValue != null)
fCurrentPSVI.fSpecified = true;
fCurrentPSVI.fNil = fNil;
fCurrentPSVI.fMemberType = fValidatedInfo.memberType;
fCurrentPSVI.fNormalizedValue = fValidatedInfo.normalizedValue;
fCurrentPSVI.fActualValue = fValidatedInfo.actualValue;
fCurrentPSVI.fActualValueType = fValidatedInfo.actualValueType;
fCurrentPSVI.fItemValueTypes = fValidatedInfo.itemValueTypes;
if (fStrictAssess) {
// get all errors for the current element, its attribute,
// and subelements (if they were strictly assessed).
// any error would make this element invalid.
// and we merge these errors to the parent element.
String[] errors = fXSIErrorReporter.mergeContext();
// PSVI: error codes
fCurrentPSVI.fErrorCodes = errors;
// PSVI: validity
fCurrentPSVI.fValidity =
(errors == null) ? ElementPSVI.VALIDITY_VALID : ElementPSVI.VALIDITY_INVALID;
} else {
// PSVI: validity
fCurrentPSVI.fValidity = ElementPSVI.VALIDITY_NOTKNOWN;
// Discard the current context: ignore any error happened within
// the sub-elements/attributes of this element, because those
// errors won't affect the validity of the parent elements.
fXSIErrorReporter.popContext();
}
if (root) {
// store [schema information] in the PSVI
fCurrentPSVI.fGrammars = grammars;
fCurrentPSVI.fSchemaInformation = null;
}
}
return augs;
| public void | endGeneralEntity(java.lang.String name, com.sun.org.apache.xerces.internal.xni.Augmentations augs)This method notifies the end of a general entity.
Note: This method is not called for entity references
appearing as part of attribute values.
// call handlers
fEntityRef = false;
if (fDocumentHandler != null) {
fDocumentHandler.endGeneralEntity(name, augs);
}
| public void | endValueScopeFor(com.sun.org.apache.xerces.internal.impl.xs.identity.IdentityConstraint identityConstraint, int initialDepth)Ends the value scope for the specified identity constraint.
ValueStoreBase valueStore =
fValueStoreCache.getValueStoreFor(identityConstraint, initialDepth);
valueStore.endValueScope();
| void | ensureStackCapacity()ensure element stack capacity
if (fElementDepth == fElemDeclStack.length) {
int newSize = fElementDepth + INC_STACK_SIZE;
boolean[] newArrayB = new boolean[newSize];
System.arraycopy(fSubElementStack, 0, newArrayB, 0, fElementDepth);
fSubElementStack = newArrayB;
XSElementDecl[] newArrayE = new XSElementDecl[newSize];
System.arraycopy(fElemDeclStack, 0, newArrayE, 0, fElementDepth);
fElemDeclStack = newArrayE;
newArrayB = new boolean[newSize];
System.arraycopy(fNilStack, 0, newArrayB, 0, fElementDepth);
fNilStack = newArrayB;
XSNotationDecl[] newArrayN = new XSNotationDecl[newSize];
System.arraycopy(fNotationStack, 0, newArrayN, 0, fElementDepth);
fNotationStack = newArrayN;
XSTypeDefinition[] newArrayT = new XSTypeDefinition[newSize];
System.arraycopy(fTypeStack, 0, newArrayT, 0, fElementDepth);
fTypeStack = newArrayT;
XSCMValidator[] newArrayC = new XSCMValidator[newSize];
System.arraycopy(fCMStack, 0, newArrayC, 0, fElementDepth);
fCMStack = newArrayC;
newArrayB = new boolean[newSize];
System.arraycopy(fSawTextStack, 0, newArrayB, 0, fElementDepth);
fSawTextStack = newArrayB;
newArrayB = new boolean[newSize];
System.arraycopy(fStringContent, 0, newArrayB, 0, fElementDepth);
fStringContent = newArrayB;
newArrayB = new boolean[newSize];
System.arraycopy(fStrictAssessStack, 0, newArrayB, 0, fElementDepth);
fStrictAssessStack = newArrayB;
int[][] newArrayIA = new int[newSize][];
System.arraycopy(fCMStateStack, 0, newArrayIA, 0, fElementDepth);
fCMStateStack = newArrayIA;
}
| private java.lang.String | expectedStr(java.util.Vector expected)
StringBuffer ret = new StringBuffer("{");
int size = expected.size();
for (int i = 0; i < size; i++) {
if (i > 0)
ret.append(", ");
ret.append(expected.elementAt(i).toString());
}
ret.append('}");
return ret.toString();
| com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar | findSchemaGrammar(short contextType, java.lang.String namespace, com.sun.org.apache.xerces.internal.xni.QName enclosingElement, com.sun.org.apache.xerces.internal.xni.QName triggeringComponet, com.sun.org.apache.xerces.internal.xni.XMLAttributes attributes)
SchemaGrammar grammar = null;
//get the grammar from local pool...
grammar = fGrammarBucket.getGrammar(namespace);
if (grammar == null) {
fXSDDescription.reset();
fXSDDescription.fContextType = contextType;
fXSDDescription.setNamespace(namespace);
fXSDDescription.fEnclosedElementName = enclosingElement;
fXSDDescription.fTriggeringComponent = triggeringComponet;
fXSDDescription.fAttributes = attributes;
if (fLocator != null) {
fXSDDescription.setBaseSystemId(fLocator.getExpandedSystemId());
}
String[] temp = null;
Object locationArray =
fLocationPairs.get(namespace == null ? XMLSymbols.EMPTY_STRING : namespace);
if (locationArray != null)
temp = ((XMLSchemaLoader.LocationArray) locationArray).getLocationArray();
if (temp != null && temp.length != 0) {
fXSDDescription.fLocationHints = new String[temp.length];
System.arraycopy(temp, 0, fXSDDescription.fLocationHints, 0, temp.length);
}
// give a chance to application to be able to retreive the grammar.
if (fGrammarPool != null) {
grammar = (SchemaGrammar) fGrammarPool.retrieveGrammar(fXSDDescription);
if (grammar != null) {
// put this grammar into the bucket, along with grammars
// imported by it (directly or indirectly)
if (!fGrammarBucket.putGrammar(grammar, true)) {
// REVISIT: a conflict between new grammar(s) and grammars
// in the bucket. What to do? A warning? An exception?
fXSIErrorReporter.fErrorReporter.reportError(
XSMessageFormatter.SCHEMA_DOMAIN,
"GrammarConflict",
null,
XMLErrorReporter.SEVERITY_WARNING);
grammar = null;
}
}
}
if (grammar == null && !fUseGrammarPoolOnly) {
// try to parse the grammar using location hints from that namespace..
try {
XMLInputSource xis =
XMLSchemaLoader.resolveDocument(
fXSDDescription,
fLocationPairs,
fEntityResolver);
grammar = fSchemaLoader.loadSchema(fXSDDescription, xis, fLocationPairs);
} catch (IOException ex) {
final String [] locationHints = fXSDDescription.getLocationHints();
fXSIErrorReporter.fErrorReporter.reportError(
XSMessageFormatter.SCHEMA_DOMAIN,
"schema_reference.4",
new Object[] { locationHints != null ? locationHints[0] : XMLSymbols.EMPTY_STRING },
XMLErrorReporter.SEVERITY_WARNING);
}
}
}
return grammar;
| com.sun.org.apache.xerces.internal.xs.XSTypeDefinition | getAndCheckXsiType(com.sun.org.apache.xerces.internal.xni.QName element, java.lang.String xsiType, com.sun.org.apache.xerces.internal.xni.XMLAttributes attributes)
// This method also deals with clause 1.2.1.2 of the constraint
// Validation Rule: Schema-Validity Assessment (Element)
// Element Locally Valid (Element)
// 4 If there is an attribute information item among the element information item's [attributes] whose [namespace name] is identical to http://www.w3.org/2001/XMLSchema-instance and whose [local name] is type, then all of the following must be true:
// 4.1 The normalized value of that attribute information item must be valid with respect to the built-in QName simple type, as defined by String Valid (3.14.4);
QName typeName = null;
try {
typeName = (QName) fQNameDV.validate(xsiType, fValidationState, null);
} catch (InvalidDatatypeValueException e) {
reportSchemaError(e.getKey(), e.getArgs());
reportSchemaError(
"cvc-elt.4.1",
new Object[] {
element.rawname,
SchemaSymbols.URI_XSI + "," + SchemaSymbols.XSI_TYPE,
xsiType });
return null;
}
// 4.2 The local name and namespace name (as defined in QName Interpretation (3.15.3)), of the actual value of that attribute information item must resolve to a type definition, as defined in QName resolution (Instance) (3.15.4)
XSTypeDefinition type = null;
// if the namespace is schema namespace, first try built-in types
if (typeName.uri == SchemaSymbols.URI_SCHEMAFORSCHEMA) {
type = SchemaGrammar.SG_SchemaNS.getGlobalTypeDecl(typeName.localpart);
}
// if it's not schema built-in types, then try to get a grammar
if (type == null) {
//try to find schema grammar by different means....
SchemaGrammar grammar =
findSchemaGrammar(
XSDDescription.CONTEXT_XSITYPE,
typeName.uri,
element,
typeName,
attributes);
if (grammar != null)
type = grammar.getGlobalTypeDecl(typeName.localpart);
}
// still couldn't find the type, report an error
if (type == null) {
reportSchemaError("cvc-elt.4.2", new Object[] { element.rawname, xsiType });
return null;
}
// if there is no current type, set this one as current.
// and we don't need to do extra checking
if (fCurrentType != null) {
// 4.3 The local type definition must be validly derived from the {type definition} given the union of the {disallowed substitutions} and the {type definition}'s {prohibited substitutions}, as defined in Type Derivation OK (Complex) (3.4.6) (if it is a complex type definition), or given {disallowed substitutions} as defined in Type Derivation OK (Simple) (3.14.6) (if it is a simple type definition).
short block = fCurrentElemDecl.fBlock;
if (fCurrentType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE)
block |= ((XSComplexTypeDecl) fCurrentType).fBlock;
if (!XSConstraints.checkTypeDerivationOk(type, fCurrentType, block))
reportSchemaError(
"cvc-elt.4.3",
new Object[] { element.rawname, xsiType, fCurrentType.getName()});
}
return type;
| public com.sun.org.apache.xerces.internal.xni.XMLDocumentHandler | getDocumentHandler()Returns the document handler
return fDocumentHandler;
| public com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentSource | getDocumentSource()Returns the document source
return fDocumentSource;
| com.sun.org.apache.xerces.internal.xni.Augmentations | getEmptyAugs(com.sun.org.apache.xerces.internal.xni.Augmentations augs)
if (augs == null) {
augs = fAugmentations;
augs.removeAllItems();
}
augs.putItem(Constants.ELEMENT_PSVI, fCurrentPSVI);
fCurrentPSVI.reset();
return augs;
| public java.lang.Boolean | getFeatureDefault(java.lang.String featureId)Returns the default state for a feature, or null if this
component does not want to report a default value for this
feature.
for (int i = 0; i < RECOGNIZED_FEATURES.length; i++) {
if (RECOGNIZED_FEATURES[i].equals(featureId)) {
return FEATURE_DEFAULTS[i];
}
}
return null;
| public java.lang.Object | getPropertyDefault(java.lang.String propertyId)Returns the default state for a property, or null if this
component does not want to report a default value for this
property.
for (int i = 0; i < RECOGNIZED_PROPERTIES.length; i++) {
if (RECOGNIZED_PROPERTIES[i].equals(propertyId)) {
return PROPERTY_DEFAULTS[i];
}
}
return null;
| public java.lang.String[] | getRecognizedFeatures()Returns a list of feature identifiers that are recognized by
this component. This method may return null if no features
are recognized by this component.
//
// XMLComponent methods
//
return (String[]) (RECOGNIZED_FEATURES.clone());
| public java.lang.String[] | getRecognizedProperties()Returns a list of property identifiers that are recognized by
this component. This method may return null if no properties
are recognized by this component.
return (String[]) (RECOGNIZED_PROPERTIES.clone());
| boolean | getXsiNil(com.sun.org.apache.xerces.internal.xni.QName element, java.lang.String xsiNil)
// Element Locally Valid (Element)
// 3 The appropriate case among the following must be true:
// 3.1 If {nillable} is false, then there must be no attribute information item among the element information item's [attributes] whose [namespace name] is identical to http://www.w3.org/2001/XMLSchema-instance and whose [local name] is nil.
if (fCurrentElemDecl != null && !fCurrentElemDecl.getNillable()) {
reportSchemaError(
"cvc-elt.3.1",
new Object[] {
element.rawname,
SchemaSymbols.URI_XSI + "," + SchemaSymbols.XSI_NIL });
}
// 3.2 If {nillable} is true and there is such an attribute information item and its actual value is true , then all of the following must be true:
// 3.2.2 There must be no fixed {value constraint}.
else {
String value = xsiNil.trim();
if (value.equals(SchemaSymbols.ATTVAL_TRUE)
|| value.equals(SchemaSymbols.ATTVAL_TRUE_1)) {
if (fCurrentElemDecl != null
&& fCurrentElemDecl.getConstraintType() == XSConstants.VC_FIXED) {
reportSchemaError(
"cvc-elt.3.2.2",
new Object[] {
element.rawname,
SchemaSymbols.URI_XSI + "," + SchemaSymbols.XSI_NIL });
}
return true;
}
}
return false;
| com.sun.org.apache.xerces.internal.xni.XMLString | handleCharacters(com.sun.org.apache.xerces.internal.xni.XMLString text)
if (fSkipValidationDepth >= 0)
return text;
fSawText = fSawText || text.length > 0;
// Note: data in EntityRef and CDATA is normalized as well
// if whitespace == -1 skip normalization, because it is a complexType
// or a union type.
if (fNormalizeData && fWhiteSpace != -1 && fWhiteSpace != XSSimpleType.WS_PRESERVE) {
// normalize data
normalizeWhitespace(text, fWhiteSpace == XSSimpleType.WS_COLLAPSE);
text = fNormalizedStr;
}
if (fAppendBuffer)
fBuffer.append(text.ch, text.offset, text.length);
// When it's a complex type with element-only content, we need to
// find out whether the content contains any non-whitespace character.
if (fCurrentType != null
&& fCurrentType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) {
XSComplexTypeDecl ctype = (XSComplexTypeDecl) fCurrentType;
if (ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_ELEMENT) {
// data outside of element content
for (int i = text.offset; i < text.offset + text.length; i++) {
if (!XMLChar.isSpace(text.ch[i])) {
fSawCharacters = true;
break;
}
}
}
}
return text;
| void | handleEndDocument()
fValueStoreCache.endDocument();
| com.sun.org.apache.xerces.internal.xni.Augmentations | handleEndElement(com.sun.org.apache.xerces.internal.xni.QName element, com.sun.org.apache.xerces.internal.xni.Augmentations augs)Handle end element. If there is not text content, and there is a
{value constraint} on the corresponding element decl, then
set the fDefaultValue XMLString representing the default value.
if (DEBUG) {
System.out.println("==>handleEndElement:" + element);
}
// if we are skipping, return
if (fSkipValidationDepth >= 0) {
// but if this is the top element that we are skipping,
// restore the states.
if (fSkipValidationDepth == fElementDepth && fSkipValidationDepth > 0) {
// set the partial validation depth to the depth of parent
fNFullValidationDepth = fSkipValidationDepth - 1;
fSkipValidationDepth = -1;
fElementDepth--;
fSubElement = fSubElementStack[fElementDepth];
fCurrentElemDecl = fElemDeclStack[fElementDepth];
fNil = fNilStack[fElementDepth];
fNotation = fNotationStack[fElementDepth];
fCurrentType = fTypeStack[fElementDepth];
fCurrentCM = fCMStack[fElementDepth];
fStrictAssess = fStrictAssessStack[fElementDepth];
fCurrCMState = fCMStateStack[fElementDepth];
fSawText = fSawTextStack[fElementDepth];
fSawCharacters = fStringContent[fElementDepth];
}
else {
fElementDepth--;
}
// PSVI: validation attempted:
// use default values in psvi item for
// validation attempted, validity, and error codes
// check extra schema constraints on root element
if (fElementDepth == -1 && fFullChecking) {
XSConstraints.fullSchemaChecking(
fGrammarBucket,
fSubGroupHandler,
fCMBuilder,
fXSIErrorReporter.fErrorReporter);
}
if (fAugPSVI)
augs = getEmptyAugs(augs);
return augs;
}
// now validate the content of the element
processElementContent(element);
// Element Locally Valid (Element)
// 6 The element information item must be valid with respect to each of the {identity-constraint definitions} as per Identity-constraint Satisfied (3.11.4).
// call matchers and de-activate context
int oldCount = fMatcherStack.getMatcherCount();
for (int i = oldCount - 1; i >= 0; i--) {
XPathMatcher matcher = fMatcherStack.getMatcherAt(i);
if (fCurrentElemDecl == null)
matcher.endElement(element, null, false, fValidatedInfo.actualValue, fValidatedInfo.actualValueType, fValidatedInfo.itemValueTypes);
else
matcher.endElement(
element,
fCurrentType,
fCurrentElemDecl.getNillable(),
fDefaultValue == null
? fValidatedInfo.actualValue
: fCurrentElemDecl.fDefault.actualValue,
fDefaultValue == null
? fValidatedInfo.actualValueType
: fCurrentElemDecl.fDefault.actualValueType,
fDefaultValue == null
? fValidatedInfo.itemValueTypes
: fCurrentElemDecl.fDefault.itemValueTypes);
}
if (fMatcherStack.size() > 0) {
fMatcherStack.popContext();
}
int newCount = fMatcherStack.getMatcherCount();
// handle everything *but* keyref's.
for (int i = oldCount - 1; i >= newCount; i--) {
XPathMatcher matcher = fMatcherStack.getMatcherAt(i);
if (matcher instanceof Selector.Matcher) {
Selector.Matcher selMatcher = (Selector.Matcher) matcher;
IdentityConstraint id;
if ((id = selMatcher.getIdentityConstraint()) != null
&& id.getCategory() != IdentityConstraint.IC_KEYREF) {
fValueStoreCache.transplant(id, selMatcher.getInitialDepth());
}
}
}
// now handle keyref's/...
for (int i = oldCount - 1; i >= newCount; i--) {
XPathMatcher matcher = fMatcherStack.getMatcherAt(i);
if (matcher instanceof Selector.Matcher) {
Selector.Matcher selMatcher = (Selector.Matcher) matcher;
IdentityConstraint id;
if ((id = selMatcher.getIdentityConstraint()) != null
&& id.getCategory() == IdentityConstraint.IC_KEYREF) {
ValueStoreBase values =
fValueStoreCache.getValueStoreFor(id, selMatcher.getInitialDepth());
if (values != null) // nothing to do if nothing matched!
values.endDocumentFragment();
}
}
}
fValueStoreCache.endElement();
SchemaGrammar[] grammars = null;
// have we reached the end tag of the validation root?
if (fElementDepth == 0) {
// 7 If the element information item is the validation root, it must be valid per Validation Root Valid (ID/IDREF) (3.3.4).
String invIdRef = fValidationState.checkIDRefID();
fValidationState.resetIDTables();
if (invIdRef != null) {
reportSchemaError("cvc-id.1", new Object[] { invIdRef });
}
// check extra schema constraints
if (fFullChecking) {
XSConstraints.fullSchemaChecking(
fGrammarBucket,
fSubGroupHandler,
fCMBuilder,
fXSIErrorReporter.fErrorReporter);
}
grammars = fGrammarBucket.getGrammars();
// return the final set of grammars validator ended up with
if (fGrammarPool != null) {
fGrammarPool.cacheGrammars(XMLGrammarDescription.XML_SCHEMA, grammars);
}
augs = endElementPSVI(true, grammars, augs);
} else {
augs = endElementPSVI(false, grammars, augs);
// decrease element depth and restore states
fElementDepth--;
// get the states for the parent element.
fSubElement = fSubElementStack[fElementDepth];
fCurrentElemDecl = fElemDeclStack[fElementDepth];
fNil = fNilStack[fElementDepth];
fNotation = fNotationStack[fElementDepth];
fCurrentType = fTypeStack[fElementDepth];
fCurrentCM = fCMStack[fElementDepth];
fStrictAssess = fStrictAssessStack[fElementDepth];
fCurrCMState = fCMStateStack[fElementDepth];
fSawText = fSawTextStack[fElementDepth];
fSawCharacters = fStringContent[fElementDepth];
// We should have a stack for whitespace value, and pop it up here.
// But when fWhiteSpace != -1, and we see a sub-element, it must be
// an error (at least for Schema 1.0). So for valid documents, the
// only value we are going to push/pop in the stack is -1.
// Here we just mimic the effect of popping -1. -SG
fWhiteSpace = -1;
// Same for append buffer. Simple types and elements with fixed
// value constraint don't allow sub-elements. -SG
fAppendBuffer = false;
// same here.
fUnionType = false;
}
return augs;
| void | handleIgnorableWhitespace(com.sun.org.apache.xerces.internal.xni.XMLString text)
if (fSkipValidationDepth >= 0)
return;
// REVISIT: the same process needs to be performed as handleCharacters.
// only it's simpler here: we know all characters are whitespaces.
| void | handleStartDocument(com.sun.org.apache.xerces.internal.xni.XMLLocator locator, java.lang.String encoding)
fValueStoreCache.startDocument();
if (fAugPSVI) {
fCurrentPSVI.fGrammars = null;
fCurrentPSVI.fSchemaInformation = null;
}
| com.sun.org.apache.xerces.internal.xni.Augmentations | handleStartElement(com.sun.org.apache.xerces.internal.xni.QName element, com.sun.org.apache.xerces.internal.xni.XMLAttributes attributes, com.sun.org.apache.xerces.internal.xni.Augmentations augs)Handle element.
if (DEBUG) {
System.out.println("==>handleStartElement: " + element);
}
// root element
if (fElementDepth == -1 && fValidationManager.isGrammarFound()) {
if (fSchemaType == null) {
// schemaType is not specified
// if a DTD grammar is found, we do the same thing as Dynamic:
// if a schema grammar is found, validation is performed;
// otherwise, skip the whole document.
fSchemaDynamicValidation = true;
} else {
// [1] Either schemaType is DTD, and in this case validate/schema is turned off
// [2] Validating against XML Schemas only
// [a] dynamic validation is false: report error if SchemaGrammar is not found
// [b] dynamic validation is true: if grammar is not found ignore.
}
}
// get xsi:schemaLocation and xsi:noNamespaceSchemaLocation attributes,
// parse them to get the grammars
String sLocation =
attributes.getValue(SchemaSymbols.URI_XSI, SchemaSymbols.XSI_SCHEMALOCATION);
String nsLocation =
attributes.getValue(SchemaSymbols.URI_XSI, SchemaSymbols.XSI_NONAMESPACESCHEMALOCATION);
//store the location hints.. we need to do it so that we can defer the loading of grammar until
//there is a reference to a component from that namespace. To provide location hints to the
//application for a namespace
storeLocations(sLocation, nsLocation);
// if we are in the content of "skip", then just skip this element
// REVISIT: is this the correct behaviour for ID constraints? -NG
if (fSkipValidationDepth >= 0) {
fElementDepth++;
if (fAugPSVI)
augs = getEmptyAugs(augs);
return augs;
}
//try to find schema grammar by different means..
SchemaGrammar sGrammar =
findSchemaGrammar(
XSDDescription.CONTEXT_ELEMENT,
element.uri,
null,
element,
attributes);
// if we are not skipping this element, and there is a content model,
// we try to find the corresponding decl object for this element.
// the reason we move this part of code here is to make sure the
// error reported here (if any) is stored within the parent element's
// context, instead of that of the current element.
Object decl = null;
if (fCurrentCM != null) {
decl = fCurrentCM.oneTransition(element, fCurrCMState, fSubGroupHandler);
// it could be an element decl or a wildcard decl
if (fCurrCMState[0] == XSCMValidator.FIRST_ERROR) {
XSComplexTypeDecl ctype = (XSComplexTypeDecl) fCurrentType;
//REVISIT: is it the only case we will have particle = null?
Vector next;
if (ctype.fParticle != null
&& (next = fCurrentCM.whatCanGoHere(fCurrCMState)).size() > 0) {
String expected = expectedStr(next);
reportSchemaError(
"cvc-complex-type.2.4.a",
new Object[] { element.rawname, expected });
} else {
reportSchemaError("cvc-complex-type.2.4.d", new Object[] { element.rawname });
}
}
}
// if it's not the root element, we push the current states in the stacks
if (fElementDepth != -1) {
ensureStackCapacity();
fSubElementStack[fElementDepth] = true;
fSubElement = false;
fElemDeclStack[fElementDepth] = fCurrentElemDecl;
fNilStack[fElementDepth] = fNil;
fNotationStack[fElementDepth] = fNotation;
fTypeStack[fElementDepth] = fCurrentType;
fStrictAssessStack[fElementDepth] = fStrictAssess;
fCMStack[fElementDepth] = fCurrentCM;
fCMStateStack[fElementDepth] = fCurrCMState;
fSawTextStack[fElementDepth] = fSawText;
fStringContent[fElementDepth] = fSawCharacters;
}
// increase the element depth after we've saved
// all states for the parent element
fElementDepth++;
fCurrentElemDecl = null;
XSWildcardDecl wildcard = null;
fCurrentType = null;
fStrictAssess = true;
fNil = false;
fNotation = null;
// and the buffer to hold the value of the element
fBuffer.setLength(0);
fSawText = false;
fSawCharacters = false;
// check what kind of declaration the "decl" from
// oneTransition() maps to
if (decl != null) {
if (decl instanceof XSElementDecl) {
fCurrentElemDecl = (XSElementDecl) decl;
} else {
wildcard = (XSWildcardDecl) decl;
}
}
// if the wildcard is skip, then return
if (wildcard != null && wildcard.fProcessContents == XSWildcardDecl.PC_SKIP) {
fSkipValidationDepth = fElementDepth;
if (fAugPSVI)
augs = getEmptyAugs(augs);
return augs;
}
// try again to get the element decl:
// case 1: find declaration for root element
// case 2: find declaration for element from another namespace
if (fCurrentElemDecl == null) {
if (sGrammar != null) {
fCurrentElemDecl = sGrammar.getGlobalElementDecl(element.localpart);
}
}
if (fCurrentElemDecl != null) {
// then get the type
fCurrentType = fCurrentElemDecl.fType;
}
// get type from xsi:type
String xsiType = attributes.getValue(SchemaSymbols.URI_XSI, SchemaSymbols.XSI_TYPE);
// if no decl/type found for the current element
if (fCurrentType == null && xsiType == null) {
// if this is the validation root, report an error, because
// we can't find eith decl or type for this element
// REVISIT: should we report error, or warning?
if (fElementDepth == 0) {
// for dynamic validation, skip the whole content,
// because no grammar was found.
if (fDynamicValidation || fSchemaDynamicValidation) {
// no schema grammar was found, but it's either dynamic
// validation, or another kind of grammar was found (DTD,
// for example). The intended behavior here is to skip
// the whole document. To improve performance, we try to
// remove the validator from the pipeline, since it's not
// supposed to do anything.
if (fDocumentSource != null) {
fDocumentSource.setDocumentHandler(fDocumentHandler);
if (fDocumentHandler != null)
fDocumentHandler.setDocumentSource(fDocumentSource);
// indicate that the validator was removed.
fElementDepth = -2;
return augs;
}
fSkipValidationDepth = fElementDepth;
if (fAugPSVI)
augs = getEmptyAugs(augs);
return augs;
}
// We don't call reportSchemaError here, because the spec
// doesn't think it's invalid not to be able to find a
// declaration or type definition for an element. Xerces is
// reporting it as an error for historical reasons, but in
// PSVI, we shouldn't mark this element as invalid because
// of this. - SG
fXSIErrorReporter.fErrorReporter.reportError(
XSMessageFormatter.SCHEMA_DOMAIN,
"cvc-elt.1",
new Object[] { element.rawname },
XMLErrorReporter.SEVERITY_ERROR);
}
// if wildcard = strict, report error.
// needs to be called before fXSIErrorReporter.pushContext()
// so that the error belongs to the parent element.
else if (wildcard != null && wildcard.fProcessContents == XSWildcardDecl.PC_STRICT) {
// report error, because wilcard = strict
reportSchemaError("cvc-complex-type.2.4.c", new Object[] { element.rawname });
}
// no element decl or type found for this element.
// Allowed by the spec, we can choose to either laxly assess this
// element, or to skip it. Now we choose lax assessment.
fCurrentType = SchemaGrammar.fAnyType;
fStrictAssess = false;
fNFullValidationDepth = fElementDepth;
// any type has mixed content, so we don't need to append buffer
fAppendBuffer = false;
// push error reporter context: record the current position
// This has to happen after we process skip contents,
// otherwise push and pop won't be correctly paired.
fXSIErrorReporter.pushContext();
} else {
// push error reporter context: record the current position
// This has to happen after we process skip contents,
// otherwise push and pop won't be correctly paired.
fXSIErrorReporter.pushContext();
// get xsi:type
if (xsiType != null) {
XSTypeDefinition oldType = fCurrentType;
fCurrentType = getAndCheckXsiType(element, xsiType, attributes);
// If it fails, use the old type. Use anyType if ther is no old type.
if (fCurrentType == null) {
if (oldType == null)
fCurrentType = SchemaGrammar.fAnyType;
else
fCurrentType = oldType;
}
}
fNNoneValidationDepth = fElementDepth;
// if the element has a fixed value constraint, we need to append
if (fCurrentElemDecl != null
&& fCurrentElemDecl.getConstraintType() == XSConstants.VC_FIXED) {
fAppendBuffer = true;
}
// if the type is simple, we need to append
else if (fCurrentType.getTypeCategory() == XSTypeDefinition.SIMPLE_TYPE) {
fAppendBuffer = true;
} else {
// if the type is simple content complex type, we need to append
XSComplexTypeDecl ctype = (XSComplexTypeDecl) fCurrentType;
fAppendBuffer = (ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_SIMPLE);
}
}
// Element Locally Valid (Element)
// 2 Its {abstract} must be false.
if (fCurrentElemDecl != null && fCurrentElemDecl.getAbstract())
reportSchemaError("cvc-elt.2", new Object[] { element.rawname });
// make the current element validation root
if (fElementDepth == 0) {
fValidationRoot = element.rawname;
}
// update normalization flags
if (fNormalizeData) {
// reset values
fFirstChunk = true;
fTrailing = false;
fUnionType = false;
fWhiteSpace = -1;
}
// Element Locally Valid (Type)
// 2 Its {abstract} must be false.
if (fCurrentType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) {
XSComplexTypeDecl ctype = (XSComplexTypeDecl) fCurrentType;
if (ctype.getAbstract()) {
reportSchemaError("cvc-type.2", new Object[] { element.rawname });
}
if (fNormalizeData) {
// find out if the content type is simple and if variety is union
// to be able to do character normalization
if (ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_SIMPLE) {
if (ctype.fXSSimpleType.getVariety() == XSSimpleType.VARIETY_UNION) {
fUnionType = true;
} else {
try {
fWhiteSpace = ctype.fXSSimpleType.getWhitespace();
} catch (DatatypeException e) {
// do nothing
}
}
}
}
}
// normalization: simple type
else if (fNormalizeData) {
// if !union type
XSSimpleType dv = (XSSimpleType) fCurrentType;
if (dv.getVariety() == XSSimpleType.VARIETY_UNION) {
fUnionType = true;
} else {
try {
fWhiteSpace = dv.getWhitespace();
} catch (DatatypeException e) {
// do nothing
}
}
}
// then try to get the content model
fCurrentCM = null;
if (fCurrentType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) {
fCurrentCM = ((XSComplexTypeDecl) fCurrentType).getContentModel(fCMBuilder);
}
// and get the initial content model state
fCurrCMState = null;
if (fCurrentCM != null)
fCurrCMState = fCurrentCM.startContentModel();
// get information about xsi:nil
String xsiNil = attributes.getValue(SchemaSymbols.URI_XSI, SchemaSymbols.XSI_NIL);
// only deal with xsi:nil when there is an element declaration
if (xsiNil != null && fCurrentElemDecl != null)
fNil = getXsiNil(element, xsiNil);
// now validate everything related with the attributes
// first, get the attribute group
XSAttributeGroupDecl attrGrp = null;
if (fCurrentType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) {
XSComplexTypeDecl ctype = (XSComplexTypeDecl) fCurrentType;
attrGrp = ctype.getAttrGrp();
}
// activate identity constraints
fValueStoreCache.startElement();
fMatcherStack.pushContext();
if (fCurrentElemDecl != null && fCurrentElemDecl.fIDCPos > 0) {
fIdConstraint = true;
// initialize when identity constrains are defined for the elem
fValueStoreCache.initValueStoresFor(fCurrentElemDecl, this);
}
processAttributes(element, attributes, attrGrp);
// add default attributes
if (attrGrp != null) {
addDefaultAttributes(element, attributes, attrGrp);
}
// call all active identity constraints
int count = fMatcherStack.getMatcherCount();
for (int i = 0; i < count; i++) {
XPathMatcher matcher = fMatcherStack.getMatcherAt(i);
matcher.startElement( element, attributes);
}
if (fAugPSVI) {
augs = getEmptyAugs(augs);
// PSVI: add validation context
fCurrentPSVI.fValidationContext = fValidationRoot;
// PSVI: add element declaration
fCurrentPSVI.fDeclaration = fCurrentElemDecl;
// PSVI: add element type
fCurrentPSVI.fTypeDecl = fCurrentType;
// PSVI: add notation attribute
fCurrentPSVI.fNotation = fNotation;
}
return augs;
| public void | ignorableWhitespace(com.sun.org.apache.xerces.internal.xni.XMLString text, com.sun.org.apache.xerces.internal.xni.Augmentations augs)Ignorable whitespace. For this method to be called, the document
source must have some way of determining that the text containing
only whitespace characters should be considered ignorable. For
example, the validator can determine if a length of whitespace
characters in the document are ignorable based on the element
content model.
handleIgnorableWhitespace(text);
// call handlers
if (fDocumentHandler != null) {
fDocumentHandler.ignorableWhitespace(text, augs);
}
| private boolean | isComparable(com.sun.org.apache.xerces.internal.impl.dv.ValidatedInfo info1, com.sun.org.apache.xerces.internal.impl.dv.ValidatedInfo info2)Returns true if the two ValidatedInfo objects can be compared in the same value space.
final short primitiveType1 = convertToPrimitiveKind(info1.actualValueType);
final short primitiveType2 = convertToPrimitiveKind(info2.actualValueType);
if (primitiveType1 != primitiveType2) {
return (primitiveType1 == XSConstants.ANYSIMPLETYPE_DT && primitiveType2 == XSConstants.STRING_DT ||
primitiveType1 == XSConstants.STRING_DT && primitiveType2 == XSConstants.ANYSIMPLETYPE_DT);
}
else if (primitiveType1 == XSConstants.LIST_DT || primitiveType1 == XSConstants.LISTOFUNION_DT) {
final ShortList typeList1 = info1.itemValueTypes;
final ShortList typeList2 = info2.itemValueTypes;
final int typeList1Length = typeList1 != null ? typeList1.getLength() : 0;
final int typeList2Length = typeList2 != null ? typeList2.getLength() : 0;
if (typeList1Length != typeList2Length) {
return false;
}
for (int i = 0; i < typeList1Length; ++i) {
final short primitiveItem1 = convertToPrimitiveKind(typeList1.item(i));
final short primitiveItem2 = convertToPrimitiveKind(typeList2.item(i));
if (primitiveItem1 != primitiveItem2) {
if (primitiveItem1 == XSConstants.ANYSIMPLETYPE_DT && primitiveItem2 == XSConstants.STRING_DT ||
primitiveItem1 == XSConstants.STRING_DT && primitiveItem2 == XSConstants.ANYSIMPLETYPE_DT) {
continue;
}
return false;
}
}
}
return true;
| public java.lang.Boolean | mayMatch(com.sun.org.apache.xerces.internal.impl.xs.identity.Field field)Returns whether the given field is permitted to match a value.
return (Boolean) fMayMatchFieldMap.get(field);
| private void | normalizeWhitespace(com.sun.org.apache.xerces.internal.xni.XMLString value, boolean collapse)Normalize whitespace in an XMLString according to the rules defined
in XML Schema specifications.
boolean skipSpace = collapse;
boolean sawNonWS = false;
boolean leading = false;
boolean trailing = false;
char c;
int size = value.offset + value.length;
// ensure the ch array is big enough
if (fNormalizedStr.ch == null || fNormalizedStr.ch.length < value.length + 1) {
fNormalizedStr.ch = new char[value.length + 1];
}
// don't include the leading ' ' for now. might include it later.
fNormalizedStr.offset = 1;
fNormalizedStr.length = 1;
for (int i = value.offset; i < size; i++) {
c = value.ch[i];
if (XMLChar.isSpace(c)) {
if (!skipSpace) {
// take the first whitespace as a space and skip the others
fNormalizedStr.ch[fNormalizedStr.length++] = ' ";
skipSpace = collapse;
}
if (!sawNonWS) {
// this is a leading whitespace, record it
leading = true;
}
} else {
fNormalizedStr.ch[fNormalizedStr.length++] = c;
skipSpace = false;
sawNonWS = true;
}
}
if (skipSpace) {
if (fNormalizedStr.length > 1) {
// if we finished on a space trim it but also record it
fNormalizedStr.length--;
trailing = true;
} else if (leading && !fFirstChunk) {
// if all we had was whitespace we skipped record it as
// trailing whitespace as well
trailing = true;
}
}
if (fNormalizedStr.length > 1) {
if (!fFirstChunk && (fWhiteSpace == XSSimpleType.WS_COLLAPSE)) {
if (fTrailing) {
// previous chunk ended on whitespace
// insert whitespace
fNormalizedStr.offset = 0;
fNormalizedStr.ch[0] = ' ";
} else if (leading) {
// previous chunk ended on character,
// this chunk starts with whitespace
fNormalizedStr.offset = 0;
fNormalizedStr.ch[0] = ' ";
}
}
}
// The length includes the leading ' '. Now removing it.
fNormalizedStr.length -= fNormalizedStr.offset;
fTrailing = trailing;
if (trailing || sawNonWS)
fFirstChunk = false;
| private void | normalizeWhitespace(java.lang.String value, boolean collapse)
boolean skipSpace = collapse;
char c;
int size = value.length();
// ensure the ch array is big enough
if (fNormalizedStr.ch == null || fNormalizedStr.ch.length < size) {
fNormalizedStr.ch = new char[size];
}
fNormalizedStr.offset = 0;
fNormalizedStr.length = 0;
for (int i = 0; i < size; i++) {
c = value.charAt(i);
if (XMLChar.isSpace(c)) {
if (!skipSpace) {
// take the first whitespace as a space and skip the others
fNormalizedStr.ch[fNormalizedStr.length++] = ' ";
skipSpace = collapse;
}
} else {
fNormalizedStr.ch[fNormalizedStr.length++] = c;
skipSpace = false;
}
}
if (skipSpace) {
if (fNormalizedStr.length != 0)
// if we finished on a space trim it but also record it
fNormalizedStr.length--;
}
| void | processAttributes(com.sun.org.apache.xerces.internal.xni.QName element, com.sun.org.apache.xerces.internal.xni.XMLAttributes attributes, com.sun.org.apache.xerces.internal.impl.xs.XSAttributeGroupDecl attrGrp)
if (DEBUG) {
System.out.println("==>processAttributes: " + attributes.getLength());
}
// whether we have seen a Wildcard ID.
String wildcardIDName = null;
// for each present attribute
int attCount = attributes.getLength();
Augmentations augs = null;
AttributePSVImpl attrPSVI = null;
boolean isSimple =
fCurrentType == null || fCurrentType.getTypeCategory() == XSTypeDefinition.SIMPLE_TYPE;
XSObjectList attrUses = null;
int useCount = 0;
XSWildcardDecl attrWildcard = null;
if (!isSimple) {
attrUses = attrGrp.getAttributeUses();
useCount = attrUses.getLength();
attrWildcard = attrGrp.fAttributeWC;
}
// Element Locally Valid (Complex Type)
// 3 For each attribute information item in the element information item's [attributes] excepting those whose [namespace name] is identical to http://www.w3.org/2001/XMLSchema-instance and whose [local name] is one of type, nil, schemaLocation or noNamespaceSchemaLocation, the appropriate case among the following must be true:
// get the corresponding attribute decl
for (int index = 0; index < attCount; index++) {
attributes.getName(index, fTempQName);
if (DEBUG) {
System.out.println("==>process attribute: " + fTempQName);
}
if (fAugPSVI || fIdConstraint) {
augs = attributes.getAugmentations(index);
attrPSVI = (AttributePSVImpl) augs.getItem(Constants.ATTRIBUTE_PSVI);
if (attrPSVI != null) {
attrPSVI.reset();
} else {
attrPSVI = new AttributePSVImpl();
augs.putItem(Constants.ATTRIBUTE_PSVI, attrPSVI);
}
// PSVI attribute: validation context
attrPSVI.fValidationContext = fValidationRoot;
}
// Element Locally Valid (Type)
// 3.1.1 The element information item's [attributes] must be empty, excepting those
// whose [namespace name] is identical to http://www.w3.org/2001/XMLSchema-instance and
// whose [local name] is one of type, nil, schemaLocation or noNamespaceSchemaLocation.
// for the 4 xsi attributes, get appropriate decl, and validate
if (fTempQName.uri == SchemaSymbols.URI_XSI) {
XSAttributeDecl attrDecl = null;
if (fTempQName.localpart == SchemaSymbols.XSI_SCHEMALOCATION)
attrDecl =
SchemaGrammar.SG_XSI.getGlobalAttributeDecl(
SchemaSymbols.XSI_SCHEMALOCATION);
else if (fTempQName.localpart == SchemaSymbols.XSI_NONAMESPACESCHEMALOCATION)
attrDecl =
SchemaGrammar.SG_XSI.getGlobalAttributeDecl(
SchemaSymbols.XSI_NONAMESPACESCHEMALOCATION);
else if (fTempQName.localpart == SchemaSymbols.XSI_NIL)
attrDecl = SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_NIL);
else if (fTempQName.localpart == SchemaSymbols.XSI_TYPE)
attrDecl = SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_TYPE);
if (attrDecl != null) {
processOneAttribute(element, attributes, index, attrDecl, null, attrPSVI);
continue;
}
}
// for namespace attributes, no_validation/unknow_validity
if (fTempQName.rawname == XMLSymbols.PREFIX_XMLNS
|| fTempQName.rawname.startsWith("xmlns:")) {
continue;
}
// simple type doesn't allow any other attributes
if (isSimple) {
reportSchemaError(
"cvc-type.3.1.1",
new Object[] { element.rawname, fTempQName.rawname });
continue;
}
// it's not xmlns, and not xsi, then we need to find a decl for it
XSAttributeUseImpl currUse = null, oneUse;
for (int i = 0; i < useCount; i++) {
oneUse = (XSAttributeUseImpl) attrUses.item(i);
if (oneUse.fAttrDecl.fName == fTempQName.localpart
&& oneUse.fAttrDecl.fTargetNamespace == fTempQName.uri) {
currUse = oneUse;
break;
}
}
// 3.2 otherwise all of the following must be true:
// 3.2.1 There must be an {attribute wildcard}.
// 3.2.2 The attribute information item must be valid with respect to it as defined in Item Valid (Wildcard) (3.10.4).
// if failed, get it from wildcard
if (currUse == null) {
//if (attrWildcard == null)
// reportSchemaError("cvc-complex-type.3.2.1", new Object[]{element.rawname, fTempQName.rawname});
if (attrWildcard == null || !attrWildcard.allowNamespace(fTempQName.uri)) {
// so this attribute is not allowed
reportSchemaError(
"cvc-complex-type.3.2.2",
new Object[] { element.rawname, fTempQName.rawname });
continue;
}
}
XSAttributeDecl currDecl = null;
if (currUse != null) {
currDecl = currUse.fAttrDecl;
} else {
// which means it matches a wildcard
// skip it if processContents is skip
if (attrWildcard.fProcessContents == XSWildcardDecl.PC_SKIP)
continue;
//try to find grammar by different means...
SchemaGrammar grammar =
findSchemaGrammar(
XSDDescription.CONTEXT_ATTRIBUTE,
fTempQName.uri,
element,
fTempQName,
attributes);
if (grammar != null) {
currDecl = grammar.getGlobalAttributeDecl(fTempQName.localpart);
}
// if can't find
if (currDecl == null) {
// if strict, report error
if (attrWildcard.fProcessContents == XSWildcardDecl.PC_STRICT) {
reportSchemaError(
"cvc-complex-type.3.2.2",
new Object[] { element.rawname, fTempQName.rawname });
}
// then continue to the next attribute
continue;
} else {
// 5 Let [Definition:] the wild IDs be the set of all attribute information item to which clause 3.2 applied and whose validation resulted in a context-determined declaration of mustFind or no context-determined declaration at all, and whose [local name] and [namespace name] resolve (as defined by QName resolution (Instance) (3.15.4)) to an attribute declaration whose {type definition} is or is derived from ID. Then all of the following must be true:
// 5.1 There must be no more than one item in wild IDs.
if (currDecl.fType.getTypeCategory() == XSTypeDefinition.SIMPLE_TYPE
&& ((XSSimpleType) currDecl.fType).isIDType()) {
if (wildcardIDName != null) {
reportSchemaError(
"cvc-complex-type.5.1",
new Object[] { element.rawname, currDecl.fName, wildcardIDName });
} else
wildcardIDName = currDecl.fName;
}
}
}
processOneAttribute(element, attributes, index, currDecl, currUse, attrPSVI);
} // end of for (all attributes)
// 5.2 If wild IDs is non-empty, there must not be any attribute uses among the {attribute uses} whose {attribute declaration}'s {type definition} is or is derived from ID.
if (!isSimple && attrGrp.fIDAttrName != null && wildcardIDName != null) {
reportSchemaError(
"cvc-complex-type.5.2",
new Object[] { element.rawname, wildcardIDName, attrGrp.fIDAttrName });
}
| void | processElementContent(com.sun.org.apache.xerces.internal.xni.QName element)If there is not text content, and there is a
{value constraint} on the corresponding element decl, then return
an XMLString representing the default value.
// 1 If the item is ?valid? with respect to an element declaration as per Element Locally Valid (Element) (?3.3.4) and the {value constraint} is present, but clause 3.2 of Element Locally Valid (Element) (?3.3.4) above is not satisfied and the item has no element or character information item [children], then schema. Furthermore, the post-schema-validation infoset has the canonical lexical representation of the {value constraint} value as the item's [schema normalized value] property.
if (fCurrentElemDecl != null
&& fCurrentElemDecl.fDefault != null
&& !fSawText
&& !fSubElement
&& !fNil) {
String strv = fCurrentElemDecl.fDefault.stringValue();
int bufLen = strv.length();
if (fNormalizedStr.ch == null || fNormalizedStr.ch.length < bufLen) {
fNormalizedStr.ch = new char[bufLen];
}
strv.getChars(0, bufLen, fNormalizedStr.ch, 0);
fNormalizedStr.offset = 0;
fNormalizedStr.length = bufLen;
fDefaultValue = fNormalizedStr;
}
// fixed values are handled later, after xsi:type determined.
fValidatedInfo.normalizedValue = null;
// Element Locally Valid (Element)
// 3.2.1 The element information item must have no character or element information item [children].
if (fNil) {
if (fSubElement || fSawText) {
reportSchemaError(
"cvc-elt.3.2.1",
new Object[] {
element.rawname,
SchemaSymbols.URI_XSI + "," + SchemaSymbols.XSI_NIL });
}
}
this.fValidatedInfo.reset();
// 5 The appropriate case among the following must be true:
// 5.1 If the declaration has a {value constraint}, the item has neither element nor character [children] and clause 3.2 has not applied, then all of the following must be true:
if (fCurrentElemDecl != null
&& fCurrentElemDecl.getConstraintType() != XSConstants.VC_NONE
&& !fSubElement
&& !fSawText
&& !fNil) {
// 5.1.1 If the actual type definition is a local type definition then the canonical lexical representation of the {value constraint} value must be a valid default for the actual type definition as defined in Element Default Valid (Immediate) (3.3.6).
if (fCurrentType != fCurrentElemDecl.fType) {
//REVISIT:we should pass ValidatedInfo here.
if (XSConstraints
.ElementDefaultValidImmediate(
fCurrentType,
fCurrentElemDecl.fDefault.stringValue(),
fState4XsiType,
null)
== null)
reportSchemaError(
"cvc-elt.5.1.1",
new Object[] {
element.rawname,
fCurrentType.getName(),
fCurrentElemDecl.fDefault.stringValue()});
}
// 5.1.2 The element information item with the canonical lexical representation of the {value constraint} value used as its normalized value must be valid with respect to the actual type definition as defined by Element Locally Valid (Type) (3.3.4).
// REVISIT: don't use toString, but validateActualValue instead
// use the fState4ApplyDefault
elementLocallyValidType(element, fCurrentElemDecl.fDefault.stringValue());
} else {
// The following method call also deal with clause 1.2.2 of the constraint
// Validation Rule: Schema-Validity Assessment (Element)
// 5.2 If the declaration has no {value constraint} or the item has either element or character [children] or clause 3.2 has applied, then all of the following must be true:
// 5.2.1 The element information item must be valid with respect to the actual type definition as defined by Element Locally Valid (Type) (3.3.4).
Object actualValue = elementLocallyValidType(element, fBuffer);
// 5.2.2 If there is a fixed {value constraint} and clause 3.2 has not applied, all of the following must be true:
if (fCurrentElemDecl != null
&& fCurrentElemDecl.getConstraintType() == XSConstants.VC_FIXED
&& !fNil) {
String content = fBuffer.toString();
// 5.2.2.1 The element information item must have no element information item [children].
if (fSubElement)
reportSchemaError("cvc-elt.5.2.2.1", new Object[] { element.rawname });
// 5.2.2.2 The appropriate case among the following must be true:
if (fCurrentType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) {
XSComplexTypeDecl ctype = (XSComplexTypeDecl) fCurrentType;
// 5.2.2.2.1 If the {content type} of the actual type definition is mixed, then the initial value of the item must match the canonical lexical representation of the {value constraint} value.
if (ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_MIXED) {
// REVISIT: how to get the initial value, does whiteSpace count?
if (!fCurrentElemDecl.fDefault.normalizedValue.equals(content))
reportSchemaError(
"cvc-elt.5.2.2.2.1",
new Object[] {
element.rawname,
content,
fCurrentElemDecl.fDefault.normalizedValue });
}
// 5.2.2.2.2 If the {content type} of the actual type definition is a simple type definition, then the actual value of the item must match the canonical lexical representation of the {value constraint} value.
else if (ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_SIMPLE) {
if (actualValue != null && (!isComparable(fValidatedInfo, fCurrentElemDecl.fDefault)
|| !actualValue.equals(fCurrentElemDecl.fDefault.actualValue))) {
reportSchemaError(
"cvc-elt.5.2.2.2.2",
new Object[] {
element.rawname,
content,
fCurrentElemDecl.fDefault.stringValue()});
}
}
} else if (fCurrentType.getTypeCategory() == XSTypeDefinition.SIMPLE_TYPE) {
if (actualValue != null && (!isComparable(fValidatedInfo, fCurrentElemDecl.fDefault)
|| !actualValue.equals(fCurrentElemDecl.fDefault.actualValue))) {
// REVISIT: the spec didn't mention this case: fixed
// value with simple type
reportSchemaError(
"cvc-elt.5.2.2.2.2",
new Object[] {
element.rawname,
content,
fCurrentElemDecl.fDefault.stringValue()});
}
}
}
}
if (fDefaultValue == null && fNormalizeData && fDocumentHandler != null && fUnionType) {
// for union types we need to send data because we delayed sending
// this data when we received it in the characters() call.
String content = fValidatedInfo.normalizedValue;
if (content == null)
content = fBuffer.toString();
int bufLen = content.length();
if (fNormalizedStr.ch == null || fNormalizedStr.ch.length < bufLen) {
fNormalizedStr.ch = new char[bufLen];
}
content.getChars(0, bufLen, fNormalizedStr.ch, 0);
fNormalizedStr.offset = 0;
fNormalizedStr.length = bufLen;
fDocumentHandler.characters(fNormalizedStr, null);
}
| void | processOneAttribute(com.sun.org.apache.xerces.internal.xni.QName element, com.sun.org.apache.xerces.internal.xni.XMLAttributes attributes, int index, com.sun.org.apache.xerces.internal.impl.xs.XSAttributeDecl currDecl, com.sun.org.apache.xerces.internal.impl.xs.XSAttributeUseImpl currUse, com.sun.org.apache.xerces.internal.impl.xs.AttributePSVImpl attrPSVI)
String attrValue = attributes.getValue(index);
fXSIErrorReporter.pushContext();
// Attribute Locally Valid
// For an attribute information item to be locally valid with respect to an attribute declaration all of the following must be true:
// 1 The declaration must not be absent (see Missing Sub-components (5.3) for how this can fail to be the case).
// 2 Its {type definition} must not be absent.
// 3 The item's normalized value must be locally valid with respect to that {type definition} as per String Valid (3.14.4).
// get simple type
XSSimpleType attDV = currDecl.fType;
Object actualValue = null;
try {
actualValue = attDV.validate(attrValue, fValidationState, fValidatedInfo);
// store the normalized value
if (fNormalizeData)
attributes.setValue(index, fValidatedInfo.normalizedValue);
if (attributes instanceof XMLAttributesImpl) {
XMLAttributesImpl attrs = (XMLAttributesImpl) attributes;
boolean schemaId =
fValidatedInfo.memberType != null
? fValidatedInfo.memberType.isIDType()
: attDV.isIDType();
attrs.setSchemaId(index, schemaId);
}
// PSVI: element notation
if (attDV.getVariety() == XSSimpleType.VARIETY_ATOMIC
&& attDV.getPrimitiveKind() == XSSimpleType.PRIMITIVE_NOTATION) {
QName qName = (QName) actualValue;
SchemaGrammar grammar = fGrammarBucket.getGrammar(qName.uri);
//REVISIT: is it possible for the notation to be in different namespace than the attribute
//with which it is associated, CHECK !! <fof n1:att1 = "n2:notation1" ..>
// should we give chance to the application to be able to retrieve a grammar - nb
//REVISIT: what would be the triggering component here.. if it is attribute value that
// triggered the loading of grammar ?? -nb
if (grammar != null) {
fNotation = grammar.getGlobalNotationDecl(qName.localpart);
}
}
} catch (InvalidDatatypeValueException idve) {
reportSchemaError(idve.getKey(), idve.getArgs());
reportSchemaError(
"cvc-attribute.3",
new Object[] { element.rawname, fTempQName.rawname, attrValue, attDV.getName()});
}
// get the value constraint from use or decl
// 4 The item's actual value must match the value of the {value constraint}, if it is present and fixed. // now check the value against the simpleType
if (actualValue != null && currDecl.getConstraintType() == XSConstants.VC_FIXED) {
if (!isComparable(fValidatedInfo, currDecl.fDefault) || !actualValue.equals(currDecl.fDefault.actualValue)) {
reportSchemaError(
"cvc-attribute.4",
new Object[] {
element.rawname,
fTempQName.rawname,
attrValue,
currDecl.fDefault.stringValue()});
}
}
// 3.1 If there is among the {attribute uses} an attribute use with an {attribute declaration} whose {name} matches the attribute information item's [local name] and whose {target namespace} is identical to the attribute information item's [namespace name] (where an absent {target namespace} is taken to be identical to a [namespace name] with no value), then the attribute information must be valid with respect to that attribute use as per Attribute Locally Valid (Use) (3.5.4). In this case the {attribute declaration} of that attribute use is the context-determined declaration for the attribute information item with respect to Schema-Validity Assessment (Attribute) (3.2.4) and Assessment Outcome (Attribute) (3.2.5).
if (actualValue != null
&& currUse != null
&& currUse.fConstraintType == XSConstants.VC_FIXED) {
if (!isComparable(fValidatedInfo, currUse.fDefault) || !actualValue.equals(currUse.fDefault.actualValue)) {
reportSchemaError(
"cvc-complex-type.3.1",
new Object[] {
element.rawname,
fTempQName.rawname,
attrValue,
currUse.fDefault.stringValue()});
}
}
if (fIdConstraint) {
attrPSVI.fActualValue = actualValue;
}
if (fAugPSVI) {
// PSVI: attribute declaration
attrPSVI.fDeclaration = currDecl;
// PSVI: attribute type
attrPSVI.fTypeDecl = attDV;
// PSVI: attribute memberType
attrPSVI.fMemberType = fValidatedInfo.memberType;
// PSVI: attribute normalized value
// NOTE: we always store the normalized value, even if it's invlid,
// because it might still be useful to the user. But when the it's
// not valid, the normalized value is not trustable.
attrPSVI.fNormalizedValue = fValidatedInfo.normalizedValue;
attrPSVI.fActualValue = fValidatedInfo.actualValue;
attrPSVI.fActualValueType = fValidatedInfo.actualValueType;
attrPSVI.fItemValueTypes = fValidatedInfo.itemValueTypes;
// PSVI: validation attempted:
attrPSVI.fValidationAttempted = AttributePSVI.VALIDATION_FULL;
String[] errors = fXSIErrorReporter.mergeContext();
// PSVI: error codes
attrPSVI.fErrorCodes = errors;
// PSVI: validity
attrPSVI.fValidity =
(errors == null) ? AttributePSVI.VALIDITY_VALID : AttributePSVI.VALIDITY_INVALID;
}
| public void | processingInstruction(java.lang.String target, com.sun.org.apache.xerces.internal.xni.XMLString data, com.sun.org.apache.xerces.internal.xni.Augmentations augs)A processing instruction. Processing instructions consist of a
target name and, optionally, text data. The data is only meaningful
to the application.
Typically, a processing instruction's data will contain a series
of pseudo-attributes. These pseudo-attributes follow the form of
element attributes but are not parsed or presented
to the application as anything other than text. The application is
responsible for parsing the data.
// call handlers
if (fDocumentHandler != null) {
fDocumentHandler.processingInstruction(target, data, augs);
}
| void | reportSchemaError(java.lang.String key, java.lang.Object[] arguments)
if (fDoValidation)
fXSIErrorReporter.reportError(
XSMessageFormatter.SCHEMA_DOMAIN,
key,
arguments,
XMLErrorReporter.SEVERITY_ERROR);
| public void | reset(com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager componentManager)
fIdConstraint = false;
//reset XSDDescription
fLocationPairs.clear();
// cleanup id table
fValidationState.resetIDTables();
//pass the component manager to the factory..
nodeFactory.reset(componentManager);
// reset schema loader
fSchemaLoader.reset(componentManager);
// initialize state
fCurrentElemDecl = null;
fCurrentCM = null;
fCurrCMState = null;
fSkipValidationDepth = -1;
fNFullValidationDepth = -1;
fNNoneValidationDepth = -1;
fElementDepth = -1;
fSubElement = false;
fSchemaDynamicValidation = false;
// datatype normalization
fEntityRef = false;
fInCDATA = false;
fMatcherStack.clear();
if (!fMayMatchFieldMap.isEmpty()) {
// should only clear this if the last schema had identity constraints.
fMayMatchFieldMap.clear();
}
// get error reporter
fXSIErrorReporter.reset((XMLErrorReporter) componentManager.getProperty(ERROR_REPORTER));
boolean parser_settings;
try {
parser_settings = componentManager.getFeature(PARSER_SETTINGS);
}
catch (XMLConfigurationException e){
parser_settings = true;
}
if (!parser_settings){
// parser settings have not been changed
fValidationManager.addValidationState(fValidationState);
// Re-parse external schema location properties.
XMLSchemaLoader.processExternalHints(
fExternalSchemas,
fExternalNoNamespaceSchema,
fLocationPairs,
fXSIErrorReporter.fErrorReporter);
return;
}
// get symbol table. if it's a new one, add symbols to it.
SymbolTable symbolTable = (SymbolTable) componentManager.getProperty(SYMBOL_TABLE);
if (symbolTable != fSymbolTable) {
fSymbolTable = symbolTable;
}
try {
fDynamicValidation = componentManager.getFeature(DYNAMIC_VALIDATION);
} catch (XMLConfigurationException e) {
fDynamicValidation = false;
}
if (fDynamicValidation) {
fDoValidation = true;
} else {
try {
fDoValidation = componentManager.getFeature(VALIDATION);
} catch (XMLConfigurationException e) {
fDoValidation = false;
}
}
if (fDoValidation) {
try {
fDoValidation = componentManager.getFeature(XMLSchemaValidator.SCHEMA_VALIDATION);
} catch (XMLConfigurationException e) {
}
}
try {
fFullChecking = componentManager.getFeature(SCHEMA_FULL_CHECKING);
} catch (XMLConfigurationException e) {
fFullChecking = false;
}
try {
fNormalizeData = componentManager.getFeature(NORMALIZE_DATA);
} catch (XMLConfigurationException e) {
fNormalizeData = false;
}
try {
fSchemaElementDefault = componentManager.getFeature(SCHEMA_ELEMENT_DEFAULT);
} catch (XMLConfigurationException e) {
fSchemaElementDefault = false;
}
try {
fAugPSVI = componentManager.getFeature(SCHEMA_AUGMENT_PSVI);
} catch (XMLConfigurationException e) {
fAugPSVI = true;
}
try {
fSchemaType =
(String) componentManager.getProperty(
Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_LANGUAGE);
} catch (XMLConfigurationException e) {
fSchemaType = null;
}
try {
fUseGrammarPoolOnly = componentManager.getFeature(USE_GRAMMAR_POOL_ONLY);
}
catch (XMLConfigurationException e) {
fUseGrammarPoolOnly = false;
}
fEntityResolver = (XMLEntityResolver) componentManager.getProperty(ENTITY_MANAGER);
fValidationManager = (ValidationManager) componentManager.getProperty(VALIDATION_MANAGER);
fValidationManager.addValidationState(fValidationState);
fValidationState.setSymbolTable(fSymbolTable);
// get schema location properties
try {
fExternalSchemas = (String) componentManager.getProperty(SCHEMA_LOCATION);
fExternalNoNamespaceSchema =
(String) componentManager.getProperty(SCHEMA_NONS_LOCATION);
} catch (XMLConfigurationException e) {
fExternalSchemas = null;
fExternalNoNamespaceSchema = null;
}
// store the external schema locations. they are set when reset is called,
// so any other schemaLocation declaration for the same namespace will be
// effectively ignored. becuase we choose to take first location hint
// available for a particular namespace.
XMLSchemaLoader.processExternalHints(
fExternalSchemas,
fExternalNoNamespaceSchema,
fLocationPairs,
fXSIErrorReporter.fErrorReporter);
try {
fJaxpSchemaSource = componentManager.getProperty(JAXP_SCHEMA_SOURCE);
} catch (XMLConfigurationException e) {
fJaxpSchemaSource = null;
}
// clear grammars, and put the one for schema namespace there
try {
fGrammarPool = (XMLGrammarPool) componentManager.getProperty(XMLGRAMMAR_POOL);
} catch (XMLConfigurationException e) {
fGrammarPool = null;
}
fState4XsiType.setSymbolTable(symbolTable);
fState4ApplyDefault.setSymbolTable(symbolTable);
| public void | setDocumentHandler(com.sun.org.apache.xerces.internal.xni.XMLDocumentHandler documentHandler)Sets the document handler to receive information about the document.
fDocumentHandler = documentHandler;
| public void | setDocumentSource(com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentSource source)Sets the document source
fDocumentSource = source;
| public void | setFeature(java.lang.String featureId, boolean state)Sets the state of a feature. This method is called by the component
manager any time after reset when a feature changes state.
Note: Components should silently ignore features
that do not affect the operation of the component.
| public void | setMayMatch(com.sun.org.apache.xerces.internal.impl.xs.identity.Field field, java.lang.Boolean state)Sets whether the given field is permitted to match a value.
This should be used to catch instance documents that try
and match a field several times in the same scope.
fMayMatchFieldMap.put(field, state);
| public void | setProperty(java.lang.String propertyId, java.lang.Object value)Sets the value of a property. This method is called by the component
manager any time after reset when a property changes value.
Note: Components should silently ignore properties
that do not affect the operation of the component.
| public void | startCDATA(com.sun.org.apache.xerces.internal.xni.Augmentations augs)The start of a CDATA section.
// REVISIT: what should we do here if schema normalization is on??
fInCDATA = true;
// call handlers
if (fDocumentHandler != null) {
fDocumentHandler.startCDATA(augs);
}
| public void | startDocument(com.sun.org.apache.xerces.internal.xni.XMLLocator locator, java.lang.String encoding, com.sun.org.apache.xerces.internal.xni.NamespaceContext namespaceContext, com.sun.org.apache.xerces.internal.xni.Augmentations augs)The start of the document.
fValidationState.setNamespaceSupport(namespaceContext);
fState4XsiType.setNamespaceSupport(namespaceContext);
fState4ApplyDefault.setNamespaceSupport(namespaceContext);
fLocator = locator;
handleStartDocument(locator, encoding);
// call handlers
if (fDocumentHandler != null) {
fDocumentHandler.startDocument(locator, encoding, namespaceContext, augs);
}
| public void | startElement(com.sun.org.apache.xerces.internal.xni.QName element, com.sun.org.apache.xerces.internal.xni.XMLAttributes attributes, com.sun.org.apache.xerces.internal.xni.Augmentations augs)The start of an element.
Augmentations modifiedAugs = handleStartElement(element, attributes, augs);
// call handlers
if (fDocumentHandler != null) {
fDocumentHandler.startElement(element, attributes, modifiedAugs);
}
| public void | startGeneralEntity(java.lang.String name, com.sun.org.apache.xerces.internal.xni.XMLResourceIdentifier identifier, java.lang.String encoding, com.sun.org.apache.xerces.internal.xni.Augmentations augs)This method notifies the start of a general entity.
Note: This method is not called for entity references
appearing as part of attribute values.
// REVISIT: what should happen if normalize_data_ is on??
fEntityRef = true;
// call handlers
if (fDocumentHandler != null) {
fDocumentHandler.startGeneralEntity(name, identifier, encoding, augs);
}
| public void | startValueScopeFor(com.sun.org.apache.xerces.internal.impl.xs.identity.IdentityConstraint identityConstraint, int initialDepth)Start the value scope for the specified identity constraint. This
method is called when the selector matches in order to initialize
the value store.
ValueStoreBase valueStore =
fValueStoreCache.getValueStoreFor(identityConstraint, initialDepth);
valueStore.startValueScope();
| void | storeLocations(java.lang.String sLocation, java.lang.String nsLocation)
if (sLocation != null) {
if (!XMLSchemaLoader.tokenizeSchemaLocationStr(sLocation, fLocationPairs)) {
// error!
fXSIErrorReporter.reportError(
XSMessageFormatter.SCHEMA_DOMAIN,
"SchemaLocation",
new Object[] { sLocation },
XMLErrorReporter.SEVERITY_WARNING);
}
}
if (nsLocation != null) {
XMLSchemaLoader.LocationArray la =
((XMLSchemaLoader.LocationArray) fLocationPairs.get(XMLSymbols.EMPTY_STRING));
if (la == null) {
la = new XMLSchemaLoader.LocationArray();
fLocationPairs.put(XMLSymbols.EMPTY_STRING, la);
}
la.addLocation(nsLocation);
}
| public void | textDecl(java.lang.String version, java.lang.String encoding, com.sun.org.apache.xerces.internal.xni.Augmentations augs)Notifies of the presence of a TextDecl line in an entity. If present,
this method will be called immediately following the startEntity call.
Note: This method will never be called for the
document entity; it is only called for external general entities
referenced in document content.
Note: This method is not called for entity references
appearing as part of attribute values.
// call handlers
if (fDocumentHandler != null) {
fDocumentHandler.textDecl(version, encoding, augs);
}
| public void | xmlDecl(java.lang.String version, java.lang.String encoding, java.lang.String standalone, com.sun.org.apache.xerces.internal.xni.Augmentations augs)Notifies of the presence of an XMLDecl line in the document. If
present, this method will be called immediately following the
startDocument call.
// call handlers
if (fDocumentHandler != null) {
fDocumentHandler.xmlDecl(version, encoding, standalone, augs);
}
|
|