Showing posts with label config. Show all posts
Showing posts with label config. Show all posts

Pipi Nestspace update - what I learned this week

Mike's Notes

The experiments continue, with progress slow but steady, and with a lot of new stuff learned.

Ongoing test results at the end. This one seems to be working without error.

😎😎😎😎

Update 19/04/2026

  • Nestspace /9cc/ passed all critical tests
  • The next job is to add the System Engine (sys) to nestspace /9cc/ and test it.
  • Then add a Nestspace Engine (nst) inside the System Engine (sys) to enable Pipi to build, configure, and repair nestspaces on demand, so that Pipi can then deploy itself to production and also create archives of itself.
Update 18/05/2025
  • Create a NEST mapping
  • Add Application.cfc to /9cc/
  • Add nest_boxlang.cfm, nest_cfml_engine.cfm, nest_java.cfm, nest_os.cfm to /9cc/

Update 27/05/2026

Nest Engine (nst) renamed as Nestspace Engine (nst)

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

2705/2026

Pipi Nestspace update - what I learned this week

By: Mike Peters
On a Sandy Beach: 15/04/2026

Mike is the inventor and architect of Pipi and the founder of Ajabbi.

Problem

Last week, I created Pipi Nestspace, a container that uses the standard root directory convention to host Pipi.

  1. The problem I discovered was that a standard deployment was not working across multiple CFML Engine environments on various operating systems.
    • Adobe ColdFusion Server 11+
    • Lucee
    • BoxLang
  2. Pipi (robot version) is required to manipulate enterprise applications.
  3. Mission Control requires a website
  4. Some of the configuration files were outside the webroot.
    • Application.cfc (1), (2)

Solution

  • Install side by side in <pipi nest>/pipi/
    • <user account>/ (none, one, or many)
    • <pipi instance-n>/ (one or many)
  • <nestspace>/pipi/<pipi instance>/www/
    • mission-control/
  • Create CFML server mappings where a Pipi Instance is the only user.
    • data/
    • pipi/
    • work/

Database support

Adobe ColdFusion, Lucee, and BoxLang are all built on the Java Virtual Machine (JVM). This means they can technically connect to any relational database that provides a JDBC (Java Database Connectivity) driver

Pipi Core example (Windows)

