FileDocCategorySizeDatePackage
NodeSetType.javaAPI DocJava SE 5 API11556Fri Aug 26 14:55:38 BST 2005com.sun.org.apache.xalan.internal.xsltc.compiler.util

NodeSetType

public final class NodeSetType extends Type
author
Jacek Ambroziak
author
Santiago Pericas-Geertsen

Fields Summary
Constructors Summary
protected NodeSetType()

Methods Summary
public com.sun.org.apache.bcel.internal.generic.InstructionLOAD(int slot)

	return new ALOAD(slot);
    
public com.sun.org.apache.bcel.internal.generic.InstructionSTORE(int slot)

	return new ASTORE(slot);
    
public java.lang.StringgetClassName()
Returns the class name of an internal type's external representation.

	return(NODE_ITERATOR);
    
private voidgetFirstNode(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
Some type conversions require gettting the first node from the node-set. This function is defined to avoid code repetition.

	final ConstantPoolGen cpg = classGen.getConstantPool();
	final InstructionList il = methodGen.getInstructionList();
	il.append(new INVOKEINTERFACE(cpg.addInterfaceMethodref(NODE_ITERATOR,
								NEXT,
								NEXT_SIG), 1));
    
public booleanidenticalTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type other)

	return this == other;
    
public com.sun.org.apache.bcel.internal.generic.TypetoJCType()

	return new com.sun.org.apache.bcel.internal.generic.ObjectType(NODE_ITERATOR);
    
public java.lang.StringtoSignature()

	return NODE_ITERATOR_SIG;
    
public java.lang.StringtoString()

	return "node-set";
    
