What is new in Lucee 6? (Part 2)

Lucee Admininstrator

So far Lucee did support 2 kinds of Administrators, the Lucee Web Administrator and the Lucee Server Administrator. This is a big benefit when you have a multi web context environment and you wanna limit the access from one web context to the other.
But like with every feature, when you don’t need it, for example when you run just one web context in Lucee, this is an unnecessary overhead and a hassle.
Lucee 6 allows you to run Lucee in “Single Mode”, what means you only have one Administrator or in “Multi Mode” to have the old behavior with “Server” and “Web” Administrator.

When you install a new Lucee 6 version, it will be in single mode by default, when you update an existing Lucee 5 version to Lucee 6, it will be in multi mode. So we are backward compatible for updates only.
But you can easily switch between multi and single in the Lucee Administrator on the overview page.

Lucee Configuration

So far Lucee did use XML to store it’s configuration, with Lucee 6 we move away from that and use cfconfig (json) instead, a configuration standard introduces by Ortus Solutions.
With the move to that new format, we did not only add support for all possible settings you could do in the XML, we added new functionality.

Extensions: Enhanced Functionality

One significant improvement in Lucee 6 is the handling of extensions. Previously, extensions in the XML configuration merely reflected what was already installed on the server. However, with the new version, you can now define extensions, and Lucee will take care of the installation process if they are not already present. Extensions can be configured in three distinct ways, providing you with greater flexibility:

Local File Source:

{
	"source":"/Users/susi/Downloads/com.teradata.jdbc-16.20.0.12.lex",
	"name":"Teradata"
}

In this example, the extension is defined with a source attribute pointing to a local .lex file, this can be any supported virtual file system like http, S3, ftp, … .

URL Endpoint Source:

{
	"source":"https://ext.lucee.org/org.postgresql.jdbc-42.2.20.lex",
	"name":"PostgreSQL"
}

Alternatively, you can specify the source as an URL endpoint, making it more accessible for remote installations. Lucee supports various virtual filesystems (such as S3, FTP, HTTPS, HTTP, GitHub, and more) as endpoints for these extensions. However, please note that you can only use an endpoint if the corresponding virtual filesystem is installed. For instance, you can’t point to an S3 endpoint if the S3 extension is not installed.

Extension ID:

{
	"id":"0F5DEC68-DB34-42BB-A1C1B609175D7C57"
	,"version":"7.1.3"
	,"name":"Exasol"
}

The third method allows you to define extensions by specifying their unique identifier (id). If the extension is not available locally, Lucee will automatically download it from the Lucee extension provider. This feature simplifies the process and ensures that your extensions are always up to date and readily accessible.

Seamless Installation:

Extensions are installed before the rest of the configuration is loaded. This enables you to, for example, install the S3 extension and immediately utilize it for a mapping that points to your S3 storage, simplifying the setup process and ensuring smooth integration of essential features.

With these enhancements in Lucee 6, we aim to make your configuration experience more versatile, efficient, and user-friendly, ultimately providing you with a modern and powerful toolset to tailor Lucee to your exact requirements.

ConfigImport

Introducing configImport in Lucee 6

With Lucee 6, we’ve added the configImport function. This practical tool simplifies the process of updating your current configuration. Here’s a quick example to show you how it works:

configImport({
    "fileSystem": {
			"functionAdditionalDirectory": "{web-root-directory}/addfunction/"
    	}
  	}, 
  	"web", 
  	"mypassword"
);

How Does It Work?

  • Dual Input Options: The first argument of configImport can be a structure containing the data you wish to update, or it can be a path pointing to a cfconfig file. This flexibility allows you to choose the most convenient method for your needs.
  • Security Measures: For security, updating configurations requires the Lucee Administrator password. This ensures that your configurations remain secure and are only modified with proper authorization.
  • Password Initialization: If you haven’t set an administrator password yet, the password provided in this function will be established as your new administrator password. This feature is particularly useful during initial setups or when configuring Server.cfc or Web.cfc on startup.

Use configImport to streamline your configuration updates in Lucee 6.

There is More

Next to the bigger changes, Lucee comes with a lot of “smaller” changes, but these can have big benefits for your daily life. Let’s delve into some of these enhancements:

CFS Templates

Simplifying Script Code with .cfs Files in Lucee 6

