001 /** 002 * Implements the CFML Function writeoutput 003 */ 004 package railo.runtime.functions.other; 005 006 007 import java.io.PrintStream; 008 009 import railo.commons.lang.ExceptionUtil; 010 import railo.commons.lang.StringUtil; 011 import railo.runtime.PageContext; 012 import railo.runtime.exp.PageException; 013 import railo.runtime.ext.function.Function; 014 import railo.runtime.functions.dynamicEvaluation.Serialize; 015 import railo.runtime.op.Caster; 016 import railo.runtime.op.Decision; 017 018 public final class SystemOutput implements Function { 019 public static boolean call(PageContext pc , Object obj) throws PageException { 020 return call(pc, obj, false,false); 021 } 022 public static boolean call(PageContext pc , Object obj, boolean addNewLine) throws PageException { 023 return call(pc, obj, addNewLine, false); 024 } 025 public static boolean call(PageContext pc , Object obj, boolean addNewLine,boolean doErrorStream) throws PageException { 026 String string; 027 if(Decision.isSimpleValue(obj))string=Caster.toString(obj); 028 else { 029 try{ 030 string=Serialize.call(pc, obj); 031 } 032 catch(Throwable t){ 033 string=obj.toString(); 034 } 035 } 036 PrintStream stream = System.out; 037 //string+=":"+Thread.currentThread().getId(); 038 if(doErrorStream) stream = System.err; 039 if(string!=null) { 040 if(StringUtil.indexOfIgnoreCase(string,"<print-stack-trace>")!=-1){ 041 String st = ExceptionUtil.getStacktrace(new Exception("Stack trace"), false); 042 string=StringUtil.replace(string, "<print-stack-trace>", "\n"+st+"\n", true).trim(); 043 } 044 if(StringUtil.indexOfIgnoreCase(string,"<hash-code>")!=-1){ 045 String st = obj.hashCode()+""; 046 string=StringUtil.replace(string, "<hash-code>", st, true).trim(); 047 } 048 } 049 if(addNewLine)stream.println(string); 050 else stream.print(string); 051 052 return true; 053 } 054 }