1 /* 2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. 3 */ 4 /* 5 * Licensed to the Apache Software Foundation (ASF) under one or more 6 * contributor license agreements. See the NOTICE file distributed with 7 * this work for additional information regarding copyright ownership. 8 * The ASF licenses this file to You under the Apache License, Version 2.0 9 * (the "License"); you may not use this file except in compliance with 10 * the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 */ 20 21 package com.sun.org.apache.xerces.internal.impl.xs; 22 23 import com.sun.org.apache.xerces.internal.impl.Constants; 24 import com.sun.org.apache.xerces.internal.impl.dv.SchemaDVFactory; 25 import com.sun.org.apache.xerces.internal.impl.dv.ValidatedInfo; 26 import com.sun.org.apache.xerces.internal.impl.dv.XSSimpleType; 27 import com.sun.org.apache.xerces.internal.impl.dv.xs.XSSimpleTypeDecl; 28 import com.sun.org.apache.xerces.internal.impl.xs.identity.IdentityConstraint; 29 import com.sun.org.apache.xerces.internal.impl.xs.util.ObjectListImpl; 30 import com.sun.org.apache.xerces.internal.impl.xs.util.SimpleLocator; 31 import com.sun.org.apache.xerces.internal.impl.xs.util.StringListImpl; 32 import com.sun.org.apache.xerces.internal.impl.xs.util.XSNamedMap4Types; 33 import com.sun.org.apache.xerces.internal.impl.xs.util.XSNamedMapImpl; 34 import com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl; 35 import com.sun.org.apache.xerces.internal.parsers.DOMParser; 36 import com.sun.org.apache.xerces.internal.parsers.SAXParser; 37 import com.sun.org.apache.xerces.internal.parsers.XML11Configuration; 38 import com.sun.org.apache.xerces.internal.util.SymbolHash; 39 import com.sun.org.apache.xerces.internal.util.SymbolTable; 40 import com.sun.org.apache.xerces.internal.xni.NamespaceContext; 41 import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarDescription; 42 import com.sun.org.apache.xerces.internal.xni.grammars.XSGrammar; 43 import com.sun.org.apache.xerces.internal.xs.StringList; 44 import com.sun.org.apache.xerces.internal.xs.XSAnnotation; 45 import com.sun.org.apache.xerces.internal.xs.XSAttributeDeclaration; 46 import com.sun.org.apache.xerces.internal.xs.XSAttributeGroupDefinition; 47 import com.sun.org.apache.xerces.internal.xs.XSConstants; 48 import com.sun.org.apache.xerces.internal.xs.XSElementDeclaration; 49 import com.sun.org.apache.xerces.internal.xs.XSIDCDefinition; 50 import com.sun.org.apache.xerces.internal.xs.XSModel; 51 import com.sun.org.apache.xerces.internal.xs.XSModelGroupDefinition; 52 import com.sun.org.apache.xerces.internal.xs.XSNamedMap; 53 import com.sun.org.apache.xerces.internal.xs.XSNamespaceItem; 54 import com.sun.org.apache.xerces.internal.xs.XSNotationDeclaration; 55 import com.sun.org.apache.xerces.internal.xs.XSObjectList; 56 import com.sun.org.apache.xerces.internal.xs.XSParticle; 57 import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition; 58 import com.sun.org.apache.xerces.internal.xs.XSWildcard; 59 import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList; 60 import java.lang.ref.SoftReference; 61 import java.util.ArrayList; 62 import java.util.List; 63 import java.util.concurrent.CopyOnWriteArrayList; 64 import org.xml.sax.SAXException; 65 66 /** 67 * This class is to hold all schema component declaration that are declared 68 * within one namespace. 69 * 70 * The Grammar class this class extends contains what little 71 * commonality there is between XML Schema and DTD grammars. It's 72 * useful to distinguish grammar objects from other kinds of object 73 * when they exist in pools or caches. 74 * 75 * @xerces.internal 76 * 77 * @author Sandy Gao, IBM 78 * @author Elena Litani, IBM 79 * 80 * @LastModified: Oct 2017 81 */ 82 83 public class SchemaGrammar implements XSGrammar, XSNamespaceItem { 84 85 // the target namespace of grammar 86 String fTargetNamespace; 87 88 // global decls: map from decl name to decl object 89 SymbolHash fGlobalAttrDecls; 90 SymbolHash fGlobalAttrGrpDecls; 91 SymbolHash fGlobalElemDecls; 92 SymbolHash fGlobalGroupDecls; 93 SymbolHash fGlobalNotationDecls; 94 SymbolHash fGlobalIDConstraintDecls; 95 SymbolHash fGlobalTypeDecls; 96 97 // extended global decls: map from schema location + decl name to decl object 98 // key is location,name 99 SymbolHash fGlobalAttrDeclsExt; 100 SymbolHash fGlobalAttrGrpDeclsExt; 101 SymbolHash fGlobalElemDeclsExt; 102 SymbolHash fGlobalGroupDeclsExt; 103 SymbolHash fGlobalNotationDeclsExt; 104 SymbolHash fGlobalIDConstraintDeclsExt; 105 SymbolHash fGlobalTypeDeclsExt; 106 107 // A global map of all global element declarations - used for substitution group computation 108 // (handy when sharing components by reference, since we might end up with duplicate components 109 // that are not added to either of the global element declarations above) 110 SymbolHash fAllGlobalElemDecls; 111 112 // the XMLGrammarDescription member 113 XSDDescription fGrammarDescription = null; 114 115 // annotations associated with the "root" schema of this targetNamespace 116 XSAnnotationImpl [] fAnnotations = null; 117 118 // number of annotations declared 119 int fNumAnnotations; 120 121 // symbol table for constructing parsers (annotation support) 122 private SymbolTable fSymbolTable = null; 123 // parsers for annotation support 124 private SoftReference<SAXParser> fSAXParser = null; 125 private SoftReference<DOMParser> fDOMParser = null; 126 127 // is this grammar immutable? (fully constructed and not changeable) 128 private boolean fIsImmutable = false; 129 130 // 131 // Constructors 132 // 133 134 // needed to make BuiltinSchemaGrammar work. 135 protected SchemaGrammar() {} 136 137 /** 138 * Default constructor. 139 * 140 * @param targetNamespace 141 * @param grammarDesc the XMLGrammarDescription corresponding to this object 142 * at the least a systemId should always be known. 143 * @param symbolTable needed for annotation support 144 */ 145 public SchemaGrammar(String targetNamespace, XSDDescription grammarDesc, 146 SymbolTable symbolTable) { 147 fTargetNamespace = targetNamespace; 148 fGrammarDescription = grammarDesc; 149 fSymbolTable = symbolTable; 150 151 // REVISIT: the initial sizes being chosen for each SymbolHash 152 // may not be ideal and could still be tuned. They were chosen 153 // somewhat arbitrarily to reduce the initial footprint of 154 // SymbolHash buckets from 1,515 to 177 (about 12% of the 155 // default size). 156 fGlobalAttrDecls = new SymbolHash(12); 157 fGlobalAttrGrpDecls = new SymbolHash(5); 158 fGlobalElemDecls = new SymbolHash(25); 159 fGlobalGroupDecls = new SymbolHash(5); 160 fGlobalNotationDecls = new SymbolHash(1); 161 fGlobalIDConstraintDecls = new SymbolHash(3); 162 163 // Extended tables 164 fGlobalAttrDeclsExt = new SymbolHash(12); 165 fGlobalAttrGrpDeclsExt = new SymbolHash(5); 166 fGlobalElemDeclsExt = new SymbolHash(25); 167 fGlobalGroupDeclsExt = new SymbolHash(5); 168 fGlobalNotationDeclsExt = new SymbolHash(1); 169 fGlobalIDConstraintDeclsExt = new SymbolHash(3); 170 fGlobalTypeDeclsExt = new SymbolHash(25); 171 172 // All global elements table 173 fAllGlobalElemDecls = new SymbolHash(25); 174 175 // if we are parsing S4S, put built-in types in first 176 // they might get overwritten by the types from S4S, but that's 177 // considered what the application wants to do. 178 if (fTargetNamespace == SchemaSymbols.URI_SCHEMAFORSCHEMA) { 179 fGlobalTypeDecls = SG_SchemaNS.fGlobalTypeDecls.makeClone(); 180 } 181 else { 182 fGlobalTypeDecls = new SymbolHash(25); 183 } 184 } // <init>(String, XSDDescription) 185 186 // Clone an existing schema grammar 187 public SchemaGrammar(SchemaGrammar grammar) { 188 fTargetNamespace = grammar.fTargetNamespace; 189 fGrammarDescription = grammar.fGrammarDescription.makeClone(); 190 //fGrammarDescription.fContextType |= XSDDescription.CONTEXT_COLLISION; // REVISIT 191 fSymbolTable = grammar.fSymbolTable; // REVISIT 192 193 fGlobalAttrDecls = grammar.fGlobalAttrDecls.makeClone(); 194 fGlobalAttrGrpDecls = grammar.fGlobalAttrGrpDecls.makeClone(); 195 fGlobalElemDecls = grammar.fGlobalElemDecls.makeClone(); 196 fGlobalGroupDecls = grammar.fGlobalGroupDecls.makeClone(); 197 fGlobalNotationDecls = grammar.fGlobalNotationDecls.makeClone(); 198 fGlobalIDConstraintDecls = grammar.fGlobalIDConstraintDecls.makeClone(); 199 fGlobalTypeDecls = grammar.fGlobalTypeDecls.makeClone(); 200 201 // Extended tables 202 fGlobalAttrDeclsExt = grammar.fGlobalAttrDeclsExt.makeClone(); 203 fGlobalAttrGrpDeclsExt = grammar.fGlobalAttrGrpDeclsExt.makeClone(); 204 fGlobalElemDeclsExt = grammar.fGlobalElemDeclsExt.makeClone(); 205 fGlobalGroupDeclsExt = grammar.fGlobalGroupDeclsExt.makeClone(); 206 fGlobalNotationDeclsExt = grammar.fGlobalNotationDeclsExt.makeClone(); 207 fGlobalIDConstraintDeclsExt = grammar.fGlobalIDConstraintDeclsExt.makeClone(); 208 fGlobalTypeDeclsExt = grammar.fGlobalTypeDeclsExt.makeClone(); 209 210 // All global elements table 211 fAllGlobalElemDecls = grammar.fAllGlobalElemDecls.makeClone(); 212 213 // Annotations associated with the "root" schema of this targetNamespace 214 fNumAnnotations = grammar.fNumAnnotations; 215 if (fNumAnnotations > 0) { 216 fAnnotations = new XSAnnotationImpl[grammar.fAnnotations.length]; 217 System.arraycopy(grammar.fAnnotations, 0, fAnnotations, 0, fNumAnnotations); 218 } 219 220 // All substitution group information declared in this namespace 221 fSubGroupCount = grammar.fSubGroupCount; 222 if (fSubGroupCount > 0) { 223 fSubGroups = new XSElementDecl[grammar.fSubGroups.length]; 224 System.arraycopy(grammar.fSubGroups, 0, fSubGroups, 0, fSubGroupCount); 225 } 226 227 // Array to store complex type decls for constraint checking 228 fCTCount = grammar.fCTCount; 229 if (fCTCount > 0) { 230 fComplexTypeDecls = new XSComplexTypeDecl[grammar.fComplexTypeDecls.length]; 231 fCTLocators = new SimpleLocator[grammar.fCTLocators.length]; 232 System.arraycopy(grammar.fComplexTypeDecls, 0, fComplexTypeDecls, 0, fCTCount); 233 System.arraycopy(grammar.fCTLocators, 0, fCTLocators, 0, fCTCount); 234 } 235 236 // Groups being redefined by restriction 237 fRGCount = grammar.fRGCount; 238 if (fRGCount > 0) { 239 fRedefinedGroupDecls = new XSGroupDecl[grammar.fRedefinedGroupDecls.length]; 240 fRGLocators = new SimpleLocator[grammar.fRGLocators.length]; 241 System.arraycopy(grammar.fRedefinedGroupDecls, 0, fRedefinedGroupDecls, 0, fRGCount); 242 System.arraycopy(grammar.fRGLocators, 0, fRGLocators, 0, fRGCount/2); 243 } 244 245 // List of imported grammars 246 if (grammar.fImported != null) { 247 fImported = new ArrayList<>(); 248 for (int i=0; i<grammar.fImported.size(); i++) { 249 fImported.add(grammar.fImported.get(i)); 250 } 251 } 252 253 // Locations 254 if (grammar.fLocations != null) { 255 for (int k=0; k<grammar.fLocations.size(); k++) { 256 addDocument(null, grammar.fLocations.get(k)); 257 } 258 } 259 260 } // <init>(String, XSDDescription) 261 262 // number of built-in XSTypes we need to create for base and full 263 // datatype set 264 private static final int BASICSET_COUNT = 29; 265 private static final int FULLSET_COUNT = 46; 266 267 private static final int GRAMMAR_XS = 1; 268 private static final int GRAMMAR_XSI = 2; 269 270 // this class makes sure the static, built-in schema grammars 271 // are immutable. 272 public static class BuiltinSchemaGrammar extends SchemaGrammar { 273 274 private static final String EXTENDED_SCHEMA_FACTORY_CLASS = "com.sun.org.apache.xerces.internal.impl.dv.xs.ExtendedSchemaDVFactoryImpl"; 275 276 /** 277 * Special constructor to create the grammars for the schema namespaces 278 * 279 * @param grammar 280 */ 281 public BuiltinSchemaGrammar(int grammar, short schemaVersion) { 282 SchemaDVFactory schemaFactory; 283 if (schemaVersion == Constants.SCHEMA_VERSION_1_0) { 284 schemaFactory = SchemaDVFactory.getInstance(); 285 } 286 else { 287 schemaFactory = SchemaDVFactory.getInstance(EXTENDED_SCHEMA_FACTORY_CLASS); 288 } 289 290 if (grammar == GRAMMAR_XS) { 291 // target namespace 292 fTargetNamespace = SchemaSymbols.URI_SCHEMAFORSCHEMA; 293 294 // grammar description 295 fGrammarDescription = new XSDDescription(); 296 fGrammarDescription.fContextType = XSDDescription.CONTEXT_PREPARSE; 297 fGrammarDescription.setNamespace(SchemaSymbols.URI_SCHEMAFORSCHEMA); 298 299 // no global decls other than types 300 fGlobalAttrDecls = new SymbolHash(1); 301 fGlobalAttrGrpDecls = new SymbolHash(1); 302 fGlobalElemDecls = new SymbolHash(1); 303 fGlobalGroupDecls = new SymbolHash(1); 304 fGlobalNotationDecls = new SymbolHash(1); 305 fGlobalIDConstraintDecls = new SymbolHash(1); 306 307 // no extended global decls 308 fGlobalAttrDeclsExt = new SymbolHash(1); 309 fGlobalAttrGrpDeclsExt = new SymbolHash(1); 310 fGlobalElemDeclsExt = new SymbolHash(1); 311 fGlobalGroupDeclsExt = new SymbolHash(1); 312 fGlobalNotationDeclsExt = new SymbolHash(1); 313 fGlobalIDConstraintDeclsExt = new SymbolHash(1); 314 fGlobalTypeDeclsExt = new SymbolHash(1); 315 316 // all global element decls table 317 fAllGlobalElemDecls = new SymbolHash(1); 318 319 // get all built-in types 320 fGlobalTypeDecls = schemaFactory.getBuiltInTypes(); 321 322 // assign the built-in schema grammar as the XSNamespaceItem 323 // for each of the built-in simple type definitions. 324 int length = fGlobalTypeDecls.getLength(); 325 XSTypeDefinition [] typeDefinitions = new XSTypeDefinition[length]; 326 fGlobalTypeDecls.getValues(typeDefinitions, 0); 327 for (int i = 0; i < length; ++i) { 328 XSTypeDefinition xtd = typeDefinitions[i]; 329 if (xtd instanceof XSSimpleTypeDecl) { 330 ((XSSimpleTypeDecl) xtd).setNamespaceItem(this); 331 } 332 } 333 334 // add anyType 335 fGlobalTypeDecls.put(fAnyType.getName(), fAnyType); 336 } 337 else if (grammar == GRAMMAR_XSI) { 338 // target namespace 339 fTargetNamespace = SchemaSymbols.URI_XSI; 340 // grammar description 341 fGrammarDescription = new XSDDescription(); 342 fGrammarDescription.fContextType = XSDDescription.CONTEXT_PREPARSE; 343 fGrammarDescription.setNamespace(SchemaSymbols.URI_XSI); 344 345 // no global decls other than attributes 346 fGlobalAttrGrpDecls = new SymbolHash(1); 347 fGlobalElemDecls = new SymbolHash(1); 348 fGlobalGroupDecls = new SymbolHash(1); 349 fGlobalNotationDecls = new SymbolHash(1); 350 fGlobalIDConstraintDecls = new SymbolHash(1); 351 fGlobalTypeDecls = new SymbolHash(1); 352 353 // no extended global decls 354 fGlobalAttrDeclsExt = new SymbolHash(1); 355 fGlobalAttrGrpDeclsExt = new SymbolHash(1); 356 fGlobalElemDeclsExt = new SymbolHash(1); 357 fGlobalGroupDeclsExt = new SymbolHash(1); 358 fGlobalNotationDeclsExt = new SymbolHash(1); 359 fGlobalIDConstraintDeclsExt = new SymbolHash(1); 360 fGlobalTypeDeclsExt = new SymbolHash(1); 361 362 // no all global element decls 363 fAllGlobalElemDecls = new SymbolHash(1); 364 365 // 4 attributes, so initialize the size as 4*2 = 8 366 fGlobalAttrDecls = new SymbolHash(8); 367 String name = null; 368 String tns = null; 369 XSSimpleType type = null; 370 short scope = XSConstants.SCOPE_GLOBAL; 371 372 // xsi:type 373 name = SchemaSymbols.XSI_TYPE; 374 tns = SchemaSymbols.URI_XSI; 375 type = schemaFactory.getBuiltInType(SchemaSymbols.ATTVAL_QNAME); 376 fGlobalAttrDecls.put(name, new BuiltinAttrDecl(name, tns, type, scope)); 377 378 // xsi:nil 379 name = SchemaSymbols.XSI_NIL; 380 tns = SchemaSymbols.URI_XSI; 381 type = schemaFactory.getBuiltInType(SchemaSymbols.ATTVAL_BOOLEAN); 382 fGlobalAttrDecls.put(name, new BuiltinAttrDecl(name, tns, type, scope)); 383 384 XSSimpleType anyURI = schemaFactory.getBuiltInType(SchemaSymbols.ATTVAL_ANYURI); 385 386 // xsi:schemaLocation 387 name = SchemaSymbols.XSI_SCHEMALOCATION; 388 tns = SchemaSymbols.URI_XSI; 389 type = schemaFactory.createTypeList("#AnonType_schemaLocation", SchemaSymbols.URI_XSI, (short)0, anyURI, null); 390 if (type instanceof XSSimpleTypeDecl) { 391 ((XSSimpleTypeDecl)type).setAnonymous(true); 392 } 393 fGlobalAttrDecls.put(name, new BuiltinAttrDecl(name, tns, type, scope)); 394 395 // xsi:noNamespaceSchemaLocation 396 name = SchemaSymbols.XSI_NONAMESPACESCHEMALOCATION; 397 tns = SchemaSymbols.URI_XSI; 398 type = anyURI; 399 fGlobalAttrDecls.put(name, new BuiltinAttrDecl(name, tns, type, scope)); 400 } 401 } // <init>(int) 402 403 // return the XMLGrammarDescription corresponding to this 404 // object 405 public XMLGrammarDescription getGrammarDescription() { 406 return fGrammarDescription.makeClone(); 407 } // getGrammarDescription(): XMLGrammarDescription 408 409 // override these methods solely so that these 410 // objects cannot be modified once they're created. 411 public void setImportedGrammars(List<SchemaGrammar> importedGrammars) { 412 // ignore 413 } 414 public void addGlobalAttributeDecl(XSAttributeDecl decl) { 415 // ignore 416 } 417 public void addGlobalAttributeDecl(XSAttributeDecl decl, String location) { 418 // ignore 419 } 420 public void addGlobalAttributeGroupDecl(XSAttributeGroupDecl decl) { 421 // ignore 422 } 423 public void addGlobalAttributeGroupDecl(XSAttributeGroupDecl decl, String location) { 424 // ignore 425 } 426 public void addGlobalElementDecl(XSElementDecl decl) { 427 // ignore 428 } 429 public void addGlobalElementDecl(XSElementDecl decl, String location) { 430 // ignore 431 } 432 public void addGlobalElementDeclAll(XSElementDecl decl) { 433 // ignore 434 } 435 public void addGlobalGroupDecl(XSGroupDecl decl) { 436 // ignore 437 } 438 public void addGlobalGroupDecl(XSGroupDecl decl, String location) { 439 // ignore 440 } 441 public void addGlobalNotationDecl(XSNotationDecl decl) { 442 // ignore 443 } 444 public void addGlobalNotationDecl(XSNotationDecl decl, String location) { 445 // ignore 446 } 447 public void addGlobalTypeDecl(XSTypeDefinition decl) { 448 // ignore 449 } 450 public void addGlobalTypeDecl(XSTypeDefinition decl, String location) { 451 // ignore 452 } 453 public void addGlobalComplexTypeDecl(XSComplexTypeDecl decl) { 454 // ignore 455 } 456 public void addGlobalComplexTypeDecl(XSComplexTypeDecl decl, String location) { 457 // ignore 458 } 459 public void addGlobalSimpleTypeDecl(XSSimpleType decl) { 460 // ignore 461 } 462 public void addGlobalSimpleTypeDecl(XSSimpleType decl, String location) { 463 // ignore 464 } 465 public void addComplexTypeDecl(XSComplexTypeDecl decl, SimpleLocator locator) { 466 // ignore 467 } 468 public void addRedefinedGroupDecl(XSGroupDecl derived, XSGroupDecl base, SimpleLocator locator) { 469 // ignore 470 } 471 public synchronized void addDocument(Object document, String location) { 472 // ignore 473 } 474 475 // annotation support 476 synchronized DOMParser getDOMParser() { 477 return null; 478 } 479 synchronized SAXParser getSAXParser() { 480 return null; 481 } 482 } 483 484 /** 485 * <p>A partial schema for schemas for validating annotations.</p> 486 * 487 * @xerces.internal 488 * 489 * @author Michael Glavassevich, IBM 490 */ 491 public static final class Schema4Annotations extends SchemaGrammar { 492 493 /** 494 * Singleton instance. 495 */ 496 public static final Schema4Annotations INSTANCE = new Schema4Annotations(); 497 498 /** 499 * Special constructor to create a schema 500 * capable of validating annotations. 501 */ 502 private Schema4Annotations() { 503 504 // target namespace 505 fTargetNamespace = SchemaSymbols.URI_SCHEMAFORSCHEMA; 506 507 // grammar description 508 fGrammarDescription = new XSDDescription(); 509 fGrammarDescription.fContextType = XSDDescription.CONTEXT_PREPARSE; 510 fGrammarDescription.setNamespace(SchemaSymbols.URI_SCHEMAFORSCHEMA); 511 512 // no global decls other than types and 513 // element declarations for <annotation>, <documentation> and <appinfo>. 514 fGlobalAttrDecls = new SymbolHash(1); 515 fGlobalAttrGrpDecls = new SymbolHash(1); 516 fGlobalElemDecls = new SymbolHash(6); 517 fGlobalGroupDecls = new SymbolHash(1); 518 fGlobalNotationDecls = new SymbolHash(1); 519 fGlobalIDConstraintDecls = new SymbolHash(1); 520 521 // no extended global decls 522 fGlobalAttrDeclsExt = new SymbolHash(1); 523 fGlobalAttrGrpDeclsExt = new SymbolHash(1); 524 fGlobalElemDeclsExt = new SymbolHash(6); 525 fGlobalGroupDeclsExt = new SymbolHash(1); 526 fGlobalNotationDeclsExt = new SymbolHash(1); 527 fGlobalIDConstraintDeclsExt = new SymbolHash(1); 528 fGlobalTypeDeclsExt = new SymbolHash(1); 529 530 // all global element declarations 531 fAllGlobalElemDecls = new SymbolHash(6); 532 533 // get all built-in types 534 fGlobalTypeDecls = SG_SchemaNS.fGlobalTypeDecls; 535 536 // create element declarations for <annotation>, <documentation> and <appinfo> 537 XSElementDecl annotationDecl = createAnnotationElementDecl(SchemaSymbols.ELT_ANNOTATION); 538 XSElementDecl documentationDecl = createAnnotationElementDecl(SchemaSymbols.ELT_DOCUMENTATION); 539 XSElementDecl appinfoDecl = createAnnotationElementDecl(SchemaSymbols.ELT_APPINFO); 540 541 // add global element declarations 542 fGlobalElemDecls.put(annotationDecl.fName, annotationDecl); 543 fGlobalElemDecls.put(documentationDecl.fName, documentationDecl); 544 fGlobalElemDecls.put(appinfoDecl.fName, appinfoDecl); 545 546 fGlobalElemDeclsExt.put(","+annotationDecl.fName, annotationDecl); 547 fGlobalElemDeclsExt.put(","+documentationDecl.fName, documentationDecl); 548 fGlobalElemDeclsExt.put(","+appinfoDecl.fName, appinfoDecl); 549 550 fAllGlobalElemDecls.put(annotationDecl, annotationDecl); 551 fAllGlobalElemDecls.put(documentationDecl, documentationDecl); 552 fAllGlobalElemDecls.put(appinfoDecl, appinfoDecl); 553 554 // create complex type declarations for <annotation>, <documentation> and <appinfo> 555 XSComplexTypeDecl annotationType = new XSComplexTypeDecl(); 556 XSComplexTypeDecl documentationType = new XSComplexTypeDecl(); 557 XSComplexTypeDecl appinfoType = new XSComplexTypeDecl(); 558 559 // set the types on their element declarations 560 annotationDecl.fType = annotationType; 561 documentationDecl.fType = documentationType; 562 appinfoDecl.fType = appinfoType; 563 564 // create attribute groups for <annotation>, <documentation> and <appinfo> 565 XSAttributeGroupDecl annotationAttrs = new XSAttributeGroupDecl(); 566 XSAttributeGroupDecl documentationAttrs = new XSAttributeGroupDecl(); 567 XSAttributeGroupDecl appinfoAttrs = new XSAttributeGroupDecl(); 568 569 // fill in attribute groups 570 { 571 // create and fill attribute uses for <annotation>, <documentation> and <appinfo> 572 XSAttributeUseImpl annotationIDAttr = new XSAttributeUseImpl(); 573 annotationIDAttr.fAttrDecl = new XSAttributeDecl(); 574 annotationIDAttr.fAttrDecl.setValues(SchemaSymbols.ATT_ID, null, (XSSimpleType) fGlobalTypeDecls.get(SchemaSymbols.ATTVAL_ID), 575 XSConstants.VC_NONE, XSConstants.SCOPE_LOCAL, null, annotationType, null); 576 annotationIDAttr.fUse = SchemaSymbols.USE_OPTIONAL; 577 annotationIDAttr.fConstraintType = XSConstants.VC_NONE; 578 579 XSAttributeUseImpl documentationSourceAttr = new XSAttributeUseImpl(); 580 documentationSourceAttr.fAttrDecl = new XSAttributeDecl(); 581 documentationSourceAttr.fAttrDecl.setValues(SchemaSymbols.ATT_SOURCE, null, (XSSimpleType) fGlobalTypeDecls.get(SchemaSymbols.ATTVAL_ANYURI), 582 XSConstants.VC_NONE, XSConstants.SCOPE_LOCAL, null, documentationType, null); 583 documentationSourceAttr.fUse = SchemaSymbols.USE_OPTIONAL; 584 documentationSourceAttr.fConstraintType = XSConstants.VC_NONE; 585 586 XSAttributeUseImpl documentationLangAttr = new XSAttributeUseImpl(); 587 documentationLangAttr.fAttrDecl = new XSAttributeDecl(); 588 documentationLangAttr.fAttrDecl.setValues("lang".intern(), NamespaceContext.XML_URI, (XSSimpleType) fGlobalTypeDecls.get(SchemaSymbols.ATTVAL_LANGUAGE), 589 XSConstants.VC_NONE, XSConstants.SCOPE_LOCAL, null, documentationType, null); 590 documentationLangAttr.fUse = SchemaSymbols.USE_OPTIONAL; 591 documentationLangAttr.fConstraintType = XSConstants.VC_NONE; 592 593 XSAttributeUseImpl appinfoSourceAttr = new XSAttributeUseImpl(); 594 appinfoSourceAttr.fAttrDecl = new XSAttributeDecl(); 595 appinfoSourceAttr.fAttrDecl.setValues(SchemaSymbols.ATT_SOURCE, null, (XSSimpleType) fGlobalTypeDecls.get(SchemaSymbols.ATTVAL_ANYURI), 596 XSConstants.VC_NONE, XSConstants.SCOPE_LOCAL, null, appinfoType, null); 597 appinfoSourceAttr.fUse = SchemaSymbols.USE_OPTIONAL; 598 appinfoSourceAttr.fConstraintType = XSConstants.VC_NONE; 599 600 // create lax attribute wildcard for <annotation>, <documentation> and <appinfo> 601 XSWildcardDecl otherAttrs = new XSWildcardDecl(); 602 otherAttrs.fNamespaceList = new String [] {fTargetNamespace, null}; 603 otherAttrs.fType = XSWildcard.NSCONSTRAINT_NOT; 604 otherAttrs.fProcessContents = XSWildcard.PC_LAX; 605 606 // add attribute uses and wildcards to attribute groups for <annotation>, <documentation> and <appinfo> 607 annotationAttrs.addAttributeUse(annotationIDAttr); 608 annotationAttrs.fAttributeWC = otherAttrs; 609 610 documentationAttrs.addAttributeUse(documentationSourceAttr); 611 documentationAttrs.addAttributeUse(documentationLangAttr); 612 documentationAttrs.fAttributeWC = otherAttrs; 613 614 appinfoAttrs.addAttributeUse(appinfoSourceAttr); 615 appinfoAttrs.fAttributeWC = otherAttrs; 616 } 617 618 // create particles for <annotation> 619 XSParticleDecl annotationParticle = createUnboundedModelGroupParticle(); 620 { 621 XSModelGroupImpl annotationChoice = new XSModelGroupImpl(); 622 annotationChoice.fCompositor = XSModelGroupImpl.MODELGROUP_CHOICE; 623 annotationChoice.fParticleCount = 2; 624 annotationChoice.fParticles = new XSParticleDecl[2]; 625 annotationChoice.fParticles[0] = createChoiceElementParticle(appinfoDecl); 626 annotationChoice.fParticles[1] = createChoiceElementParticle(documentationDecl); 627 annotationParticle.fValue = annotationChoice; 628 } 629 630 // create wildcard particle for <documentation> and <appinfo> 631 XSParticleDecl anyWCSequenceParticle = createUnboundedAnyWildcardSequenceParticle(); 632 633 // fill complex types 634 annotationType.setValues("#AnonType_" + SchemaSymbols.ELT_ANNOTATION, fTargetNamespace, SchemaGrammar.fAnyType, 635 XSConstants.DERIVATION_RESTRICTION, XSConstants.DERIVATION_NONE, (short) (XSConstants.DERIVATION_EXTENSION | XSConstants.DERIVATION_RESTRICTION), 636 XSComplexTypeDecl.CONTENTTYPE_ELEMENT, false, annotationAttrs, null, annotationParticle, XSObjectListImpl.EMPTY_LIST); 637 annotationType.setName("#AnonType_" + SchemaSymbols.ELT_ANNOTATION); 638 annotationType.setIsAnonymous(); 639 640 documentationType.setValues("#AnonType_" + SchemaSymbols.ELT_DOCUMENTATION, fTargetNamespace, SchemaGrammar.fAnyType, 641 XSConstants.DERIVATION_RESTRICTION, XSConstants.DERIVATION_NONE, (short) (XSConstants.DERIVATION_EXTENSION | XSConstants.DERIVATION_RESTRICTION), 642 XSComplexTypeDecl.CONTENTTYPE_MIXED, false, documentationAttrs, null, anyWCSequenceParticle, XSObjectListImpl.EMPTY_LIST); 643 documentationType.setName("#AnonType_" + SchemaSymbols.ELT_DOCUMENTATION); 644 documentationType.setIsAnonymous(); 645 646 appinfoType.setValues("#AnonType_" + SchemaSymbols.ELT_APPINFO, fTargetNamespace, SchemaGrammar.fAnyType, 647 XSConstants.DERIVATION_RESTRICTION, XSConstants.DERIVATION_NONE, (short) (XSConstants.DERIVATION_EXTENSION | XSConstants.DERIVATION_RESTRICTION), 648 XSComplexTypeDecl.CONTENTTYPE_MIXED, false, appinfoAttrs, null, anyWCSequenceParticle, XSObjectListImpl.EMPTY_LIST); 649 appinfoType.setName("#AnonType_" + SchemaSymbols.ELT_APPINFO); 650 appinfoType.setIsAnonymous(); 651 652 } // <init>(int) 653 654 // return the XMLGrammarDescription corresponding to this 655 // object 656 public XMLGrammarDescription getGrammarDescription() { 657 return fGrammarDescription.makeClone(); 658 } // getGrammarDescription(): XMLGrammarDescription 659 660 // override these methods solely so that these 661 // objects cannot be modified once they're created. 662 public void setImportedGrammars(List<SchemaGrammar> importedGrammars) { 663 // ignore 664 } 665 public void addGlobalAttributeDecl(XSAttributeDecl decl) { 666 // ignore 667 } 668 public void addGlobalAttributeDecl(XSAttributeGroupDecl decl, String location) { 669 // ignore 670 } 671 public void addGlobalAttributeGroupDecl(XSAttributeGroupDecl decl) { 672 // ignore 673 } 674 public void addGlobalAttributeGroupDecl(XSAttributeGroupDecl decl, String location) { 675 // ignore 676 } 677 public void addGlobalElementDecl(XSElementDecl decl) { 678 // ignore 679 } 680 public void addGlobalElementDecl(XSElementDecl decl, String location) { 681 // ignore 682 } 683 public void addGlobalElementDeclAll(XSElementDecl decl) { 684 // ignore 685 } 686 public void addGlobalGroupDecl(XSGroupDecl decl) { 687 // ignore 688 } 689 public void addGlobalGroupDecl(XSGroupDecl decl, String location) { 690 // ignore 691 } 692 public void addGlobalNotationDecl(XSNotationDecl decl) { 693 // ignore 694 } 695 public void addGlobalNotationDecl(XSNotationDecl decl, String location) { 696 // ignore 697 } 698 public void addGlobalTypeDecl(XSTypeDefinition decl) { 699 // ignore 700 } 701 public void addGlobalTypeDecl(XSTypeDefinition decl, String location) { 702 // ignore 703 } 704 public void addGlobalComplexTypeDecl(XSComplexTypeDecl decl) { 705 // ignore 706 } 707 public void addGlobalComplexTypeDecl(XSComplexTypeDecl decl, String location) { 708 // ignore 709 } 710 public void addGlobalSimpleTypeDecl(XSSimpleType decl) { 711 // ignore 712 } 713 public void addGlobalSimpleTypeDecl(XSSimpleType decl, String location) { 714 // ignore 715 } 716 public void addComplexTypeDecl(XSComplexTypeDecl decl, SimpleLocator locator) { 717 // ignore 718 } 719 public void addRedefinedGroupDecl(XSGroupDecl derived, XSGroupDecl base, SimpleLocator locator) { 720 // ignore 721 } 722 public synchronized void addDocument(Object document, String location) { 723 // ignore 724 } 725 726 // annotation support 727 synchronized DOMParser getDOMParser() { 728 return null; 729 } 730 synchronized SAXParser getSAXParser() { 731 return null; 732 } 733 734 // 735 // private helper methods 736 // 737 738 private XSElementDecl createAnnotationElementDecl(String localName) { 739 XSElementDecl eDecl = new XSElementDecl(); 740 eDecl.fName = localName; 741 eDecl.fTargetNamespace = fTargetNamespace; 742 eDecl.setIsGlobal(); 743 eDecl.fBlock = (XSConstants.DERIVATION_EXTENSION | 744 XSConstants.DERIVATION_RESTRICTION | XSConstants.DERIVATION_SUBSTITUTION); 745 eDecl.setConstraintType(XSConstants.VC_NONE); 746 return eDecl; 747 } 748 749 private XSParticleDecl createUnboundedModelGroupParticle() { 750 XSParticleDecl particle = new XSParticleDecl(); 751 particle.fMinOccurs = 0; 752 particle.fMaxOccurs = SchemaSymbols.OCCURRENCE_UNBOUNDED; 753 particle.fType = XSParticleDecl.PARTICLE_MODELGROUP; 754 return particle; 755 } 756 757 private XSParticleDecl createChoiceElementParticle(XSElementDecl ref) { 758 XSParticleDecl particle = new XSParticleDecl(); 759 particle.fMinOccurs = 1; 760 particle.fMaxOccurs = 1; 761 particle.fType = XSParticleDecl.PARTICLE_ELEMENT; 762 particle.fValue = ref; 763 return particle; 764 } 765 766 private XSParticleDecl createUnboundedAnyWildcardSequenceParticle() { 767 XSParticleDecl particle = createUnboundedModelGroupParticle(); 768 XSModelGroupImpl sequence = new XSModelGroupImpl(); 769 sequence.fCompositor = XSModelGroupImpl.MODELGROUP_SEQUENCE; 770 sequence.fParticleCount = 1; 771 sequence.fParticles = new XSParticleDecl[1]; 772 sequence.fParticles[0] = createAnyLaxWildcardParticle(); 773 particle.fValue = sequence; 774 return particle; 775 } 776 777 private XSParticleDecl createAnyLaxWildcardParticle() { 778 XSParticleDecl particle = new XSParticleDecl(); 779 particle.fMinOccurs = 1; 780 particle.fMaxOccurs = 1; 781 particle.fType = XSParticleDecl.PARTICLE_WILDCARD; 782 783 XSWildcardDecl anyWC = new XSWildcardDecl(); 784 anyWC.fNamespaceList = null; 785 anyWC.fType = XSWildcard.NSCONSTRAINT_ANY; 786 anyWC.fProcessContents = XSWildcard.PC_LAX; 787 788 particle.fValue = anyWC; 789 return particle; 790 } 791 } 792 793 // Grammar methods 794 795 // return the XMLGrammarDescription corresponding to this 796 // object 797 public XMLGrammarDescription getGrammarDescription() { 798 return fGrammarDescription; 799 } // getGrammarDescription(): XMLGrammarDescription 800 801 // DTDGrammar methods 802 public boolean isNamespaceAware () { 803 return true; 804 } // isNamespaceAware():boolean 805 806 List<SchemaGrammar> fImported = null; 807 808 public void setImportedGrammars(List<SchemaGrammar> importedGrammars) { 809 fImported = importedGrammars; 810 } 811 812 public List<SchemaGrammar> getImportedGrammars() { 813 return fImported; 814 } 815 816 /** 817 * Returns this grammar's target namespace. 818 */ 819 public final String getTargetNamespace() { 820 return fTargetNamespace; 821 } // getTargetNamespace():String 822 823 /** 824 * register one global attribute 825 */ 826 public void addGlobalAttributeDecl(XSAttributeDecl decl) { 827 fGlobalAttrDecls.put(decl.fName, decl); 828 decl.setNamespaceItem(this); 829 } 830 831 public void addGlobalAttributeDecl(XSAttributeDecl decl, String location) { 832 fGlobalAttrDeclsExt.put(((location!=null) ? location : "") + "," + decl.fName, decl); 833 if (decl.getNamespaceItem() == null) { 834 decl.setNamespaceItem(this); 835 } 836 } 837 838 /** 839 * register one global attribute group 840 */ 841 public void addGlobalAttributeGroupDecl(XSAttributeGroupDecl decl) { 842 fGlobalAttrGrpDecls.put(decl.fName, decl); 843 decl.setNamespaceItem(this); 844 } 845 846 public void addGlobalAttributeGroupDecl(XSAttributeGroupDecl decl, String location) { 847 fGlobalAttrGrpDeclsExt.put(((location!=null) ? location : "") + "," + decl.fName, decl); 848 if (decl.getNamespaceItem() == null) { 849 decl.setNamespaceItem(this); 850 } 851 } 852 853 /** 854 * register one global element 855 */ 856 public void addGlobalElementDeclAll(XSElementDecl decl) { 857 if (fAllGlobalElemDecls.get(decl) == null) { 858 fAllGlobalElemDecls.put(decl, decl); 859 // if there is a substitution group affiliation, store in an array, 860 // for further constraint checking: UPA, PD, EDC 861 if (decl.fSubGroup != null) { 862 if (fSubGroupCount == fSubGroups.length) 863 fSubGroups = resize(fSubGroups, fSubGroupCount+INC_SIZE); 864 fSubGroups[fSubGroupCount++] = decl; 865 } 866 } 867 } 868 869 public void addGlobalElementDecl(XSElementDecl decl) { 870 fGlobalElemDecls.put(decl.fName, decl); 871 decl.setNamespaceItem(this); 872 } 873 874 public void addGlobalElementDecl(XSElementDecl decl, String location) { 875 fGlobalElemDeclsExt.put(((location != null) ? location : "") + "," + decl.fName, decl); 876 if (decl.getNamespaceItem() == null) { 877 decl.setNamespaceItem(this); 878 } 879 } 880 881 /** 882 * register one global group 883 */ 884 public void addGlobalGroupDecl(XSGroupDecl decl) { 885 fGlobalGroupDecls.put(decl.fName, decl); 886 decl.setNamespaceItem(this); 887 } 888 889 public void addGlobalGroupDecl(XSGroupDecl decl, String location) { 890 fGlobalGroupDeclsExt.put(((location!=null) ? location : "") + "," + decl.fName, decl); 891 if (decl.getNamespaceItem() == null) { 892 decl.setNamespaceItem(this); 893 } 894 } 895 896 /** 897 * register one global notation 898 */ 899 public void addGlobalNotationDecl(XSNotationDecl decl) { 900 fGlobalNotationDecls.put(decl.fName, decl); 901 decl.setNamespaceItem(this); 902 } 903 904 public void addGlobalNotationDecl(XSNotationDecl decl, String location) { 905 fGlobalNotationDeclsExt.put(((location!=null) ? location : "") + "," +decl.fName, decl); 906 if (decl.getNamespaceItem() == null) { 907 decl.setNamespaceItem(this); 908 } 909 } 910 911 /** 912 * register one global type 913 */ 914 public void addGlobalTypeDecl(XSTypeDefinition decl) { 915 fGlobalTypeDecls.put(decl.getName(), decl); 916 if (decl instanceof XSComplexTypeDecl) { 917 ((XSComplexTypeDecl) decl).setNamespaceItem(this); 918 } 919 else if (decl instanceof XSSimpleTypeDecl) { 920 ((XSSimpleTypeDecl) decl).setNamespaceItem(this); 921 } 922 } 923 924 public void addGlobalTypeDecl(XSTypeDefinition decl, String location) { 925 fGlobalTypeDeclsExt.put(((location!=null) ? location : "") + "," + decl.getName(), decl); 926 if (decl.getNamespaceItem() == null) { 927 if (decl instanceof XSComplexTypeDecl) { 928 ((XSComplexTypeDecl) decl).setNamespaceItem(this); 929 } 930 else if (decl instanceof XSSimpleTypeDecl) { 931 ((XSSimpleTypeDecl) decl).setNamespaceItem(this); 932 } 933 } 934 } 935 936 /** 937 * register one global complex type 938 */ 939 public void addGlobalComplexTypeDecl(XSComplexTypeDecl decl) { 940 fGlobalTypeDecls.put(decl.getName(), decl); 941 decl.setNamespaceItem(this); 942 } 943 944 public void addGlobalComplexTypeDecl(XSComplexTypeDecl decl, String location) { 945 fGlobalTypeDeclsExt.put(((location!=null) ? location : "") + "," + decl.getName(), decl); 946 if (decl.getNamespaceItem() == null) { 947 decl.setNamespaceItem(this); 948 } 949 } 950 951 /** 952 * register one global simple type 953 */ 954 public void addGlobalSimpleTypeDecl(XSSimpleType decl) { 955 fGlobalTypeDecls.put(decl.getName(), decl); 956 if (decl instanceof XSSimpleTypeDecl) { 957 ((XSSimpleTypeDecl) decl).setNamespaceItem(this); 958 } 959 } 960 961 public void addGlobalSimpleTypeDecl(XSSimpleType decl, String location) { 962 fGlobalTypeDeclsExt.put(((location != null) ? location : "") + "," + decl.getName(), decl); 963 if (decl.getNamespaceItem() == null && decl instanceof XSSimpleTypeDecl) { 964 ((XSSimpleTypeDecl) decl).setNamespaceItem(this); 965 } 966 } 967 968 /** 969 * register one identity constraint 970 */ 971 public final void addIDConstraintDecl(XSElementDecl elmDecl, IdentityConstraint decl) { 972 elmDecl.addIDConstraint(decl); 973 fGlobalIDConstraintDecls.put(decl.getIdentityConstraintName(), decl); 974 } 975 976 public final void addIDConstraintDecl(XSElementDecl elmDecl, IdentityConstraint decl, String location) { 977 fGlobalIDConstraintDeclsExt.put(((location != null) ? location : "") + "," + decl.getIdentityConstraintName(), decl); 978 } 979 980 /** 981 * get one global attribute 982 */ 983 public final XSAttributeDecl getGlobalAttributeDecl(String declName) { 984 return(XSAttributeDecl)fGlobalAttrDecls.get(declName); 985 } 986 987 public final XSAttributeDecl getGlobalAttributeDecl(String declName, String location) { 988 return(XSAttributeDecl)fGlobalAttrDeclsExt.get(((location != null) ? location : "") + "," + declName); 989 } 990 991 /** 992 * get one global attribute group 993 */ 994 public final XSAttributeGroupDecl getGlobalAttributeGroupDecl(String declName) { 995 return(XSAttributeGroupDecl)fGlobalAttrGrpDecls.get(declName); 996 } 997 998 public final XSAttributeGroupDecl getGlobalAttributeGroupDecl(String declName, String location) { 999 return(XSAttributeGroupDecl)fGlobalAttrGrpDeclsExt.get(((location != null) ? location : "") + "," + declName); 1000 } 1001 1002 /** 1003 * get one global element 1004 */ 1005 public final XSElementDecl getGlobalElementDecl(String declName) { 1006 return(XSElementDecl)fGlobalElemDecls.get(declName); 1007 } 1008 1009 public final XSElementDecl getGlobalElementDecl(String declName, String location) { 1010 return(XSElementDecl)fGlobalElemDeclsExt.get(((location != null) ? location : "") + "," + declName); 1011 } 1012 1013 /** 1014 * get one global group 1015 */ 1016 public final XSGroupDecl getGlobalGroupDecl(String declName) { 1017 return(XSGroupDecl)fGlobalGroupDecls.get(declName); 1018 } 1019 1020 public final XSGroupDecl getGlobalGroupDecl(String declName, String location) { 1021 return(XSGroupDecl)fGlobalGroupDeclsExt.get(((location != null) ? location : "") + "," + declName); 1022 } 1023 1024 /** 1025 * get one global notation 1026 */ 1027 public final XSNotationDecl getGlobalNotationDecl(String declName) { 1028 return(XSNotationDecl)fGlobalNotationDecls.get(declName); 1029 } 1030 1031 public final XSNotationDecl getGlobalNotationDecl(String declName, String location) { 1032 return(XSNotationDecl)fGlobalNotationDeclsExt.get(((location != null) ? location : "") + "," + declName); 1033 } 1034 1035 /** 1036 * get one global type 1037 */ 1038 public final XSTypeDefinition getGlobalTypeDecl(String declName) { 1039 return(XSTypeDefinition)fGlobalTypeDecls.get(declName); 1040 } 1041 1042 public final XSTypeDefinition getGlobalTypeDecl(String declName, String location) { 1043 return(XSTypeDefinition)fGlobalTypeDeclsExt.get(((location != null) ? location : "") + "," + declName); 1044 } 1045 1046 /** 1047 * get one identity constraint 1048 */ 1049 public final IdentityConstraint getIDConstraintDecl(String declName) { 1050 return(IdentityConstraint)fGlobalIDConstraintDecls.get(declName); 1051 } 1052 1053 public final IdentityConstraint getIDConstraintDecl(String declName, String location) { 1054 return(IdentityConstraint)fGlobalIDConstraintDeclsExt.get(((location != null) ? location : "") + "," + declName); 1055 } 1056 1057 /** 1058 * get one identity constraint 1059 */ 1060 public final boolean hasIDConstraints() { 1061 return fGlobalIDConstraintDecls.getLength() > 0; 1062 } 1063 1064 // array to store complex type decls 1065 private static final int INITIAL_SIZE = 16; 1066 private static final int INC_SIZE = 16; 1067 1068 private int fCTCount = 0; 1069 private XSComplexTypeDecl[] fComplexTypeDecls = new XSComplexTypeDecl[INITIAL_SIZE]; 1070 private SimpleLocator[] fCTLocators = new SimpleLocator[INITIAL_SIZE]; 1071 1072 // an array to store groups being redefined by restriction 1073 // even-numbered elements are the derived groups, odd-numbered ones their bases 1074 private static final int REDEFINED_GROUP_INIT_SIZE = 2; 1075 private int fRGCount = 0; 1076 private XSGroupDecl[] fRedefinedGroupDecls = new XSGroupDecl[REDEFINED_GROUP_INIT_SIZE]; 1077 private SimpleLocator[] fRGLocators = new SimpleLocator[REDEFINED_GROUP_INIT_SIZE/2]; 1078 1079 // a flag to indicate whether we have checked the 3 constraints on this 1080 // grammar. 1081 boolean fFullChecked = false; 1082 1083 /** 1084 * add one complex type decl: for later constraint checking 1085 */ 1086 public void addComplexTypeDecl(XSComplexTypeDecl decl, SimpleLocator locator) { 1087 if (fCTCount == fComplexTypeDecls.length) { 1088 fComplexTypeDecls = resize(fComplexTypeDecls, fCTCount+INC_SIZE); 1089 fCTLocators = resize(fCTLocators, fCTCount+INC_SIZE); 1090 } 1091 fCTLocators[fCTCount] = locator; 1092 fComplexTypeDecls[fCTCount++] = decl; 1093 } 1094 1095 /** 1096 * add a group redefined by restriction: for later constraint checking 1097 */ 1098 public void addRedefinedGroupDecl(XSGroupDecl derived, XSGroupDecl base, SimpleLocator locator) { 1099 if (fRGCount == fRedefinedGroupDecls.length) { 1100 // double array size each time. 1101 fRedefinedGroupDecls = resize(fRedefinedGroupDecls, fRGCount << 1); 1102 fRGLocators = resize(fRGLocators, fRGCount); 1103 } 1104 fRGLocators[fRGCount/2] = locator; 1105 fRedefinedGroupDecls[fRGCount++] = derived; 1106 fRedefinedGroupDecls[fRGCount++] = base; 1107 } 1108 1109 /** 1110 * get all complex type decls: for later constraint checking 1111 */ 1112 final XSComplexTypeDecl[] getUncheckedComplexTypeDecls() { 1113 if (fCTCount < fComplexTypeDecls.length) { 1114 fComplexTypeDecls = resize(fComplexTypeDecls, fCTCount); 1115 fCTLocators = resize(fCTLocators, fCTCount); 1116 } 1117 return fComplexTypeDecls; 1118 } 1119 1120 /** 1121 * get the error locator of all complex type decls 1122 */ 1123 final SimpleLocator[] getUncheckedCTLocators() { 1124 if (fCTCount < fCTLocators.length) { 1125 fComplexTypeDecls = resize(fComplexTypeDecls, fCTCount); 1126 fCTLocators = resize(fCTLocators, fCTCount); 1127 } 1128 return fCTLocators; 1129 } 1130 1131 /** 1132 * get all redefined groups: for later constraint checking 1133 */ 1134 final XSGroupDecl[] getRedefinedGroupDecls() { 1135 if (fRGCount < fRedefinedGroupDecls.length) { 1136 fRedefinedGroupDecls = resize(fRedefinedGroupDecls, fRGCount); 1137 fRGLocators = resize(fRGLocators, fRGCount/2); 1138 } 1139 return fRedefinedGroupDecls; 1140 } 1141 1142 /** 1143 * get the error locator of all redefined groups 1144 */ 1145 final SimpleLocator[] getRGLocators() { 1146 if (fRGCount < fRedefinedGroupDecls.length) { 1147 fRedefinedGroupDecls = resize(fRedefinedGroupDecls, fRGCount); 1148 fRGLocators = resize(fRGLocators, fRGCount/2); 1149 } 1150 return fRGLocators; 1151 } 1152 1153 /** 1154 * after the first-round checking, some types don't need to be checked 1155 * against UPA again. here we trim the array to the proper size. 1156 */ 1157 final void setUncheckedTypeNum(int newSize) { 1158 fCTCount = newSize; 1159 fComplexTypeDecls = resize(fComplexTypeDecls, fCTCount); 1160 fCTLocators = resize(fCTLocators, fCTCount); 1161 } 1162 1163 // used to store all substitution group information declared in 1164 // this namespace 1165 private int fSubGroupCount = 0; 1166 private XSElementDecl[] fSubGroups = new XSElementDecl[INITIAL_SIZE]; 1167 1168 /** 1169 * get all substitution group information: for the 3 constraint checking 1170 */ 1171 final XSElementDecl[] getSubstitutionGroups() { 1172 if (fSubGroupCount < fSubGroups.length) 1173 fSubGroups = resize(fSubGroups, fSubGroupCount); 1174 return fSubGroups; 1175 } 1176 1177 // anyType and anySimpleType: because there are so many places where 1178 // we need direct access to these two types 1179 public final static XSComplexTypeDecl fAnyType = new XSAnyType(); 1180 private static class XSAnyType extends XSComplexTypeDecl { 1181 public XSAnyType () { 1182 fName = SchemaSymbols.ATTVAL_ANYTYPE; 1183 super.fTargetNamespace = SchemaSymbols.URI_SCHEMAFORSCHEMA; 1184 fBaseType = this; 1185 fDerivedBy = XSConstants.DERIVATION_RESTRICTION; 1186 fContentType = XSComplexTypeDecl.CONTENTTYPE_MIXED; 1187 1188 fParticle = createParticle(); 1189 fAttrGrp = createAttrGrp(); 1190 } 1191 1192 // overridden methods 1193 public void setValues(String name, String targetNamespace, 1194 XSTypeDefinition baseType, short derivedBy, short schemaFinal, 1195 short block, short contentType, 1196 boolean isAbstract, XSAttributeGroupDecl attrGrp, 1197 XSSimpleType simpleType, XSParticleDecl particle) { 1198 // don't allow this. 1199 } 1200 1201 public void setName(String name){ 1202 // don't allow this. 1203 } 1204 1205 public void setIsAbstractType() { 1206 // null implementation 1207 } 1208 1209 public void setContainsTypeID() { 1210 // null implementation 1211 } 1212 1213 public void setIsAnonymous() { 1214 // null implementation 1215 } 1216 1217 public void reset() { 1218 // null implementation 1219 } 1220 1221 public XSObjectList getAnnotations() { 1222 return XSObjectListImpl.EMPTY_LIST; 1223 } 1224 1225 public XSNamespaceItem getNamespaceItem() { 1226 return SG_SchemaNS; 1227 } 1228 1229 private XSAttributeGroupDecl createAttrGrp() { 1230 XSWildcardDecl wildcard = new XSWildcardDecl(); 1231 wildcard.fProcessContents = XSWildcardDecl.PC_LAX; 1232 XSAttributeGroupDecl attrGrp = new XSAttributeGroupDecl(); 1233 attrGrp.fAttributeWC = wildcard; 1234 return attrGrp; 1235 } 1236 1237 private XSParticleDecl createParticle() { 1238 // the wildcard used in anyType (content and attribute) 1239 // the spec will change strict to skip for anyType 1240 XSWildcardDecl wildcard = new XSWildcardDecl(); 1241 wildcard.fProcessContents = XSWildcardDecl.PC_LAX; 1242 // the particle for the content wildcard 1243 XSParticleDecl particleW = new XSParticleDecl(); 1244 particleW.fMinOccurs = 0; 1245 particleW.fMaxOccurs = SchemaSymbols.OCCURRENCE_UNBOUNDED; 1246 particleW.fType = XSParticleDecl.PARTICLE_WILDCARD; 1247 particleW.fValue = wildcard; 1248 // the model group of a sequence of the above particle 1249 XSModelGroupImpl group = new XSModelGroupImpl(); 1250 group.fCompositor = XSModelGroupImpl.MODELGROUP_SEQUENCE; 1251 group.fParticleCount = 1; 1252 group.fParticles = new XSParticleDecl[1]; 1253 group.fParticles[0] = particleW; 1254 // the content of anyType: particle of the above model group 1255 XSParticleDecl particleG = new XSParticleDecl(); 1256 particleG.fType = XSParticleDecl.PARTICLE_MODELGROUP; 1257 particleG.fValue = group; 1258 1259 return particleG; 1260 } 1261 } 1262 private static class BuiltinAttrDecl extends XSAttributeDecl { 1263 public BuiltinAttrDecl(String name, String tns, 1264 XSSimpleType type, short scope) { 1265 fName = name; 1266 super.fTargetNamespace = tns; 1267 fType = type; 1268 fScope = scope; 1269 } 1270 1271 public void setValues(String name, String targetNamespace, 1272 XSSimpleType simpleType, short constraintType, short scope, 1273 ValidatedInfo valInfo, XSComplexTypeDecl enclosingCT) { 1274 // ignore this call. 1275 } 1276 1277 public void reset () { 1278 // also ignore this call. 1279 } 1280 1281 public XSAnnotation getAnnotation() { 1282 return null; 1283 } 1284 1285 public XSNamespaceItem getNamespaceItem() { 1286 return SG_XSI; 1287 } 1288 1289 } // class BuiltinAttrDecl 1290 1291 // the grammars to hold components of the schema namespace 1292 public final static BuiltinSchemaGrammar SG_SchemaNS = new BuiltinSchemaGrammar(GRAMMAR_XS, Constants.SCHEMA_VERSION_1_0); 1293 private final static BuiltinSchemaGrammar SG_SchemaNSExtended = new BuiltinSchemaGrammar(GRAMMAR_XS, Constants.SCHEMA_VERSION_1_0_EXTENDED); 1294 1295 public final static XSSimpleType fAnySimpleType = (XSSimpleType)SG_SchemaNS.getGlobalTypeDecl(SchemaSymbols.ATTVAL_ANYSIMPLETYPE); 1296 1297 // the grammars to hold components of the schema-instance namespace 1298 public final static BuiltinSchemaGrammar SG_XSI = new BuiltinSchemaGrammar(GRAMMAR_XSI, Constants.SCHEMA_VERSION_1_0); 1299 1300 public static SchemaGrammar getS4SGrammar(short schemaVersion) { 1301 if (schemaVersion == Constants.SCHEMA_VERSION_1_0) { 1302 return SG_SchemaNS; 1303 } 1304 else { 1305 return SG_SchemaNSExtended; 1306 } 1307 } 1308 1309 static final XSComplexTypeDecl[] resize(XSComplexTypeDecl[] oldArray, int newSize) { 1310 XSComplexTypeDecl[] newArray = new XSComplexTypeDecl[newSize]; 1311 System.arraycopy(oldArray, 0, newArray, 0, Math.min(oldArray.length, newSize)); 1312 return newArray; 1313 } 1314 1315 static final XSGroupDecl[] resize(XSGroupDecl[] oldArray, int newSize) { 1316 XSGroupDecl[] newArray = new XSGroupDecl[newSize]; 1317 System.arraycopy(oldArray, 0, newArray, 0, Math.min(oldArray.length, newSize)); 1318 return newArray; 1319 } 1320 1321 static final XSElementDecl[] resize(XSElementDecl[] oldArray, int newSize) { 1322 XSElementDecl[] newArray = new XSElementDecl[newSize]; 1323 System.arraycopy(oldArray, 0, newArray, 0, Math.min(oldArray.length, newSize)); 1324 return newArray; 1325 } 1326 1327 static final SimpleLocator[] resize(SimpleLocator[] oldArray, int newSize) { 1328 SimpleLocator[] newArray = new SimpleLocator[newSize]; 1329 System.arraycopy(oldArray, 0, newArray, 0, Math.min(oldArray.length, newSize)); 1330 return newArray; 1331 } 1332 1333 // XSNamespaceItem methods 1334 1335 // the max index / the max value of XSObject type 1336 private static final short MAX_COMP_IDX = XSTypeDefinition.SIMPLE_TYPE; 1337 private static final boolean[] GLOBAL_COMP = {false, // null 1338 true, // attribute 1339 true, // element 1340 true, // type 1341 false, // attribute use 1342 true, // attribute group 1343 true, // group 1344 false, // model group 1345 false, // particle 1346 false, // wildcard 1347 true, // idc 1348 true, // notation 1349 false, // annotation 1350 false, // facet 1351 false, // multi value facet 1352 true, // complex type 1353 true // simple type 1354 }; 1355 1356 // store a certain kind of components from all namespaces 1357 private XSNamedMap[] fComponents = null; 1358 private ObjectList[] fComponentsExt = null; 1359 1360 // store the documents and their locations contributing to this namespace 1361 // REVISIT: use StringList and XSObjectList for there fields. 1362 // fDocuments is never used 1363 private List<Object> fDocuments = null; 1364 private List<String> fLocations = null; 1365 1366 public synchronized void addDocument(Object document, String location) { 1367 if (fDocuments == null) { 1368 // Parsing schema is not thread safe, synchronized may be removed 1369 fDocuments = new CopyOnWriteArrayList<>(); 1370 fLocations = new CopyOnWriteArrayList<>(); 1371 } 1372 fDocuments.add(document); 1373 fLocations.add(location); 1374 } 1375 1376 public synchronized void removeDocument(int index) { 1377 if (fDocuments != null && 1378 index >= 0 && 1379 index < fDocuments.size()) { 1380 fDocuments.remove(index); 1381 fLocations.remove(index); 1382 } 1383 } 1384 1385 /** 1386 * [schema namespace] 1387 * @see <a href="http://www.w3.org/TR/xmlschema-1/#nsi-schema_namespace">[schema namespace]</a> 1388 * @return The target namespace of this item. 1389 */ 1390 public String getSchemaNamespace() { 1391 return fTargetNamespace; 1392 } 1393 1394 // annotation support 1395 synchronized DOMParser getDOMParser() { 1396 if (fDOMParser != null) { 1397 DOMParser parser = fDOMParser.get(); 1398 if (parser != null) { 1399 return parser; 1400 } 1401 } 1402 // REVISIT: when schema handles XML 1.1, will need to 1403 // revisit this (and the practice of not prepending an XML decl to the annotation string 1404 XML11Configuration config = new XML11Configuration(fSymbolTable); 1405 // note that this should never produce errors or require 1406 // entity resolution, so just a barebones configuration with 1407 // a couple of feature set will do fine 1408 config.setFeature(Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE, true); 1409 config.setFeature(Constants.SAX_FEATURE_PREFIX + Constants.VALIDATION_FEATURE, false); 1410 1411 DOMParser parser = new DOMParser(config); 1412 try { 1413 parser.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.DEFER_NODE_EXPANSION_FEATURE, false); 1414 } 1415 catch (SAXException exc) {} 1416 fDOMParser = new SoftReference<DOMParser>(parser); 1417 return parser; 1418 } 1419 1420 synchronized SAXParser getSAXParser() { 1421 if (fSAXParser != null) { 1422 SAXParser parser = fSAXParser.get(); 1423 if (parser != null) { 1424 return parser; 1425 } 1426 } 1427 // REVISIT: when schema handles XML 1.1, will need to 1428 // revisit this (and the practice of not prepending an XML decl to the annotation string 1429 XML11Configuration config = new XML11Configuration(fSymbolTable); 1430 // note that this should never produce errors or require 1431 // entity resolution, so just a barebones configuration with 1432 // a couple of feature set will do fine 1433 config.setFeature(Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE, true); 1434 config.setFeature(Constants.SAX_FEATURE_PREFIX + Constants.VALIDATION_FEATURE, false); 1435 SAXParser parser = new SAXParser(config); 1436 fSAXParser = new SoftReference<SAXParser>(parser); 1437 return parser; 1438 } 1439 1440 /** 1441 * [schema components]: a list of top-level components, i.e. element 1442 * declarations, attribute declarations, etc. 1443 * @param objectType The type of the declaration, i.e. 1444 * <code>ELEMENT_DECLARATION</code>. Note that 1445 * <code>XSTypeDefinition.SIMPLE_TYPE</code> and 1446 * <code>XSTypeDefinition.COMPLEX_TYPE</code> can also be used as the 1447 * <code>objectType</code> to retrieve only complex types or simple 1448 * types, instead of all types. 1449 * @return A list of top-level definition of the specified type in 1450 * <code>objectType</code> or an empty <code>XSNamedMap</code> if no 1451 * such definitions exist. 1452 */ 1453 public synchronized XSNamedMap getComponents(short objectType) { 1454 if (objectType <= 0 || objectType > MAX_COMP_IDX || 1455 !GLOBAL_COMP[objectType]) { 1456 return XSNamedMapImpl.EMPTY_MAP; 1457 } 1458 1459 if (fComponents == null) 1460 fComponents = new XSNamedMap[MAX_COMP_IDX+1]; 1461 1462 // get the hashtable for this type of components 1463 if (fComponents[objectType] == null) { 1464 SymbolHash table = null; 1465 switch (objectType) { 1466 case XSConstants.TYPE_DEFINITION: 1467 case XSTypeDefinition.COMPLEX_TYPE: 1468 case XSTypeDefinition.SIMPLE_TYPE: 1469 table = fGlobalTypeDecls; 1470 break; 1471 case XSConstants.ATTRIBUTE_DECLARATION: 1472 table = fGlobalAttrDecls; 1473 break; 1474 case XSConstants.ELEMENT_DECLARATION: 1475 table = fGlobalElemDecls; 1476 break; 1477 case XSConstants.ATTRIBUTE_GROUP: 1478 table = fGlobalAttrGrpDecls; 1479 break; 1480 case XSConstants.MODEL_GROUP_DEFINITION: 1481 table = fGlobalGroupDecls; 1482 break; 1483 case XSConstants.NOTATION_DECLARATION: 1484 table = fGlobalNotationDecls; 1485 break; 1486 case XSConstants.IDENTITY_CONSTRAINT: 1487 table = this.fGlobalIDConstraintDecls; 1488 break; 1489 } 1490 1491 // for complex/simple types, create a special implementation, 1492 // which take specific types out of the hash table 1493 if (objectType == XSTypeDefinition.COMPLEX_TYPE || 1494 objectType == XSTypeDefinition.SIMPLE_TYPE) { 1495 fComponents[objectType] = new XSNamedMap4Types(fTargetNamespace, table, objectType); 1496 } 1497 else { 1498 fComponents[objectType] = new XSNamedMapImpl(fTargetNamespace, table); 1499 } 1500 } 1501 1502 return fComponents[objectType]; 1503 } 1504 1505 public synchronized ObjectList getComponentsExt(short objectType) { 1506 if (objectType <= 0 || objectType > MAX_COMP_IDX || 1507 !GLOBAL_COMP[objectType]) { 1508 return ObjectListImpl.EMPTY_LIST; 1509 } 1510 1511 if (fComponentsExt == null) 1512 fComponentsExt = new ObjectList[MAX_COMP_IDX+1]; 1513 1514 // get the hashtable for this type of components 1515 if (fComponentsExt[objectType] == null) { 1516 SymbolHash table = null; 1517 switch (objectType) { 1518 case XSConstants.TYPE_DEFINITION: 1519 case XSTypeDefinition.COMPLEX_TYPE: 1520 case XSTypeDefinition.SIMPLE_TYPE: 1521 table = fGlobalTypeDeclsExt; 1522 break; 1523 case XSConstants.ATTRIBUTE_DECLARATION: 1524 table = fGlobalAttrDeclsExt; 1525 break; 1526 case XSConstants.ELEMENT_DECLARATION: 1527 table = fGlobalElemDeclsExt; 1528 break; 1529 case XSConstants.ATTRIBUTE_GROUP: 1530 table = fGlobalAttrGrpDeclsExt; 1531 break; 1532 case XSConstants.MODEL_GROUP_DEFINITION: 1533 table = fGlobalGroupDeclsExt; 1534 break; 1535 case XSConstants.NOTATION_DECLARATION: 1536 table = fGlobalNotationDeclsExt; 1537 break; 1538 case XSConstants.IDENTITY_CONSTRAINT: 1539 table = this.fGlobalIDConstraintDeclsExt; 1540 break; 1541 } 1542 1543 Object[] entries = table.getEntries(); 1544 fComponentsExt[objectType] = new ObjectListImpl(entries, entries.length); 1545 } 1546 1547 return fComponentsExt[objectType]; 1548 } 1549 1550 public synchronized void resetComponents() { 1551 fComponents = null; 1552 fComponentsExt = null; 1553 } 1554 1555 /** 1556 * Convenience method. Returns a top-level simple or complex type 1557 * definition. 1558 * @param name The name of the definition. 1559 * @return An <code>XSTypeDefinition</code> or null if such definition 1560 * does not exist. 1561 */ 1562 public XSTypeDefinition getTypeDefinition(String name) { 1563 return getGlobalTypeDecl(name); 1564 } 1565 1566 /** 1567 * Convenience method. Returns a top-level attribute declaration. 1568 * @param name The name of the declaration. 1569 * @return A top-level attribute declaration or null if such declaration 1570 * does not exist. 1571 */ 1572 public XSAttributeDeclaration getAttributeDeclaration(String name) { 1573 return getGlobalAttributeDecl(name); 1574 } 1575 1576 /** 1577 * Convenience method. Returns a top-level element declaration. 1578 * @param name The name of the declaration. 1579 * @return A top-level element declaration or null if such declaration 1580 * does not exist. 1581 */ 1582 public XSElementDeclaration getElementDeclaration(String name) { 1583 return getGlobalElementDecl(name); 1584 } 1585 1586 /** 1587 * Convenience method. Returns a top-level attribute group definition. 1588 * @param name The name of the definition. 1589 * @return A top-level attribute group definition or null if such 1590 * definition does not exist. 1591 */ 1592 public XSAttributeGroupDefinition getAttributeGroup(String name) { 1593 return getGlobalAttributeGroupDecl(name); 1594 } 1595 1596 /** 1597 * Convenience method. Returns a top-level model group definition. 1598 * 1599 * @param name The name of the definition. 1600 * @return A top-level model group definition definition or null if such 1601 * definition does not exist. 1602 */ 1603 public XSModelGroupDefinition getModelGroupDefinition(String name) { 1604 return getGlobalGroupDecl(name); 1605 } 1606 1607 /** 1608 * Convenience method. Returns a top-level notation declaration. 1609 * 1610 * @param name The name of the declaration. 1611 * @return A top-level notation declaration or null if such declaration 1612 * does not exist. 1613 */ 1614 public XSNotationDeclaration getNotationDeclaration(String name) { 1615 return getGlobalNotationDecl(name); 1616 } 1617 1618 public XSIDCDefinition getIDCDefinition(String name) { 1619 return getIDConstraintDecl(name); 1620 } 1621 1622 1623 /** 1624 * [document location] 1625 * @see <a href="http://www.w3.org/TR/xmlschema-1/#sd-document_location">[document location]</a> 1626 * @return a list of document information item 1627 */ 1628 public StringList getDocumentLocations() { 1629 return new StringListImpl(fLocations); 1630 } 1631 1632 /** 1633 * Return an <code>XSModel</code> that represents components in this schema 1634 * grammar. 1635 * 1636 * @return an <code>XSModel</code> representing this schema grammar 1637 */ 1638 public XSModel toXSModel() { 1639 return new XSModelImpl(new SchemaGrammar[]{this}); 1640 } 1641 1642 public XSModel toXSModel(XSGrammar[] grammars) { 1643 if (grammars == null || grammars.length == 0) 1644 return toXSModel(); 1645 1646 int len = grammars.length; 1647 boolean hasSelf = false; 1648 for (int i = 0; i < len; i++) { 1649 if (grammars[i] == this) { 1650 hasSelf = true; 1651 break; 1652 } 1653 } 1654 1655 SchemaGrammar[] gs = new SchemaGrammar[hasSelf ? len : len+1]; 1656 for (int i = 0; i < len; i++) 1657 gs[i] = (SchemaGrammar)grammars[i]; 1658 if (!hasSelf) 1659 gs[len] = this; 1660 return new XSModelImpl(gs); 1661 } 1662 1663 /** 1664 * @see org.apache.xerces.xs.XSNamespaceItem#getAnnotations() 1665 */ 1666 public XSObjectList getAnnotations() { 1667 if (fNumAnnotations == 0) { 1668 return XSObjectListImpl.EMPTY_LIST; 1669 } 1670 return new XSObjectListImpl(fAnnotations, fNumAnnotations); 1671 } 1672 1673 public void addAnnotation(XSAnnotationImpl annotation) { 1674 if (annotation == null) { 1675 return; 1676 } 1677 if (fAnnotations == null) { 1678 fAnnotations = new XSAnnotationImpl[2]; 1679 } 1680 else if (fNumAnnotations == fAnnotations.length) { 1681 XSAnnotationImpl[] newArray = new XSAnnotationImpl[fNumAnnotations << 1]; 1682 System.arraycopy(fAnnotations, 0, newArray, 0, fNumAnnotations); 1683 fAnnotations = newArray; 1684 } 1685 fAnnotations[fNumAnnotations++] = annotation; 1686 } 1687 1688 public void setImmutable(boolean isImmutable) { 1689 fIsImmutable = isImmutable; 1690 } 1691 1692 public boolean isImmutable() { 1693 return fIsImmutable; 1694 } 1695 1696 } // class SchemaGrammar