[prev in list] [next in list] [prev in thread] [next in thread]
List: xerces-cvs
Subject: svn commit: r1517114 [2/2] - in /xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/
From: mukulg () apache ! org
Date: 2013-08-24 7:34:55
Message-ID: 20130824073455.9E4AE238899C () eris ! apache ! org
[Download RAW message or body]
Modified: xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java
URL: http://svn.apache.org/viewvc/xerces/java/branches/xml-schema-1.1-dev/src/org/apac \
he/xerces/impl/xs/XMLSchemaValidator.java?rev=1517114&r1=1517113&r2=1517114&view=diff \
==============================================================================
--- xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java \
(original)
+++ xerces/java/branches/xml-schema-1.1-dev/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java \
Sat Aug 24 07:34:55 2013 @@ -17,14 +17,8 @@
package org.apache.xerces.impl.xs;
-import java.io.IOException;
import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Hashtable;
import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
import java.util.Vector;
import javax.xml.XMLConstants;
@@ -41,22 +35,13 @@ import org.apache.xerces.impl.dv.xs.Equa
import org.apache.xerces.impl.dv.xs.TypeValidatorHelper;
import org.apache.xerces.impl.dv.xs.XSSimpleTypeDecl;
import org.apache.xerces.impl.validation.ValidationManager;
-import org.apache.xerces.impl.validation.ValidationState;
import org.apache.xerces.impl.xs.assertion.XSAssertConstants;
-import org.apache.xerces.impl.xs.identity.Field;
-import org.apache.xerces.impl.xs.identity.FieldActivator;
import org.apache.xerces.impl.xs.identity.IdentityConstraint;
-import org.apache.xerces.impl.xs.identity.KeyRef;
import org.apache.xerces.impl.xs.identity.Selector;
-import org.apache.xerces.impl.xs.identity.UniqueOrKey;
-import org.apache.xerces.impl.xs.identity.ValueStore;
import org.apache.xerces.impl.xs.identity.XPathMatcher;
-import org.apache.xerces.impl.xs.models.CMBuilder;
-import org.apache.xerces.impl.xs.models.CMNodeFactory;
import org.apache.xerces.impl.xs.models.XSCMValidator;
import org.apache.xerces.impl.xs.util.XS11TypeHelper;
import org.apache.xerces.util.AugmentationsImpl;
-import org.apache.xerces.util.IntStack;
import org.apache.xerces.util.SymbolTable;
import org.apache.xerces.util.URI.MalformedURIException;
import org.apache.xerces.util.XMLAttributesImpl;
@@ -79,15 +64,11 @@ import org.apache.xerces.xni.parser.XMLC
import org.apache.xerces.xni.parser.XMLDocumentFilter;
import org.apache.xerces.xni.parser.XMLDocumentSource;
import org.apache.xerces.xni.parser.XMLEntityResolver;
-import org.apache.xerces.xni.parser.XMLInputSource;
import org.apache.xerces.xni.parser.XMLParseException;
import org.apache.xerces.xs.AttributePSVI;
import org.apache.xerces.xs.ElementPSVI;
-import org.apache.xerces.xs.ShortList;
-import org.apache.xerces.xs.StringList;
import org.apache.xerces.xs.XSConstants;
import org.apache.xerces.xs.XSObjectList;
-import org.apache.xerces.xs.XSTypeAlternative;
import org.apache.xerces.xs.XSTypeDefinition;
import org.apache.xerces.xs.datatypes.ObjectList;
import org.xml.sax.SAXNotRecognizedException;
@@ -108,8 +89,8 @@ import org.xml.sax.SAXNotSupportedExcept
* <li>http://apache.org/xml/properties/internal/error-reporter</li>
* <li>http://apache.org/xml/properties/internal/entity-resolver</li>
* </ul>
- *
- * @xerces.internal
+ *
+ * @xerces.internal
*
* @author Sandy Gao IBM
* @author Elena Litani IBM
@@ -117,464 +98,7 @@ import org.xml.sax.SAXNotSupportedExcept
* @author Neeraj Bajaj, Sun Microsystems, inc.
* @version $Id$
*/
-public class XMLSchemaValidator
- implements XMLComponent, XMLDocumentFilter, FieldActivator, RevalidationHandler, \
XSElementDeclHelper {
-
- //
- // Constants
- //
- private static final boolean DEBUG = false;
-
- // feature identifiers
-
- /** Feature identifier: validation. */
- protected static final String VALIDATION =
- Constants.SAX_FEATURE_PREFIX + Constants.VALIDATION_FEATURE;
-
- /** Feature identifier: validation. */
- protected static final String SCHEMA_VALIDATION =
- Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_VALIDATION_FEATURE;
-
- /** Feature identifier: schema full checking*/
- protected static final String SCHEMA_FULL_CHECKING =
- Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_FULL_CHECKING;
-
- /** Feature identifier: dynamic validation. */
- protected static final String DYNAMIC_VALIDATION =
- Constants.XERCES_FEATURE_PREFIX + Constants.DYNAMIC_VALIDATION_FEATURE;
-
- /** Feature identifier: expose schema normalized value */
- protected static final String NORMALIZE_DATA =
- Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_NORMALIZED_VALUE;
-
- /** Feature identifier: send element default value via characters() */
- protected static final String SCHEMA_ELEMENT_DEFAULT =
- Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_ELEMENT_DEFAULT;
-
- /** Feature identifier: augment PSVI */
- protected static final String SCHEMA_AUGMENT_PSVI =
- Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_AUGMENT_PSVI;
-
- /** Feature identifier: whether to recognize java encoding names */
- protected static final String ALLOW_JAVA_ENCODINGS =
- Constants.XERCES_FEATURE_PREFIX + Constants.ALLOW_JAVA_ENCODINGS_FEATURE;
-
- /** Feature identifier: standard uri conformant feature. */
- protected static final String STANDARD_URI_CONFORMANT_FEATURE =
- Constants.XERCES_FEATURE_PREFIX + Constants.STANDARD_URI_CONFORMANT_FEATURE;
-
- /** Feature: generate synthetic annotations */
- protected static final String GENERATE_SYNTHETIC_ANNOTATIONS =
- Constants.XERCES_FEATURE_PREFIX + \
Constants.GENERATE_SYNTHETIC_ANNOTATIONS_FEATURE;
-
- /** Feature identifier: validate annotations. */
- protected static final String VALIDATE_ANNOTATIONS =
- Constants.XERCES_FEATURE_PREFIX + Constants.VALIDATE_ANNOTATIONS_FEATURE;
-
- /** Feature identifier: honour all schemaLocations */
- protected static final String HONOUR_ALL_SCHEMALOCATIONS =
- Constants.XERCES_FEATURE_PREFIX + \
Constants.HONOUR_ALL_SCHEMALOCATIONS_FEATURE;
-
- /** Feature identifier: use grammar pool only */
- protected static final String USE_GRAMMAR_POOL_ONLY =
- Constants.XERCES_FEATURE_PREFIX + Constants.USE_GRAMMAR_POOL_ONLY_FEATURE;
-
- /** Feature identifier: whether to continue parsing a schema after a fatal error \
is encountered */
- protected static final String CONTINUE_AFTER_FATAL_ERROR =
- Constants.XERCES_FEATURE_PREFIX + \
Constants.CONTINUE_AFTER_FATAL_ERROR_FEATURE;
-
- protected static final String PARSER_SETTINGS =
- Constants.XERCES_FEATURE_PREFIX + Constants.PARSER_SETTINGS;
-
- /** Feature identifier: namespace growth */
- protected static final String NAMESPACE_GROWTH =
- Constants.XERCES_FEATURE_PREFIX + Constants.NAMESPACE_GROWTH_FEATURE;
-
- /** Feature identifier: tolerate duplicates */
- protected static final String TOLERATE_DUPLICATES =
- Constants.XERCES_FEATURE_PREFIX + Constants.TOLERATE_DUPLICATES_FEATURE;
-
- /** Feature identifier: whether to ignore xsi:type attributes until a global \
element declaration is encountered */
- protected static final String IGNORE_XSI_TYPE =
- Constants.XERCES_FEATURE_PREFIX + Constants.IGNORE_XSI_TYPE_FEATURE;
-
- /** Feature identifier: whether to ignore ID/IDREF errors */
- protected static final String ID_IDREF_CHECKING =
- Constants.XERCES_FEATURE_PREFIX + Constants.ID_IDREF_CHECKING_FEATURE;
-
- /** Feature identifier: whether to ignore unparsed entity errors */
- protected static final String UNPARSED_ENTITY_CHECKING =
- Constants.XERCES_FEATURE_PREFIX + \
Constants.UNPARSED_ENTITY_CHECKING_FEATURE;
-
- /** Feature identifier: whether to ignore identity constraint errors */
- protected static final String IDENTITY_CONSTRAINT_CHECKING =
- Constants.XERCES_FEATURE_PREFIX + Constants.IDC_CHECKING_FEATURE;
-
- /** Feature identifier: whether to ignore type alternatives */
- protected static final String TYPE_ALTERNATIVES_CHECKING =
- Constants.XERCES_FEATURE_PREFIX + \
Constants.TYPE_ALTERNATIVES_CHEKING_FEATURE;
-
- /** Feature identifier: whether to allow comment and PI nodes to be visible \
during <assert> processing */
- protected static final String ASSERT_COMMENT_PI_CHECKING =
- Constants.XERCES_FEATURE_PREFIX + \
Constants.ASSERT_COMMENT_PI_CHECKING_FEATURE;
-
- // property identifiers
-
- /** Property identifier: symbol table. */
- public static final String SYMBOL_TABLE =
- Constants.XERCES_PROPERTY_PREFIX + Constants.SYMBOL_TABLE_PROPERTY;
-
- /** Property identifier: error reporter. */
- public static final String ERROR_REPORTER =
- Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY;
-
- /** Property identifier: entity resolver. */
- public static final String ENTITY_RESOLVER =
- Constants.XERCES_PROPERTY_PREFIX + Constants.ENTITY_RESOLVER_PROPERTY;
-
- /** Property identifier: grammar pool. */
- public static final String XMLGRAMMAR_POOL =
- Constants.XERCES_PROPERTY_PREFIX + Constants.XMLGRAMMAR_POOL_PROPERTY;
-
- protected static final String VALIDATION_MANAGER =
- Constants.XERCES_PROPERTY_PREFIX + Constants.VALIDATION_MANAGER_PROPERTY;
-
- protected static final String ENTITY_MANAGER =
- Constants.XERCES_PROPERTY_PREFIX + Constants.ENTITY_MANAGER_PROPERTY;
-
- /** Property identifier: schema location. */
- protected static final String SCHEMA_LOCATION =
- Constants.XERCES_PROPERTY_PREFIX + Constants.SCHEMA_LOCATION;
-
- /** Property identifier: no namespace schema location. */
- protected static final String SCHEMA_NONS_LOCATION =
- Constants.XERCES_PROPERTY_PREFIX + Constants.SCHEMA_NONS_LOCATION;
-
- /** Property identifier: JAXP schema source. */
- protected static final String JAXP_SCHEMA_SOURCE =
- Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_SOURCE;
-
- /** Property identifier: JAXP schema language. */
- protected static final String JAXP_SCHEMA_LANGUAGE =
- Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_LANGUAGE;
-
- /** Property identifier: root type definition. */
- protected static final String ROOT_TYPE_DEF =
- Constants.XERCES_PROPERTY_PREFIX + Constants.ROOT_TYPE_DEFINITION_PROPERTY;
-
- /** Property identifier: root element declaration. */
- protected static final String ROOT_ELEMENT_DECL =
- Constants.XERCES_PROPERTY_PREFIX + \
Constants.ROOT_ELEMENT_DECLARATION_PROPERTY;
-
- /** Property identifier: Schema DV Factory */
- protected static final String SCHEMA_DV_FACTORY =
- Constants.XERCES_PROPERTY_PREFIX + Constants.SCHEMA_DV_FACTORY_PROPERTY;
-
- /** Property identifier: xml schema version. */
- protected static final String XML_SCHEMA_VERSION =
- Constants.XERCES_PROPERTY_PREFIX + Constants.XML_SCHEMA_VERSION_PROPERTY;
-
- /** Property identifier: datatype xml version. */
- protected static final String DATATYPE_XML_VERSION =
- Constants.XERCES_PROPERTY_PREFIX + Constants.DATATYPE_XML_VERSION_PROPERTY;
-
- // recognized features and properties
-
- /** Recognized features. */
- private static final String[] RECOGNIZED_FEATURES =
- {
- VALIDATION,
- SCHEMA_VALIDATION,
- DYNAMIC_VALIDATION,
- SCHEMA_FULL_CHECKING,
- ALLOW_JAVA_ENCODINGS,
- CONTINUE_AFTER_FATAL_ERROR,
- STANDARD_URI_CONFORMANT_FEATURE,
- GENERATE_SYNTHETIC_ANNOTATIONS,
- VALIDATE_ANNOTATIONS,
- HONOUR_ALL_SCHEMALOCATIONS,
- USE_GRAMMAR_POOL_ONLY,
- IGNORE_XSI_TYPE,
- ID_IDREF_CHECKING,
- IDENTITY_CONSTRAINT_CHECKING,
- UNPARSED_ENTITY_CHECKING,
- NAMESPACE_GROWTH,
- TOLERATE_DUPLICATES,
- TYPE_ALTERNATIVES_CHECKING,
- ASSERT_COMMENT_PI_CHECKING
- };
-
-
- /** Feature defaults. */
- private static final Boolean[] FEATURE_DEFAULTS = { null,
- // NOTE: The following defaults are nulled out on purpose.
- // If they are set, then when the XML Schema validator
- // is constructed dynamically, these values may override
- // those set by the application. This goes against the
- // whole purpose of XMLComponent#getFeatureDefault but
- // it can't be helped in this case. -Ac
- // NOTE: Instead of adding default values here, add them (and
- // the corresponding recognized features) to the objects
- // that have an XMLSchemaValidator instance as a member,
- // such as the parser configurations. -PM
- null, //Boolean.FALSE,
- null, //Boolean.FALSE,
- null, //Boolean.FALSE,
- null, //Boolean.FALSE,
- null, //Boolean.FALSE,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null
- };
-
- /** Recognized properties. */
- private static final String[] RECOGNIZED_PROPERTIES =
- {
- SYMBOL_TABLE,
- ERROR_REPORTER,
- ENTITY_RESOLVER,
- VALIDATION_MANAGER,
- SCHEMA_LOCATION,
- SCHEMA_NONS_LOCATION,
- JAXP_SCHEMA_SOURCE,
- JAXP_SCHEMA_LANGUAGE,
- ROOT_TYPE_DEF,
- ROOT_ELEMENT_DECL,
- SCHEMA_DV_FACTORY,
- XML_SCHEMA_VERSION,
- DATATYPE_XML_VERSION
- };
-
- /** Property defaults. */
- private static final Object[] PROPERTY_DEFAULTS =
- { null, null, null, null, null, null, null, null, null, null, null, null, \
null};
-
- // this is the number of valuestores of each kind
- // we expect an element to have. It's almost
- // never > 1; so leave it at that.
- protected static final int ID_CONSTRAINT_NUM = 1;
-
- // xsi:* attribute declarations
- static final XSAttributeDecl XSI_TYPE = \
SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_TYPE);
- static final XSAttributeDecl XSI_NIL = \
SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_NIL);
- static final XSAttributeDecl XSI_SCHEMALOCATION = \
SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_SCHEMALOCATION);
- static final XSAttributeDecl XSI_NONAMESPACESCHEMALOCATION = \
SchemaGrammar.SG_XSI.getGlobalAttributeDecl(SchemaSymbols.XSI_NONAMESPACESCHEMALOCATION);
-
- //
- private static final Hashtable EMPTY_TABLE = new Hashtable();
-
- //
- // Data
- //
-
- /** current PSVI element info */
- protected ElementPSVImpl fCurrentPSVI = new ElementPSVImpl();
-
- // since it is the responsibility of each component to an
- // Augmentations parameter if one is null, to save ourselves from
- // having to create this object continually, it is created here.
- // If it is not present in calls that we're passing on, we *must*
- // clear this before we introduce it into the pipeline.
- protected final AugmentationsImpl fAugmentations = new AugmentationsImpl();
-
- // this is included for the convenience of handleEndElement
- protected XMLString fDefaultValue;
-
- // Validation features
- protected boolean fDynamicValidation = false;
- protected boolean fSchemaDynamicValidation = false;
- protected boolean fDoValidation = false;
- protected boolean fFullChecking = false;
- protected boolean fNormalizeData = true;
- protected boolean fSchemaElementDefault = true;
- protected boolean fAugPSVI = true;
- protected boolean fIdConstraint = false;
- protected boolean fUseGrammarPoolOnly = false;
-
- // Namespace growth feature
- protected boolean fNamespaceGrowth = false;
-
- /** Schema type: None, DTD, Schema */
- private String fSchemaType = null;
-
- // to indicate whether we are in the scope of entity reference or CData
- protected boolean fEntityRef = false;
- protected boolean fInCDATA = false;
-
- // properties
-
- /** Symbol table. */
- protected SymbolTable fSymbolTable;
-
- /**
- * While parsing a document, keep the location of the document.
- */
- private XMLLocator fLocator;
-
- private ArrayList fXSITypeErrors = new ArrayList(4);
-
- private IDContext fIDContext = null;
-
- private String fDatatypeXMLVersion = null;
-
- private NamespaceContext fNamespaceContext = null;
-
- /**
- * A wrapper of the standard error reporter. We'll store all schema errors
- * in this wrapper object, so that we can get all errors (error codes) of
- * a specific element. This is useful for PSVI.
- */
- protected final class XSIErrorReporter {
-
- // the error reporter property
- XMLErrorReporter fErrorReporter;
-
- // store error codes; starting position of the errors for each element;
- // number of element (depth); and whether to record error
- Vector fErrors = new Vector();
- int[] fContext = new int[INITIAL_STACK_SIZE];
- int fContextCount;
-
- // set the external error reporter, clear errors
- public void reset(XMLErrorReporter errorReporter) {
- fErrorReporter = errorReporter;
- fErrors.removeAllElements();
- fContextCount = 0;
- }
-
- // should be called when starting process an element or an attribute.
- // store the starting position for the current context
- public void pushContext() {
- if (!fAugPSVI) {
- return;
- }
- // resize array if necessary
- if (fContextCount == fContext.length) {
- int newSize = fContextCount + INC_STACK_SIZE;
- int[] newArray = new int[newSize];
- System.arraycopy(fContext, 0, newArray, 0, fContextCount);
- fContext = newArray;
- }
-
- fContext[fContextCount++] = fErrors.size();
- }
-
- // should be called on endElement: get all errors of the current element
- public String[] popContext() {
- if (!fAugPSVI) {
- return null;
- }
- // get starting position of the current element
- int contextPos = fContext[--fContextCount];
- // number of errors of the current element
- int size = fErrors.size() - contextPos;
- // if no errors, return null
- if (size == 0)
- return null;
- // copy errors from the list to an string array
- String[] errors = new String[size];
- for (int i = 0; i < size; i++) {
- errors[i] = (String) fErrors.elementAt(contextPos + i);
- }
- // remove errors of the current element
- fErrors.setSize(contextPos);
- return errors;
- }
-
- // should be called when an attribute is done: get all errors of
- // this attribute, but leave the errors to the containing element
- // also called after an element was strictly assessed.
- public String[] mergeContext() {
- if (!fAugPSVI) {
- return null;
- }
- // get starting position of the current element
- int contextPos = fContext[--fContextCount];
- // number of errors of the current element
- int size = fErrors.size() - contextPos;
- // if no errors, return null
- if (size == 0)
- return null;
- // copy errors from the list to an string array
- String[] errors = new String[size];
- for (int i = 0; i < size; i++) {
- errors[i] = (String) fErrors.elementAt(contextPos + i);
- }
- // don't resize the vector: leave the errors for this attribute
- // to the containing element
- return errors;
- }
-
- public void reportError(String domain, String key, Object[] arguments, short \
severity)
- throws XNIException {
- String message = fErrorReporter.reportError(domain, key, arguments, \
severity);
- if (fAugPSVI) {
- fErrors.addElement(key);
- fErrors.addElement(message);
- }
- } // reportError(String,String,Object[],short)
-
- public void reportError(
- XMLLocator location,
- String domain,
- String key,
- Object[] arguments,
- short severity)
- throws XNIException {
- String message = fErrorReporter.reportError(location, domain, key, \
arguments, severity);
- if (fAugPSVI) {
- fErrors.addElement(key);
- fErrors.addElement(message);
- }
- } // reportError(XMLLocator,String,String,Object[],short)
- }
-
- /** Error reporter. */
- protected final XSIErrorReporter fXSIErrorReporter = new XSIErrorReporter();
-
- /** Entity resolver */
- protected XMLEntityResolver fEntityResolver;
-
- // updated during reset
- protected ValidationManager fValidationManager = null;
- protected XSValidationState fValidationState = new XSValidationState();
- protected XMLGrammarPool fGrammarPool;
-
- // schema location property values
- protected String fExternalSchemas = null;
- protected String fExternalNoNamespaceSchema = null;
-
- //JAXP Schema Source property
- protected Object fJaxpSchemaSource = null;
-
- /** Schema Grammar Description passed, to give a chance to application to \
supply the Grammar */
- protected final XSDDescription fXSDDescription = new XSDDescription();
- protected final Hashtable fLocationPairs = new Hashtable();
- protected final Hashtable fExpandedLocationPairs = new Hashtable();
- protected final ArrayList fUnparsedLocations = new ArrayList();
-
- /** XML Schema 1.1 Support */
- short fSchemaVersion;
-
- /** XML Schema Constraints */
- XSConstraints fXSConstraints;
-
- // handlers
-
- /** Document handler. */
- protected XMLDocumentHandler fDocumentHandler;
-
- protected XMLDocumentSource fDocumentSource;
+public class XMLSchemaValidator extends SchemaValidatorHelper implements \
XMLComponent, XMLDocumentFilter, RevalidationHandler {
//
// XMLComponent methods
@@ -1215,215 +739,6 @@ public class XMLSchemaValidator
} // endEntity(String)
- // constants
-
- static final int INITIAL_STACK_SIZE = 8;
- static final int INC_STACK_SIZE = 8;
-
- //
- // Data
- //
-
- // Schema Normalization
-
- private static final boolean DEBUG_NORMALIZATION = false;
- // temporary empty string buffer.
- private final XMLString fEmptyXMLStr = new XMLString(null, 0, -1);
- // temporary character buffer, and empty string buffer.
- private static final int BUFFER_SIZE = 20;
- private final XMLString fNormalizedStr = new XMLString();
- private boolean fFirstChunk = true;
- // got first chunk in characters() (SAX)
- private boolean fTrailing = false; // Previous chunk had a trailing space
- private short fWhiteSpace = -1; //whiteSpace: preserve/replace/collapse
- private boolean fUnionType = false;
-
- /** Schema grammar resolver. */
- private final XSGrammarBucket fGrammarBucket = new XSGrammarBucket();
- private final SubstitutionGroupHandler fSubGroupHandler = new \
SubstitutionGroupHandler(this);
-
- /** the DV usd to convert xsi:type to a QName */
- // REVISIT: in new simple type design, make things in DVs static,
- // so that we can QNameDV.getCompiledForm()
- // using 1.0 xs:QName
- private final XSSimpleType fQNameDV =
- (XSSimpleType) \
SchemaGrammar.getS4SGrammar(Constants.SCHEMA_VERSION_1_0).getGlobalTypeDecl(SchemaSymbols.ATTVAL_QNAME);
-
- private final CMNodeFactory nodeFactory = new CMNodeFactory();
- /** used to build content models */
- // REVISIT: create decl pool, and pass it to each traversers
- private final CMBuilder fCMBuilder = new CMBuilder(nodeFactory);
-
- // Schema grammar loader
- private final XMLSchemaLoader fSchemaLoader =
- new XMLSchemaLoader(
- fXSIErrorReporter.fErrorReporter,
- fGrammarBucket,
- fSubGroupHandler,
- fCMBuilder);
-
- // state
-
- /** String representation of the validation root. */
- // REVISIT: what do we store here? QName, XPATH, some ID? use rawname now.
- private String fValidationRoot;
-
- /** Skip validation: anything below this level should be skipped */
- private int fSkipValidationDepth;
-
- /** anything above this level has validation_attempted != full */
- private int fNFullValidationDepth;
-
- /** anything above this level has validation_attempted != none */
- private int fNNoneValidationDepth;
-
- /** Element depth: -2: validator not in pipeline; >= -1 current depth. */
- private int fElementDepth;
-
- /** Seen sub elements. */
- private boolean fSubElement;
-
- /** Seen sub elements stack. */
- private boolean[] fSubElementStack = new boolean[INITIAL_STACK_SIZE];
-
- /** Current element declaration. */
- private XSElementDecl fCurrentElemDecl;
-
- /** Element decl stack. */
- private XSElementDecl[] fElemDeclStack = new XSElementDecl[INITIAL_STACK_SIZE];
-
- /** nil value of the current element */
- private boolean fNil;
-
- /** nil value stack */
- private boolean[] fNilStack = new boolean[INITIAL_STACK_SIZE];
-
- /** notation value of the current element */
- private XSNotationDecl fNotation;
-
- /** notation stack */
- private XSNotationDecl[] fNotationStack = new \
XSNotationDecl[INITIAL_STACK_SIZE];
-
- /** Current type. */
- private XSTypeDefinition fCurrentType;
-
- /** Failed assertions. */
- private ObjectList fFailedAssertions;
-
- /** Type Alternative augmentation information. */
- private XSTypeAlternative fTypeAlternative;
-
- /** type stack. */
- private XSTypeDefinition[] fTypeStack = new \
XSTypeDefinition[INITIAL_STACK_SIZE];
-
- /** Current content model. */
- private XSCMValidator fCurrentCM;
-
- /** Content model stack. */
- private XSCMValidator[] fCMStack = new XSCMValidator[INITIAL_STACK_SIZE];
-
- /** the current state of the current content model */
- private int[] fCurrCMState;
-
- /** stack to hold content model states */
- private int[][] fCMStateStack = new int[INITIAL_STACK_SIZE][];
-
- /** whether the curret element is strictly assessed */
- private boolean fStrictAssess = true;
-
- /** strict assess stack */
- private boolean[] fStrictAssessStack = new boolean[INITIAL_STACK_SIZE];
-
- /** Temporary string buffers. */
- private final StringBuffer fBuffer = new StringBuffer();
-
- /** Whether need to append characters to fBuffer */
- private boolean fAppendBuffer = true;
-
- /** Did we see any character data? */
- private boolean fSawText = false;
-
- /** stack to record if we saw character data */
- private boolean[] fSawTextStack = new boolean[INITIAL_STACK_SIZE];
-
- /** Did we see non-whitespace character data? */
- private boolean fSawCharacters = false;
-
- /** Stack to record if we saw character data outside of element content*/
- private boolean[] fStringContent = new boolean[INITIAL_STACK_SIZE];
-
- /** temporary qname */
- private final QName fTempQName = new QName();
-
- /** value of the "root-type-definition" property. */
- private javax.xml.namespace.QName fRootTypeQName = null;
- private XSTypeDefinition fRootTypeDefinition = null;
-
- /** value of the "root-element-declaration" property. */
- private javax.xml.namespace.QName fRootElementDeclQName = null;
- private XSElementDecl fRootElementDeclaration = null;
-
- private int fIgnoreXSITypeDepth;
-
- private boolean fIDCChecking;
-
- private boolean fTypeAlternativesChecking;
-
- private boolean fCommentsAndPIsForAssert;
-
- /** temporary validated info */
- private ValidatedInfo fValidatedInfo = new ValidatedInfo();
-
- // used to validate default/fixed values against xsi:type
- // only need to check facets, so we set extraChecking to false (in reset)
- private ValidationState fState4XsiType = new ValidationState();
-
- // used to apply default/fixed values
- // only need to check id/idref/entity, so we set checkFacets to false
- private ValidationState fState4ApplyDefault = new ValidationState();
-
- // identity constraint information
-
- /**
- * Stack of active XPath matchers for identity constraints. All
- * active XPath matchers are notified of startElement
- * and endElement callbacks in order to perform their matches.
- * <p>
- * 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.
- * <p>
- * <strong>Note:</strong> Once the activation scope is left, the
- * XPath matchers are automatically removed from the stack of
- * active matchers and no longer receive callbacks.
- */
- protected XPathMatcherStack fMatcherStack = new XPathMatcherStack();
-
- /** Cache of value stores for identity constraint fields. */
- protected ValueStoreCache fValueStoreCache = new ValueStoreCache();
-
- // assertion validator subcomponent
- private XSDAssertionValidator fAssertionValidator = null;
-
- // variable to track validity of element content for simpleType->union. if a \
member type of union in XSD namespace can
- // successfully validate an element instance value, we don't process assertions \
for such union types in downstream checks. i.e.,
- // an element instance known to be valid doesn't require assertion evaluations.
- boolean fIsAssertProcessingNeededForSTUnionElem = true;
-
- // variable with similar semantics as fIsAssertProcessingNeededForSTUnionElem, \
but for attributes of an element instance (i.e.,
- // all attributes of one element instance).
- List fIsAssertProcessingNeededForSTUnionAttrs = new ArrayList();
-
- // 'type alternative' validator subcomponent
- private XSDTypeAlternativeValidator fTypeAlternativeValidator = null;
-
- // a Vector list storing inheritable attributes
- Vector fInheritableAttrList = new Vector();
-
- // a Stack storing inheritable attribute count for the elements
- private IntStack fInhrAttrCountStack = new IntStack();
-
//
// Constructors
//
@@ -1744,85 +1059,6 @@ public class XMLSchemaValidator
fState4ApplyDefault.setTypeValidatorHelper(typeValidatorHelper);
} // reset(XMLComponentManager)
-
- //
- // FieldActivator methods
- //
-
- /**
- * Start the value scope for the specified identity constraint. This
- * method is called when the selector matches in order to initialize
- * the value store.
- *
- * @param identityConstraint The identity constraint.
- */
- public void startValueScopeFor(IdentityConstraint identityConstraint, int \
initialDepth) {
-
- ValueStoreBase valueStore =
- fValueStoreCache.getValueStoreFor(identityConstraint, initialDepth);
- valueStore.startValueScope();
-
- } // startValueScopeFor(IdentityConstraint identityConstraint)
-
- /**
- * Request to activate the specified field. This method returns the
- * matcher for the field.
- *
- * @param field The field to activate.
- */
- public XPathMatcher activateField(Field field, int initialDepth) {
- ValueStore valueStore =
- fValueStoreCache.getValueStoreFor(field.getIdentityConstraint(), \
initialDepth);
- XPathMatcher matcher = field.createMatcher(valueStore);
- if (fSchemaVersion == Constants.SCHEMA_VERSION_1_1) {
- matcher.setXPathDefaultNamespace(field.getXPathDefaultNamespace());
- }
- fMatcherStack.addMatcher(matcher);
- matcher.startDocumentFragment();
- return matcher;
- } // activateField(Field):XPathMatcher
-
- /**
- * Ends the value scope for the specified identity constraint.
- *
- * @param identityConstraint The identity constraint.
- */
- public void endValueScopeFor(IdentityConstraint identityConstraint, int \
initialDepth) {
-
- ValueStoreBase valueStore =
- fValueStoreCache.getValueStoreFor(identityConstraint, initialDepth);
- valueStore.endValueScope();
-
- } // endValueScopeFor(IdentityConstraint)
-
- // a utility method for Identity constraints
- private void activateSelectorFor(IdentityConstraint ic) {
- Selector selector = ic.getSelector();
- FieldActivator activator = this;
- if (selector == null)
- return;
- XPathMatcher matcher = selector.createMatcher(activator, fElementDepth);
- if (fSchemaVersion == Constants.SCHEMA_VERSION_1_1) {
- matcher.setXPathDefaultNamespace(selector.getXPathDefaultNamespace());
- }
- fMatcherStack.addMatcher(matcher);
- matcher.startDocumentFragment();
- }
-
- // Implements XSElementDeclHelper interface
- public XSElementDecl getGlobalElementDecl(QName element) {
- final SchemaGrammar sGrammar =
- findSchemaGrammar(
- XSDDescription.CONTEXT_ELEMENT,
- element.uri,
- null,
- element,
- null);
- if (sGrammar != null) {
- return sGrammar.getGlobalElementDecl(element.localpart);
- }
- return null;
- }
//
// Protected methods
@@ -3010,155 +2246,6 @@ public class XMLSchemaValidator
} //storeLocations
- //this is the function where logic of retrieving grammar is written , parser \
first tries to get the grammar from
- //the local pool, if not in local pool, it gives chance to application to be \
able to retrieve the grammar, then it
- //tries to parse the grammar using location hints from the give namespace.
- SchemaGrammar findSchemaGrammar(
- short contextType,
- String namespace,
- QName enclosingElement,
- QName triggeringComponent,
- XMLAttributes attributes) {
- SchemaGrammar grammar = null;
- //get the grammar from local pool...
- grammar = fGrammarBucket.getGrammar(namespace);
- if (grammar == null) {
- fXSDDescription.setNamespace(namespace);
- 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, fNamespaceGrowth)) \
{
- // 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 (!fUseGrammarPoolOnly && (grammar == null ||
- (fNamespaceGrowth && !hasSchemaComponent(grammar, contextType, \
triggeringComponent)))) {
- fXSDDescription.reset();
- fXSDDescription.fContextType = contextType;
- fXSDDescription.setNamespace(namespace);
- fXSDDescription.fEnclosedElementName = enclosingElement;
- fXSDDescription.fTriggeringComponent = triggeringComponent;
- fXSDDescription.fAttributes = attributes;
- if (fLocator != null) {
- fXSDDescription.setBaseSystemId(fLocator.getExpandedSystemId());
- }
-
- Hashtable locationPairs = fLocationPairs;
- Object locationArray =
- locationPairs.get(namespace == null ? XMLSymbols.EMPTY_STRING : \
namespace);
- if (locationArray != null) {
- String[] temp = ((XMLSchemaLoader.LocationArray) \
locationArray).getLocationArray();
- if (temp.length != 0) {
- setLocationHints(fXSDDescription, temp, grammar);
- }
- }
-
- if (grammar == null || fXSDDescription.fLocationHints != null) {
- boolean toParseSchema = true;
- if (grammar != null) {
- // use location hints instead
- locationPairs = EMPTY_TABLE;
- }
-
- // try to parse the grammar using location hints from that \
namespace..
- try {
- XMLInputSource xis =
- XMLSchemaLoader.resolveDocument(
- fXSDDescription,
- locationPairs,
- fEntityResolver);
- if (grammar != null && fNamespaceGrowth) {
- try {
- // if we are dealing with a different schema location, \
then include the new schema
- // into the existing grammar
- if \
(grammar.getDocumentLocations().contains(XMLEntityManager.expandSystemId(xis.getSystemId(), \
xis.getBaseSystemId(), false))) {
- toParseSchema = false;
- }
- }
- catch (MalformedURIException e) {
- }
- }
- if (toParseSchema) {
- 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, ex);
- }
- }
- }
-
- return grammar;
-
- } //findSchemaGrammar
-
- private boolean hasSchemaComponent(SchemaGrammar grammar, short contextType, \
QName triggeringComponent) {
- if (grammar != null && triggeringComponent != null) {
- String localName = triggeringComponent.localpart;
- if (localName != null && localName.length() > 0) {
- switch (contextType) {
- case XSDDescription.CONTEXT_ELEMENT:
- return grammar.getElementDeclaration(localName) != null;
- case XSDDescription.CONTEXT_ATTRIBUTE:
- return grammar.getAttributeDeclaration(localName) != null;
- case XSDDescription.CONTEXT_XSITYPE:
- return grammar.getTypeDefinition(localName) != null;
- }
- }
- }
- return false;
- }
-
- private void setLocationHints(XSDDescription desc, String[] locations, \
SchemaGrammar grammar) {
- int length = locations.length;
- if (grammar == null) {
- fXSDDescription.fLocationHints = new String[length];
- System.arraycopy(locations, 0, fXSDDescription.fLocationHints, 0, \
length);
- }
- else {
- setLocationHints(desc, locations, grammar.getDocumentLocations());
- }
- }
-
- private void setLocationHints(XSDDescription desc, String[] locations, \
StringList docLocations) {
- int length = locations.length;
- String[] hints = new String[length];
- int counter = 0;
-
- for (int i=0; i<length; i++) {
- if (!docLocations.contains(locations[i])) {
- hints[counter++] = locations[i];
- }
- }
-
- if (counter > 0) {
- if (counter == length) {
- fXSDDescription.fLocationHints = hints;
- }
- else {
- fXSDDescription.fLocationHints = new String[counter];
- System.arraycopy(hints, 0, fXSDDescription.fLocationHints, 0, \
counter);
- }
- }
- }
-
private boolean isValidBuiltInTypeName(String localpart) {
if (fSchemaVersion == Constants.SCHEMA_VERSION_1_0_EXTENDED) {
if (localpart.equals("duration") ||
@@ -4090,15 +3177,6 @@ public class XMLSchemaValidator
reportSchemaError("cvc-elt.1.b", new Object[] {element.rawname, \
rootElementDecl.fName}); }
} // checkElementMatchesRootElementDecl
-
- void reportSchemaError(String key, Object[] arguments) {
- if (fDoValidation)
- fXSIErrorReporter.reportError(
- XSMessageFormatter.SCHEMA_DOMAIN,
- key,
- arguments,
- XMLErrorReporter.SEVERITY_ERROR);
- }
private String expectedStr(Vector expected) {
StringBuffer ret = new StringBuffer("{");
@@ -4111,1052 +3189,5 @@ public class XMLSchemaValidator
ret.append('}');
return ret.toString();
}
-
- /**********************************/
-
- // xpath matcher information
-
- /**
- * Stack of XPath matchers for identity constraints.
- *
- * @author Andy Clark, IBM
- */
- protected static class XPathMatcherStack {
-
- //
- // Data
- //
-
- /** Active matchers. */
- protected XPathMatcher[] fMatchers = new XPathMatcher[4];
-
- /** Count of active matchers. */
- protected int fMatchersCount;
-
- /** Offset stack for contexts. */
- protected IntStack fContextStack = new IntStack();
-
- //
- // Constructors
- //
-
- public XPathMatcherStack() {
- } // <init>()
-
- //
- // Public methods
- //
-
- /** Resets the XPath matcher stack. */
- public void clear() {
- for (int i = 0; i < fMatchersCount; i++) {
- fMatchers[i] = null;
- }
- fMatchersCount = 0;
- fContextStack.clear();
- } // clear()
-
- /** Returns the size of the stack. */
- public int size() {
- return fContextStack.size();
- } // size():int
-
- /** Returns the count of XPath matchers. */
- public int getMatcherCount() {
- return fMatchersCount;
- } // getMatcherCount():int
-
- /** Adds a matcher. */
- public void addMatcher(XPathMatcher matcher) {
- ensureMatcherCapacity();
- fMatchers[fMatchersCount++] = matcher;
- } // addMatcher(XPathMatcher)
-
- /** Returns the XPath matcher at the specified index. */
- public XPathMatcher getMatcherAt(int index) {
- return fMatchers[index];
- } // getMatcherAt(index):XPathMatcher
-
- /** Pushes a new context onto the stack. */
- public void pushContext() {
- fContextStack.push(fMatchersCount);
- } // pushContext()
-
- /** Pops a context off of the stack. */
- public void popContext() {
- fMatchersCount = fContextStack.pop();
- } // popContext()
-
- //
- // Private methods
- //
-
- /** Ensures the size of the matchers array. */
- private void ensureMatcherCapacity() {
- if (fMatchersCount == fMatchers.length) {
- XPathMatcher[] array = new XPathMatcher[fMatchers.length * 2];
- System.arraycopy(fMatchers, 0, array, 0, fMatchers.length);
- fMatchers = array;
- }
- } // ensureMatcherCapacity()
-
- } // class XPathMatcherStack
-
- // value store implementations
-
- /**
- * Value store implementation base class. There are specific subclasses
- * for handling unique, key, and keyref.
- *
- * @author Andy Clark, IBM
- */
- protected abstract class ValueStoreBase implements ValueStore {
-
- //
- // Data
- //
-
- /** Identity constraint. */
- protected IdentityConstraint fIdentityConstraint;
- protected int fFieldCount = 0;
- protected Field[] fFields = null;
- protected String fElementName;
- /** current data */
- protected Object[] fLocalValues = null;
- protected short[] fLocalValueTypes = null;
- protected ShortList[] fLocalItemValueTypes = null;
-
- /** Current data value count. */
- protected int fValuesCount;
-
- /** global data */
- public final Vector fValues = new Vector();
- public ShortVector fValueTypes = null;
- public Vector fItemValueTypes = null;
-
- private boolean fUseValueTypeVector = false;
- private int fValueTypesLength = 0;
- private short fValueType = 0;
-
- private boolean fUseItemValueTypeVector = false;
- private int fItemValueTypesLength = 0;
- private ShortList fItemValueType = null;
-
- /** buffer for error messages */
- final StringBuffer fTempBuffer = new StringBuffer();
-
- //
- // Constructors
- //
-
- /** Constructs a value store for the specified identity constraint. */
- protected ValueStoreBase(IdentityConstraint identityConstraint, String \
elementName) {
- fElementName = elementName;
- fIdentityConstraint = identityConstraint;
- fFieldCount = fIdentityConstraint.getFieldCount();
- fFields = new Field[fFieldCount];
- fLocalValues = new Object[fFieldCount];
- fLocalValueTypes = new short[fFieldCount];
- fLocalItemValueTypes = new ShortList[fFieldCount];
- for (int i = 0; i < fFieldCount; i++) {
- fFields[i] = fIdentityConstraint.getFieldAt(i);
- }
- } // <init>(IdentityConstraint)
-
- //
- // Public methods
- //
-
- // destroys this ValueStore; useful when, for instance, a
- // locally-scoped ID constraint is involved.
- public void clear() {
- fValuesCount = 0;
- fUseValueTypeVector = false;
- fValueTypesLength = 0;
- fValueType = 0;
- fUseItemValueTypeVector = false;
- fItemValueTypesLength = 0;
- fItemValueType = null;
- fValues.setSize(0);
- if (fValueTypes != null) {
- fValueTypes.clear();
- }
- if (fItemValueTypes != null) {
- fItemValueTypes.setSize(0);
- }
- } // end clear():void
-
- // appends the contents of one ValueStore to those of us.
- public void append(ValueStoreBase newVal) {
- for (int i = 0; i < newVal.fValues.size(); i++) {
- fValues.addElement(newVal.fValues.elementAt(i));
-
- // REVISIT:
- addValueType(newVal.getValueTypeAt(i));
- addItemValueType(newVal.getItemValueTypeAt(i));
- }
- } // append(ValueStoreBase)
-
- /** Start scope for value store. */
- public void startValueScope() {
- fValuesCount = 0;
- for (int i = 0; i < fFieldCount; i++) {
- fLocalValues[i] = null;
- fLocalValueTypes[i] = 0;
- fLocalItemValueTypes[i] = null;
- }
- } // startValueScope()
-
- /** Ends scope for value store. */
- public void endValueScope() {
-
- if (fValuesCount == 0) {
- if (fIdentityConstraint.getCategory() == IdentityConstraint.IC_KEY) \
{
- String code = "AbsentKeyValue";
- String cName = fIdentityConstraint.getIdentityConstraintName();
- reportSchemaError(code, new Object[] { fElementName, cName });
- }
- return;
- }
-
- // Validation Rule: Identity-constraint Satisfied
- // 4.2 If the {identity-constraint category} is key, then all of the \
following must be true:
- // 4.2.1 The target node set and the qualified node set are equal, that \
is, every member of the
- // target node set is also a member of the qualified node set and vice \
versa.
- //
- // If the IDC is a key check whether we have all the fields.
- if (fValuesCount != fFieldCount) {
- if (fIdentityConstraint.getCategory() == IdentityConstraint.IC_KEY) \
{
- String code = "KeyNotEnoughValues";
- UniqueOrKey key = (UniqueOrKey) fIdentityConstraint;
- String cName = key.getIdentityConstraintName();
- reportSchemaError(code, new Object[] { fElementName, cName });
- }
- return;
- }
-
- } // endValueScope()
-
- // This is needed to allow keyref's to look for matched keys
- // in the correct scope. Unique and Key may also need to
- // override this method for purposes of their own.
- // This method is called whenever the DocumentFragment
- // of an ID Constraint goes out of scope.
- public void endDocumentFragment() {
- } // endDocumentFragment():void
-
- /**
- * Signals the end of the document. This is where the specific
- * instances of value stores can verify the integrity of the
- * identity constraints.
- */
- public void endDocument() {
- } // endDocument()
-
- //
- // ValueStore methods
- //
-
- /* reports an error if an element is matched
- * has nillable true and is matched by a key.
- */
-
- public void reportError(String key, Object[] args) {
- reportSchemaError(key, args);
- } // reportError(String,Object[])
-
- /**
- * Adds the specified value to the value store.
- *
- * @param field The field associated to the value. This reference
- * is used to ensure that each field only adds a value
- * once within a selection scope.
- * @param mayMatch a flag indiciating whether the field may be matched.
- * @param actualValue The value to add.
- * @param valueType Type of the value to add.
- * @param itemValueType If the value is a list, a list of types for each of \
the values in the list.
- */
- public void addValue(Field field, boolean mayMatch, Object actualValue, \
short valueType, ShortList itemValueType) {
- int i;
- for (i = fFieldCount - 1; i > -1; i--) {
- if (fFields[i] == field) {
- break;
- }
- }
- // do we even know this field?
- if (i == -1) {
- String code = "UnknownField";
- String cName = fIdentityConstraint.getIdentityConstraintName();
- reportSchemaError(code, new Object[] { field.toString(), \
fElementName, cName });
- return;
- }
- if (!mayMatch) {
- String code = "FieldMultipleMatch";
- String cName = fIdentityConstraint.getIdentityConstraintName();
- reportSchemaError(code, new Object[] { field.toString(), cName });
- }
- else {
- fValuesCount++;
- }
- fLocalValues[i] = actualValue;
- fLocalValueTypes[i] = valueType;
- fLocalItemValueTypes[i] = itemValueType;
- if (fValuesCount == fFieldCount) {
- checkDuplicateValues();
- // store values
- for (i = 0; i < fFieldCount; i++) {
- fValues.addElement(fLocalValues[i]);
- addValueType(fLocalValueTypes[i]);
- addItemValueType(fLocalItemValueTypes[i]);
- }
- }
- } // addValue(String,Field)
-
- /**
- * Sets the name of the element which holds the identity constraint
- * that is stored in this value store
- */
- public void setElementName(String elementName) {
- fElementName = elementName;
- }
-
- /**
- * Returns the name of the element which holds the identity constraint
- * that is stored in this value store
- */
- public String getElementName() {
- return fElementName;
- } // getElementName():String
-
- /**
- * Returns true if this value store contains the locally scoped value stores
- */
- public boolean contains() {
- // REVISIT: we can improve performance by using hash codes, instead of
- // traversing global vector that could be quite large.
- int next = 0;
- final int size = fValues.size();
- LOOP : for (int i = 0; i < size; i = next) {
- next = i + fFieldCount;
- for (int j = 0; j < fFieldCount; j++) {
- final Object value1 = fLocalValues[j];
- final Object value2 = fValues.elementAt(i);
- final short valueType1 = fLocalValueTypes[j];
- final short valueType2 = getValueTypeAt(i);
- final ShortList typeList1 = isListType(valueType1) ? \
fLocalItemValueTypes[j] : null;
- final ShortList typeList2 = isListType(valueType2) ? \
getItemValueTypeAt(i) : null;
-
- if (!EqualityHelper.isEqual(value1, value2, valueType1, \
valueType2, typeList1, typeList2, fSchemaVersion)) {
- continue LOOP;
- }
- i++;
- }
- // found it
- return true;
- }
- // didn't find it
- return false;
- } // contains():boolean
-
- /**
- * Returns -1 if this value store contains the specified
- * values, otherwise the index of the first field in the
- * key sequence.
- */
- public int contains(ValueStoreBase vsb) {
-
- final Vector values = vsb.fValues;
- final int size1 = values.size();
- if (fFieldCount <= 1) {
- LOOP: for (int i = 0; i < size1; ++i) {
- final Object value1 = values.elementAt(i);
- final short valueType1 = vsb.getValueTypeAt(i);
- final ShortList typeList1 = isListType(valueType1) ? \
vsb.getItemValueTypeAt(i) : null;
- for (int j=0; j < fValues.size(); ++j) {
- final Object value2 = fValues.elementAt(j);
- final short valueType2 = getValueTypeAt(j);
- final ShortList typeList2 = isListType(valueType2) ? \
getItemValueTypeAt(j) : null;
- if (EqualityHelper.isEqual(value1, value2, valueType1, \
valueType2, typeList1, typeList2, fSchemaVersion)) {
- continue LOOP;
- }
- }
- return i;
- }
- }
- /** Handle n-tuples. **/
- else {
- final int size2 = fValues.size();
- /** Iterate over each set of fields. **/
- OUTER: for (int i = 0; i < size1; i += fFieldCount) {
- /** Check whether this set is contained in the value store. **/
- INNER: for (int j = 0; j < size2; j += fFieldCount) {
- for (int k = 0; k < fFieldCount; ++k) {
- final Object value1 = values.elementAt(i+k);
- final Object value2 = fValues.elementAt(j+k);
- final short valueType1 = vsb.getValueTypeAt(i+k);
- final short valueType2 = getValueTypeAt(j+k);
- final ShortList typeList1 = isListType(valueType1) ? \
vsb.getItemValueTypeAt(i+k) : null;
- final ShortList typeList2 = isListType(valueType2) ? \
getItemValueTypeAt(j+k) : null;
-
- if (!EqualityHelper.isEqual(value1, value2, valueType1, \
valueType2, typeList1, typeList2, fSchemaVersion)) {
- continue INNER;
- }
- }
- continue OUTER;
- }
- return i;
- }
- }
- return -1;
-
- } // contains(Vector):Object
-
- //
- // Protected methods
- //
-
- protected void checkDuplicateValues() {
- // no-op
- } // duplicateValue(Hashtable)
-
- /** Returns a string of the specified values. */
- protected String toString(Object[] values) {
-
- // no values
- int size = values.length;
- if (size == 0) {
- return "";
- }
-
- fTempBuffer.setLength(0);
-
- // construct value string
- for (int i = 0; i < size; i++) {
- if (i > 0) {
- fTempBuffer.append(',');
- }
- fTempBuffer.append(values[i]);
- }
- return fTempBuffer.toString();
-
- } // toString(Object[]):String
-
- /** Returns a string of the specified values. */
- protected String toString(Vector values, int start, int length) {
-
- // no values
- if (length == 0) {
- return "";
- }
-
- // one value
- if (length == 1) {
- return String.valueOf(values.elementAt(start));
- }
-
- // construct value string
- StringBuffer str = new StringBuffer();
- for (int i = 0; i < length; i++) {
- if (i > 0) {
- str.append(',');
- }
- str.append(values.elementAt(start + i));
- }
- return str.toString();
-
- } // toString(Vector,int,int):String
-
- //
- // Object methods
- //
-
- /** Returns a string representation of this object. */
- public String toString() {
- String s = super.toString();
- int index1 = s.lastIndexOf('$');
- if (index1 != -1) {
- s = s.substring(index1 + 1);
- }
- int index2 = s.lastIndexOf('.');
- if (index2 != -1) {
- s = s.substring(index2 + 1);
- }
- return s + '[' + fIdentityConstraint + ']';
- } // toString():String
-
- //
- // Private methods
- //
- private boolean isListType(short type) {
- return type == XSConstants.LIST_DT || type == \
XSConstants.LISTOFUNION_DT;
- }
-
- private void addValueType(short type) {
- if (fUseValueTypeVector) {
- fValueTypes.add(type);
- }
- else if (fValueTypesLength++ == 0) {
- fValueType = type;
- }
- else if (fValueType != type) {
- fUseValueTypeVector = true;
- if (fValueTypes == null) {
- fValueTypes = new ShortVector(fValueTypesLength * 2);
- }
- for (int i = 1; i < fValueTypesLength; ++i) {
- fValueTypes.add(fValueType);
- }
- fValueTypes.add(type);
- }
- }
-
- private short getValueTypeAt(int index) {
- if (fUseValueTypeVector) {
- return fValueTypes.valueAt(index);
- }
- return fValueType;
- }
-
- private void addItemValueType(ShortList itemValueType) {
- if (fUseItemValueTypeVector) {
- fItemValueTypes.add(itemValueType);
- }
- else if (fItemValueTypesLength++ == 0) {
- fItemValueType = itemValueType;
- }
- else if (!(fItemValueType == itemValueType ||
- (fItemValueType != null && \
fItemValueType.equals(itemValueType)))) {
- fUseItemValueTypeVector = true;
- if (fItemValueTypes == null) {
- fItemValueTypes = new Vector(fItemValueTypesLength * 2);
- }
- for (int i = 1; i < fItemValueTypesLength; ++i) {
- fItemValueTypes.add(fItemValueType);
- }
- fItemValueTypes.add(itemValueType);
- }
- }
-
- private ShortList getItemValueTypeAt(int index) {
- if (fUseItemValueTypeVector) {
- return (ShortList) fItemValueTypes.elementAt(index);
- }
- return fItemValueType;
- }
-
- private IdentityConstraint getIdentityConstraint() {
- return fIdentityConstraint;
- }
-
- } // class ValueStoreBase
-
- /**
- * Unique value store.
- *
- * @author Andy Clark, IBM
- */
- protected class UniqueValueStore extends ValueStoreBase {
-
- //
- // Constructors
- //
-
- /** Constructs a unique value store. */
- public UniqueValueStore(UniqueOrKey unique, String elementName) {
- super(unique, elementName);
- } // <init>(Unique)
-
- //
- // ValueStoreBase protected methods
- //
-
- /**
- * Called when a duplicate value is added.
- */
- protected void checkDuplicateValues() {
- // is this value as a group duplicated?
- if (contains()) {
- String code = "DuplicateUnique";
- String value = toString(fLocalValues);
- String cName = fIdentityConstraint.getIdentityConstraintName();
- reportSchemaError(code, new Object[] { value, fElementName, cName \
});
- }
- } // duplicateValue(Hashtable)
-
- } // class UniqueValueStore
-
- /**
- * Key value store.
- *
- * @author Andy Clark, IBM
- */
- protected class KeyValueStore extends ValueStoreBase {
-
- // REVISIT: Implement a more efficient storage mechanism. -Ac
-
- //
- // Constructors
- //
-
- /** Constructs a key value store. */
- public KeyValueStore(UniqueOrKey key, String elementName) {
- super(key, elementName);
- } // <init>(Key)
-
- //
- // ValueStoreBase protected methods
- //
-
- /**
- * Called when a duplicate value is added.
- */
- protected void checkDuplicateValues() {
- if (contains()) {
- String code = "DuplicateKey";
- String value = toString(fLocalValues);
- String cName = fIdentityConstraint.getIdentityConstraintName();
- reportSchemaError(code, new Object[] { value, fElementName, cName \
});
- }
- } // duplicateValue(Hashtable)
-
- } // class KeyValueStore
-
- /**
- * Key reference value store.
- *
- * @author Andy Clark, IBM
- */
- protected class KeyRefValueStore extends ValueStoreBase {
-
- //
- // Data
- //
-
- /** Key value store. */
- protected ValueStoreBase fKeyValueStore;
-
- //
- // Constructors
- //
-
- /** Constructs a key value store. */
- public KeyRefValueStore(KeyRef keyRef, KeyValueStore keyValueStore, String \
elementName) {
- super(keyRef, elementName);
- fKeyValueStore = keyValueStore;
- } // <init>(KeyRef)
-
- //
- // ValueStoreBase methods
- //
-
- // end the value Scope; here's where we have to tie
- // up keyRef loose ends.
- public void endDocumentFragment() {
-
- // do all the necessary management...
- super.endDocumentFragment();
-
- // verify references
- // get the key store corresponding (if it exists):
- fKeyValueStore =
- (ValueStoreBase) fValueStoreCache.fGlobalIDConstraintMap.get(
- ((KeyRef) fIdentityConstraint).getKey());
-
- if (fKeyValueStore == null) {
- // report error
- String code = "KeyRefOutOfScope";
- String value = fIdentityConstraint.getName();
- reportSchemaError(code, new Object[] { value });
- return;
- }
- int errorIndex = fKeyValueStore.contains(this);
- if (errorIndex != -1) {
- String code = "KeyNotFound";
- String values = toString(fValues, errorIndex, fFieldCount);
- String name = fIdentityConstraint.getName();
- reportSchemaError(code, new Object[] { name, values, fElementName \
});
- }
-
- } // endDocumentFragment()
-
- /** End document. */
- public void endDocument() {
- super.endDocument();
-
- } // endDocument()
-
- } // class KeyRefValueStore
-
- // value store management
-
- /**
- * Value store cache. This class is used to store the values for
- * identity constraints.
- *
- * @author Andy Clark, IBM
- */
- protected class ValueStoreCache {
-
- //
- // Data
- //
- final LocalIDKey fLocalId = new LocalIDKey();
- // values stores
-
- /** stores all global Values stores. */
- protected final ArrayList fValueStores = new ArrayList();
-
- /**
- * Values stores associated to specific identity constraints.
- * This hashtable maps IdentityConstraints and
- * the 0-based element on which their selectors first matched to
- * a corresponding ValueStore. This should take care
- * of all cases, including where ID constraints with
- * descendant-or-self axes occur on recursively-defined
- * elements.
- */
- protected final HashMap fIdentityConstraint2ValueStoreMap = new HashMap();
-
- // sketch of algorithm:
- // - when a constraint is first encountered, its
- // values are stored in the (local) fIdentityConstraint2ValueStoreMap;
- // - Once it is validated (i.e., when it goes out of scope),
- // its values are merged into the fGlobalIDConstraintMap;
- // - as we encounter keyref's, we look at the global table to
- // validate them.
- //
- // The fGlobalIDMapStack has the following structure:
- // - validation always occurs against the fGlobalIDConstraintMap
- // (which comprises all the "eligible" id constraints);
- // When an endElement is found, this Hashtable is merged with the one
- // below in the stack.
- // When a start tag is encountered, we create a new
- // fGlobalIDConstraintMap.
- // i.e., the top of the fGlobalIDMapStack always contains
- // the preceding siblings' eligible id constraints;
- // the fGlobalIDConstraintMap contains descendants+self.
- // keyrefs can only match descendants+self.
- protected final Stack fGlobalMapStack = new Stack();
- protected final HashMap fGlobalIDConstraintMap = new HashMap();
-
- //
- // Constructors
- //
-
- /** Default constructor. */
- public ValueStoreCache() {
- } // <init>()
-
- //
- // Public methods
- //
-
- /** Resets the identity constraint cache. */
- public void startDocument() {
- fValueStores.clear();
- fIdentityConstraint2ValueStoreMap.clear();
- fGlobalIDConstraintMap.clear();
- fGlobalMapStack.removeAllElements();
- } // startDocument()
-
- // startElement: pushes the current fGlobalIDConstraintMap
- // onto fGlobalMapStack and clears fGlobalIDConstraint map.
- public void startElement() {
- // only clone the map when there are elements
- if (fGlobalIDConstraintMap.size() > 0)
- fGlobalMapStack.push(fGlobalIDConstraintMap.clone());
- else
- fGlobalMapStack.push(null);
- fGlobalIDConstraintMap.clear();
- } // startElement(void)
-
- /** endElement(): merges contents of fGlobalIDConstraintMap with the
- * top of fGlobalMapStack into fGlobalIDConstraintMap.
- */
- public void endElement() {
- if (fGlobalMapStack.isEmpty()) {
- return; // must be an invalid doc!
- }
- HashMap oldMap = (HashMap) fGlobalMapStack.pop();
- // return if there is no element
- if (oldMap == null) {
- return;
- }
-
- Iterator entries = oldMap.entrySet().iterator();
- while (entries.hasNext()) {
- Map.Entry entry = (Map.Entry) entries.next();
- IdentityConstraint id = (IdentityConstraint) entry.getKey();
- ValueStoreBase oldVal = (ValueStoreBase) entry.getValue();
- if (oldVal != null) {
- ValueStoreBase currVal = (ValueStoreBase) \
fGlobalIDConstraintMap.get(id);
- if (currVal == null) {
- fGlobalIDConstraintMap.put(id, oldVal);
- }
- else if (currVal != oldVal) {
- currVal.append(oldVal);
- }
- }
- }
- } // endElement()
-
- /**
- * Initializes the value stores for the specified element
- * declaration.
- */
- public void initValueStoresFor(XSElementDecl eDecl, FieldActivator \
activator) {
- // initialize value stores for unique fields
- IdentityConstraint[] icArray = eDecl.fIDConstraints;
- int icCount = eDecl.fIDCPos;
- for (int i = 0; i < icCount; i++) {
- switch (icArray[i].getCategory()) {
- case (IdentityConstraint.IC_UNIQUE) :
- // initialize value stores for unique fields
- UniqueOrKey unique = (UniqueOrKey) icArray[i];
- LocalIDKey toHash = new LocalIDKey(unique, fElementDepth);
- UniqueValueStore uniqueValueStore =
- (UniqueValueStore) \
fIdentityConstraint2ValueStoreMap.get(toHash);
- if (uniqueValueStore == null) {
- uniqueValueStore = new UniqueValueStore(unique, \
eDecl.getName());
- fIdentityConstraint2ValueStoreMap.put(toHash, \
uniqueValueStore);
- } else {
- uniqueValueStore.clear();
- uniqueValueStore.setElementName(eDecl.getName());
- }
- fValueStores.add(uniqueValueStore);
- activateSelectorFor(icArray[i]);
- break;
- case (IdentityConstraint.IC_KEY) :
- // initialize value stores for key fields
- UniqueOrKey key = (UniqueOrKey) icArray[i];
- toHash = new LocalIDKey(key, fElementDepth);
- KeyValueStore keyValueStore =
- (KeyValueStore) \
fIdentityConstraint2ValueStoreMap.get(toHash);
- if (keyValueStore == null) {
- keyValueStore = new KeyValueStore(key, eDecl.getName());
- fIdentityConstraint2ValueStoreMap.put(toHash, \
keyValueStore);
- } else {
- keyValueStore.clear();
- keyValueStore.setElementName(eDecl.getName());
- }
- fValueStores.add(keyValueStore);
- activateSelectorFor(icArray[i]);
- break;
- case (IdentityConstraint.IC_KEYREF) :
- // initialize value stores for keyRef fields
- KeyRef keyRef = (KeyRef) icArray[i];
- toHash = new LocalIDKey(keyRef, fElementDepth);
- KeyRefValueStore keyRefValueStore =
- (KeyRefValueStore) \
fIdentityConstraint2ValueStoreMap.get(toHash);
- if (keyRefValueStore == null) {
- keyRefValueStore = new KeyRefValueStore(keyRef, null, \
eDecl.getName());
- fIdentityConstraint2ValueStoreMap.put(toHash, \
keyRefValueStore);
- } else {
- keyRefValueStore.clear();
- keyRefValueStore.setElementName(eDecl.getName());
- }
- fValueStores.add(keyRefValueStore);
- activateSelectorFor(icArray[i]);
- break;
- }
- }
- } // initValueStoresFor(XSElementDecl)
-
- /** Returns the value store associated to the specified IdentityConstraint. \
*/
- public ValueStoreBase getValueStoreFor(IdentityConstraint id, int \
initialDepth) {
- fLocalId.fDepth = initialDepth;
- fLocalId.fId = id;
- return (ValueStoreBase) fIdentityConstraint2ValueStoreMap.get(fLocalId);
- } // getValueStoreFor(IdentityConstraint, int):ValueStoreBase
-
- /** Returns the global value store associated to the specified \
IdentityConstraint. */
- public ValueStoreBase getGlobalValueStoreFor(IdentityConstraint id) {
- return (ValueStoreBase) fGlobalIDConstraintMap.get(id);
- } // getValueStoreFor(IdentityConstraint):ValueStoreBase
-
- // This method takes the contents of the (local) ValueStore
- // associated with id and moves them into the global
- // hashtable, if id is a <unique> or a <key>.
- // If it's a <keyRef>, then we leave it for later.
- public void transplant(IdentityConstraint id, int initialDepth) {
- fLocalId.fDepth = initialDepth;
- fLocalId.fId = id;
- ValueStoreBase newVals =
- (ValueStoreBase) fIdentityConstraint2ValueStoreMap.get(fLocalId);
- if (id.getCategory() == IdentityConstraint.IC_KEYREF)
- return;
- ValueStoreBase currVals = (ValueStoreBase) \
fGlobalIDConstraintMap.get(id);
- if (currVals != null) {
- currVals.append(newVals);
- fGlobalIDConstraintMap.put(id, currVals);
- } else
- fGlobalIDConstraintMap.put(id, newVals);
-
- } // transplant(id)
-
- /** Check identity constraints. */
- public void endDocument() {
-
- int count = fValueStores.size();
- for (int i = 0; i < count; i++) {
- ValueStoreBase valueStore = (ValueStoreBase) fValueStores.get(i);
- valueStore.endDocument();
- }
-
- } // endDocument()
-
- //
- // Object methods
- //
-
- /** Returns a string representation of this object. */
- public String toString() {
- String s = super.toString();
- int index1 = s.lastIndexOf('$');
- if (index1 != -1) {
- return s.substring(index1 + 1);
- }
- int index2 = s.lastIndexOf('.');
- if (index2 != -1) {
- return s.substring(index2 + 1);
- }
- return s;
- } // toString():String
-
- } // class ValueStoreCache
-
- // the purpose of this class is to enable IdentityConstraint,int
- // pairs to be used easily as keys in Hashtables.
- protected static final class LocalIDKey {
-
- public IdentityConstraint fId;
- public int fDepth;
-
- public LocalIDKey() {
- }
-
- public LocalIDKey(IdentityConstraint id, int depth) {
- fId = id;
- fDepth = depth;
- } // init(IdentityConstraint, int)
-
- // object method
- public int hashCode() {
- return fId.hashCode() + fDepth;
- }
-
- public boolean equals(Object localIDKey) {
- if (localIDKey instanceof LocalIDKey) {
- LocalIDKey lIDKey = (LocalIDKey) localIDKey;
- return (lIDKey.fId == fId && lIDKey.fDepth == fDepth);
- }
- return false;
- }
- } // class LocalIDKey
-
- /**
- * A simple vector for <code>short</code>s.
- */
- protected static final class ShortVector {
-
- //
- // Data
- //
-
- /** Current length. */
- private int fLength;
-
- /** Data. */
- private short[] fData;
-
- //
- // Constructors
- //
-
- public ShortVector() {}
-
- public ShortVector(int initialCapacity) {
- fData = new short[initialCapacity];
- }
-
- //
- // Public methods
- //
-
- /** Returns the length of the vector. */
- public int length() {
- return fLength;
- }
-
- /** Adds the value to the vector. */
- public void add(short value) {
- ensureCapacity(fLength + 1);
- fData[fLength++] = value;
- }
-
- /** Returns the short value at the specified position in the vector. */
- public short valueAt(int position) {
- return fData[position];
- }
-
- /** Clears the vector. */
- public void clear() {
- fLength = 0;
- }
-
- /** Returns whether the short is contained in the vector. */
- public boolean contains(short value) {
- for (int i = 0; i < fLength; ++i) {
- if (fData[i] == value) {
- return true;
- }
- }
- return false;
- }
-
- //
- // Private methods
- //
-
- /** Ensures capacity. */
- private void ensureCapacity(int size) {
- if (fData == null) {
- fData = new short[8];
- }
- else if (fData.length <= size) {
- short[] newdata = new short[fData.length * 2];
- System.arraycopy(fData, 0, newdata, 0, fData.length);
- fData = newdata;
- }
- }
- }
-
- public XSDAssertionValidator getAssertionValidator() {
- return fAssertionValidator;
- }
-
- boolean getIsAssertProcessingNeededForSTUnionElem() {
- return fIsAssertProcessingNeededForSTUnionElem;
- }
-
- void setIsAssertProcessingNeededForSTUnionElem(boolean \
isAssertProcessingNeededForSTUnionElem) {
- this.fIsAssertProcessingNeededForSTUnionElem = \
isAssertProcessingNeededForSTUnionElem;
- }
-
- List getIsAssertProcessingNeededForSTUnionAttrs() {
- return fIsAssertProcessingNeededForSTUnionAttrs;
- }
-
- void setIsAssertProcessingNeededForSTUnionAttrs(List \
isAssertProcessingNeededForSTUnionAttrs) {
- this.fIsAssertProcessingNeededForSTUnionAttrs = \
isAssertProcessingNeededForSTUnionAttrs;
- }
-
- Vector getInheritableAttrList() {
- return fInheritableAttrList;
- }
-
- void setInheritableAttrList(Vector inheritableAttrList) {
- this.fInheritableAttrList = inheritableAttrList;
- }
} // class XMLSchemaValidator
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic