FileDocCategorySizeDatePackage
SchemaNamespaceSupport.javaAPI DocApache Xerces 3.0.111055Fri Sep 14 20:33:52 BST 2007org.apache.xerces.impl.xs

SchemaNamespaceSupport

public class SchemaNamespaceSupport extends org.apache.xerces.util.NamespaceSupport
This class customizes the behaviour of the util.NamespaceSupport class in order to easily implement some features that we need for efficient schema handling. It will not be generally useful.
xerces.internal
author
Neil Graham, IBM
version
$Id: SchemaNamespaceSupport.java 446734 2006-09-15 20:51:23Z mrglavas $

Fields Summary
private SchemaRootContext
fSchemaRootContext
Constructors Summary
public SchemaNamespaceSupport(Element schemaRoot, org.apache.xerces.util.SymbolTable symbolTable)


          
        super();
        if (schemaRoot != null && !(schemaRoot instanceof ElementImpl)) {
            Document ownerDocument = schemaRoot.getOwnerDocument();
            if (ownerDocument != null && schemaRoot != ownerDocument.getDocumentElement()) {
                fSchemaRootContext = new SchemaRootContext(schemaRoot, symbolTable);
            }
        }
    
public SchemaNamespaceSupport(SchemaNamespaceSupport nSupport)

        fSchemaRootContext = nSupport.fSchemaRootContext;
        fNamespaceSize = nSupport.fNamespaceSize;
        if (fNamespace.length < fNamespaceSize)
            fNamespace = new String[fNamespaceSize];
        System.arraycopy(nSupport.fNamespace, 0, fNamespace, 0, fNamespaceSize);
        fCurrentContext = nSupport.fCurrentContext;
        if (fContext.length <= fCurrentContext)
            fContext = new int[fCurrentContext+1];
        System.arraycopy(nSupport.fContext, 0, fContext, 0, fCurrentContext+1);
    
Methods Summary
public java.lang.String[]getEffectiveLocalContext()
This method returns an array of Strings, as would be stored in a NamespaceSupport object. This array contains all declarations except those at the global level.

        // the trick here is to recognize that all local contexts
        // happen to start at fContext[3].
        // context 1: empty
        // context 2: decls for xml and xmlns;
        // context 3: decls on <xs:schema>: the global ones
        String[] returnVal = null;
        if (fCurrentContext >= 3) {
            int bottomLocalContext = fContext[3];
            int copyCount = fNamespaceSize - bottomLocalContext;
            if (copyCount > 0) {
                returnVal = new String[copyCount];
                System.arraycopy(fNamespace, bottomLocalContext, returnVal, 0,
                                 copyCount);
            }
        }
        return returnVal;
    
public java.lang.StringgetURI(java.lang.String prefix)

        String uri = super.getURI(prefix);
        if (uri == null && fSchemaRootContext != null) {
            if (!fSchemaRootContext.fDOMContextBuilt) {
                fSchemaRootContext.fillNamespaceContext();
                fSchemaRootContext.fDOMContextBuilt = true;
            }
            if (fSchemaRootContext.fNamespaceSize > 0 && 
                !containsPrefix(prefix)) {
                uri = fSchemaRootContext.getURI(prefix);
            }
        }
        return uri;
    
public voidmakeGlobal()

        if (fCurrentContext >= 3) {
            fCurrentContext = 3;
            fNamespaceSize = fContext[3];
        }
    
public voidsetEffectiveContext(java.lang.String[] namespaceDecls)
This method takes a set of Strings, as stored in a NamespaceSupport object, and "fools" the object into thinking that this is one unified context. This is meant to be used in conjunction with things like local elements, whose declarations may be deeply nested but which for all practical purposes may be regarded as being one level below the global element--at least with regard to namespace declarations. It's worth noting that the context from which the strings are being imported had better be using the same SymbolTable.

        if(namespaceDecls == null || namespaceDecls.length == 0) return;
        pushContext();
        int newSize = fNamespaceSize + namespaceDecls.length;
        if (fNamespace.length < newSize) {
            // expand namespace's size...
            String[] tempNSArray = new String[newSize];
            System.arraycopy(fNamespace, 0, tempNSArray, 0, fNamespace.length);
            fNamespace = tempNSArray;
        }
        System.arraycopy(namespaceDecls, 0, fNamespace, fNamespaceSize,
                         namespaceDecls.length);
        fNamespaceSize = newSize;