* write out file loop
* @param adapter
* @throws TemplateException
*/
private void writeOutTypeFile(BytecodeContext bc) throws BytecodeException {
WhileVisitor whileVisitor = new WhileVisitor();
loopVisitor=whileVisitor;
GeneratorAdapter adapter = bc.getAdapter();
// charset=@charset
int charset=adapter.newLocal(Types.STRING);
Attribute attrCharset = getAttribute("charset");
if(attrCharset==null) adapter.visitInsn(Opcodes.ACONST_NULL);
else attrCharset.getValue().writeOut(bc, Expression.MODE_REF);
adapter.storeLocal(charset);
// startline=@startline
int startline=adapter.newLocal(Types.INT_VALUE);
Attribute attrStartLine = getAttribute("startline");
if(attrStartLine==null) attrStartLine = getAttribute("from"); // CF8
if(attrStartLine==null) adapter.push(1);
else {
attrStartLine.getValue().writeOut(bc, Expression.MODE_VALUE);
adapter.visitInsn(Opcodes.D2I);
}
adapter.storeLocal(startline);
// endline=@endline
int endline=adapter.newLocal(Types.INT_VALUE);
Attribute attrEndLine = getAttribute("endline");
if(attrEndLine==null) attrEndLine = getAttribute("to");
if(attrEndLine==null) adapter.push(-1);
else {
attrEndLine.getValue().writeOut(bc, Expression.MODE_VALUE);
adapter.visitInsn(Opcodes.D2I);
}
adapter.storeLocal(endline);
//VariableReference index=VariableInterpreter.getVariableReference(pc,@index);
int index=-1,item=-1;
// item
Attribute attrItem = getAttribute("item");
if(attrItem!=null) {
item = adapter.newLocal(Types.VARIABLE_REFERENCE);
adapter.loadArg(0);
attrItem.getValue().writeOut(bc, Expression.MODE_REF);
adapter.invokeStatic(Types.VARIABLE_INTERPRETER, GET_VARIABLE_REFERENCE);
adapter.storeLocal(item);
}
// index
Attribute attrIndex = getAttribute("index");
if(attrIndex!=null) {
index = adapter.newLocal(Types.VARIABLE_REFERENCE);
adapter.loadArg(0);
attrIndex.getValue().writeOut(bc, Expression.MODE_REF);
adapter.invokeStatic(Types.VARIABLE_INTERPRETER, GET_VARIABLE_REFERENCE);
adapter.storeLocal(index);
}
//java.io.File file=FileUtil.toResourceExisting(pc,@file);
int resource=adapter.newLocal(Types.RESOURCE);
adapter.loadArg(0);
getAttribute("file").getValue().writeOut(bc, Expression.MODE_REF);
adapter.invokeStatic(RESOURCE_UTIL, TO_RESOURCE_EXISTING);
adapter.storeLocal(resource);
// pc.getConfig().getSecurityManager().checkFileLocation(resource);
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, GET_CONFIG);
adapter.invokeInterface(Types.CONFIG_WEB, GET_SECURITY_MANAGER);
adapter.loadLocal(resource);
adapter.invokeInterface(Types.SECURITY_MANAGER, CHECK_FILE_LOCATION);
// char[] carr=new char[characters];
Attribute attr = getAttribute("characters");
int carr=-1;
if(attr!=null) {
carr=adapter.newLocal(Types.CHAR_ARRAY);
attr.getValue().writeOut(bc, Expression.MODE_VALUE);
adapter.cast(Types.DOUBLE_VALUE, Types.INT_VALUE);
adapter.newArray(Types.CHAR);
adapter.storeLocal(carr);
}
// BufferedReader reader = IOUtil.getBufferedReader(resource,charset);
final int br=adapter.newLocal(Types.BUFFERED_READER);
adapter.loadLocal(resource);
adapter.loadLocal(charset);
adapter.invokeStatic(IO_UTIL, GET_BUFFERED_READER);
adapter.storeLocal(br);
// String line;
int line=adapter.newLocal(Types.STRING);
// int count=0;
int count=adapter.newLocal(Types.INT_VALUE);
adapter.push(0);
adapter.storeLocal(count);
TryFinallyVisitor tfv=new TryFinallyVisitor(new OnFinally() {
public void writeOut(BytecodeContext bc) {
bc.getAdapter().loadLocal(br);
bc.getAdapter().invokeStatic(IO_UTIL, CLOSE_EL);
}
},null);
//TryFinallyVisitor tcfv=new TryFinallyVisitor();
// try
tfv.visitTryBegin(bc);
//tcfv.visitTryBegin(bc);
// while((line=br.readLine())!=null) {
//WhileVisitor wv=new WhileVisitor();
whileVisitor.visitBeforeExpression(bc);
DecisionObjectVisitor dv=new DecisionObjectVisitor();
dv.visitBegin();
if(attr!=null) {
// IOUtil.read(bufferedreader,12)
adapter.loadLocal(br);
adapter.loadLocal(carr);
adapter.arrayLength();
adapter.invokeStatic(Types.IOUTIL, READ);
}
else {
// br.readLine()
adapter.loadLocal(br);
adapter.invokeVirtual(Types.BUFFERED_READER, READ_LINE);
}
adapter.dup();
adapter.storeLocal(line);
dv.visitNEQ();
adapter.visitInsn(Opcodes.ACONST_NULL);
dv.visitEnd(bc);
whileVisitor.visitAfterExpressionBeforeBody(bc);
//if(++count < startLine) continue;
DecisionIntVisitor dv2=new DecisionIntVisitor();
dv2.visitBegin();
adapter.iinc(count, 1);
adapter.loadLocal(count);
dv2.visitLT();
adapter.loadLocal(startline);
dv2.visitEnd(bc);
Label end=new Label();
adapter.ifZCmp(Opcodes.IFEQ, end);
whileVisitor.visitContinue(bc);
adapter.visitLabel(end);
// if(endLine!=-1 && count > endLine) break;
DecisionIntVisitor div=new DecisionIntVisitor();
div.visitBegin();
adapter.loadLocal(endline);
div.visitNEQ();
adapter.push(-1);
div.visitEnd(bc);
Label end2=new Label();
adapter.ifZCmp(Opcodes.IFEQ, end2);
DecisionIntVisitor div2 = new DecisionIntVisitor();
div2.visitBegin();
adapter.loadLocal(count);
div2.visitGT();
adapter.loadLocal(endline);
div2.visitEnd(bc);
Label end3=new Label();
adapter.ifZCmp(Opcodes.IFEQ, end3);
whileVisitor.visitBreak(bc);
adapter.visitLabel(end3);
adapter.visitLabel(end2);
// index and item
if(index!=-1 && item!=-1) {
// index.set(pc,line);
adapter.loadLocal(index);
adapter.loadArg(0);
adapter.loadLocal(count);
adapter.cast(Types.INT_VALUE,Types.DOUBLE_VALUE);
adapter.invokeStatic(Types.CASTER, Methods.METHOD_TO_DOUBLE_FROM_DOUBLE);
adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
adapter.pop();
// item.set(pc,line);
adapter.loadLocal(item);
adapter.loadArg(0);
adapter.loadLocal(line);
adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
adapter.pop();
}
// only index
else if(index!=-1) {
// index.set(pc,line);
adapter.loadLocal(index);
adapter.loadArg(0);
adapter.loadLocal(line);
adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
adapter.pop();
}
// only item
else {
// item.set(pc,line);
adapter.loadLocal(item);
adapter.loadArg(0);
adapter.loadLocal(line);
adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
adapter.pop();
}
getBody().writeOut(bc);
whileVisitor.visitAfterBody(bc,getEnd());
tfv.visitTryEnd(bc);
}