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    }