FileDocCategorySizeDatePackage
LiteralAttribute.javaAPI DocJava SE 6 API5142Tue Jun 10 00:22:28 BST 2008com.sun.org.apache.xalan.internal.xsltc.compiler

LiteralAttribute

public final class LiteralAttribute extends Instruction
author
Jacek Ambroziak
author
Santiago Pericas-Geertsen
author
Morten Jorgensen

Fields Summary
private final String
_name
private final AttributeValue
_value
Constructors Summary
public LiteralAttribute(String name, String value, Parser parser, SyntaxTreeNode parent)
Creates a new literal attribute (but does not insert it into the AST).

param
name the attribute name (incl. prefix) as a String.
param
value the attribute value.
param
parser the XSLT parser (wraps XPath parser).

	_name = name;
        setParent(parent);
	_value = AttributeValue.create(this, value, parser);
    
Methods Summary
protected booleancontextDependent()

	return _value.contextDependent();
    
public voiddisplay(int indent)

	indent(indent);
	Util.println("LiteralAttribute name=" + _name + " value=" + _value);
    
public java.lang.StringgetName()
Return the name of the attribute

        return _name;
    
public com.sun.org.apache.xalan.internal.xsltc.compiler.AttributeValuegetValue()
Return the value of the attribute

        return _value;
    
private booleanhasBadChars(java.lang.String value)
Return true if at least one character in the String is considered to be a "bad" character. A bad character is one whose code is: less than 32 (a space), or greater than 126, or it is one of '<', '>', '&' or '\"'. This helps the serializer to decide whether the String needs to be escaped.

    	char[] chars = value.toCharArray();
    	int size = chars.length;
    	for (int i = 0; i < size; i++) {
    	    char ch = chars[i];
    	    if (ch < 32 || 126 < ch || ch == '<" || ch == '>" || ch == '&" || ch == '\"")
                return true;    	        
    	}
    	return false;
    
public voidtranslate(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)

	final ConstantPoolGen cpg = classGen.getConstantPool();
	final InstructionList il = methodGen.getInstructionList();

	// push handler
	il.append(methodGen.loadHandler());
	// push attribute name - namespace prefix set by parent node
	il.append(new PUSH(cpg, _name));
	// push attribute value
	_value.translate(classGen, methodGen);
	
	// Generate code that calls SerializationHandler.addUniqueAttribute()
	// if all attributes are unique.
	SyntaxTreeNode parent = getParent();
	if (parent instanceof LiteralElement
	    && ((LiteralElement)parent).allAttributesUnique()) {	    
	    
	    int flags = 0;
	    boolean isHTMLAttrEmpty = false;
	    ElemDesc elemDesc = ((LiteralElement)parent).getElemDesc();
	    
	    // Set the HTML flags
	    if (elemDesc != null) {
	    	if (elemDesc.isAttrFlagSet(_name, ElemDesc.ATTREMPTY)) {
	    	    flags = flags | SerializationHandler.HTML_ATTREMPTY;
	    	    isHTMLAttrEmpty = true;
	    	}
	    	else if (elemDesc.isAttrFlagSet(_name, ElemDesc.ATTRURL)) {
	    	    flags = flags | SerializationHandler.HTML_ATTRURL;
	    	}
	    }
	    
	    if (_value instanceof SimpleAttributeValue) {
	        String attrValue = ((SimpleAttributeValue)_value).toString();
	        
	        if (!hasBadChars(attrValue) && !isHTMLAttrEmpty) {
	            flags = flags | SerializationHandler.NO_BAD_CHARS;
	        }
	    }
	        
	    il.append(new PUSH(cpg, flags));
	    il.append(methodGen.uniqueAttribute());
	}
	else {
	    // call attribute
	    il.append(methodGen.attribute());
	}
    
public com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypetypeCheck(com.sun.org.apache.xalan.internal.xsltc.compiler.SymbolTable stable)

	_value.typeCheck(stable);
	typeCheckContents(stable);
	return Type.Void;