1 /* Copyright 2004 The Apache Software Foundation 2 * 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 package org.apache.xmlbeans; 17 18 import javax.xml.namespace.QName; 19 20 /** 21 * Represents a schema type. 22 * <p> 23 * SchemaType is the metadata "type" class for {@link XmlObject}, and it plays the 24 * analogous role for {@link XmlObject} that {@link java.lang.Class} plays for 25 * {@link java.lang.Object}. 26 * <p> 27 * Every XML Bean class corresponds to a singleton SchemaType object 28 * obtainable by ClassName.type (e.g., {@link XmlNonPositiveInteger#type}), and 29 * every XML Bean instance has an actual SchemaType, obtainable by 30 * {@link XmlObject#schemaType}. The ClassName.type and schemaType() mechanisms are 31 * analogous to the ordinary Java ClassName.class and obj.getClass() mechanisms. 32 * <p> 33 * All schema types are represented by a SchemaType, this includes all types 34 * regardless of whether they are built-in or user-defined, compiled or 35 * uncompiled, simple or complex. 36 * <p> 37 * In addition, a compiled XML Bean type system includes special "document" schema types 38 * each representing a document containing nothing but a single element for each 39 * global element, and special "attribute" schema types each representing 40 * a fragment containing nothing but a single global attribute for global 41 * attribute. 42 * <p> 43 * Do not confuse Schema Types with other types of Schema Components such as 44 * {@link SchemaGlobalElement Global Elements}, {@link SchemaGlobalAttribute Global Attributes}, 45 * {@link SchemaModelGroup Named Model Groups}, or {@link SchemaAttributeGroup Attribute Groups}. 46 * SchemaType represents a Type component, not any of the other kinds of components. 47 * There are different kinds of metadata objects for the different Schema components. 48 * <p> 49 * The space of SchemaTypes is divided as follows: 50 * 51 * <ul> 52 * <li>First, there is the universal base type and the universal 53 * subtype. These are {@link XmlObject#type} 54 * (corresponding to xs:anyType) and {@link XmlBeans#NO_TYPE}, 55 * respectively. The first type is a base type of all other 56 * types. The other type indicates the absence of type information 57 * and, at least in set-theoretic terms, is a subtype of all other types. 58 * <li>There is another universal base type that is the base type 59 * for all simple types. This is the {@link XmlAnySimpleType#type}, 60 * corresponding to xs:anySimpleType. Only XmlObject.type and 61 * XmlAnySimpleType.type return <code>true</code> for {@link #isURType}, and 62 * only XmlBeans.NO_TYPE returns <code>true</code> for {@link #isNoType}. 63 * <li>The two "special" kinds of types that are generated that 64 * do not formally exist in the actual Schema specification are 65 * document types and global attribute types (corresponding to 66 * documents that contain a global element, or fragments that 67 * contain a global attribute). They can be detected using 68 * {@link #isDocumentType} and {@link #isAttributeType}. Other 69 * than their anonymity (lack of a type name) and their appearance 70 * only at the root of an instance, they are otherwise just like 71 * ordinary complex types. 72 * <li>Simple types can be detected using {@link #isSimpleType}. 73 * Complex types are consdered to be all the types that are 74 * not simple. 75 * <li>Simple types are divided into three varieties: atomic types, 76 * list types, and union types. Which variety of simple type 77 * you have can be discoverd using {@link #getSimpleVariety}. 78 * It will return either {@link #ATOMIC}, {@link #LIST}, or 79 * {@link #UNION}. 80 * <li>An {@link #ATOMIC} simple type is always based on one of the 81 * 20 built-in primitive schema types. You can determine 82 * the underlying primitive type for an atomic simple type 83 * by calling {@link #getPrimitiveType}. An atomic type 84 * may add facet restrictions on top of the primitive type, 85 * and these facets can be explored using {@link #getFacet}, 86 * {@link #getWhiteSpaceRule}, {@link #matchPatternFacet}, 87 * {@link #getEnumerationValues}, and related methods. 88 * <li>A {@link #LIST} simple type is always based on another non-list 89 * simple type. The underlying list item type can be obtained 90 * by using {@link #getListItemType}. 91 * <li>A {@link #UNION} simple type is always composed out of a number of 92 * other simple types. The direct members of the union can 93 * be obtained by {@link #getUnionMemberTypes}. When unions 94 * consist of other unions, it is useful to know useful to know 95 * the "leaves of the union tree", so the 96 * set of non-union types making up the union can be obtained 97 * by {@link #getUnionConstituentTypes}. The closure of the 98 * entire "union tree" is {@link #getUnionSubTypes} (this includes 99 * the type itself). For 100 * simple unions that do not consist of other unions, all three 101 * of these sets are the same. 102 * <li>Complex types have nested structure. They are divided into 103 * four content types: empty content, simple content, element-only 104 * content, and mixed content. All kinds of complex types may 105 * have attributes. The content type for a complex type can 106 * be dermined using {@link #getContentType}. This will return 107 * {@link #EMPTY_CONTENT}, {@link #SIMPLE_CONTENT}, 108 * {@link #ELEMENT_CONTENT}, or {@link #MIXED_CONTENT}. 109 * <li>If a complex type has {@link #EMPTY_CONTENT}, the content model will be null. 110 * <li>If a complex type has {@link #SIMPLE_CONTENT}, then it will extend the 111 * simple type that describes the content. In addition, the type 112 * may impose additional simple type facet restrictions; these can 113 * be determined in the same way they are for a simple type. 114 * <li>If a complex type has {@link #ELEMENT_CONTENT} or {@link #MIXED_CONTENT}, then 115 * the detailed content model can be determined by examining 116 * the particle tree (which may be null for MIXED_CONTENT). 117 * The particle tree can be obtained via {@link #getContentModel}. 118 * <li>When working with a complex type, most users will find it 119 * sufficient to discover the summarized shape of the content model 120 * and attribute model using {@link #getElementProperties}, 121 * {@link #getAttributeProperties}, and related methods rather than 122 * examining the particle tree and attribute model directly. 123 * </ul> 124 * 125 * @see SchemaTypeLoader 126 * @see XmlObject#schemaType 127 * @see SimpleValue#instanceType 128 */ 129 public interface SchemaType extends SchemaComponent, SchemaAnnotated 130 { 131 /** 132 * The name used to describe the type in the schema. 133 * Null if the type is anonymous (nested), or if it is a document type. 134 */ 135 public abstract QName getName(); 136 137 /** 138 * The parent schema element. 139 * Null for top-level (named) types and document types. 140 */ 141 public abstract SchemaField getContainerField(); 142 143 /** 144 * True if this is a document type. 145 * <p> 146 * Document types are generated for every global element. A document 147 * type is an unnamed complex type that contains exactly one element: 148 * we define these types, because they are the types of the "documents" 149 * which contain the defined global elements, and they all turn into 150 * Java types. (Named ElementnameDocument.) 151 */ 152 public boolean isDocumentType(); 153 154 /** 155 * True if this is a attribute type. 156 * <p> 157 * Attribute types are generated for every global attribute. An attribute 158 * type is an unnamed complex type that contains exactly one attribute: 159 * we define these types, because they are the types of the "attribute documents" 160 * which contain the defined global attribute, and they all turn into 161 * Java types. (Named AttributenameAttribute.) 162 */ 163 public boolean isAttributeType(); 164 165 166 /** 167 * Returns the document element name if this is a document type, 168 * or null otherwise. 169 */ 170 public QName getDocumentElementName(); 171 172 /** 173 * Returns the attribute qname if this is a attribute type, 174 * or null otherwise. 175 */ 176 public QName getAttributeTypeAttributeName(); 177 178 /** 179 * The outer schema type. 180 * Null for top-level (named) types. 181 */ 182 public abstract SchemaType getOuterType(); 183 184 /** 185 * True if this anonymous type has no corresponding Java type. True for 186 * anonymous types nested within simple type restrictions. 187 */ 188 public abstract boolean isSkippedAnonymousType(); 189 190 /** 191 * True if this schema type was compiled to have a corresponding 192 * Java class. 193 */ 194 public abstract boolean isCompiled(); 195 196 /** 197 * The fully-qualified Java type name of the class. 198 */ 199 public abstract String getFullJavaName(); 200 201 /** 202 * The short unqualfiied Java name for the class. 203 */ 204 public abstract String getShortJavaName(); 205 206 /** 207 * The fully-qualified Java type name of the implementation class. 208 */ 209 public abstract String getFullJavaImplName(); 210 211 /** 212 * The short unqualfiied Java name for the implementation class. 213 */ 214 public abstract String getShortJavaImplName(); 215 216 /** 217 * The Java class corresponding to this schema type. 218 */ 219 public abstract Class getJavaClass(); 220 221 /** 222 * The Java class corresponding to the enumeration type for this schema type, 223 * if applicable (or null if not an enumeration). 224 */ 225 public abstract Class getEnumJavaClass(); 226 227 /** 228 * Returns user-specific information. 229 * @see SchemaBookmark 230 */ 231 public Object getUserData(); 232 233 /** 234 * True if the Xsd type is anonymous (i.e., not top-level). 235 */ 236 public abstract boolean isAnonymousType(); 237 238 /** 239 * True for any of the 40+ built-in types. 240 */ 241 public abstract boolean isBuiltinType(); 242 243 /** 244 * True for the anySimpleType and any restrictions/unions/lists. 245 */ 246 public abstract boolean isSimpleType(); 247 248 /** 249 * Returns base restriction or extension type. Unions and lists 250 * return the anySimpleType. 251 */ 252 public abstract SchemaType getBaseType(); 253 254 /** 255 * Returns common base type with the given type. The returned 256 * type is the most specific declared base type of both types. 257 */ 258 public abstract SchemaType getCommonBaseType(SchemaType type); 259 260 /** 261 * True if the specified type derives from this type (or if 262 * it is the same type). 263 * 264 * Note that XmlObject.type (the anyType) is assignable 265 * from all type, and the XmlBeans.noType (the absence of 266 * a type) is assignable to all types. 267 */ 268 public abstract boolean isAssignableFrom(SchemaType type); 269 270 /** 271 * Returns an integer for the derivation type, either 272 * {@link #DT_EXTENSION}, {@link #DT_RESTRICTION}, {@link #DT_NOT_DERIVED}. 273 */ 274 public int getDerivationType(); 275 276 /** Not derived. True for XmlObject.type only. See {@link #getDerivationType}. */ 277 public static final int DT_NOT_DERIVED = 0; 278 /** Derived by restriction. See {@link #getDerivationType}. */ 279 public static final int DT_RESTRICTION = 1; 280 /** Derived by extension. See {@link #getDerivationType}. */ 281 public static final int DT_EXTENSION = 2; 282 283 /** 284 * Returns an integer for builtin types that can be used 285 * for quick comparison. 286 */ 287 public abstract int getBuiltinTypeCode(); 288 289 /** Not a builtin type */ 290 public static final int BTC_NOT_BUILTIN = 0; 291 /** xs:anyType, aka {@link XmlObject#type} */ 292 public static final int BTC_ANY_TYPE = 1; 293 294 /** The primitive types have codes between BTC_FIRST_PRIMITIVE and BTC_LAST_PRIMITIVE inclusive */ 295 public static final int BTC_FIRST_PRIMITIVE = 2; 296 297 /** xs:anySimpleType, aka {@link XmlAnySimpleType#type} */ 298 public static final int BTC_ANY_SIMPLE = 2; 299 300 /** xs:boolean, aka {@link XmlBoolean#type} */ 301 public static final int BTC_BOOLEAN = 3; 302 /** xs:base64Binary, aka {@link XmlBase64Binary#type} */ 303 public static final int BTC_BASE_64_BINARY = 4; 304 /** xs:hexBinary, aka {@link XmlBase64Binary#type} */ 305 public static final int BTC_HEX_BINARY = 5; 306 /** xs:anyURI, aka {@link XmlAnyURI#type} */ 307 public static final int BTC_ANY_URI = 6; 308 /** xs:QName, aka {@link XmlQName#type} */ 309 public static final int BTC_QNAME = 7; 310 /** xs:NOTATION, aka {@link XmlNOTATION#type} */ 311 public static final int BTC_NOTATION = 8; 312 /** xs:float, aka {@link XmlFloat#type} */ 313 public static final int BTC_FLOAT = 9; 314 /** xs:double, aka {@link XmlDouble#type} */ 315 public static final int BTC_DOUBLE = 10; 316 /** xs:decimal, aka {@link XmlDecimal#type} */ 317 public static final int BTC_DECIMAL = 11; 318 /** xs:string, aka {@link XmlString#type} */ 319 public static final int BTC_STRING = 12; 320 321 /** xs:duration, aka {@link XmlDuration#type} */ 322 public static final int BTC_DURATION = 13; 323 /** xs:dateTime, aka {@link XmlDateTime#type} */ 324 public static final int BTC_DATE_TIME = 14; 325 /** xs:time, aka {@link XmlTime#type} */ 326 public static final int BTC_TIME = 15; 327 /** xs:date, aka {@link XmlDate#type} */ 328 public static final int BTC_DATE = 16; 329 /** xs:gYearMonth, aka {@link XmlGYearMonth#type} */ 330 public static final int BTC_G_YEAR_MONTH = 17; 331 /** xs:gYear, aka {@link XmlGYear#type} */ 332 public static final int BTC_G_YEAR = 18; 333 /** xs:gMonthDay, aka {@link XmlGMonthDay#type} */ 334 public static final int BTC_G_MONTH_DAY = 19; 335 /** xs:gDay, aka {@link XmlGDay#type} */ 336 public static final int BTC_G_DAY = 20; 337 /** xs:gMonth, aka {@link XmlGMonth#type} */ 338 public static final int BTC_G_MONTH = 21; 339 340 /** The primitive types have codes between BTC_FIRST_PRIMITIVE and BTC_LAST_PRIMITIVE inclusive */ 341 public static final int BTC_LAST_PRIMITIVE = 21; 342 343 // derived numerics 344 /** xs:integer, aka {@link XmlInteger#type} */ 345 public static final int BTC_INTEGER = 22; 346 /** xs:long, aka {@link XmlLong#type} */ 347 public static final int BTC_LONG = 23; 348 /** xs:int, aka {@link XmlInt#type} */ 349 public static final int BTC_INT = 24; 350 /** xs:short, aka {@link XmlShort#type} */ 351 public static final int BTC_SHORT = 25; 352 /** xs:byte, aka {@link XmlByte#type} */ 353 public static final int BTC_BYTE = 26; 354 /** xs:nonPositiveInteger, aka {@link XmlNonPositiveInteger#type} */ 355 public static final int BTC_NON_POSITIVE_INTEGER = 27; 356 /** xs:NegativeInteger, aka {@link XmlNegativeInteger#type} */ 357 public static final int BTC_NEGATIVE_INTEGER = 28; 358 /** xs:nonNegativeInteger, aka {@link XmlNonNegativeInteger#type} */ 359 public static final int BTC_NON_NEGATIVE_INTEGER = 29; 360 /** xs:positiveInteger, aka {@link XmlPositiveInteger#type} */ 361 public static final int BTC_POSITIVE_INTEGER = 30; 362 /** xs:unsignedLong, aka {@link XmlUnsignedLong#type} */ 363 public static final int BTC_UNSIGNED_LONG = 31; 364 /** xs:unsignedInt, aka {@link XmlUnsignedInt#type} */ 365 public static final int BTC_UNSIGNED_INT = 32; 366 /** xs:unsignedShort, aka {@link XmlUnsignedShort#type} */ 367 public static final int BTC_UNSIGNED_SHORT = 33; 368 /** xs:unsignedByte, aka {@link XmlUnsignedByte#type} */ 369 public static final int BTC_UNSIGNED_BYTE = 34; 370 371 // derived strings 372 /** xs:normalizedString, aka {@link XmlNormalizedString#type} */ 373 public static final int BTC_NORMALIZED_STRING = 35; 374 /** xs:token, aka {@link XmlToken#type} */ 375 public static final int BTC_TOKEN = 36; 376 /** xs:Name, aka {@link XmlName#type} */ 377 public static final int BTC_NAME = 37; 378 /** xs:NCName, aka {@link XmlNCName#type} */ 379 public static final int BTC_NCNAME = 38; 380 /** xs:language, aka {@link XmlLanguage#type} */ 381 public static final int BTC_LANGUAGE = 39; 382 /** xs:ID, aka {@link XmlID#type} */ 383 public static final int BTC_ID = 40; 384 /** xs:IDREF, aka {@link XmlIDREF#type} */ 385 public static final int BTC_IDREF = 41; 386 /** xs:IDREFS, aka {@link XmlIDREFS#type} */ 387 public static final int BTC_IDREFS = 42; 388 /** xs:ENTITY, aka {@link XmlENTITY#type} */ 389 public static final int BTC_ENTITY = 43; 390 /** xs:ENTITIES, aka {@link XmlENTITIES#type} */ 391 public static final int BTC_ENTITIES = 44; 392 /** xs:NMTOKEN, aka {@link XmlNMTOKEN#type} */ 393 public static final int BTC_NMTOKEN = 45; 394 /** xs:NMTOKENS, aka {@link XmlNMTOKENS#type} */ 395 public static final int BTC_NMTOKENS = 46; 396 397 public static final int BTC_LAST_BUILTIN = 46; 398 399 /** 400 * True for anyType and anySimpleType. 401 */ 402 public boolean isURType(); 403 404 /** 405 * True for the type object that represents a the absence of a determined type. 406 * XML Objects whose type isNoType() are never valid. 407 */ 408 public boolean isNoType(); 409 410 /** 411 * Returns the SchemaTypeLoader in which this type was defined. 412 * Complex types are defined and used in exactly one schema type 413 * system, but simple types are defined in one type system and can 414 * be used in any number of type systems. The most common case is 415 * the builtin types, which are defined in the builtin type system 416 * and used elsewhere. 417 */ 418 public SchemaTypeSystem getTypeSystem(); 419 420 /** True if this type cannot be used directly in instances */ 421 public boolean isAbstract(); 422 423 /** True if other types cannot extend this type (only for complex types) */ 424 public boolean finalExtension(); 425 426 /** True if other types cannot restrict this type */ 427 public boolean finalRestriction(); 428 429 /** True if list derivation of this type is prohibited (only for simple types) */ 430 public boolean finalList(); 431 432 /** True if union derivation of this type is prohibited (only for simple types) */ 433 public boolean finalUnion(); 434 435 /** True if extensions of this type cannot be substituted for this type */ 436 public boolean blockExtension(); 437 438 /** True if restrictions of this type cannot be substituted for this type */ 439 public boolean blockRestriction(); 440 441 /** 442 * Returns {@link #EMPTY_CONTENT}, {@link #SIMPLE_CONTENT}, {@link #ELEMENT_CONTENT}, or 443 * {@link #MIXED_CONTENT} for complex types. For noncomplex types, returns 444 * {@link #NOT_COMPLEX_TYPE}. 445 */ 446 public abstract int getContentType(); 447 448 /** Not a complex type. See {@link #getContentType()}. */ 449 public static final int NOT_COMPLEX_TYPE = 0; 450 /** Empty content. See {@link #getContentType()}. */ 451 public static final int EMPTY_CONTENT = 1; 452 /** Simple content. See {@link #getContentType()}. */ 453 public static final int SIMPLE_CONTENT = 2; 454 /** Element-only content. See {@link #getContentType()}. */ 455 public static final int ELEMENT_CONTENT = 3; 456 /** Mixed content. See {@link #getContentType()}. */ 457 public static final int MIXED_CONTENT = 4; 458 459 460 /** 461 * For complex types with simple content returns the base type for this 462 * type's content. In most cases, this is the same as the base type, but 463 * it can also be an anonymous type. 464 */ 465 SchemaType getContentBasedOnType(); 466 467 /** 468 * Returns a {@link SchemaTypeElementSequencer} object, which can then 469 * be used to validate complex content inside this element. This is useful 470 * for example for trying out different names and see which one would be 471 * valid as a child of this element. 472 */ 473 SchemaTypeElementSequencer getElementSequencer(); 474 475 /** 476 * The array of inner (anonymous) types defined 477 * within this type. 478 */ 479 public abstract SchemaType[] getAnonymousTypes(); 480 481 /** 482 * Returns a SchemaProperty corresponding to an element within this 483 * complex type by looking up the element name. 484 */ 485 public abstract SchemaProperty getElementProperty(QName eltName); 486 487 /** 488 * Returns all the SchemaProperties corresponding to elements. 489 */ 490 public abstract SchemaProperty[] getElementProperties(); 491 492 /** 493 * Returns a SchemaProperty corresponding to an attribute within this 494 * complex type by looking up the attribute name. 495 */ 496 public abstract SchemaProperty getAttributeProperty(QName attrName); 497 498 /** 499 * Returns all the SchemaProperties corresponding to attributes. 500 */ 501 public abstract SchemaProperty[] getAttributeProperties(); 502 503 /** 504 * Returns all the SchemaProperties within this complex type, 505 * elements followed by attributes. 506 */ 507 public abstract SchemaProperty[] getProperties(); 508 509 /** 510 * Returns the SchemaProperties defined by this complex type, 511 * exclusive of the base type (if any). 512 */ 513 SchemaProperty[] getDerivedProperties(); 514 515 /** 516 * Returns the attribute model for this complex type (with simple or complex content). 517 */ 518 public abstract SchemaAttributeModel getAttributeModel(); 519 520 /** 521 * True if this type permits wildcard attributes. See the attribute model for 522 * more information about which wildcards are allowed. 523 */ 524 public abstract boolean hasAttributeWildcards(); 525 526 /** 527 * Returns the complex content model for this complex type (with complex content). 528 */ 529 public abstract SchemaParticle getContentModel(); 530 531 /** 532 * True if this type permits element wildcards. See the content model for 533 * more information about which wildcards are allowed, and where. 534 */ 535 public abstract boolean hasElementWildcards(); 536 537 /** 538 * For document types, true if the given name can be substituted for the 539 * document element name. 540 */ 541 public boolean isValidSubstitution(QName name); 542 543 /** 544 * True if the complex content model for this complex type is an "all" group. 545 */ 546 public abstract boolean hasAllContent(); 547 548 /** 549 * True if particles have same defaults, nillability, etc, that are 550 * invariant when order changes. Computed only for Javaized types. 551 */ 552 public abstract boolean isOrderSensitive(); 553 554 /** 555 * Returns the type of a child element based on the element name and 556 * an xsi:type attribute (and the type system within which names are 557 * resolved). 558 */ 559 public abstract SchemaType getElementType(QName eltName, QName xsiType, SchemaTypeLoader wildcardTypeLoader); 560 561 /** 562 * Returns the type of an attribute based on the attribute name and 563 * the type system within which (wildcard) names are resolved. 564 */ 565 public abstract SchemaType getAttributeType(QName eltName, SchemaTypeLoader wildcardTypeLoader); 566 567 /*************************************************************/ 568 /* SIMPLE TYPE MODEL BELOW */ 569 /*************************************************************/ 570 571 /** xs:length facet */ 572 public static final int FACET_LENGTH = 0; 573 /** xs:minLength facet */ 574 public static final int FACET_MIN_LENGTH = 1; 575 /** xs:maxLength facet */ 576 public static final int FACET_MAX_LENGTH = 2; 577 /** xs:minExclusive facet */ 578 public static final int FACET_MIN_EXCLUSIVE = 3; 579 /** xs:minInclusive facet */ 580 public static final int FACET_MIN_INCLUSIVE = 4; 581 /** xs:maxInclusive facet */ 582 public static final int FACET_MAX_INCLUSIVE = 5; 583 /** xs:maxExclusive facet */ 584 public static final int FACET_MAX_EXCLUSIVE = 6; 585 /** xs:totalDigits facet */ 586 public static final int FACET_TOTAL_DIGITS = 7; 587 /** xs:fractionDigits facet */ 588 public static final int FACET_FRACTION_DIGITS = 8; 589 590 public static final int LAST_BASIC_FACET = 8; 591 592 /** xs:whiteSpace facet - use {@link #getWhiteSpaceRule} instead */ 593 public static final int FACET_WHITE_SPACE = 9; 594 /** xs:pattern facet - use {@link #matchPatternFacet} instead */ 595 public static final int FACET_PATTERN = 10; 596 /** xs:enumeration facet - use {@link #getEnumerationValues} instead */ 597 public static final int FACET_ENUMERATION = 11; 598 599 /** The last ordinary facet code */ 600 public static final int LAST_FACET = 11; 601 602 /** @see #ordered */ 603 public static final int PROPERTY_ORDERED = 12; 604 /** @see #isBounded */ 605 public static final int PROPERTY_BOUNDED = 13; 606 /** @see #isFinite */ 607 public static final int PROPERTY_CARDINALITY = 14; 608 /** @see #isNumeric */ 609 public static final int PROPERTY_NUMERIC = 15; 610 611 /** The last property code */ 612 public static final int LAST_PROPERTY = 15; 613 614 615 /** 616 * Returns the value of the given facet, or null if 617 * none is set. 618 */ 619 public abstract XmlAnySimpleType getFacet(int facetCode); 620 621 /** 622 * True if the given facet is fixed. 623 */ 624 public abstract boolean isFacetFixed(int facetCode); 625 626 /** 627 * True if ordered. Returns either {@link #UNORDERED}, 628 * {@link #PARTIAL_ORDER}, or {@link #TOTAL_ORDER}. 629 */ 630 public abstract int ordered(); 631 632 /** Unordered. See {@link #ordered}. */ 633 public static int UNORDERED = 0; 634 /** Partially ordered. See {@link #ordered}. */ 635 public static int PARTIAL_ORDER = 1; 636 /** Totally ordered. See {@link #ordered}. */ 637 public static int TOTAL_ORDER = 2; 638 639 /** 640 * True if bounded. 641 */ 642 public abstract boolean isBounded(); 643 644 /** 645 * True if finite. 646 */ 647 public abstract boolean isFinite(); 648 649 /** 650 * True if numeric. 651 */ 652 public abstract boolean isNumeric(); 653 654 /** 655 * True if there are regex pattern facents 656 */ 657 public abstract boolean hasPatternFacet(); 658 659 /** 660 * True 661 */ 662 public abstract String[] getPatterns(); 663 664 /** 665 * True if the given string matches the pattern facets. 666 * Always true if there are no pattern facets. 667 */ 668 public abstract boolean matchPatternFacet(String s); 669 670 /** 671 * Returns the array of valid objects from the 672 * enumeration facet, null if no enumeration defined. 673 */ 674 public abstract XmlAnySimpleType[] getEnumerationValues(); 675 676 /** 677 * True if this is a string enum where an integer 678 * is assigned to each enumerated value. 679 */ 680 public abstract boolean hasStringEnumValues(); 681 682 /** 683 * If this is a string enumeration, returns the most basic base schema 684 * type that this enuemration is based on. Otherwise returns null. 685 */ 686 public abstract SchemaType getBaseEnumType(); 687 688 /** 689 * Returns the array of SchemaStringEnumEntries for this type: this 690 * array includes information about the java constant names used for 691 * each string enum entry. 692 */ 693 public SchemaStringEnumEntry[] getStringEnumEntries(); 694 695 /** 696 * Returns the string enum entry corresponding to the given enumerated 697 * string, or null if there is no match or this type is not 698 * a string enumeration. 699 */ 700 public SchemaStringEnumEntry enumEntryForString(String s); 701 702 /** 703 * Returns the string enum value corresponding to the given enumerated 704 * string, or null if there is no match or this type is not 705 * a string enumeration. 706 */ 707 public abstract StringEnumAbstractBase enumForString(String s); 708 709 /** 710 * Returns the string enum value corresponding to the given enumerated 711 * string, or null if there is no match or this type is not 712 * a string enumeration. 713 */ 714 public abstract StringEnumAbstractBase enumForInt(int i); 715 716 /** 717 * True for any of the 20 primitive types (plus anySimpleType) 718 */ 719 public abstract boolean isPrimitiveType(); 720 721 /** 722 * Returns whether the simple type is ATOMIC, UNION, or LIST. 723 * Returns {@link #NOT_SIMPLE}, {@link #ATOMIC}, {@link #UNION}, 724 * or {@link #LIST}. 725 */ 726 public abstract int getSimpleVariety(); 727 728 /** Not a simple type or simple content. See {@link #getSimpleVariety}. */ 729 public static final int NOT_SIMPLE = 0; 730 /** Atomic type. See {@link #getSimpleVariety} */ 731 public static final int ATOMIC = 1; 732 /** Union type. See {@link #getSimpleVariety} */ 733 public static final int UNION = 2; 734 /** Simple list type. See {@link #getSimpleVariety} */ 735 public static final int LIST = 3; 736 737 738 /** 739 * For atomic types only: get the primitive type underlying this one. 740 * <p> 741 * Returns null if this is not an atomic type. 742 */ 743 public abstract SchemaType getPrimitiveType(); 744 745 /** 746 * For atomic numeric restrictions of decimal only: the 747 * numeric size category. Takes into account min and max 748 * restrictions as well as totalDigits and fractionDigits 749 * facets. 750 * <p> 751 * Returns either {@link #NOT_DECIMAL}, 752 * {@link #SIZE_BYTE}, {@link #SIZE_SHORT}, {@link #SIZE_INT}, 753 * {@link #SIZE_LONG}, {@link #SIZE_BIG_INTEGER}, or 754 * {@link #SIZE_BIG_DECIMAL}. 755 */ 756 public abstract int getDecimalSize(); 757 758 /** Not a decimal restriction. See {@link #getDecimalSize}. */ 759 public static final int NOT_DECIMAL = 0; 760 /** Fits in a byte. See {@link #getDecimalSize}. */ 761 public static final int SIZE_BYTE = 8; 762 /** Fits in a short. See {@link #getDecimalSize}. */ 763 public static final int SIZE_SHORT = 16; 764 /** Fits in an int. See {@link #getDecimalSize}. */ 765 public static final int SIZE_INT = 32; 766 /** Fits in a long. See {@link #getDecimalSize}. */ 767 public static final int SIZE_LONG = 64; 768 /** Fits in a {@link java.math.BigInteger}. See {@link #getDecimalSize}. */ 769 public static final int SIZE_BIG_INTEGER = 1000000; // "millions" 770 /** Fits in a {@link java.math.BigDecimal}. See {@link #getDecimalSize}. */ 771 public static final int SIZE_BIG_DECIMAL = 1000001; // "even more" 772 773 /** 774 * For union types only: get the shallow member types. This 775 * returns the declared member types of the union, so, for 776 * example if the type contains another union, the nested 777 * members of that union are NOT returned here. 778 * <p> 779 * Returns null if this type is not a union. 780 */ 781 public abstract SchemaType[] getUnionMemberTypes(); 782 783 /** 784 * For union types only: gets the full tree of member types. 785 * This computes the closure of the set returned by 786 * getUnionMemberTypes(), so, for example, it returns 787 * all the types nested within unions of unions as well 788 * as the top-level members; the set also includes the 789 * type itself. If you are seeking only the basic 790 * non-union consituents, use getUnionConstituentTypes. 791 * <p> 792 * Returns null if this type is not a union. 793 */ 794 public abstract SchemaType[] getUnionSubTypes(); 795 796 /** 797 * For union types only: get the constituent member types. This 798 * returns only non-union types, so, for example, for unions of 799 * unions, this returns the flattened list of individual member 800 * types within the innermost unions. 801 * <p> 802 * Returns null if this type is not a union. 803 */ 804 public abstract SchemaType[] getUnionConstituentTypes(); 805 806 /** 807 * For union types only: get the most specific common base 808 * type of the constituent member types. May return a UR type. 809 * <p> 810 * Returns null if this type is not a union. 811 */ 812 public abstract SchemaType getUnionCommonBaseType(); 813 814 /** 815 * For anonymous types defined inside a union only: gets 816 * the integer indicating the declaration order of this 817 * type within the outer union type, or zero if this is 818 * not applicable. The first anonymous union member within 819 * a union type is numbered "1". Used to differentiate 820 * between different anonymous types. 821 */ 822 public abstract int getAnonymousUnionMemberOrdinal(); 823 824 /** 825 * For list types only: get the item type. This is the atomic 826 * or union type that is the type of every entry in the list. 827 * <p> 828 * Returns null if this type is not a list. 829 */ 830 public abstract SchemaType getListItemType(); 831 832 /** 833 * For nonunion simple types: get the whitespace rule. This is 834 * either {@link #WS_PRESERVE}, {@link #WS_REPLACE}, or 835 * {@link #WS_COLLAPSE}. Returns {@link #WS_UNSPECIFIED} 836 * for unions and complex types. 837 */ 838 public abstract int getWhiteSpaceRule(); 839 840 /** Whitespace rule unspecified. See {@link #getWhiteSpaceRule}. */ 841 public static final int WS_UNSPECIFIED = 0; 842 /** Whitespace preserved. See {@link #getWhiteSpaceRule}. */ 843 public static final int WS_PRESERVE = 1; 844 /** Whitespace replaced by ordinary space. See {@link #getWhiteSpaceRule}. */ 845 public static final int WS_REPLACE = 2; 846 /** Whitespace collapsed and trimmed. See {@link #getWhiteSpaceRule}. */ 847 public static final int WS_COLLAPSE = 3; 848 849 /** 850 * Creates an immutable simple type value that does not reside in a tree. 851 */ 852 public abstract XmlAnySimpleType newValue(Object v); 853 854 855 /** 856 * Used to allow on-demand loading of types. 857 * 858 * @exclude 859 */ 860 public final static class Ref extends SchemaComponent.Ref 861 { 862 public Ref(SchemaType type) 863 { super(type); } 864 865 public Ref(SchemaTypeSystem system, String handle) 866 { super(system, handle); } 867 868 public final int getComponentType() 869 { return SchemaComponent.TYPE; } 870 871 public final SchemaType get() 872 { return (SchemaType)getComponent(); } 873 } 874 875 /** 876 * Retruns a SchemaType.Ref pointing to this schema type itself. 877 */ 878 public Ref getRef(); 879 880 /** 881 * Returns a QNameSet of elements that may exist in wildcard 882 * buchets and are not explicitly defined in this schema type. 883 * Note: In this example: 884 * <xs:complexType name="exampleType"> 885 * <xs:sequence> 886 * <xs:element name="someElement" type='xs:string' /> 887 * <xs:any namespace="##targetNamespace" /> 888 * </xs:sequence> 889 * </xs:complexType> 890 * the returned QNameSet will not contain the qname of 'someElement'. 891 * @return the constructed QNameSet 892 */ 893 public QNameSet qnameSetForWildcardElements(); 894 895 /** 896 * Returns a QNameSet of attributes that may exist in wildcard 897 * buchets and are not explicitly defined in this schema type. 898 * Note: In this example: 899 * <xs:complexType name="exampleType"> 900 * ... 901 * <xs:attribute name='someAttribute' type='xs:string' /> 902 * <xs:anyAttribute namespace="##targetNamespace" /> 903 * </xs:complexType> 904 * the returned QNameSet will not contain the qname of 'someAttribute'. 905 * @return the constructed QNameSet 906 */ 907 public QNameSet qnameSetForWildcardAttributes(); 908 }