FileDocCategorySizeDatePackage
NameSpaceSymbTable.javaAPI DocJava SE 6 API12001Tue Jun 10 00:23:00 BST 2008com.sun.org.apache.xml.internal.security.c14n.implementations

NameSpaceSymbTable

public class NameSpaceSymbTable extends Object
A stack based Symble Table.
For speed reasons all the symbols are introduced in the same map, and at the same time in a list so it can be removed when the frame is pop back.
author
Raul Benito

Fields Summary
SymbMap
symb
The map betwen prefix-> entry table.
int
nameSpaces
The level of nameSpaces (for Inclusive visibility).
List
level
The stacks for removing the definitions when doing pop.
boolean
cloned
static final String
XMLNS
Constructors Summary
public NameSpaceSymbTable()
Default constractor

           		
      
    	//Insert the default binding for xmlns.
    	NameSpaceSymbEntry ne=new NameSpaceSymbEntry("",null,true);
		ne.lastrendered="";
    	symb.put(XMLNS,ne);    
    
Methods Summary
public booleanaddMapping(java.lang.String prefix, java.lang.String uri, org.w3c.dom.Attr n)
Adds the mapping for a prefix.

param
prefix the prefix of definition
param
uri the Uri of the definition
param
n the attribute that have the definition
return
true if there is already defined.

						
		NameSpaceSymbEntry ob = symb.get(prefix);		
		if ((ob!=null) && uri.equals(ob.uri)) {
			//If we have it previously defined. Don't keep working.
			return false;
		}			
		//Creates and entry in the table for this new definition.
		NameSpaceSymbEntry ne=new NameSpaceSymbEntry(uri,n,false);		
        needsClone();
		symb.put(prefix, ne);
		if (ob != null) {
			//We have a previous definition store it for the pop.			
			//Check if a previous definition(not the inmidiatly one) has been rendered.			
			ne.lastrendered=ob.lastrendered;			
			if ((ob.lastrendered!=null)&& (ob.lastrendered.equals(uri))) {
				//Yes it is. Mark as rendered.
				ne.rendered=true;
			}			
		} 			
        return true;
	
public org.w3c.dom.NodeaddMappingAndRender(java.lang.String prefix, java.lang.String uri, org.w3c.dom.Attr n)
Adds a definition and mark it as render. For inclusive c14n.

param
prefix the prefix of definition
param
uri the Uri of the definition
param
n the attribute that have the definition
return
the attr to render, null if there is no need to render

                     
        NameSpaceSymbEntry ob = symb.get(prefix);
        
        if ((ob!=null) && uri.equals(ob.uri)) {
            if (!ob.rendered) {                 
                ob=(NameSpaceSymbEntry) ob.clone();
                needsClone();
                symb.put(prefix,ob);         
                ob.lastrendered=uri;
                ob.rendered=true;
                return ob.n;
            }           
            return null;
        }   
        
        NameSpaceSymbEntry ne=new NameSpaceSymbEntry(uri,n,true);
        ne.lastrendered=uri;
        needsClone();
        symb.put(prefix, ne);
        if (ob != null) {           
            
            if ((ob.lastrendered!=null)&& (ob.lastrendered.equals(uri))) {
                ne.rendered=true;
                return null;
            }
        }       
        return ne.n;
    
public org.w3c.dom.NodeaddMappingAndRenderXNodeSet(java.lang.String prefix, java.lang.String uri, org.w3c.dom.Attr n, boolean outputNode)
Adds & gets(if needed) the attribute node that defines the binding for the prefix. Take on account if the rules of rendering in the inclusive c14n. For inclusive c14n.

