The application framework in Adobe ColdFusion and Lucee is quite powerful; however, there are some complications when trying to extend functionality to application components that reside in the web root directory. I wrote an article years ago on this topic, but I want to revisit it using modern versions of ColdFusion and Lucee and expand upon it.


ColdFusion Component Inheritance

ColdFusion components use the extends attribute to implement a relationship between two components using object-oriented inheritance.

The child component using this extends attribute will become a child object that inherits all the methods and properties of the parent component being extended. This creates a typical class-based hierarchy that follows the 'A' rule (a dog is an animal) and promotes code reusability

The implementation of this inherited relationship using the extends attribute is quite straightforward:


<cfcomponent extends="Application">

You can extend ColdFusion/Lucee components in many ways. I personally use dot notation as I would when invoking a component. For example, if the component that you want to extend is in the same directory, specify the name of the CFC in the extends attribute. If the cfc is in a different directory, such as the blog directory, simply use extends="blog.application". However, as we will see, things get tricky when trying to extend application.cfc's to and from the root web directory.


Problems When Extending Application.cfc's in the Root Directory

ColdFusion and Lucee have issues when trying to extend an application.cfc from the web root directory. The problem appears that ColdFusion and Lucee are not able to distinguish the application.cfc in the root directory. This issue has been present since 2005.

Adobe ColdFusion 2023 raises the following error: 'The Application component or interface cannot extend itself.'
Lucee's error is a bit more cryptic: java.lang.StackOverflowError unkown source'.

However, as I mentioned in one of my previous articles, there are solutions to this issue, which I will expand upon in this article.


Extending the Root Application.cfc from a Sub Directory


If you need to extend the Application.cfc, which resides in the root directory, you need to use a proxy component that lives in the root directory alongside the application.cfc. The root Application.cfc extends to the proxy in the root directory, and the child application.cfc in a subdirectory extends the proxy component in the root directory.


Components in Root Directory


Application.cfc The parent application.cfc in the root directory does not have an extends statement.

RootProxy.cfc

The empty RootProxy.cfc, also in the root directory, extends the application.cfc. You can name this component anything you want; it just needs to extend the parent application.cfc. Note this component is empty (you can put comments in it though):

<cfcomponent extends="Application">
</cfcomponent>


Child Application.cfc in Sub-Directory

The child component in a subdirectory extends the RootProxy.cfc (or whatever name you chose for the proxy) in the root directory.

<cfcomponent sessionmanagement="yes" clientmanagement="yes" output="yes" extends="Proxy">


Click on the thumbnail below for an illustration.


Extending a Application.cfc Within a Sub Directory to an Application.cfc in the Root Directory

The directory structure does not govern the parent-child relationship. A parent component can be located in a subdirectory, whereas the child component can be placed in the root directory and we can flip the previous example upside down when extending a parent CFC, found in a subdirectory, to the root directory.

In this scenario, we will invert the previous example to extend an application inside a subdirectory to the application.cfc in the root directory using a proxy.cfc. Click on the thumbnail below to illustrate how to extend application.cfc's bi-directionally:



Things to Watch Out For

There are a few things to watch out for when using this approach to extend to/from a root directory. First, for some reason, dynamic application names will not work. You must hard-code your this.name in your application.cfc. 

<cfset this.name = "GalaxieBlog4" />

Additionally, any custom Java code loaded using JavaLoadPaths may not function within the child application, and you should employ a different approach when loading custom JAR files. For example, if an error occurs when loading your .jar file to load a custom library, place the jar file in the lib directory of the ColdFusion root instead.


Further Reading: