FileDocCategorySizeDatePackage
TransletOutput.javaAPI DocJava SE 5 API4613Fri Aug 26 14:55:36 BST 2005com.sun.org.apache.xalan.internal.xsltc.compiler

TransletOutput

public final class TransletOutput extends Instruction
author
Morten Jorgensen

Fields Summary
private Expression
_filename
private boolean
_append
Constructors Summary
Methods Summary
public voiddisplay(int indent)
Displays the contents of this element.

	indent(indent);
	Util.println("TransletOutput: " + _filename);
    
public voidparseContents(com.sun.org.apache.xalan.internal.xsltc.compiler.Parser parser)
Parse the contents of this element. The only attribute we recognise is the 'file' attribute that contains teh output filename.

	// Get the output filename from the 'file' attribute
	String filename = getAttribute("file");
        
        // If the 'append' attribute is set to "yes" or "true",
        // the output is appended to the file.
        String append   = getAttribute("append");

	// Verify that the filename is in fact set
	if ((filename == null) || (filename.equals(EMPTYSTRING))) {
	    reportError(this, parser, ErrorMsg.REQUIRED_ATTR_ERR, "file");
	}

	// Save filename as an attribute value template
	_filename = AttributeValue.create(this, filename, parser);
        
        if (append != null && (append.toLowerCase().equals("yes") ||
            append.toLowerCase().equals("true"))) {
          _append = true;     
        }
        else
          _append = false;
          
	parseChildren(parser);
    
public voidtranslate(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
Compile code that opens the give file for output, dumps the contents of the element to the file, then closes the file.

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

	// Save the current output handler on the stack
	il.append(methodGen.loadHandler());
	
	final int open =  cpg.addMethodref(TRANSLET_CLASS,
					   "openOutputHandler",
                                           "(" + STRING_SIG + "Z)" +
					   TRANSLET_OUTPUT_SIG);

	final int close =  cpg.addMethodref(TRANSLET_CLASS,
					    "closeOutputHandler",
					    "("+TRANSLET_OUTPUT_SIG+")V");

	// Create the new output handler (leave it on stack)
	il.append(classGen.loadTranslet());
	_filename.translate(classGen, methodGen);
        il.append(new PUSH(cpg, _append));
	il.append(new INVOKEVIRTUAL(open));

	// Overwrite current handler
	il.append(methodGen.storeHandler());
	
	// Translate contents with substituted handler
	translateContents(classGen, methodGen);

	// Close the output handler (close file)
	il.append(classGen.loadTranslet());
	il.append(methodGen.loadHandler());
	il.append(new INVOKEVIRTUAL(close));

	// Restore old output handler from stack
	il.append(methodGen.storeHandler());
    
public com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypetypeCheck(com.sun.org.apache.xalan.internal.xsltc.compiler.SymbolTable stable)
Type checks the 'file' attribute (must be able to convert it to a str).

	final Type type = _filename.typeCheck(stable);
	if (type instanceof StringType == false) {
	    _filename = new CastExpr(_filename, Type.String);
	}
	typeCheckContents(stable);
	return Type.Void;