param
prefix the prefix to obtain the attribute.
param
outputNode the container element is an output element.
param
uri the Uri of the definition
param
n the attribute that have the definition
return
null if there is no need to render the prefix. Otherwise the node of definition.

						
		NameSpaceSymbEntry ob = symb.get(prefix);
		int visibleNameSpaces=nameSpaces;		
		if ((ob!=null) && uri.equals(ob.uri)) {
			if (!ob.rendered) {					
				ob=(NameSpaceSymbEntry)ob.clone();
                needsClone();
                symb.put(prefix,ob);				
				ob.rendered=true;
				ob.level=visibleNameSpaces;
				return ob.n;
			}						
            ob=(NameSpaceSymbEntry)ob.clone();
            needsClone();
            symb.put(prefix,ob);
			if (outputNode && (((visibleNameSpaces-ob.level)<2) || XMLNS.equals(prefix)) ) {
				ob.level=visibleNameSpaces;
				return null; //Already rendered, just return nulll
			}
			ob.level=visibleNameSpaces;
			return ob.n;
		}	
		
		NameSpaceSymbEntry ne=new NameSpaceSymbEntry(uri,n,true);
		ne.level=nameSpaces;
		ne.rendered=true;
        needsClone();
		symb.put(prefix, ne);
		if (ob != null) {			
			ne.lastrendered=ob.lastrendered;
			
			if ((ob.lastrendered!=null)&& (ob.lastrendered.equals(uri))) {
				ne.rendered=true;
			}
		}	
		return ne.n;
	
public org.w3c.dom.AttrgetMapping(java.lang.String prefix)
Gets the attribute node that defines the binding for the prefix.

param
prefix the prefix to obtain the attribute.
return
null if there is no need to render the prefix. Otherwise the node of definition.

					
		NameSpaceSymbEntry entry=symb.get(prefix);
		if (entry==null) {
			//There is no definition for the prefix(a bug?).
			return null;
		}
		if (entry.rendered) {		
			//No need to render an entry already rendered.
			return null;		
		}
		// Mark this entry as render.
        entry=(NameSpaceSymbEntry) entry.clone();
        needsClone();
        symb.put(prefix,entry);
		entry.rendered=true;
		entry.level=nameSpaces;
		entry.lastrendered=entry.uri;				
		// Return the node for outputing.
		return entry.n;
	
public org.w3c.dom.AttrgetMappingWithoutRendered(java.lang.String prefix)
Gets a definition without mark it as render. For render in exclusive c14n the namespaces in the include prefixes.

param
prefix The prefix whose definition is neaded.
return
the attr to render, null if there is no need to render

					
		NameSpaceSymbEntry entry= symb.get(prefix);
		if (entry==null) {		   
			return null;
		}
		if (entry.rendered) {		
			return null;		
		}
		return entry.n;
	
public voidgetUnrenderedNodes(java.util.Collection result)
Get all the unrendered nodes in the name space. For Inclusive rendering

param
result the list where to fill the unrendered xmlns definitions.

		
	   //List result=new ArrayList();
	   Iterator it=symb.entrySet().iterator();
	   while (it.hasNext()) {	   	   
	   		NameSpaceSymbEntry n=(NameSpaceSymbEntry)(it.next());
	   		//put them rendered?
	   		if ((!n.rendered) && (n.n!=null)) {
	   			result.add(n.n);
	   			n.rendered=true;
	   		}
	   }	   
	
final voidneedsClone()

		if (!cloned) {
            level.remove(level.size()-1);
            level.add(symb);
			symb=(SymbMap) symb.clone();
            cloned=true;
        }
    
public voidoutputNodePop()
Pop a frame for visible namespace.

		nameSpaces--;
		pop();
	
public voidoutputNodePush()
Push a frame for visible namespace. For Inclusive rendering.

		nameSpaces++;
		push();
	
public voidpop()
Pop a frame. Inclusive or Exclusive.

        int size=level.size()-1;
        Object ob= level.remove(size);
        if (ob!=null) {
        	symb=(SymbMap)ob;
            if (size==0) {
               cloned=false;   
            } else
            cloned=(level.get(size-1)!=symb);
        } else {
        	cloned=false;
        }
        
        
	
public voidpush()
Push a frame for a node. Inclusive or Exclusive.

		
		//Put the number of namespace definitions in the stack.
        /**if (cloned) {
        	Object ob[]= {symb,cloned ? symb : null};
        	level.add(ob);
        } **/
        level.add(null);
        cloned=false;