Lucee 6 introduces the convenience of using .cfs files. These files are designed to streamline your scripting experience by allowing script code to be written directly, without the need for enclosing it in <cfscript> tags.

Key Features:

  • Direct Scripting: Write your ColdFusion script code directly in .cfs files. This eliminates the extra step of wrapping your code in <cfscript> tags, making your code cleaner and more straightforward.
  • Seamless Integration: .cfs files work seamlessly within the Lucee environment, allowing for a more efficient coding process.

This new feature is all about making your development process more efficient and less cluttered. Give .cfs files a try and experience a smoother scripting workflow in Lucee 6.

Enhanced Number Handling

In Lucee 6, we’ve made a significant change in how numbers are handled internally. Moving away from the previous standard of using “double”, Lucee 6 now employs “BigDecimal” for number processing.

Key Improvements:

  • Increased Precision: BigDecimal offers greater precision in mathematical operations compared to double. This enhancement ensures that your calculations are more accurate and reliable.
  • Simplified Coding: With this transition to BigDecimal, the need for using the PrecisionEvaluate function is eliminated. You can now perform precise mathematical operations directly, without additional function calls.

This upgrade to BigDecimal in Lucee 6 marks a leap forward in offering more precise and efficient number handling for your applications.

Connection Pooling

In Lucee 6, there’s a significant change in how datasource connections are managed. Moving away from the custom-made connection pool that was previously used, Lucee now integrates Apache Commons Pool2 for handling datasource connections.

Advantages of This Shift:

  • Enhanced Control: Apache Commons Pool2 provides a more robust framework for managing connection pools, offering greater control over how datasource connections are handled.
  • Future-Ready: This transition opens up new possibilities for future enhancements in managing datasource connections. With Apache Commons Pool2, Lucee is better positioned to incorporate advanced features and improvements in connection management.

By adopting Apache Commons Pool2, Lucee 6 sets the stage for more efficient and effective connection pooling, aligning with modern standards and practices.

New and Extended Functions/Tags

Lucee 6 brings a host of new and enhanced functions and tags, broadening the capabilities and efficiency of your coding experience. Here’s a snapshot of what’s new:

  • General Enhancements: <cfsetting> tag gets additional attributes for more control.
    Array Functions: Introducing ArrayRemoveDuplicates, ArraySplice to manipulate arrays more effectively.
  • File and Query Handling: Functions like IsFileObject, DirectoryInfo, QueryAppend, QueryClear, QueryInsertAt, QueryIsEmpty, QueryPrepend, QueryRenameColumn, QueryReverse, QueryRowSwap offer more nuanced file and query operations.
  • String Manipulation: New functions such as StringEach, StringEvery, StringFilter, StringMap, StringReduce, StringSome, StringSort for advanced string processing.
  • Markdown to HTML: Convert Markdown to HTML easily with MarkdownToHTML.
  • System Insights: ExtensionInfo for detailed information about Lucee extensions.
  • Internal Requests and Searches: Use InternalRequest, findLast, findLastNoCase, and more for internal process management and string searching.

This is just a glimpse of the extensive list of new functionalities in Lucee 6, designed to make your development process more efficient and versatile.

Shrink Down Core Size

In Lucee 6, we’ve taken significant steps to optimize and streamline the core by moving more core functionalities to extensions. Key features like Axis, ESAPI, and Image processing have been transitioned into extension modules.

Benefits of This Approach:

  • On-Demand Loading: Libraries from these extensions are now loaded only when needed. This on-demand approach reduces the initial load on the system, enhancing performance and efficiency.
  • Lighter Core: By moving these functionalities out of the core, the overall size of the Lucee core is reduced. This makes for a leaner, more agile application core, which is easier to maintain and quicker to start.
  • Customizable Setup: With core functionalities as extensions, you can tailor your Lucee setup more precisely, adding only the extensions you need for your specific use case.

This strategic reorganization of core functionalities into extensions marks a significant step towards a more modular, efficient, and performance-oriented Lucee 6.

Removed XML Transformers/Parser

Streamlining XML Handling in Lucee 6

In Lucee 6, we’ve made a strategic decision regarding the handling of XML data. We’ve removed the external XML transformers and parsers that were previously part of Lucee and have shifted to utilizing the capabilities inherent in the Java Virtual Machine (JVM).