public voidtranslateBox(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
Translates an object of this type to its boxed representation.

	translateTo(classGen, methodGen, Type.Reference);
    
public voidtranslateFrom(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, java.lang.Class clazz)
Translates an external Java Class into an internal type. Expects the Java object on the stack, pushes the internal type

		
  	InstructionList il = methodGen.getInstructionList();
	ConstantPoolGen cpg = classGen.getConstantPool();
	if (clazz.getName().equals("org.w3c.dom.NodeList")) {
	   // w3c NodeList is on the stack from the external Java function call.
	   // call BasisFunction to consume NodeList and leave Iterator on
	   //    the stack. 
	   il.append(classGen.loadTranslet());   // push translet onto stack
	   il.append(methodGen.loadDOM());   	 // push DOM onto stack
	   final int convert = cpg.addMethodref(BASIS_LIBRARY_CLASS,
					"nodeList2Iterator",
					"("		
					 + "Lorg/w3c/dom/NodeList;"
					 + TRANSLET_INTF_SIG 
					 + DOM_INTF_SIG 
					 + ")" + NODE_ITERATOR_SIG );
	   il.append(new INVOKESTATIC(convert));
	}
	else if (clazz.getName().equals("org.w3c.dom.Node")) {
	   // w3c Node is on the stack from the external Java function call.
	   // call BasisLibrary.node2Iterator() to consume Node and leave 
	   // Iterator on the stack. 
	   il.append(classGen.loadTranslet());   // push translet onto stack
	   il.append(methodGen.loadDOM());   	 // push DOM onto stack
	   final int convert = cpg.addMethodref(BASIS_LIBRARY_CLASS,
					"node2Iterator",
					"("		
					 + "Lorg/w3c/dom/Node;"
					 + TRANSLET_INTF_SIG 
					 + DOM_INTF_SIG 
					 + ")" + NODE_ITERATOR_SIG );
	   il.append(new INVOKESTATIC(convert));
	}
	else {
	    ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
		toString(), clazz.getName());
	    classGen.getParser().reportError(Constants.FATAL, err);
	} 
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.RealType type)
Expects a node-set on the stack and pushes a real. First the node-set is converted to string, and from string to real.

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	translateTo(classGen, methodGen, Type.String);
	Type.String.translateTo(classGen, methodGen, Type.Real);	
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.NodeType type)
Expects a node-set on the stack and pushes a node.

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	getFirstNode(classGen, methodGen);
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.ObjectType type)
Subsume node-set into ObjectType.

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	    methodGen.getInstructionList().append(NOP);	
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.ReferenceType type)
Expects a node-set on the stack and pushes a boxed node-set. Node sets are already boxed so the translation is just a NOP.

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	methodGen.getInstructionList().append(NOP);
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, java.lang.Class clazz)
Translates a node-set into the Java type denoted by clazz. Expects a node-set on the stack and pushes an object of the appropriate type after coercion.

	final ConstantPoolGen cpg = classGen.getConstantPool();
	final InstructionList il = methodGen.getInstructionList();
	final String className = clazz.getName();

	il.append(methodGen.loadDOM());
	il.append(SWAP);

	if (className.equals("org.w3c.dom.Node")) {
	    int index = cpg.addInterfaceMethodref(DOM_INTF,
						  MAKE_NODE,
						  MAKE_NODE_SIG2);
	    il.append(new INVOKEINTERFACE(index, 2));
	}
        else if (className.equals("org.w3c.dom.NodeList") || 
                 className.equals("java.lang.Object")) {
	    int index = cpg.addInterfaceMethodref(DOM_INTF,
						  MAKE_NODE_LIST,
						  MAKE_NODE_LIST_SIG2);
	    il.append(new INVOKEINTERFACE(index, 2));
	}
        else if (className.equals("java.lang.String")) {
            int next = cpg.addInterfaceMethodref(NODE_ITERATOR,
                                                 "next", "()I");
            int index = cpg.addInterfaceMethodref(DOM_INTF,
                                                 GET_NODE_VALUE,
                                                 "(I)"+STRING_SIG);

            // Get next node from the iterator
            il.append(new INVOKEINTERFACE(next, 1));
            // Get the node's string value (from the DOM)
            il.append(new INVOKEINTERFACE(index, 2));
                       
        }
	else {
	    ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
					toString(), className);
	    classGen.getParser().reportError(Constants.FATAL, err);
	}
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type type)
Translates a node-set into an object of internal type type. The translation to int is undefined since node-sets are always converted to reals in arithmetic expressions.

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	if (type == Type.String) {
	    translateTo(classGen, methodGen, (StringType) type);
	}
	else if (type == Type.Boolean) {
	    translateTo(classGen, methodGen, (BooleanType) type);
	}
	else if (type == Type.Real) {
	    translateTo(classGen, methodGen, (RealType) type);
	}
	else if (type == Type.Node) {
	    translateTo(classGen, methodGen, (NodeType) type);
	}
	else if (type == Type.Reference) {
	    translateTo(classGen, methodGen, (ReferenceType) type);
	}
	else if (type == Type.Object) {
	    translateTo(classGen, methodGen, (ObjectType) type);
	}
	else {
	    ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
					toString(), type.toString());
	    classGen.getParser().reportError(Constants.FATAL, err);
	}
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.BooleanType type)
Translates a node-set into a synthesized boolean. The boolean value of a node-set is "true" if non-empty and "false" otherwise. Notice that the function getFirstNode() is called in translateToDesynthesized().

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	final InstructionList il = methodGen.getInstructionList();
	FlowList falsel = translateToDesynthesized(classGen, methodGen, type);
	il.append(ICONST_1);
	final BranchHandle truec = il.append(new GOTO(null));
	falsel.backPatch(il.append(ICONST_0));
	truec.setTarget(il.append(NOP));
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.StringType type)
Translates a node-set into a string. The string value of a node-set is value of its first element.

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	final InstructionList il = methodGen.getInstructionList();
	getFirstNode(classGen, methodGen);
	il.append(DUP);
	final BranchHandle falsec = il.append(new IFLT(null));
	Type.Node.translateTo(classGen, methodGen, type);
	final BranchHandle truec = il.append(new GOTO(null));
	falsec.setTarget(il.append(POP));
	il.append(new PUSH(classGen.getConstantPool(), ""));
	truec.setTarget(il.append(NOP));
    
public com.sun.org.apache.xalan.internal.xsltc.compiler.FlowListtranslateToDesynthesized(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.BooleanType type)
Translates a node-set into a non-synthesized boolean. It does not push a 0 or a 1 but instead returns branchhandle list to be appended to the false list.

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateToDesynthesized

	final InstructionList il = methodGen.getInstructionList();
	getFirstNode(classGen, methodGen);
	return new FlowList(il.append(new IFLT(null)));
    
public voidtranslateUnBox(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
Translates an object of this type to its unboxed representation.

	methodGen.getInstructionList().append(NOP);