Package railo.runtime.functions.system

Source Code of railo.runtime.functions.system.CallStackGet

package railo.runtime.functions.system;

import railo.commons.io.res.util.ResourceUtil;
import railo.runtime.PageContext;
import railo.runtime.PageContextImpl;
import railo.runtime.ext.function.Function;
import railo.runtime.type.Array;
import railo.runtime.type.ArrayImpl;
import railo.runtime.type.Collection;
import railo.runtime.type.KeyImpl;
import railo.runtime.type.Struct;
import railo.runtime.type.StructImpl;
import railo.runtime.type.UDF;
import railo.runtime.type.util.KeyConstants;

/**
* returns the root of this actuell Page Context
*/
public final class CallStackGet implements Function {

  private static final long serialVersionUID = -5853145189662102420L;
  static final Collection.Key LINE_NUMBER = KeyImpl.init("LineNumber");

  public static Array call(PageContext pc) {
    Array arr=new ArrayImpl();
    _getTagContext(pc, arr, new Exception("Stack trace"),LINE_NUMBER);
    return arr;
  }
 
  public static void _getTagContext(PageContext pc, Array tagContext, Throwable t,Collection.Key lineNumberName) {
    //Throwable root = t.getRootCause();
    Throwable cause = t.getCause();
    if(cause!=null)_getTagContext(pc, tagContext, cause,lineNumberName);
    StackTraceElement[] traces = t.getStackTrace();
    UDF[] udfs = ((PageContextImpl)pc).getUDFs();
   
        int line=0;
    String template;
    Struct item;
    StackTraceElement trace=null;
    String functionName,methodName;
    int index=udfs.length-1;
    for(int i=0;i<traces.length;i++) {
      trace=traces[i];
      template=trace.getFileName();
      if(trace.getLineNumber()<=0 || template==null || ResourceUtil.getExtension(template,"").equals("java")) continue;
      methodName=trace.getMethodName();
      if(methodName!=null && methodName.startsWith("udfCall") && index>-1)
        functionName=udfs[index--].getFunctionName();
     
      else functionName="";
     
      item=new StructImpl();
      line=trace.getLineNumber();
      item.setEL(KeyConstants._function,functionName);
      item.setEL(KeyConstants._template,template);
      item.setEL(lineNumberName,new Double(line));
      tagContext.appendEL(item);
    }
  }
}
TOP

Related Classes of railo.runtime.functions.system.CallStackGet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.