Key Changes and Benefits:

  • Leveraging JVM Capabilities: By relying on the XML processing functionalities available within the JVM, Lucee 6 simplifies its architecture. This change ensures more native and efficient XML handling, tapping into the JVM’s robust and optimized XML processing features.
  • Reduced Overhead: This shift away from external XML tools reduces the overhead associated with maintaining separate XML processors. It streamlines Lucee’s functionality and potentially enhances performance and stability.
  • Simplified Maintenance: With XML processing now directly managed by the JVM, developers can expect a more straightforward approach to XML handling in Lucee 6, aligning with standard Java practices.

This update in Lucee 6 reflects our ongoing commitment to optimizing and simplifying the platform, ensuring that it remains as efficient and developer-friendly as possible.

Global Proxy

Lucee 6 introduces the capability to define a global proxy. This feature allows you to specify proxy settings either through the Lucee Administrator or directly within the Application.cfc. The global proxy settings ensure that all HTTP requests from Lucee go through the specified proxy server.

this.proxy = {
	server: "myproxy.com",
	port: 1234,
	username: "susi",
	password: "sorglos",
		excludes: ["lucee.org"],
		includes: ["whatever.com"]
};

Key Features:

  • Flexibility: You can easily define the proxy server, port, and authentication details.
  • Selective Routing: The excludes and includes arrays allow you to specify which domains should bypass or use the proxy, giving you fine-grained control over your network traffic.
  • Centralized Management: Setting the proxy at the application level (or via the Lucee Administrator) offers a centralized approach to manage how external resources are accessed by your applications.

This feature is particularly useful for scenarios where internet access is restricted or monitored through a proxy, ensuring seamless integration of Lucee applications in such environments.

Extensions

Next to the Lucee core we also have a lot of changes made to Lucee extensions.

Tasks

Lucee 6 brings a significant enhancement with its new event-driven Task engine extension. This extension is designed to execute tasks in an innovative yet familiar way, offering flexibility and efficiency in task management.

Key Aspects of the New Task Engine:

  • Versatility: The new Task engine in Lucee 6 allows for task execution that is similar to the conventional scheduled tasks, providing a familiar ground for those accustomed to the previous system.
  • Ease of Transition: If you’re already using scheduled tasks, transitioning to the new event-driven Task engine is straightforward. This feature ensures a seamless shift, minimizing the learning curve and adaptation time.
  • Event-Driven Approach: With this update, tasks in Lucee can be triggered by specific events, offering more dynamic and responsive task management. This approach allows for more precise control over when and how tasks are executed.

The introduction of the event-driven Task engine in Lucee 6 represents a step forward in simplifying and enhancing the task execution process, aligning with modern development practices.

Image Extension

Lucee 6 expands the functionality of its Image extension to support a wider range of image formats and includes built-in support for JDeli, a commercial library known for its advanced imaging capabilities.

What’s New?

  • Broader Format Compatibility: The Image extension now supports additional formats such as WEBP, HEIC, HEIF, PSD, and more. This expansion allows for more flexibility in handling various image types within your applications.
  • JDeli Integration: Built-in support for JDeli enhances the Image extension’s capabilities. JDeli is a high-performance, commercial library that offers advanced image processing features. This integration provides superior image handling, especially for formats that are not natively supported by the JVM.

The enhanced Image extension in Lucee 6, with its wider format support and JDeli integration, significantly improves image processing capabilities, making it easier to work with a variety of image formats in your applications.

Redis Cache Extension

The Redis Cache Extension in Lucee 6 has undergone significant improvements. These enhancements not only involve a shift to a new library but also the introduction of a feature for direct, native access.

Key Updates:

  • New Library Integration: The extension now utilizes a different library for Redis Cache. This transition aims to bolster the extension’s efficiency and capability, ensuring more robust and feature-rich Redis integration for Lucee users.
  • Direct Access with RedisCommand: A major feature is the addition of the RedisCommand function. This function allows Lucee developers to execute Redis commands natively, offering an unprecedented level of control and flexibility in managing cache operations.

These improvements in the Redis Cache Extension for Lucee 6 are designed to enhance the overall performance and functionality of Redis caching, making it more adaptable to the diverse needs of web applications.

S3 Extension

Enhanced Direct Access and Expanded Support in Lucee 6

The S3 Extension in Lucee 6 has received substantial updates, introducing native access functions and broadening support for various S3 providers.

