methodscoldfusioncfc

Find who's calling the method


I'd like to somehow find out which CFC is calling my method.

I have a logging CFC which is called by many different CFC's. On this logging CFC there's a need to store which CFC called for the log.

Whilst I could simply pass the CFC name as an argument to my log.cfc, I find this to be a repetitive task, that might not be necessary, if I somehow could find out "who's" calling the method on log.cfc

Is there any programmatic way of achieving this?

Thanks in advance


Solution

  • Update: As Richard Tingle's answer points out, since CF10 you can use CallStackGet(), which is better than throwing a dummy exception.


    Original answer: The easiest way is to throw a dummy exception and immediately catch it. But this has the downside of making a dummy exception show up in your debug output. For me, this was a deal-breaker, so I wrote the following code (based off of this code on cflib). I wanted to create an object that is similar to a cfcatch object, so that I could use it in places that expected a cfcatch object.

    Note: You may have to adjust this code a bit to make it work in CF8 or earlier. I don't think the {...} syntax for creating object was supported prior to CF9.

    StackTrace = { 
      Type= 'StackTrace',
      Detail= '',
      Message= 'This is not a real exception. It is only used to generate debugging information.',
      TagContext= ArrayNew(1)
    };
    j = CreateObject("java","java.lang.Thread").currentThread().getStackTrace();
    
    for (i=1; i LTE ArrayLen(j); i++)
    {
      if(REFindNoCase("\.cf[cm]$", j[i].getFileName())) {
        ArrayAppend(StackTrace.TagContext, {
          Line= j[i].getLineNumber(),
          Column= 0,
          Template= j[i].getFileName()
        });
      }
    }