xsdhandler.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 1,320 行 · 第 1/5 页

JAVA
1,320
字号
                }                else {                    for (Element redefinedChild = DOMUtil.getFirstChildElement(child);                            redefinedChild != null;                            redefinedChild = DOMUtil.getNextSiblingElement(redefinedChild)) {                        String redefinedComponentType = DOMUtil.getLocalName(redefinedChild);                        if (redefinedComponentType.equals(SchemaSymbols.ELT_ANNOTATION)) {                            // promoting annotations to parent component                            sg.addAnnotation(                                fElementTraverser.traverseAnnotationDecl(redefinedChild, includeAttrs, true, currSchemaInfo));                            DOMUtil.setHidden(redefinedChild);                        }                         // catch all other content errors later                    }                }                fAttributeChecker.returnAttrArray(includeAttrs, currSchemaInfo);                // schemaLocation is required on <include> and <redefine>                if (schemaHint == null) {                    reportSchemaError("s4s-att-must-appear", new Object [] {                                      "<include> or <redefine>", "schemaLocation"},                                      child);                }                // pass the systemId of the current document as the base systemId                boolean mustResolve = false;                refType = XSDDescription.CONTEXT_INCLUDE;                if(localName.equals(SchemaSymbols.ELT_REDEFINE)) {                    mustResolve = nonAnnotationContent(child);                    refType = XSDDescription.CONTEXT_REDEFINE;                }                fSchemaGrammarDescription.reset();                fSchemaGrammarDescription.setContextType(refType);                fSchemaGrammarDescription.setBaseSystemId((String)fDoc2SystemId.get(schemaRoot));                fSchemaGrammarDescription.setLocationHints(new String[]{schemaHint});                fSchemaGrammarDescription.setTargetNamespace(callerTNS);                newSchemaRoot = resolveSchema(fSchemaGrammarDescription, mustResolve, child);                schemaNamespace = currSchemaInfo.fTargetNamespace;            }            else {                // no more possibility of schema references in well-formed                // schema...                break;            }            // If the schema is duplicate, we needn't call constructTrees() again.            // To handle mutual <include>s            XSDocumentInfo newSchemaInfo = null;            if (fLastSchemaWasDuplicate) {                newSchemaInfo = (XSDocumentInfo)fDoc2XSDocumentMap.get(newSchemaRoot);            }            else {                newSchemaInfo = constructTrees(newSchemaRoot, schemaHint, fSchemaGrammarDescription);            }            if (localName.equals(SchemaSymbols.ELT_REDEFINE) &&                newSchemaInfo != null) {                // must record which schema we're redefining so that we can                // rename the right things later!                fRedefine2XSDMap.put(child, newSchemaInfo);            }            if (newSchemaRoot != null) {                if (newSchemaInfo != null)                    dependencies.addElement(newSchemaInfo);                newSchemaRoot = null;            }        }                fDependencyMap.put(currSchemaInfo, dependencies);        return currSchemaInfo;    } // end constructTrees    // This method builds registries for all globally-referenceable    // names.  A registry will be built for each symbol space defined    // by the spec.  It is also this method's job to rename redefined    // components, and to record which components redefine others (so    // that implicit redefinitions of groups and attributeGroups can be handled).    protected void buildGlobalNameRegistries() {        /* Starting with fRoot, we examine each child of the schema         * element.  Skipping all imports and includes, we record the names         * of all other global components (and children of <redefine>).  We         * also put <redefine> names in a registry that we look through in         * case something needs renaming.  Once we're done with a schema we         * set its Document node to hidden so that we don't try to traverse         * it again; then we look to its Dependency map entry.  We keep a         * stack of schemas that we haven't yet finished processing; this         * is a depth-first traversal.         */        Stack schemasToProcess = new Stack();        schemasToProcess.push(fRoot);        while (!schemasToProcess.empty()) {            XSDocumentInfo currSchemaDoc =            (XSDocumentInfo)schemasToProcess.pop();            Document currDoc = currSchemaDoc.fSchemaDoc;            if (DOMUtil.isHidden(currDoc)) {                // must have processed this already!                continue;            }            Element currRoot = DOMUtil.getRoot(currDoc);            // process this schema's global decls            boolean dependenciesCanOccur = true;            for (Element globalComp =                 DOMUtil.getFirstChildElement(currRoot);                globalComp != null;                globalComp = DOMUtil.getNextSiblingElement(globalComp)) {                // this loop makes sure the <schema> element ordering is                // also valid.                if (DOMUtil.getLocalName(globalComp).equals(SchemaSymbols.ELT_ANNOTATION)) {                    //skip it; traverse it later                    continue;                }                else if (DOMUtil.getLocalName(globalComp).equals(SchemaSymbols.ELT_INCLUDE) ||                         DOMUtil.getLocalName(globalComp).equals(SchemaSymbols.ELT_IMPORT)) {                    if (!dependenciesCanOccur) {                        reportSchemaError("s4s-elt-invalid-content.3", new Object [] {DOMUtil.getLocalName(globalComp)}, globalComp);                    }                    // we've dealt with this; mark as traversed                    DOMUtil.setHidden(globalComp);                }                else if (DOMUtil.getLocalName(globalComp).equals(SchemaSymbols.ELT_REDEFINE)) {                    if (!dependenciesCanOccur) {                        reportSchemaError("s4s-elt-invalid-content.3", new Object [] {DOMUtil.getLocalName(globalComp)}, globalComp);                    }                    for (Element redefineComp = DOMUtil.getFirstChildElement(globalComp);                        redefineComp != null;                        redefineComp = DOMUtil.getNextSiblingElement(redefineComp)) {                        String lName = DOMUtil.getAttrValue(redefineComp, SchemaSymbols.ATT_NAME);                        if (lName.length() == 0) // an error we'll catch later                            continue;                        String qName = currSchemaDoc.fTargetNamespace == null ?                                       ","+lName:                                       currSchemaDoc.fTargetNamespace +","+lName;                        String componentType = DOMUtil.getLocalName(redefineComp);                        if (componentType.equals(SchemaSymbols.ELT_ATTRIBUTEGROUP)) {                            checkForDuplicateNames(qName, fUnparsedAttributeGroupRegistry, redefineComp, currSchemaDoc);                            // the check will have changed our name;                            String targetLName = DOMUtil.getAttrValue(redefineComp, SchemaSymbols.ATT_NAME)+REDEF_IDENTIFIER;                            // and all we need to do is error-check+rename our kkids:                            renameRedefiningComponents(currSchemaDoc, redefineComp, SchemaSymbols.ELT_ATTRIBUTEGROUP,                                                       lName, targetLName);                        }                        else if ((componentType.equals(SchemaSymbols.ELT_COMPLEXTYPE)) ||                                 (componentType.equals(SchemaSymbols.ELT_SIMPLETYPE))) {                            checkForDuplicateNames(qName, fUnparsedTypeRegistry, redefineComp, currSchemaDoc);                            // the check will have changed our name;                            String targetLName = DOMUtil.getAttrValue(redefineComp, SchemaSymbols.ATT_NAME) + REDEF_IDENTIFIER;                            // and all we need to do is error-check+rename our kkids:                            if (componentType.equals(SchemaSymbols.ELT_COMPLEXTYPE)) {                                renameRedefiningComponents(currSchemaDoc, redefineComp, SchemaSymbols.ELT_COMPLEXTYPE,                                                           lName, targetLName);                            }                            else { // must be simpleType                                renameRedefiningComponents(currSchemaDoc, redefineComp, SchemaSymbols.ELT_SIMPLETYPE,                                                           lName, targetLName);                            }                        }                        else if (componentType.equals(SchemaSymbols.ELT_GROUP)) {                            checkForDuplicateNames(qName, fUnparsedGroupRegistry, redefineComp, currSchemaDoc);                            // the check will have changed our name;                            String targetLName = DOMUtil.getAttrValue(redefineComp, SchemaSymbols.ATT_NAME)+REDEF_IDENTIFIER;                            // and all we need to do is error-check+rename our kids:                            renameRedefiningComponents(currSchemaDoc, redefineComp, SchemaSymbols.ELT_GROUP,                                                       lName, targetLName);                        }                    } // end march through <redefine> children                    // and now set as traversed                    //DOMUtil.setHidden(globalComp);                }                else {                    dependenciesCanOccur = false;                    String lName = DOMUtil.getAttrValue(globalComp, SchemaSymbols.ATT_NAME);                    if (lName.length() == 0) // an error we'll catch later                        continue;                    String qName = currSchemaDoc.fTargetNamespace == null?                                   ","+lName:                                   currSchemaDoc.fTargetNamespace +","+lName;                    String componentType = DOMUtil.getLocalName(globalComp);                    if (componentType.equals(SchemaSymbols.ELT_ATTRIBUTE)) {                        checkForDuplicateNames(qName, fUnparsedAttributeRegistry, globalComp, currSchemaDoc);                    }                    else if (componentType.equals(SchemaSymbols.ELT_ATTRIBUTEGROUP)) {                        checkForDuplicateNames(qName, fUnparsedAttributeGroupRegistry, globalComp, currSchemaDoc);                    }                    else if ((componentType.equals(SchemaSymbols.ELT_COMPLEXTYPE)) ||                             (componentType.equals(SchemaSymbols.ELT_SIMPLETYPE))) {                        checkForDuplicateNames(qName, fUnparsedTypeRegistry, globalComp, currSchemaDoc);                    }                    else if (componentType.equals(SchemaSymbols.ELT_ELEMENT)) {                        checkForDuplicateNames(qName, fUnparsedElementRegistry, globalComp, currSchemaDoc);                    }                    else if (componentType.equals(SchemaSymbols.ELT_GROUP)) {                        checkForDuplicateNames(qName, fUnparsedGroupRegistry, globalComp, currSchemaDoc);                    }                    else if (componentType.equals(SchemaSymbols.ELT_NOTATION)) {                        checkForDuplicateNames(qName, fUnparsedNotationRegistry, globalComp, currSchemaDoc);                    }                }            } // end for            // now we're done with this one!            DOMUtil.setHidden(currDoc);            // now add the schemas this guy depends on            Vector currSchemaDepends = (Vector)fDependencyMap.get(currSchemaDoc);            for (int i = 0; i < currSchemaDepends.size(); i++) {                schemasToProcess.push(currSchemaDepends.elementAt(i));            }        } // while    } // end buildGlobalNameRegistries    // Beginning at the first schema processing was requested for    // (fRoot), this method    // examines each child (global schema information item) of each    // schema document (and of each <redefine> element)    // corresponding to an XSDocumentInfo object.  If the    // readOnly field on that node has not been set, it calls an    // appropriate traverser to traverse it.  Once all global decls in    // an XSDocumentInfo object have been traversed, it marks that object    // as traversed (or hidden) in order to avoid infinite loops.  It completes    // when it has visited all XSDocumentInfo objects in the    // DependencyMap and marked them as traversed.    protected void traverseSchemas() {        // the process here is very similar to that in        // buildGlobalRegistries, except we can't set our schemas as        // hidden for a second time; so make them all visible again        // first!        setSchemasVisible(fRoot);        Stack schemasToProcess = new Stack();        schemasToProcess.push(fRoot);        while (!schemasToProcess.empty()) {            XSDocumentInfo currSchemaDoc =                (XSDocumentInfo)schemasToProcess.pop();            Document currDoc = currSchemaDoc.fSchemaDoc;            SchemaGrammar currSG = fGrammarBucket.getGrammar(currSchemaDoc.fTargetNamespace);            if (DOMUtil.isHidden(currDoc)) {                // must have processed this already!                continue;            }            Element currRoot = DOMUtil.getRoot(currDoc);             // traverse this schema's global decls            for (Element globalComp =                 DOMUtil.getFirstVisibleChildElement(currRoot);                globalComp != null;                globalComp = DOMUtil.getNextVisibleSiblingElement(globalComp)) {                // We'll always want to set this as hidden!                DOMUtil.setHidden(globalComp);                String componentType = DOMUtil.getLocalName(globalComp);                // includes and imports will not show up here!                if (DOMUtil.getLocalName(globalComp).equals(SchemaSymbols.ELT_REDEFINE)) {                    // use the namespace decls for the redefine, instead of for the parent <schema>                    currSchemaDoc.backupNSSupport((SchemaNamespaceSupport)fRedefine2NSSupport.get(globalComp));                    for (Element redefinedComp = DOMUtil.getFirstVisibleChildElement(globalComp);                        redefinedComp != null;                        redefinedComp = DOMUtil.getNextVisibleSiblingElement(redefinedComp)) {                        String redefinedComponentType = DOMUtil.getLocalName(redefinedComp);                        DOMUtil.setHidden(redefinedComp);                        if (redefinedComponentType.equals(SchemaSymbols.ELT_ATTRIBUTEGROUP)) {                            fAttributeGroupTraverser.traverseGlobal(redefinedComp, currSchemaDoc, currSG);                        }                        else if (redefinedComponentType.equals(SchemaSymbols.ELT_COMPLEXTYPE)) {                            fComplexTypeTraverser.traverseGlobal(redefinedComp, currSchemaDoc, currSG);                        }                        else if (redefinedComponentType.equals(SchemaSymbols.ELT_GROUP)) {                            fGroupTraverser.traverseGlobal(redefinedComp, currSchemaDoc, currSG);                        }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?