/9cc/ (Nestspace)

  • Application.cfc
  • nest_boxlang.cfm
  • nest_cfml_engine.cfm
  • nest_java.cfm
  • nest_os.cfm
  • nest_probe.cfm
  • data/
    • pipi_data.cfm
    • couchbase/
    • db2/
    • derby/
    • h2/
    • hsqldb/
    • informix/
    • mariadb/
    • msaccess/
      • 32/
      • 64/
    • mssql/
    • mysql/
    • oracle/
    • pg/
      • 18/
    • sqllite/
    • sybase/
    • virtuoso/
  • pipi/
      • Application.cfc (1) - Nest settings
      • pipi_nest.cfm
      • loki-01/ (instance)
        • ...
      • loki-02/ (instance)
        • Application.cfc (2) - Account settings
        • pipi_account.cfm
        • pip/
          • Application.cfc (3) - Version settings
          • pipi_version.cfm
          • i18n/
          • log/
          • pipi_<pipi version>.txt
          • sys/
            • Application.cfc (4) - System settings
            • pipi_system.cfm
          • temp/
          • template/
            • _include/
            • _layout/
              • _log/
        • www/
          • mission-control/
            • Application.cfc (4) - Website settings
    • work/
      • pipi_work.cfm
      • backup/
      • install/
      • project/

    Pipi Enterprise example (Windows)

    /9ae/ (Nestspace)

    • Application.cfc
    • nest_boxlang.cfm
    • nest_cfml_engine.cfm
    • nest_java.cfm
    • nest_os.cfm
    • nest_probe.cfm
    • data/
      • pipi_data.cfm
      • couchbase/
      • db2/
      • derby/
      • h2/
      • hsqldb/
      • informix/
      • mariadb/
      • msaccess/
        • 32/
        • 64/
      • mssql/
      • mysql/
      • oracle/
      • pg/
        • 18/
      • sqllite/
      • sybase/
      • virtuoso/
    • pipi/
      • Application.cfc (1) - Nest settings
      • pipi_nest.cfm
      • ajabbi/ (Account Name)
        • Application.cfc (2) - Account settings
        • pipi_account.cfm
        • com/
        • dat/
        • lib/
        • log/
        • plu/
        • tmp/
        • www/
          • learn.ajabbi.com/
            • Application.cfc (4) - Website settings
          • wiki.ajabbi.com/
            • Application.cfc (4) - Website settings
      • dis-01/ (Instance)
      • ...
      • dis-04/ (Instance)
        • Application.cfc (2) - Account settings
        • pipi_account.cfm
        • pip/
          • Application.cfc (3) - Version settings
          • pipi_version.,cfm
          • i18n/
          • log/
          • pipi_<pipi version>.txt
          • sys/
            • Application.cfc (4) - System settings
            • pipi_system.,cfm
          • temp/
          • template/
            • _include/
            • _layout/
              • _log/
        • www/
          • mission-control/
            • Application.cfc (4) - Website settings
    • work/
      • pipi_work.cfm
      • backup/
        • pipi_9ae_ajabbi_pip_www_learn.ajabbi.com_20260411.zip
      • install/
      • project/

    Automated installs

    • Adobe ColdFusion Server 11+: Many XML files store the server configuration. Any pipi instance doing Pipi Nest installs could rewrite these XML files.
    • Lucee: Yet to discover
    • BoxLang: Yet to discover

    Production obfuscation

    Pipi will obfuscate these names using UUIDs and other dastardly methods on public-facing production websites. But the names are very useful for UI labels and visualisation.


    DevOps log (edit)

    A record of work done.

    NZ DateTime Action Object Status
    2026-04-15 14:15 Edit server.xml Mappings Success
    2026-04-15 14:20 Create Mapping Docs Complete
    2026-04-15 14:26 Rename Named instances Success
    2026-04-15 14:48 Create Mission Control Success
    2026-04-15 17:24 Test Application.cfc (1) - Pipi Nest settings Success
    2026-04-15 17:40 Test pipi_nest.cfm Success
    2026-04-16 13:22 Test pipi_account.cfm Success
    2026-04-16 13:54 Test Application.cfc (2) - Pipi Account settings
    Not inheriting Application.cfc (1)
    Success
    2026-04-16 15:09 Test Application.cfc (3) - Version settings Success
    2026-04-16 15:40 Test pipi_version.cfm Success
    2026-04-16 16:02 Test Application.cfc (4) - Pipi Website settings Success
    2026-04-16 16:03 Test pipi_website.cfm Success
    2026-04-16 19:09 Create Named instance website Success
    2026-04-16 19:44 Test pipi_nest_probe.cfm Success
    2026-04-16 20:28 Test java.lang.System class - get properties Success
    2026-04-17 11:23 Test Add a 32-bit datasource using the CFML Engine CFIDE Success
    2026-04-17 11:56 Test Add a 64-bit datasource using the CFML Engine CFIDE Success
    2026-04-17 13:33 Test Add a datasource using Coldfusion Administrator API
    • couchbase/
    • db2/
    • derby/
    • h2/
    • hsqldb/
    • informix/
    • mariadb/
    • msaccess/
    • mssql/
    • mysql/
    • oracle/
    • pg/
    • sqllite/
    • sybase/
    • virtuoso/
    Success
    2026-04-19 18:00 Demo 9cc/ live demo to Open Research Group Success

    Changes to the Pipi System Engine (sys) data model

    Mike's Notes

    The next job is to write the 6 configuration files for each Nestspace.

    A big thanks is owed to Ben Nadel for the sample code he shared on his CFML blog, which explained some ways to do this.

    Resources

    References

    • Reference

    Repository

    • Home > Ajabbi Research > Library >
    • Home > Handbook > 

    Last Updated

    27/05/2026

    Changes to the Pipi System Engine (sys) data model

    By: Mike Peters
    On a Sandy Beach: 12/04/2026

    Mike is the inventor and architect of Pipi and the founder of Ajabbi.

    Changes this week to how Pipi is organised in the data centre continue.

    This job is to write the 6 base configuration files for each Nestspace. Because the recent code tests were successful, most of the time will be spent documenting. This should only need to be done once. The 6 files can be done sequentially, starting from the root.

    Pipi Nest

    The fundamental organising principle is to use a uniquely named "Nestspace" directory to host Pipi.

    Every nestspace has these properties;

    • One Pipi major version
    • One Pipi edition
    • One account type
    • Can host
      • One or more accounts
      • AND
      • One or more Pipi instances.

    Account

    Every customer or user has an account, which is opened when they sign up.

    A customer account has these properties;

    • One account type.
    • Contains one or more deployments.

    Pipi Instance

    Each Pipi instance has these properties;
    • One account name, e.g., "loki-01".
    • Shares a codebase, e.g., "loki".

    Deployment

    A deployment has these properties;

    • One deployment tenancy type.
    • One language.
    • Contains one or more deployment objects.
    • Can contain other deployments to create global settings for an account (Enterprise or DevOps).

    Revised Configuration Hierarchy

    Child files inherit properties from parent files and can also override them.

    • Nestspace > Account > Deployment > Deployment Object > Publication > Website > Workspace.
    • Pipi Nest > Codebase > Pipi Instance.

    Configuration files

    Pipi uses a hierarchy of CFML configuration files to set system properties.

    <nestspace>/
    • nest_probe.cfm
    • pipi/
      • Application.cfc [1]
      • pipi_nest.cfm
      • <name>/
        • Application.cfc [2]
        • pipi_account.cfm
        • pip/
          • Application.cfc [3]
          • pipi_system.cfm

    Configuration notes

    The 3 different Application.cfc files are common across all Pipi Nests and don't ever change.

    Application.cfc [1] defines Nestspace variables

    • OS
    • Java environment
    • Platform-appropriate absolute physical path
    • Nest datasources

    Application.cfc [2] defines Name variables

    • Account name
    • Deployments
    • Pipi Instances

    Application.cfc [3] defines System variables

    • Version
    • Edition
    • State

    The .cfm files contain specific local configuration variables that can be directly edited by Pipi.

    • nest_probe.cfm
    • pipi_nest.cfm
    • pipi_account.cfm
    • pipi_system.cfm

      Example

      This is the list of 7 configuration files for the Nestspace 9cc/

      • 9cc/pipi_nest_probe.cfm
      • 9cc/pipi/Application.cfc
      • 9cc/pipi/pipi_nest.cfm
      • 9cc/pipi/loki/Application.cfc
      • 9cc/pipi/loki/pipi_account.cfm
      • 9cc/pipi/loki/pip/Application.cfc
      • 9cc/pipi/loki/pip/pipi_system.cfm

      Nestspace

      Mike's Notes

      Thursday, 09/04/2026 (NZ time) was the longest day. I couldn't make a single mistake, so I turned off the phone and the internet to concentrate from 8am to 9pm, then slept like a log. I was a walking zombie yesterday. I'm glad this will never need to be done again.

      This is the successful culmination of months of mentally challenging preparatory work for the new Pipi Core data centre.

      A typical day for me is

      • 50% learning
      • 40% thinking
      • 10% doing

      The less I do, the more productive the solutions. The faster the progress.

      Speed will come from Pipi-driven automation, not Mike working harder.

      Resources

      References

      • Reference

      Repository

      • Home > Ajabbi Research > Library >
      • Home > Handbook > 

      Last Updated

      23/07/2026

      Nestspace

      By: Mike Peters
      On a Sandy Beach: 10/04/2026

      Mike is the inventor and architect of Pipi and the founder of Ajabbi.

      Inside the Pipi Core data centre, the careful migration and reorganisation of hundreds of thousands of Pipi-related files began and were completed yesterday. Each file or directory was placed in only one Nestspace, and then the historical Nestspaces were converted into zip​ archives

      It is a good solution, but it took a month of trial and error to figure out. It had to be 100% correct to enable rapid, reliable data centre automation, self-managed by Pipi.

      It was fascinating to watch the recent Lex Fridman interview with NVIDIA CEO Jensen Huang, who described NVIDIA's large-scale problem-solving process.

      Problems to solve

      A large number of problems had to be solved in parallel. Each problem affected the others.

      • Where to put self-organising Pipi swarms.
      • Pipi instances
        • Naming
        • Self-evolving
        • Versioning
      • How to use DevOps automation with all of the above.
      • The knock-on effects on
        • Namespaces
        • Backups
        • Replication
        • Accounts
        • Workspaces
        • i18n
        • Web URLs
        • Developer documentation
        • Training
        • etc.
      • Securing 100% security and privacy
      • Cross-platform and environment portability

      This has led to changes in the underlying Pipi System Engine (sys) data model, which I will write about tomorrow.

      Nestspace

      The fundamental organising principle is to use a uniquely named directory, now named as a "Nestspace".

      The unique name is a string combination made of

      • <pipi major version> (integer)
      • <pipi edition> (single lowercase letter)
      • <account type> (single lowercase letter)

      Data Centre / DevOps

      Here are some examples.

      • 6pg/
      • 9ae/

      Backups

      Customer backup examples.

      • pipi_9ae_ajabbi_data_pg_20260411
      • pipi_9ae_ajabbi_pipi_www_learn.ajabbi.com_20260411

      Archiving

      Here are some examples.

      • pipi_6pg_20180219.zip
      • pipi_9ae_20241211.zip

      Next job

      Now, I can start configuring the files and settings for each Nestspace. The necessary code has already been successfully tested. Eventually, this process will be completely automated.

      • Application.cfc
      • server.xml
      • Datasources
      • OS environment
      • Java
      • Application server
      • Cloud platform
      • REPL

      Speed is King

      Then, each Pipi will be back in business and can be left running 24x7 in its own Nestspace, thereby increasing DevOps speed by at least 10x. The priority now is to increase Pipi's Data Centre speed by 1000x using automation and keep going. So what previously took a year can be done in an hour. The over-optimistic complete deadline is June 2026.

      But nothing happens as expected

      It is hard to make completion predictions when this architecture is completely novel, and everything is uncharted territory and hellish difficult. Everything is a back-of-the-envelope guess. I'm slowly getting there ... 

      "like a man riding a drunken donkey facing the tail, two steps forwards, one step backwards"

      ... enjoying the whole journey and it's a hell of a lot of fun. 

      Future customers

      The increase in speed will also directly benefit all future customers using the SaaS workspace applications. Deployments, configuration, and updates will also get the same 1000x speed increases at no extra cost.

      Pipi naming pattern

      Mike's Notes

      It was helpful talking over automation with Alex a few nights ago.

      There are hundreds of thousands of files to be put somewhere in the new data centre using automation.

      Resources

      References

      • Reference

      Repository

      • Home > Ajabbi Research > Library >
      • Home > Handbook > 

      Last Updated

      27/05/2026

      Pipi naming pattern

      By: Mike Peters
      On a Sandy Beach: 07/04/2026

      Mike is the inventor and architect of Pipi and the founder of Ajabbi.

      This is the new naming pattern for every version, edition and account type of Pipi since 1997. These names are ASCI lowercase for compatibility with Windows, Linux, Solaris, MacOS, etc. This is now named the Nestspace.

      It is highly deterministic, enabling safe, reliable automation.

      Assumptions

      Pipi versions 1-8 had no editions or account types, so these default names will be used.

      • Edition = "p" (Pipi)
      • Account Type = "g" (General)

      Archive

      All existing files, including research materials, experiments, sample code, web crawls, and notes, will be moved to these locations. The archive format is a ZIP file with a date string appended. An example would be;

      • pipi_7pg_20201230.zip

      Production

      It is also the root deployment directory. An example would be;

      • pipi/9ae/


      Major Version Edition Account Type Pipi Nest
      1 p g 1pg
      2 p g 2pg
      3 p g 3pg
      4 p g 4pg
      5 p g 5pg
      6 p g 6pg
      7 p g 7pg
      8 p g 8pg
      9 a a 9aa
      9 a d 9ad
      9 a e 9ae
      9 a p 9ap
      9 a r 9ar
      9 a s 9as
      9 a t 9at
      9 c c 9cc
      9 i i 9ii
      9 r b 9rb
      10 a a 10aa
      10 a d 10ad
      10 a e 10ae
      10 a p 10ap
      10 a r 10ar
      10 a s 10as
      10 a t 10at
      10 c c 10cc
      10 i i 10ii
      10 r b 10rb

      Pipi Core directory structure

      Mike's Notes

      Here are some recent changes, and no doubt there will be many more on the road to autonomous automated production. This has been driven by;

      • Application.cfc configuration
      • Cross-platform deployment
      • Cost reduction
      • Security
      • Privacy
      • Archiving
      • Import previous versions
      • Generate future versions

      Editions

      Setting up the data centre has resulted in Pipi 9 being explicitly split into 4 editions this week, each with a different role. They all work together to provide socially useful critical infrastructure services.

      • Pipi Application
      • Pipi Core
      • Pipi IaC
      • Pipi Robot

      Pipi Application

      SaaS applications that run in the cloud (AWS, Azure, GCP, IBM, Oracle, etc).

      Pipi Core

      The mother ship runs in the isolated data centre.

      Pipi IaC

      A slave of Pipi Core, it uses Infrastructure as Code (IaC) to deploy into the cloud.

      Pipi Robot

      A slave of Pipi Core, it runs in the cloud to super-administer all SaaS applications.

      Resources

      References

      • Reference

      Repository

      • Home > Ajabbi Research > Library >
      • Home > Handbook > 

      Last Updated

      27/05/2026

      Pipi Core directory structure

      By: Mike Peters
      On a Sandy Beach: 07/04/2026

      Mike is the inventor and architect of Pipi and the founder of Ajabbi.

      This is the current default directory configuration for the Pipi Core accounts in a Windows data centre.

      Pipi can automatically edit the configuration file to easily change the location of these key directories for a particular host, such as Windows or Linux.

      • Linux
      • MacOS
      • Windows
      • etc.

      Each major build version contains a different directory structure. This configuration file is for version 9.

      Configuration file

      /9cc/ (Nestspace)

      • pipi_nest_probe.cfm
      • data/
        • couchbase/
        • db2/
        • derby/
        • h2/
        • hsqldb/
        • informix/
        • mariadb/
        • msaccess/
          • 32/
          • 64/
        • mssql/
        • mysql/
        • oracle/
        • pg/
          • 18/
        • sqllite/
        • sybase/
        • virtuoso/
      • pipi/
          • Application.cfc (1) - Nest settings
          • pipi_nest.cfm
          • loki-01/ (instance)
            • ...
          • loki-02/ (instance)
            • Application.cfc (2) - Account settings
            • pipi_account.cfm
            • pip/
              • Application.cfc (3) - Version settings
              • pipi_version.cfm
              • i18n/
              • log/
              • pipi_<pipi version>.txt
              • sys/
              • temp/
              • template/
                • _include/
                • _layout/
                  • _log/
            • www/
              • mission-control/
                • Application.cfc (4) - Website settings
        • work/
          • backup/
          • install/
          • project/

        Descriptions

        Directory Example Description
        9cc 9cc/ Nestspace:
        Major version = 9
        Edition = c (Pipi Core).
        Account type = c (Core).
        <instance name> loki-01/ Pipi instance name (retired deity, lowercase, unique ASCII).
        pip pip/ Pipi Core goes here
        Application.cfc Application.cfc Config file
        i18n i18n/ Translation files
        log log/ Log files
        <pipi version>.txt pipi.9.1.2.34567.txt ASCII text file (current build).
        sys sys/ System Engine (sys)
        temp temp/
        template template/
        www www/ mission control website

        CFML Application.cfc

        Mike's Notes

        Pipi 9 is written in CFML (ColdFusion Markup Language).

        Below is a collection of links gathered about using Application.cfc

        The article below is an extract copied from the Adobe website. The full article is  named Defining the application and its event handlers in Application.cfc

        Examples

        Examples in script-based and tag-based syntax are at the end.

        I am very visual, so I use tag-based syntax, which makes it much easier for me to set up templates for Pipi. Pipi also generates CFML code in tag-based syntax. I also work in SQLXML and HTML a lot.

        MS Access

        I always use MS Access for rapid visual development and database prototyping. It's fast, clean, and visually simple to use. Adding sample data or importing production config data from MS Excel is a dream. The SQL and cleaned, sorted data are then exported via DBeaver Community to PostgreSQL, MSSQL Express, etc., for production use by CFML.

        I also often use an "empty" MS Access database as the front end for an MSSQL Server, etc., for form-based editing.

        Migration

        The plan is to move to Linux and replace MS Access with another Java-based embedded database, with data stored in physical data files rather than in RAM.

        Resources

        References

        • Reference

        Repository

        • Home > Ajabbi Research > Library >
        • Home > Handbook > 

        Last Updated

        02/04/2026

        CFML Application.cfc

        By: Adobe
        Adobe: 13/01/2022

        The Application.cfc file defines application-wide settings and variables, and application event handlers:

        • Application-wide settings and variables include page processing settings, default variables, data sources, style settings, and other application-level constants.
        • Application event handlers are CFC methods that ColdFusion automatically executes when specific events occur during the lifetime of an application: application start and end, session start and end, request start, execution, and end, and exceptions.

        Defining application-level settings and variables

        When you create an application, you can set many application-wide properties and characteristics, including the following items:

        • Application name
        • Application properties, including Client-, Application-, and Session-variable management options
        • Page processing options
        • Default variables, data sources, style settings, and other application-level constants

        For information on setting default variables, see Setting application default variables and constants in onApplicationStart  in this page.

        Naming the application

        Define the application and give it a name by setting the This.name variable in the Application.cfc initialization section, before the method definitions. By using a specific application name, you define a set of pages as part of the same logical application. 

        ColdFusion supports unnamed applications, which are useful for ColdFusion applications that must interoperate with JSP tags and servlets. Consider creating an unnamed application only if your ColdFusion pages must share Application or Session scope data with existing JSP pages and servlets. You cannot have more than one unnamed application on a server instance. For more information on using unnamed applications, see Sharing data between ColdFusion pages and JSP pages or servlets in Interoperating with JSP pages and servlets.

        Setting application properties

        Specify application properties by setting  This scope variables  in the Application.cfc initialization code. (These are the same properties that you set in the  cfapplication  tag.) The following table lists  the This  scope variable that ColdFusion uses to set application properties and describes their uses.

        Variable

        Default

        Description

        applicationTimeout

        Administrator value

        Life span , as a real number of days, of the application, including all Application scope variables. Use the createTimeSpan function to generate this variable.

        clientManagement

        False

        Whether the application supports Client scope variables.

        clientStorage

        Administrator value

        Where Client variables are stored; can be  cookie , registry, or the name of a data source.

        loginStorage

        Cookie

        Whether to store login information in the Cookie scope or the Session scope.

        scriptProtect

        Administrator Value

        Whether to protect variables from cross-site scripting attacks.

        sessionManagement

        False

        Whether the application supports Session scope variables.

        sessionTimeout

        Administrator Value

        Life span , as a real number of days, of the user session, including all Session variables. Use the createTimeSpan function to generate this variable.

        setClientCookies

        True

        Whether to send CFID and CFTOKEN cookies to the client browser.

        setDomainCookies

        False

        Whether to use domain cookies for the CFID and CFTOKEN values used for client identification, and for Client scope variables stored using cookies. If False, ColdFusion uses host-specific cookies. Set to True for applications running on clusters.

        The following example code from the top of an Application.cfc sets the application name and properties:

        <cfcomponent>
        <cfset This.name = "TestApplication">
        <cfset This.clientmanagement="True">
        <cfset This.loginstorage="Session">
        <cfset This.sessionmanagement="True">
        <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#">
        <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#">

        For more information on these settings, see cfapplication in the CFML Reference.

        Setting page processing options

        The  cfsetting  tag lets you specify the following page processing attributes to apply to all pages in your application:

        Attribute

        Use

        showDebugOutput

        Specifies whether to show debugging output. This setting cannot enable debugging if it is disabled in the ColdFusion Administrator. However, this option ensures that debugging output is not displayed, even if the Administrator enables it.

        requestTimeout

        Specifies the page request time-out. If ColdFusion cannot complete processing a page within the time-out period, it generates an error. This setting overrides the setting in the ColdFusion Administrator. Use this setting to increase the page time-out if your application or page frequently accesses external resources that are slow, such as external LDAP servers or web services providers.

        enableCFOutputOnly

        Disables output of text that is not included inside  cfoutput  tags. This setting helps ensure that extraneous text in your ColdFusion pages does not get displayed.

        Often, you use the cfsetting tag on individual pages, but you can also use it in your Application.cfc file. For example, using it in multi-application environment to override the ColdFusion Administrator settings in one application.

        You can place an application-wide cfsetting tag in the component initialization code, normally following the This scope application property settings, as the following example shows:

        <cfscript>
        This.name="MyAppl";
        This.clientmanagement="True";
        This.loginstorage="Session" ;
        This.sessionmanagement="True" ;
        This.sessiontimeout=CreateTimeSpan(0,0,1,0);
        </cfscript>
        <cfsetting showdebugoutput="No" enablecfoutputonly="No">

        The cfsetting tag in this example affects all pages in an application. You can override the application-wide settings in the event methods, such as onRequestStart, or on individual ColdFusion pages.

        Using application event handlers

        The following table describes the application event CFC methods that you can implement, including when they are triggered.

        Method

        When run

        onApplicationStart

        The application first starts: when the first request for a page is processed or the first CFC method is invoked by an event gateway instance, Flash Remoting request, or a web service invocation. This method is useful for setting application-wide (Application scope) variables, such as the names of data sources.

        onApplicationEnd

        The application ends: when the application times out or the server shuts down.

        onSessionStart

        A new session is created as a result of a request that is not in an existing session, including ColdFusion event gateway sessions. The application must enable sessions for this event to happen.

        onSessionEnd

        A session time-out setting is reached. This event is not triggered when the application ends or the server shuts down.

        onRequestStart

        ColdFusion receives any of the following: a request, an HTTP request (for example, from a browser), a message to an event gateway, a SOAP request, or a Flash Remoting request.

        onRequest

        The onRequestStart event has completed. This method acts as a filter for the requested page content.

        onRequestEnd

        All pages and CFCs in the request have been processed: equivalent to the OnRequestEnd.cfm page.

        onMissingTemplate

        When ColdFusion receives a request for a nonexistent page.

        onError

        When an exception occurs that is not caught by a try/catch block.

        When ColdFusion receives a request, it instantiates the Application CFC and runs the Application.cfc code in the following order:

        1. CFC initialization code at the top of the file
        2. onApplicationStart, if not run before for this application
        3. onSessionStart, if not run before for this session
        4. onRequestStart
        5. onRequest, or the requested page if there is no onRequest method
        6. onRequestEnd

        The following methods are triggered by specific events:

        • onApplicationEnd
        • onSessionEnd
        • onMissingTemplate
        • onError

        The onApplicationEnd and onSessionEnd methods do not execute in the context of a page request, so they cannot access request variables or display information to the user. The onMissingTemplate method is triggered when a URL specifies a CFML page that does not exist. The OnError method does not always execute in the context of a request; use its Event argument to determine the context.

        Managing the application with Application.cfc

        Use the onApplicationStart and onApplicationEnd methods to configure and manage the application; that is, to control resources that are used by multiple pages and requests and must be consistently available to all code in your application. Such resources include data sources, application counters such as page hit variables, or style information for all pages.

        The onApplicationStart method executes when ColdFusion gets the first request for a page in the application after the server starts. The onApplicationEnd method executes when the application server shuts down or if the application is inactive for the application time-out period.

        The following are some of the ways you use these methods. For more information, see entries for onApplicationStart and onApplicationEnd in the CFML Reference.

        Defining application utility functions

        Functions that you define in Application.cfc and do not place in a shared scope are, by default, available only to other methods in the CFC. 

        If your Application.cfc implements the onRequest method, any utility functions that you define in Application.cfc are also directly available in to the target page, because Application.cfc and the target page share the Variables scope.

        If your application requires utility functions that are used by multiple pages, not just by the methods in Application.cfc, and you do not use an onRequest method, Adobe recommends that you place them in a separate CFC and access them by running that CFC. As with other ColdFusion pages, Application.cfc can access any CFC in a directory path that is configured on the ColdFusion Administrator Mappings page. Therefore, use this technique to share utility functions across applications.

        If your Application.cfc defines utility functions that you want available on request pages and does not use an onRequest method, explicitly place the functions in a ColdFusion scope, such as the Request scope, as the following code shows:

        <!--- Function definition goes here. --->
        </cffunction>
        <cffunction name="OnRequestStart">
        <!--- OnRequestStart body goes here --->
        <cfset Request.theFunctionName=This.theFunctionName>
        </cffunction>

        On the request page, you would include the following code:

        <cfset myVar=Request.theFunctionName(Argument1...)>

        Functions that you define in this manner share the This scope and Variables scope with the Application.cfc file for the request.

        Setting application default variables and constants in onApplicationStart

        You can set default variables and application-level constants in Application.cfc. For example, you can do the following:

        • Specify a data source and ensure that it is available
        • Specify domain name
        • Set styles, such as fonts or colors
        • Set other application-level variables

        You do not have to lock Application scope variables when you set them in the Application.cfc onApplicationStart method.

        For details on implementing the onApplicationStart method, see onApplicationStart in the CFML Reference.

        Using the onApplicationEnd method

        Use the onApplicationEnd method for any clean-up activities that your application requires when it shuts down, such as saving data in memory to a database, or to log the application end. You cannot use this method to display data on a user page, because it is not associated with any request. The application ends, even if this method throws an exception. An application that is used often is unlikely to execute this method, except when the server is shut down. 

        For details on implementing the onApplicationEnd method, see onApplicationEnd in the CFML Reference.

        Managing sessions in Application.cfc

        Use the onSessionStart and onSessionEnd methods to configure and manage user sessions; that is, to control resources that are used by multiple pages while a user is accessing your site from during a single browser session. The session begins when a user first requests a page in your  application,  and ends when the session times out. For more information on Session scope and Session variables, see Using Persistent Data and Locking.

        Session resources include variables that store data that is needed throughout the session, such as account numbers, shopping cart contents, or CFCs that contain methods and data that are used by multiple pages in a session.

        Note

        Do not include the cflogin tag or basic login processing in the onSessionStart method, as the code executes only at the start of the session; it cannot handle user logout, and cannot fully ensure security.

        Using the onSessionStart method

        This method is useful for initializing session data, such as user settings or shopping cart contents, or for tracking the number of active sessions. You do not need to lock the Session scope when you set session variables in this method.

        For more information, see the onSessionStart entry in the CFML Reference.

        Using the onSessionEnd method

        Use this method for any clean-up activities when the session ends. (For information on ending sessions, see Ending a session in Configuring and using session variables.) For example, you can save session-related data, such as shopping cart contents or information about whether the user has not completed an order, in a database, or you can log the end of the session to a file. You cannot use this method to display data on a user  page,  because it is not associated with a request.

        Note

        Sessions do not end, and the onSessionEnd method is not called when an application ends. For more information, see the  onSessionEnd  entry in the CFML Reference.

        ColdFusion provides three methods for managing requests: onRequestStart, onRequest, and onRequestEnd. ColdFusion processes requests, including these methods, as follows:

        1. ColdFusion always processes  onRequestStart  at the start of the request.
        2. If you implement an onRequest method, ColdFusion processes it; otherwise, it processes the requested page. If you implement an onRequest method, explicitly call the requested page in your onRequest method.
        3. ColdFusion always processes onRequestEnd at the end of the request.

        Note

        When using cfabort, cflocation, or cfcontent tags, the OnAbort method is invoked instead of OnRequestEnd.

        You can use each of the Application.cfc request methods to manage requests as follows:

        Using the onRequestStart method

        This method runs at the beginning of the request. It is useful for user authorization (login handling), and for request-specific variable initialization, such as gathering performance statistics.

        If you use the onRequestStart method and do not use the onRequest method, ColdFusion automatically processes the request when it finishes processing the onRequestStart code.

        Note

        If you do not include an onRequest method in Application.cfm file, the onRequestStart method does not share a Variables scope with the requested page, but it does share Request scope variables.

        For more information, see the entry for onRequestStart in the CFML Reference

        User authentication

        When an application requires a user to log in, include the authentication code, including the  cflogin  tag or code that calls this tag, in the onRequestStart method. Doing so ensures that the user is authenticated at the start of each request. For detailed information on security and creating logins, see Securing Applications For an example that uses authentication code generated by the Adobe Dreamweaver CF Login Wizard, see onRequestStart in the CFML Reference.

        Using the onRequest method

        The onRequest method differs from the onRequestStart method in one major way: the onRequest method intercepts the user's request. This difference has two implications:

        • ColdFusion does not process the request unless you explicitly call it, for example, by using a  cfinclude  tag. This behavior lets you use the onRequest method to filter requested page content or to implement a switch that determines the pages or page contents to be displayed.
        • When you use  cfinclude  to process  request , the CFC instance shares the Variables scope with the requested page. As a result, any method in the CFC that executes can set the page's Variables scope variables, and the onRequestEnd method can access any Variable scope values that the included page has set or changed. Therefore, for example, the onRequestStart or onRequest method set variables that are used on the page.

        To use this method as a filter, place the  cfinclude  tag inside a  cfsavecontent  tag, as the following example shows:

        <cfargument name = "targetPage" type="String" required=true/>
        <cfsavecontent variable="content">
        <cfinclude template=#Arguments.targetPage#>
        </cfsavecontent>
        <cfoutput>
        #replace(content, "report", "MyCompany Quarterly Report", "all")#
        </cfoutput>
        </cffunction>

        For more information, see the entry for onRequest in the CFML Reference

        Using the onRequestEnd method

        You use the onRequestEnd method for code that should run at the end of each request. (In ColdFusion versions through ColdFusion MX 6.1, you would use the OnRequestEnd.cfm page for such code). Typical uses include displaying dynamic footer pages. For an example, see onSessionEnd in the CFML Reference.

        Note

        If you do not include an onRequest method in Application.cfm file, the onRequestEnd method does not share a Variables scope with the requested page, but it does share Request scope variables.

        For more information, see the entry for onRequestEnd in the CFML Reference.

        Handling errors in Application.cfc

        The following sections briefly describe how you to handle errors in Application.cfc. For more information on error pages and error handling, see Handling Errors For details on implementing the onError method, see onError in the CFML Reference.

        Application.cfc error handling techniques

        Application.cfc handles errors in any combination of the following ways:

        • Use try/catch error handling in the event methods, such as onApplicationStart or onRequestStart, to handle exceptions that happen in the event methods.
        • Implement the onError method. This method receives all exceptions that are not directly handled by try/catch handlers in CFML code. The method can use the  cfthrow  tag to pass any errors it does not handle to ColdFusion for handling.{{}}
        • Use  cferror  tags in the application initialization code following the  cfcomponent  tag, typically following the code that sets the application's This scope variables . These tags specify error processing if you do not implement an onError  method, or if the onErrormethod throws an error. You could implement an application-specific validation error handler, for example, by placing the following tag in the CFC initialization code:
          <cferror type="VALIDATION" template="validationerrorhandler.cfm">
        • The ColdFusion default error mechanisms handle any errors that are not handled by the preceding techniques. These mechanisms include the site-wide error handler that you specify in the ColdFusion Administrator and the built-in default error pages.

          These techniques let you include application-specific information, such as contact information or application or version identifiers, in the error message, and let you display all error messages in the application in a consistent manner. You use Application.cfc to develop sophisticated application-wide error-handling techniques, including error-handling methods that provide specific messages, or use structured error-handling techniques.

        Note

        The onError method catches errors that occur in the onSessionEnd and onApplicationEnd application event methods. It does not display messages to the user, however, because there is no request context. The onError function logs errors that occur when the session or application ends

        Handling server-side validation errors in the onError method

        Server-side validation errors are actually ColdFusion exceptions; as a result, if your application uses an onError  method, this method gets the error and must handle it or pass it on to ColdFusion for handling.

        To identify a server-side validation error, search the Arguments.Exception.StackTrace field for coldfusion .filter.FormValidationException. You can then handle the error directly in your onError routine, or throw the error so that either the ColdFusion default validation error page or a page specified by an  cferror  tag in your Application.cfc initialization code handles it.

        Example: error Handling with the onError method

        The following Application.cfc file has  an onError  method that handles errors as follows:

        • If the error is a server-side validation error, the onError method throws the error for handling by ColdFusion, which displays its standard validation error message.
        • For any other type of exception, the onError method displays the name of the event method in which the error occurred and dumps the exception information. In this example, because you generate errors on the CFM page only, and not in  a Application.cfc  method, the event name is always the empty string.

        <cfset This.name = "BugTestApplication">
        <cffunction name="onError">
        <!--- The onError method gets two arguments:
        An exception structure, which is identical to a cfcatch variable.
        The name of the Application.cfc method, if any, in which the error
        happened.
        <cfargument name="Except" required=true/>
        <cfargument type="String" name = "EventName" required=true/>
        <!--- Log all errors in an application-specific log file. --->
        <cflog file="#This.Name#" type="error" text="Event Name: #Eventname#" >
        <cflog file="#This.Name#" type="error" text="Message: #except.message#">
        <!--- Throw validation errors to ColdFusion for handling. --->
        <cfif Find("coldfusion.filter.FormValidationException",
        Arguments.Except.StackTrace)>
        <cfthrow object="#except#">
        <cfelse>
        <!--- You can replace this cfoutput tag with application-specific
        error-handling code. --->
        <cfoutput>
        <p>Error Event: #EventName#</p>
        <p>Error details:<br>
        <cfdump var=#except#></p>
        </cfoutput>
        </cfif>
        </cffunction>
        </cfcomponent>

        To test this example, place a CFML page with the following code in the same page as the Application.cfc file, and enter valid and invalid text in the text input field.

        This box does Integer validation:
        <cfinput name="intinput" type="Text" validate="integer" validateat="onServer"><br>
        Check this box to throw an error on the action page:
        <cfinput type="Checkbox" name="throwerror"><br>
        <cfinput type="submit" name="submitit">
        </cfform>
        <cfif IsDefined("form.fieldnames")>
        <cfif IsDefined("form.throwerror")>
        <cfthrow type="ThrownError" message="This error was thrown from the bugTest action page.">
        <cfelseif form.intinput NEQ "">
        <h3>You entered the following valid data in the field</h3>
        <cfoutput>#form.intinput#</cfoutput>
        </cfif>
        </cfif>

        Note

        For more information on server-side validation errors, see Validating data.

        Example: a complete Application.cfc

        The following example is a simplified Application.cfc file that illustrates the basic use of all application event handlers:

        <cfset This.name = "TestApplication">
        <cfset This.Sessionmanagement=true>
        <cfset This.Sessiontimeout="#createtimespan(0,0,10,0)#">
        <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#">

        <cffunction name="onApplicationStart">
        <cftry>
        <!--- Test whether the DB that this application uses is accessible
        by selecting some data. --->
        <cfquery name="testDB" dataSource="cfdocexamples" maxrows="2">
        SELECT Emp_ID FROM employee
        </cfquery>
        <!--- If we get database error, report it to the user, log the error
        information, and do not start the application. --->
        <cfcatch type="database">
        <cfoutput>
        This application encountered an error.<br>
        Please contact support.
        </cfoutput>
        <cflog file="#This.Name#" type="error"
        text="cfdocexamples DB not available. message: #cfcatch.message#
        Detail: #cfcatch.detail# Native Error: #cfcatch.NativeErrorCode#">
        <cfreturn False>
        </cfcatch>
        </cftry>
        <cflog file="#This.Name#" type="Information" text="Application Started">
        <!--- You do not have to lock code in the onApplicationStart method that sets Application scope variables. --->
        <cfscript>
        Application.availableResources=0;
        Application.counter1=1;
        Application.sessions=0;
        </cfscript>
        <!--- You do not need to return True if you don't set the cffunction returntype attribute. --->
        </cffunction>

        <cffunction name="onApplicationEnd">
        <cfargument name="ApplicationScope" required=true/>
        <cflog file="#This.Name#" type="Information"
        text="Application #ApplicationScope.applicationname# Ended">
        </cffunction>


        <cffunction name="onRequestStart">
        <!--- Authentication code, generated by the Dreamweaver Login Wizard,
        makes sure that a user is logged in, and if not displays a login page. --->
        <cfinclude template="mm_wizard_application_include.cfm">
        <!--- If it's time for maintenance, tell users to come back later. --->
        <cfscript>
        if ((Hour(now()) gt 1) and (Hour(now()) lt 3)) {
        WriteOutput("The system is undergoing periodic maintenance.
        Please return after 3:00 AM Eastern time.");
        return false;
        } else {
        this.start=now();
        }
        </cfscript>
        </cffunction>

        <cffunction name="onRequest">
        <cfargument name = "targetPage" type="String" required=true/>
        <cfsavecontent variable="content">
        <cfinclude template=#Arguments.targetPage#>
        </cfsavecontent>
        <!--- This is a minimal example of an onRequest filter. --->
        <cfoutput>
        #replace(content, "report", "MyCompany Quarterly Report", "all")#
        </cfoutput>
        </cffunction>

        <!--- Display a different footer for logged in users than for guest users or 
        users who have not logged in. --->

        <cffunction name="onRequestEnd">
        <cfargument type="String" name = "targetTemplate" required=true/>
        <cfset theAuthuser=getauthuser()>
        <cfif ((theAuthUser EQ "guest") OR (theAuthUser EQ ""))>
        <cfinclude template="noauthuserfooter.cfm">
        <cfelse>
        <cfinclude template="authuserfooter.cfm">
        </cfif>
        </cffunction>

        <cffunction name="onSessionStart">
        <cfscript>
        Session.started = now();
        Session.shoppingCart = StructNew();
        Session.shoppingCart.items =0;
        </cfscript>
        <cflock timeout="5" throwontimeout="No" type="EXCLUSIVE" scope="SESSION">
        <cfset Application.sessions = Application.sessions + 1>
        </cflock>
        <cflog file="#This.Name#" type="Information" text="Session:
        #Session.sessionid# started">
        </cffunction>

        <cffunction name="onSessionEnd">
        <cfargument name = "SessionScope" required=true/>
        <cflog file="#This.Name#" type="Information" text="Session:
        #arguments.SessionScope.sessionid# ended">
        </cffunction>

        <cffunction name="onError">
        <cfargument name="Exception" required=true/>
        <cfargument type="String" name = "EventName" required=true/>
        <!--- Log all errors. --->
        <cflog file="#This.Name#" type="error" text="Event Name: #Eventname#">
        <cflog file="#This.Name#" type="error" text="Message: #exception.message#">
        <!--- Some exceptions, including server-side validation errors, do not
        generate a rootcause structure. --->
        <cfif isdefined("exception.rootcause")>
        <cflog file="#This.Name#" type="error"
        text="Root Cause Message: #exception.rootcause.message#">
        </cfif>
        <!--- Display an error message if there is a page context. --->
        <cfif NOT (Arguments.EventName IS onSessionEnd) OR
        (Arguments.EventName IS onApplicationEnd)>
        <cfoutput>
        <h2>An unexpected error occurred.</h2>
        <p>Please provide the following information to technical support:</p>
        <p>Error Event: #EventName#</p>
        <p>Error details:<br>
        <cfdump var=#exception#></p>
        </cfoutput>
        </cfif>
        </cffunction>

        </cfcomponent>

        Script-based syntax example

        An Application.cfc file is a special ColdFusion Component used to define application-level settings and event handlers that manage the lifecycle of a CFML application.

        Below is a modern, script-based example of an Application.cfc file.

        component {
            // 1. Application Settings
            this.name = "MyAwesomeApp_" & hash(getCurrentTemplatePath()); // Unique app name
            this.applicationTimeout = createTimeSpan(30, 0, 0, 0);         // 30 days
            this.sessionManagement = true;                                 // Enable sessions
            this.sessionTimeout = createTimeSpan(0, 0, 30, 0);             // 30 minutes
            this.setClientCookies = true;                                  // Use CFID/CFTOKEN cookies

            // 2. Lifecycle Events

            // Runs once when the application first starts
            public boolean function onApplicationStart() {
                application.version = "1.0.0";
                application.startedAt = now();
                return true; 
            }

            // Runs when a new user session begins
            public void function onSessionStart() {
                session.started = now();
                session.cart = [];
            }

            // Runs at the very start of every page request
            public boolean function onRequestStart(required string targetPage) {
                // Useful for security checks or global variables
                request.startTime = getTickCount();
                
                // Example: Force app re-init during development
                if (structKeyExists(url, "reinit")) {
                    onApplicationStart();
                    onSessionStart();
                }
                return true;
            }

            // Handles the actual request processing
            public void function onRequest(required string targetPage) {
                include arguments.targetPage;
            }

            // Runs if an unhandled error occurs in the application
            public void function onError(any exception, string eventName) {
                // You can log errors or redirect to a custom error page here
                writeLog(type="Error", text="Error in #arguments.eventName#: #arguments.exception.message#");
                include "error.cfm";
            }
        }

        Tag-based syntax example

        If you prefer the traditional tag-based syntax (using <cfset> and <cffunction>), here is how that same structure looks. This style is still very common in older or "legacy" ColdFusion codebases.

        <cfcomponent>
            <!--- 1. Application Settings --->
            <cfset this.name = "MyTaggedApp">
            <cfset this.sessionManagement = true>
            <cfset this.sessionTimeout = createTimeSpan(0, 0, 30, 0)>
            <cfset this.setClientCookies = true>

            <!--- 2. Lifecycle Events --->

            <!--- Runs once when the application first starts --->
            <cffunction name="onApplicationStart" returnType="boolean" output="false">
                <cfset application.version = "2.1.0">
                <cfreturn true>
            </cffunction>

            <!--- Runs when a new user session begins --->
            <cffunction name="onSessionStart" returnType="void" output="false">
                <cfset session.started = now()>
            </cffunction>

            <!--- Runs at the start of every page request --->
            <cffunction name="onRequestStart" returnType="boolean" output="false">
                <cfargument name="targetPage" type="string" required="true">
                
                <!--- Example: Force re-init if 'reinit' is in the URL --->
                <cfif structKeyExists(url, "reinit")>
                    <cfset onApplicationStart()>
                </cfif>
                
                <cfreturn true>
            </cffunction>

            <!--- Handles the actual request processing --->
            <cffunction name="onRequest" returnType="void">
                <cfargument name="targetPage" type="string" required="true">
                
                <!--- This is where the requested .cfm file is actually executed --->
                <cfinclude template="#arguments.targetPage#">
            </cffunction>

            <!--- Error handling --->
            <cffunction name="onError" returnType="void" output="true">
                <cfargument name="exception" type="any" required="true">
                <cfargument name="eventName" type="string" required="true">
                
                <h2>An error occurred!</h2>
                <p>Details: <cfoutput>#arguments.exception.message#</cfoutput></p>
            </cffunction>
        </cfcomponent>

        Adobe Application Variables

        The scope for the Application.cfc file contains several built-in variables, which correspond to the attributes that you set in the cfapplication tag. You set the values of these variables in the CFC initialization code, before you define the CFC methods. You can access the variables in any method.

        Note: Although Windows is case-insensitive, you must always start the Application.cfc filename with an uppercase A. Both application.cfc and Application.cfc are reserved words.

        Note: If your application has an Application.cfc, and an Application.cfm or onRequestend.cfm page, ColdFusion ignores the CFM pages

        The following table briefly describes the variables that you can set to control the application behavior. For more details, see the cfapplication tag.

        Variable Default Description
        name no name The application name. If you do not set this variable, or set it to the empty string, your CFC applies to the unnamed application scope, which is the ColdFusion J2EE servlet context. For more information on unnamed scopes see Integrating JSP and servlets in a ColdFusion application in Interoperating with JSP pages and servlets in the Developing ColdFusion Applications.
        applicationTimeout Administrator value Life span, as a real number of days, of the application, including all Application scope variables. Use the CFML CreateTimeSpan function to generate this variable's value.
        authcookie.disableupdate False Disable update of cfauthorization cookie using cfcookie or cfheader tag
        authcookie.timeout -1 Auth Cookie age in days. The cookie doesn't times out.
        authcookie.samesite   Valid values are Struct, Lax, or None.
        cache.useInternalQueryCache false If true, ColdFusion will store cached queries in the old non-cool non-Ehcache version of the cache.
        cache.querysize Administrator value Maximum number of queries that can be cached. To be clear, this refers to automatic caching via cachedWithin and cachedAfter in the cfquery/queryExecute tag/function. You can store as many queries as you would like using cachePut. Well, as many as your RAM will allow. Be sensible, people.
        chartStyleDirectory   Application specific chart styles directory.
        clientManagement no
        • yes: enables client variables.

        • no

        clientStorage Administrator value Where Client variables are stored; can be cookie, registry, or the name of a data source.
        customtagpaths Administrator value Contains ColdFusion custom tag paths. It is a comma delimited list with absolute path.To use this variable, select the Enable Per App Settings option in the Administrator Server > Settings page.The settings that you define here take precedence over the custom tag paths defined in the Administrator Server Settings > Mappings page for the current application.
        googleMapKey   The Google Maps API key required to embed Google Maps in your web pages.
        datasource   Name of the data source from which the query retrieves data.
        datasources   Struct of structs defining datasources.You can use this variable to define a datasource specific to the application . This does not register/update a datasource in ColdFusion Administrator.
        loginStorage cookie Whether to store login information in the Cookie scope or the Session scope.
        mappings Administrator value A structure that contains ColdFusion mappings. Each element in the structure consists of a key and a value. The logical path is the key and the absolute path is the value. To use this variable, select the Enable Per App Settings option in the Administrator Server Settings > Settings page.The mappings that you define here take precedence over the mappings defined in the Administrator Server Settings > Mappings page for the current application.
        passArrayByReference False Arrays will be passed by reference instead of by value for this application.
        restSettings.cfclocation   To publish the CFCs only in a particular location, provide comma-separated list of directories where the REST CFCs are located. The directory paths can be absolute or relative.If not set, all the CFCs from the application root are published.
        restSettings.skipCFCWithError   When an error occurs, continue publishing, ignoring the CFC that has caused the exception.If true, the CFC with error is ignored and the rest of the CFCs are published. By default it is false.If set to false, in case of an error, the application itself is not published. But other registered application are published.If an error occurs during application startup, the error is printed in console.Each application has separate log files for logging the issues.
        restSettings.restEnabled False If true, then ColdFusion searches the directory containing a set of REST-enabled CF components. 
        restSettings.autoRegister False Enable auto registration of an application.
        restSettings.useHost False Specifies the host name. If true, then the host name is parsed from the URL.
        restSettings.host  

        Explicitly naming the hostname will make the host name. If the host name is not mentioned, then the usehost name will be defaulted.

        restSettings.serviceMapping   If not specified, then the application defined in this.name is taken as default.
        restSettings.isDefault False If true, application will be made as default app.
        scriptprotect None

        If true, it adds protection from external scripts and cross-site scripting. Valid values are:

        • Form
        • URL
        • Cookie
        • CGI

        The flag protects from the following:

        • object
        • embed
        • script
        • applet
        • meta

        The feature is a set of regular expressions located in lib/neo-security.xml that replaces the tags: object, embed, script, applet, and meta with the tag name InvalidTag, when they are passed as input to the Form, URL, CGI, and Cookie scopes.

        sessioncookie.httponly True Specify whether session cookies have to be set as httponly or not. i.e. accessible only to Http requests
        sessioncookie.secure False Specify whether session cookies have to be set as secure or not. i.e. returned on any type of connection or only secured (https) connections
        sessioncookie.domain   Domain for which the cookie should be set. This should match exactly with the domain, with which application would be accessed
        sessioncookie.timeout 30 years
        Session Cookie age in days. You can also assign -1 to this value, while 0 is invalid.
        sessioncookie.disableupdate False Disable update of cfid and cftoken cookie using cfcookie or cfheader tag
        serverSideFormValidation yes Whether to enable validation on cfform fields when the form is submitted.
        sessionManagement no Whether the application supports Session scope variables.
        sessionTimeout Administrator value Life span, as a real number of days, of the user session, including all Session variables. Use the CFML CreateTimeSpan function to generate this variable's value.
        setClientCookies True Whether to send CFID and CFTOKEN cookies to the client browser.
        setDomainCookies False Whether to set CFID and CFTOKEN cookies for a domain (not just a host).
        security.antisamypolicy   Specify the location of antisamy file to be used when no antisamy policy file is passed to the getSafeHTML or isSafeHTML functions. The policy file can be relative to the Application CFC path or an absolute path can be provided.
        compileextforinclude   Specify the list of allowed file extensions as a comma-separated list for the cfinclude tag. Specifying a wildcard * in the list makes any file included using the cfinclude tag to be compiled. If any file included using the cfinclude tag is not found in this list, their content will be statically included. By default, files with the cfm and cfml extensions are always compiled irrespective of this setting.
        strictnumbervalidation  

        True/False. Default is true. The IsValid function for the integer and numeric types allowed the currency symbols at the start and commas inside the number.

        In ColdFusion 11, the isValid function behaves in a different way. Setting strictnumbervalidation to false makes the isValid function to behave in a way just like in the previous versions (ColdFusion 10 or earlier). Note that this setting also changes the behavior of the following tags:

        secureJSON Administrator value A Boolean value that specifies whether to add a security prefix in front of the value that a ColdFusion function returns in JSON-format in response to a remote call. The default value is the value of the Prefix serialized JSON setting in the Administrator Server Settings > Settings page (which defaults to false). You can override this value in the cffunction tag.For more information see Improving security in Ajax programming rules and techniques in the Developing ColdFusion Applications.
        secureJSONPrefix Administrator value The security prefix to put in front of the value that a ColdFusion function returns in JSON-format in response to a remote call if the secureJSON setting is true. The default value is the value of the Prefix serialized JSON setting in the Administrator Server Settings > Settings page (which defaults to //, the JavaScript comment character).For more information see Improving security in Ajax programming rules and techniques in the Developing ColdFusion Applications.
        serialization.preservecaseforstructkey False Boolean that determines if case for struct keys should be preserved when serializing a struct to JSON.
        serialization.serializequeryas row Determines how queries should be serialized to JSON. Possible values are row, column, and struct.
        serialization.preserveCaseForQueryColumn false If true, column case will be preserved.
        sessioncookie.samesite 
          Valid values are Strict, Lax, or None.
        welcomeFileList  

        A comma-delimited list of names of files. Tells ColdFusion not to call the onMissingTemplate method if the files are not found. Use this variable to prevent ColdFusion from invoking the onMissingTemplate handler if all of the following items are true:

        • Your web server (for example, web.xml file) has a welcome file list with CFML pages such as index.cfm that it tries to run if a URL specifies a path ending in a directory.
        • The web server sends a request for CFML pages the welcome list to ColdFusion without first determining if the page exists.
        • You want to support directory browsing in directories that do not have any of the files on the welcome file list.
          You specify this variable only if the Application.cfc file also specifies an onMissingTemplate handler. It must have the same list of files as your web.xml welcome file list.Note: You do not need to use the welcomeFileList variable with most "pure" web servers, such as Apache. The welcomeFileList variable has to be used with most integrated web and application servers.
        smtpServersettings   A struct that contains the following values: server, username, and password.If no value is specified, takes the value in the administrator.
        sameformfieldsasarray false If the form fields have the same name, ColdFusion converts the form fields as an array instead of a list. To do this, in the Application.cfc, specify the following: this.sameformfieldsasarray = "true". Note: The empty string values will be preserved only if this is set to true.
        timeout   This number represents how long an individual request can take. Timeout set using overrides the timeout in the Application.cfc using this.timeout="".
        debuggingIPAddresses   A list of IP addresses that need debugging.
        enablerobustexception   Overrides the default administrator settings. It does not report compile-time exceptions.
        javaSettings   A structure allowing you to specify Java class paths to be made available to your code. Valid keys are: loadPaths (an array of paths to include when searching for Java libraries), loadColdFusionClassPath (a boolean indicating if the default class path should be used, defaults to false), and reloadOnChange (a boolean indicating if the classpaths should be reloaded when they change, the default is false).
        javasettings.watchInterval   Specifies the time interval in seconds after which to verify any change in the class files or JAR files. This attribute is applicable only if the reloadOnChange attribute is set to true. The default value is 60 seconds.
        javasettings.watchExtensions   Specifies the extensions of the files to monitor for changes. By default, only .class and .jar files are monitored.
        searchimplicitscopes False

        Allows you to enable or disable searching for an un-scoped variable in implicit scopes.

        NOTE: In ColdFusion (2023 release) Update 7, the default value for this flag is changed to FALSE.

        serialization.structmetadata   Set the data type info for a struct value. For example, if this.serialization.structmetadata = {zipcode="String"};, you need not define the data type for zipcode for the struct that contains this key. If you define the datatype for zipcode in the struct itself, then the defined datatype at struct level takes priority over the one defined in Application.cfc.
        enableNullSupport false Allows you to enable or disable support for NULL variables. Possible values are true or false.
        cache.engine ehcache

        Specified the cache engine to be used. You can use the following engines:

        • Ehcache
        • JCS
        • Memcached
        • Redis
        cache.configFile   Path to the properties file of the caching engine.
        restSettings.generateRESTDoc false If true, then ColdFusion server generates Swagger doc automatically.
        blockedExtForFileUpload   A comma-separated list of file extensions for the files that must be blocked for uploading.
        useJavaAsRegexEngine false If true, then Java is used as regex engine over the default engine.
        timeZone
          If true, if you execute any date/time function, the time zone returned will be the same as set in this flag.

        Form fields with the same name

        Assume that the form fields have same name. In this case, ColdFusion converts the form fields as an array instead of a list.To do this, in the Application.cfc, specify the following: this.sameformfieldsasarray = "true".The default value is false.

        Note

        Application.cfc is unable to resolve nested cfincludes from outside the directory where te file resides. To resolve this, add the flag -Dcoldfusion.application.recur_resolve.include=true needs be added in jvm.config.

        Enhancements made in ColdFusion (2021 release)

        • this.timeZone

        There is a new flag, this.timeZone, which you can set it to any valid time zone. After setting the time zone, if you execute any date/time function, the time zone returned will be the same as set in Application.cfc. For example,

        Application.cfc


        component {
            this.timeZone="US/Pacific"
        }
        timezone.cfm
        <cfscript>
            writeOutput("The time at the configured time zone is: " & now())
        </cfscript>
        MongoDb settings
        this.datasources = { 
            "local"= { 
                type="mongodb" 
            }, 
            "mymongodb"= { 
                type="mongodb", 
                host="mongodb://10.192.217.184:27017/", 
                "init"= true 
            } 
        }

        AWS Cloud Features (SQS, SNS, S3, DynamoDB)


        component { 
         
           function OnApplicationStart() { 
              application.awsCred = { 
                 "credentialAlias" : "<alias name>", 
                 "vendorName" : "AWS", 
                 "region" : "<region name>", 
                 "secretAccessKey" : "<AWS Secret>", 
                 "accessKeyId" : "<AWS Key>" 
              }; 
         
              application.awsConf = { 
                 "serviceName" = "<Service name>", 
         
                 "alias" : “<alias name>”, 
         
                 "clientOverrideConfig": { 
         
                    "apiCallAttemptTimeout": "<timeout>" 
         
                 } 
         
              }; 
         
              application.accountKey = "<Account Key>"; 
           } 
        }

        SAML

        Manual Configuration

        this.security.samlsettings.idp = [{ 
            name: '<IDP name>', 
         
            description: '<Description>', 
            entityID: '<Entity ID obtained from Identity Provider>', 
            ssoURL: '<Single Sign-On URL>', 
            sloURL: '<Logout URL>', 
            ssoBinding: '<post/redirect>', 
            sloBinding: '<post/redirect>', 
            SIGNREQUESTS: true/false, 
            ENCRYPTREQUESTS: true/false, 
            SignCertificate: '<Certificate>' , 
         
            EncryptCertificate: '<Certificate>' 
         
        }];

        Using File location of IDP metadata

        this.security.samlsettings.idp = [ 

            name: '<IDP name>', 
            description:'<Description>', 
            file:'<IDP metadata file location>' 

        ];

        Using URL

        this.security.samlsettings.idp = [ 

            name: '<IDP name>', 
            description:'<Description>', 
            url:'<IDP metadata URL>' 

        ];

        Add SP using Application.cfc

        this.security.samlsettings.sp = [{ 
            name: '<SP name>', 
            description:'<Description>', 
            entityId: '<Entity ID for SP>', 
            acsURL: '<Assertion Consumer Service URL>', 
            sloURL: '<Logout URL>', 
            ACSBINDING: '<post/redirect>', 
            SLOBINDING: '<post/redirect>', 
            SIGNREQUESTS: true/false, 
            WANTASSERTIONSSIGNED: true/false, 
            LOGOUTRESPONSESIGNED: true/false, 
            SIGNKEYSTOREPATH: '<Path to sign keystore>', 
            SIGNKEYSTOREPASSWORD: '<keystore password>', 
            SIGNKEYSTOREALIAS: '<keystore alias>', 
            requestStore: 'Redis', strict: 'true' 
        }];

        Azure Blob credentials

        application.blobCred = { 
            "vendorName" : "AZURE", 
            "connectionString" : "key" 
        }

        Azure Blob configuration

        application.blobConf = { 
            "serviceName" : "AZURE_BLOB" 
            "options" : { 
                "absorbConditionalErrorsOnRetry" : true/false, 
                "concurrentRequestCount" : 5, 
                "useTransactionalContentMD5" : true/false, 
                "storeBlobContentMD5" : true/false, 
                "disableContentMD5Validation": true/fasle, 
                "singleBlobPutThresholdInBytes" : 12345, 
                "skipEtagLocking" : true/false, 
                "retryPolicyFactory": { 
                    "retryPolicyType" : "EXPONENTIAL" | "LINEAR" | "NONE", 
                    "deltaBackoffIntervalInMs" : 12, 
                    "maxAttempts" : 3, 
                    "resolvedMinBackoff" : 1 
                }, 
                "locationMode" : "PRIMARY_ONLY" | "PRIMARY_THEN_SECONDARY" | "SECONDARY_ONLY" | "SECONDARY_THEN_PRIMARY", 
                "maximumExecutionTimeInMs" : 2, 
                "timeoutIntervalInMs" : 1 
            } 
        }

        Enhancements made in ColdFusion (2018 release) Update 9 and ColdFusion (2016 release) Update 15

        Added the followinng flags:

        • this.sessioncookie.samesite = "Strict | Lax | None"
        • this.authcookie.samesite= "Strict | Lax | None"

        Application.cfc

        component {
                        this.name = "MyApp";
                        this.sessioncookie.samesite = "Strict";
                        this.authcookie.samesite = "Lax";
                        this.sessionmanagement = true;
        }

        Enhancements made in ColdFusion (2018 release) Update 3, ColdFusion (2016 release) Update 10, and ColdFusion 11 Update 18

        • blockedExtForFileUpload to specify a comma-separated list of file extensions for file that must be blocked for uploading.

        For example,

        {
            this.name="app name";
            this.blockedExtForFileUpload="cfm, cfc, jsp"; //Specify other file extensions
        }

        The setting blockedExtForFileUpload only applies to the following tags and functions:

        • cffile action="upload"
        • cffile action="uploadall"
        • FileUpload
        • FileUploadAll

        You can use "*" (star) to block all files or use "" (empty string) to allow all extensions.

        If you are trying to upload a file using the  cffile tag and you want to override the blocked file extensions defined at the server level, specify the extensions. The list overrides the global settings.

        For example, you have blocked the extensions,  " cfm , cfc , asp, aspx " in ColdFusion Administrator, but want to upload files of type aspx for your application, use the code below to override the global settings.

        component {
                this.name="myApp";
                this.blockedExtForFileUpload="cfm, cfc, asp";
        }

        Enhancements made in ColdFusion (2018 release)

        • enableNullSupport that specifies if you want to enable support for NULL variables.
        • cache.engine to specify the type of cache engine to be used.
        • Enhancements made in ColdFusion (2016 release)
        • serialization.structmetadata that defines the datatype for a struct key.
        • There is a new application setting, searchImplicitScopes. When set to false, an un-scoped variable is not searched in implicit scopes.
        • passArrayByReference setting, which when set to true, enables you to pass arrays by reference instead of value.

        Enhancements made in ColdFusion 11

        In ColdFusion 11, you can register application-specific datasources in Application.cfc. These datasources will be specific to that application and will not be available through the Administrator. If there is a name clash with a server-wide datasource, the one specific to the application will be given the priority.

        this.datasources.dsn2={
            "driver"="MSSQLServer",
            "username"="sa",
            "password"="password",
            "url"="jdbc:macromedia:sqlserver:
        //localhost\MSSQL2008;databaseName=regression;;sendStringParametersAsUnicode=
        false;querytimeout=0;MaxPooledStatements=1000"
        };

        With a custom driver:

        this.datasources.dsn3 = { 
            "driver" = "other", 
        "url"="jdbc:sqlserver://localhost\MSSQL2008;databaseName=pubs;sendStringParametersAsUnicode=false;querytimeout=0;MaxPooledStatements=1000", 
            "username" = "sa", 
            "password" = "S33N0Ev!l",             
        "class"="com.microsoft.sqlserver.jdbc.SQLServerDriver"
        };

        The following drivers are supported:

        • MSSQLServer
        • Oracle
        • Sybase
        • DB2
        • Informix
        • MySQL_DD
        • PostgreSQL
        • MSAccess
        • Apache Derby Embedded
        • Apache Derby Client
        • MySQL5
        • ODBCSocket
        • Other (for custom driver)

        Use this.datasources as shown in the examples below.

        // Application.cfc
        component {
                this.name = "DSNTest";
                this.datasources = { 
                        mssql_app = { 
                            database = "<DBName>", 
                            host = "<HostNameOrIP>", 
                            port = "<portNumber>", 
                            driver = "MSSQLServer", 
                            username = "username", 
                            password = "password" } 
                        };
                this.datasource = "mssql_app";
        }
        <!--- query.cfm --->
        <cfscript>
            employees = queryExecute("SELECT * FROM TableName ",[], {datasource="mssql_app"});
            writeOutput(employees);
        </cfscript>

        Enhancements made in ColdFusion 9.0.1

        Application.cfc lets you specify data source authentication details for the data source. The data source settings can now be a string or a struct. When string, it is considered to be the data source name and authentication information is taken from the data source defined in the ColdFusion Administrator.

        You can specify the authentication information using a struct value for data source. The following are the key names:

        • name: data source name
        • username: Username for the data source
        • password: Password for the data source

        Example

        <this.datasource={name='cfartgallery', username="user", password="passwd"}>
        or
        <this.datasource="cfartgallery">

        Note: The same convention is used for ORM default data source where you can specify the data source authentication information in the ormsettings.
        The following application-specific attributes have been added for Amazon S3 integration:

        • accessKeyId: ID for Amazon S3 account.
        • awsSecretKey: Secret key for S3 account.
        • defaultLocation:}}The default location of Amazon S3 bucket creation. A bucket on S3 storage can be in one of the following regions: {{US, EU, or US-WEST.The defaultLocation provided in the Application.cfc defines the default location for the bucket that you create. The default value is US.

        Example

        this.s3.accessKeyId = "key_ID";
        this.s3.awsSecretKey = "secret_key";
        this.s3.defaultLocation="location";
        </cfscript>

        Application-specific In-memory file system

        You can use in-memory file system specific to applications. This enables application isolation for your virtual file system. That is, the file created in the in-memory file system by one application will not be accessible to another application.

        The settings can be specified in the Application.cfc as follows:

        Variable

        Description

        this.inmemoryfilesystem.enabled

        Set the value to true to enable in-memory file system for application. This is the default setting.

        this.inmemoryfilesystem.size

        Specify the memory limit in MB for the in-memory file system.You can also specify the value in the ColdFusion Administrator (Server Settings > Settings > Memory Limit per Application for In-Memory Virtual File System).The lesser value is considered.


        Other examples

        To come.