What’s New?

  • Native Access Functions: The addition of functions for native access to the S3 extension marks a significant enhancement. This allows for more direct and precise interaction with S3, not limited to its use as a virtual file system. The benefit? Improved performance due to more efficient, targeted code.
  • Support for Additional S3 Providers: Lucee 6’s S3 Extension now extends support beyond AWS to include other S3-compatible providers like Google Cloud Storage and Wasabi. This broadened compatibility offers more flexibility in choosing storage solutions that fit your needs.
  • Library Transition: We’ve transitioned from the Jedis library to the library provided by AWS. The reason? Jedis had certain limitations and bugs that restricted functionality. The AWS library, on the other hand, provides a more reliable and comprehensive toolkit for interacting with S3 services.

These enhancements in the S3 Extension for Lucee 6 are designed to improve both the versatility and performance of S3 interactions, offering a more robust and flexible approach to managing S3 resources.

19 Likes

Fantastic work to the Lucee team!

Two minor questions:

  1. Is there a way to uninstall extensions via config or any other mechanism?
  2. Is there a chance of an enhancement or possibly a way now (such as an interface for the connection pool) to use another connection pool?
    We typically use HikariCP when working in Java/Kotlin and it generally performs 5x - 50x better than DBCP2 when we check in on it, depending on query load, etc. We have never once found it performing worse, so it is something we would do if it was simple and perhaps even do a pull request for if the Lucee team were open to it.

Thank you for a huge upgrade to Lucee, especially for the async features and query/mail monitoring! Also excited to try out using CF in Java or Kotlin again to see if the ability to integrate the two, embedding CF into other apps has improved with the deeper integration.

We had to completely change the handling of extensions moving from xml to json. If you define an extension in cfconfig, Lucee installs the extension if it is not already installed. So you could argue when you remove an extension from cfconfig, it should be uninstalled, what is not the case yet, but thinking about it should be the case. We will look into that asap. Of course this excludes every action done with the function configImport, that is always adaptive.

maybe as a clarification, we don’t use “DBCP2” for handling connections in Lucee 6, we use " Apache Commons Pool 2", “DBCP2” is a product build with “Apache Commons Pool 2”. “DBCP2” nor HikariCP would be options for us to use, because of their to specific use case.
In Lucee or CFML in general you have a lot of specific functionality you have to support, we would not be able to switch to this pools without breaking a lot of backward compatibility.

We plan to move the whole DB handling to a extension in the near future. That gives more freedom with versioning and makes development easier, because you have a clear cut to the rest of Lucee.
So that could be interesting for you i think.

1 Like

Small addition, we have just moved the whole image handling to an extension and added support to use JDeli as underlying engine, IF you have the necessary license.
I could see a similar approach for DB handling

2 Likes

Is there a reference for the CFConfig spec? I need to make modifications to GitHub - dajester2013/lucee-maven-plugin: A maven plugin to simplify Lucee project development. to support writing mapping configs to the new config format.

@Brad_Wood I looked at the CFConfig manual, but I didn’t see a spec for the json format itself.

I think there is still no offical documentation. Commandbox cfconfig tool applies more to commandbox running, loading, updating a specific server setting for running a cfml engine. For example you also define there which type of vendor is running the cfengine (Lucee or ACF). This cfconfig of commanbox is commandbox specific.

But commandbox has strongly given inspiration to the way Lucee settings would be implemented there. For reference to Lucees servers cfconfig there hasnt been much documented, BUT(!!!) you can download and run a Lucee6 express version, and you should see all the Lucee server context setting in /path-to-your-lucee-express/lucee-server/context/.CFConfig.json. The settings are pretty self explaining.

1 Like

Gotcha. Just a point of concern, there needs to be a published spec at some point if this config format is going to be adopted as “standard”.

3 Likes

i will see if we can generate a full example automatically, having a static doc for this always is a hassle to keep it in sync. Lucce itself should have all the data to create a full example we then can extend with metadata.

1 Like

Is the redis extension still the same project at GitHub - lucee/extension-redis: Lucee Redis Cache Extension or something new?

I ask because we have a PR outstanding for the current one that has been outstanding for quite some time and we just supplied a test for it – but if it’s no longer relevant to Lucee 6 that would be good for us to know.

yes still relevant. we will look io it asap

Any resources on this extension and it’s use / examples?

Any resources on this extension and it’s use / examples?

maybe that’s it: GitHub - lucee/task-event-gateway