001    /**
002     * Implements the Cold Fusion 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 string=Serialize.call(pc, obj);
029            
030            
031            PrintStream stream = System.out;
032            //string+=":"+Thread.currentThread().getId();
033            if(doErrorStream) stream = System.err;
034            if(string!=null) {
035                    if(StringUtil.indexOfIgnoreCase(string,"<print-stack-trace>")!=-1){
036                            String st = ExceptionUtil.getStacktrace(new Exception("Stack trace"), false);
037                            string=StringUtil.replace(string, "<print-stack-trace>", "\n"+st+"\n", true).trim();
038                    }
039                    if(StringUtil.indexOfIgnoreCase(string,"<hash-code>")!=-1){
040                            String st = obj.hashCode()+"";
041                            string=StringUtil.replace(string, "<hash-code>", st, true).trim();
042                    }
043            }
044            if(addNewLine)stream.println(string);
045            else stream.print(string);
046            
047            return true;
048        }
049    }