Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
Path to the directory to be registered or reset.

This folder should contain

- one or more REST enabled CFCs, i.e. with `rest=true`
- An `Application.cfc` (if required)
1 change: 0 additions & 1 deletion docs/03.reference/02.tags/dbinfo/_usageNotes.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,3 @@ Performance tips

- Using `type="columns_minimal"` is dramatically faster than `type="columns"`
- With `type="table"` using `filter="table"` is also much faster

2 changes: 2 additions & 0 deletions docs/03.reference/02.tags/pdf/_attributes/action.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
- setInfo
- thumbnail
- write
- extractimage (default)
- extractimages (alias for `extractimage`)

**Note:**

Expand Down
1 change: 1 addition & 0 deletions docs/03.reference/02.tags/pdf/tag.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,4 @@ The following list describes some of the tasks you can perform with the cfpdf ta
- Add and remove header/footer from PDF documents
- Optimize PDF documents
- Extract all the words from the pdf
- Extract images from PDF documents using the `extractimage` action.
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ component {
}
```

In difference to `this.mappings`, `this.componentpaths" and `this.customtagpaths` are taking arrays as input and not structs, because in that case there is not "virtual path" that needs to be defined.
In difference to `this.mappings`, `this.componentpaths` and `this.customtagpaths` are taking arrays as input and not structs, because in that case there is not "virtual path" that needs to be defined.

## Advanced

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ description: Mathematical, Logical, Ternary, Comparison, String and Elvis Operat
| --------- | -------------- | ----------- |
| EQ | equals | Returns true if operands are equal, e.g. `"A" EQ "A"` is true |
| == | equals | Returns true if operands are equal, e.g. `"A" == "A"` is true |
| === | identical | Returns true if operands are the same object in memory, false if they are not, (Note this is different than how JavaScript's `===` operator works). **Lucee 6 === works like javascript, comparing type and value, however, prior to 6.2.3.34, it was senstive to the underlying java types [LDEV-5806](https://luceeserver.atlassian.net/browse/LDEV-5806)** |
| === | identical | Returns true if operands are the same object in memory, false if they are not, (Note this is different than how JavaScript's `===` operator works). **Lucee 6 === works like javascript, comparing type and value, however, prior to 6.2.3.34, it was sensitive to the underlying java types [LDEV-5806](https://luceeserver.atlassian.net/browse/LDEV-5806)** |
| NEQ | does not equal | Returns true if operands are not equal, e.g. `"A" NEQ "B"` is true |
| \<\> | does not equal | Returns true if operands are not equal, e.g. `"A" <> "B"` is true |
| != | does not equal | Returns true if operands are not equal, e.g. `"A" != "B"` is true |
Expand Down
1 change: 0 additions & 1 deletion docs/04.guides/12.deploying-lucee-server-apps/page.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,6 @@ You can pre warm a lucee installation, by setting the env var `LUCEE_ENABLE_WARM

Lucee Docker images are already pre-warmed and Lucee 6.2 includes several improvements which make deployment faster.


## Admin and Docs extensions

You will see extensions, Lucee Admin and Lucee Docs, these simply install mappings to make them available. The admin is tightly coupled to the Lucee Version, so they aren't separately deployed
Expand Down
2 changes: 1 addition & 1 deletion docs/recipes/breaking-changes-6-2.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ Workaround, create an Application.cfc which extends the parent Application.cfc

[LDEV-5323](https://luceeserver.atlassian.net/browse/LDEV-5323)

## Strict Equality Operator was senstive to underlying java types
## Strict Equality Operator was sensitive to underlying java types

Lucee 6 improved the `===` operator to compare type and value, but was checking only the underlying java type, rather than cfml type, so numbers might fail

Expand Down
8 changes: 4 additions & 4 deletions docs/recipes/cfschedule-bulk-update.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<!--
{
"title": "Scheduled Tasks - efficently updating in a single operation",
"title": "Scheduled Tasks - efficiently updating in a single operation",
"id": "cfschedule-bulk",
"description": "How to update scheduled tasks in a single operation",
"since": "6.2.3.16",
Expand All @@ -19,7 +19,7 @@
}
-->

## Efficently and reliably updating scheduled tasks in a single operation
## Efficiently and reliably updating scheduled tasks in a single operation

Using the [[tag-schedule]] to update all tasks on application start has always been a bit slow, as each update reloads the config which is slow when updating many tasks.

Expand All @@ -31,7 +31,7 @@ Note, this approach only works reliably since 6.2.3.16, as the config import / m

### Updating tasks in a single transaction

An alternative and far more efficent approach is to
An alternative and far more efficient approach is to

1. Extract the **scheduledTasks** from `.CFConfig.json`,
2. Check and modify the array of tasks if needed (i.e. track changes)
Expand Down Expand Up @@ -76,7 +76,7 @@ Loop over the array and modify it as needed.

### Tip: avoid updates when there is no change

It's good to avoid updating the config if there is no change, but not so important when using this efficent approach.
It's good to avoid updating the config if there is no change, but not so important when using this efficient approach.

An easy way is to simply compare the source tasks array with the updated tasks array.

Expand Down
8 changes: 8 additions & 0 deletions docs/recipes/hooks-and-monitors.md
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,7 @@ You can define monitors directly in your `.CFConfig.json` configuration file und
```

**Configuration Properties:**

- `name`: Unique identifier for the monitor (required)
- `type`: Monitor type - `action`, `request`, or `interval` (required)
- `class`: Full Java class name (required unless using component)
Expand All @@ -332,6 +333,7 @@ You can define monitors directly in your `.CFConfig.json` configuration file und
- `async`: Run request monitors asynchronously (optional, request monitors only, default: false)

**Class Definition Resolution Order:**

1. **OSGi Bundle** - If `bundleName` is provided
2. **Maven Dependency** - If `maven` is provided
3. **CFML Component** - If `component` is provided (and `class` is null)
Expand Down Expand Up @@ -412,6 +414,7 @@ public class MyActionMonitor implements ActionMonitor {
### Use Cases

Action monitors are ideal for:

- Database query performance tracking
- Lock contention analysis
- Mail delivery monitoring
Expand Down Expand Up @@ -488,6 +491,7 @@ public class MyRequestMonitor implements RequestMonitor {
### Use Cases

Request monitors are ideal for:

- Application performance monitoring (APM)
- Error rate tracking
- User behavior analysis
Expand Down Expand Up @@ -566,6 +570,7 @@ public class MyIntervalMonitor implements IntervallMonitor {
### Use Cases

Interval monitors are ideal for:

- System resource monitoring
- Memory leak detection
- Performance baseline establishment
Expand Down Expand Up @@ -633,16 +638,19 @@ When implementing hooks and monitors, consider these security aspects:
## Common Issues

**Hook Not Loading**

- Verify class name and path are correct
- Check bundle/Maven dependencies are available
- Review Lucee logs for error messages

**Monitor Not Triggering**

- Ensure monitoring is enabled in `.CFConfig.json`
- Check that the monitor interface is implemented correctly
- Verify the extension manifest syntax is valid

**Performance Issues**

- Keep monitor logic lightweight
- Use asynchronous processing for expensive operations
- Implement proper error handling to prevent monitor failures
Expand Down
4 changes: 3 additions & 1 deletion docs/recipes/query-result-threshold.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,13 @@ This feature provides early warning when queries return unexpectedly large datas
Query result logging is configured using a single environment variable or system property:

**Environment Variable:**

```bash
LUCEE_QUERY_RESULT_THRESHOLD=100000
```

**System Property:**

```bash
-Dlucee.query.result.threshold=100000
```
Expand Down Expand Up @@ -157,10 +159,10 @@ When large result sets are logged:
2. Check that queries actually exceed the threshold
3. Ensure `warn` level logging is enabled for the `datasource` category


### False Positives

If logging captures expected large result sets:

- Adjust the threshold higher
- Use different thresholds for different environments
- Consider the business logic requirements
Expand Down
1 change: 1 addition & 0 deletions docs/recipes/thread-dump-startup.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ function analyzeThreadDump(path, threadName) {
```

This function provides:

- **Thread filtering**: Focus on specific threads by name (case-insensitive partial matching)
- **Relative timing**: Shows elapsed time from the first captured snapshot
- **Stack trace limiting**: Displays only the top stack frames for better readability
Expand Down
38 changes: 19 additions & 19 deletions docs/technical-specs/hooks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,24 @@ configuration:
property: "startupHooks"
format: "Array of objects"
schema:
class:
class:
type: "string"
required: true
description: "Full Java class name"
bundleName:
bundleName:
type: "string"
required: false
description: "OSGi bundle symbolic name"
bundleVersion:
bundleVersion:
type: "string"
required: false
description: "OSGi bundle version"
maven:
maven:
type: "string"
required: false
description: "Maven coordinates (groupId:artifactId:version)"
alternative_to: ["bundleName", "bundleVersion"]
component:
component:
type: "string"
required: false
description: "CFML component path"
Expand Down Expand Up @@ -59,7 +59,7 @@ constructor_resolution:
parameter_type: "lucee.runtime.config.Config"
actual_type: "ConfigServer instance"
detection: "Reflector.getConstructor(clazz, new Class[]{Config.class})"

fallback:
signature: "public ClassName()"
usage: "ClassUtil.loadInstance(clazz)"
Expand All @@ -70,17 +70,17 @@ class_loading:
method: "ClassUtil.loadClassByBundle()"
parameters:
- "className"
- "bundleName"
- "bundleName"
- "version (OSGi Version object)"
- "identification"
- "bundleDirectories"
- "versionOnlyMattersWhenDownloading"

maven_dependency:
condition: "maven is not null"
method: "config.getRPCClassLoader().loadClass()"
settings: "JavaSettingsImpl.getInstance(config, getMaven())"

standard_classpath:
condition: "fallback"
method: "ClassUtil.loadClass(ThreadLocalPageContext.getRPCClassLoader())"
Expand All @@ -96,7 +96,7 @@ instance_management:
recommended: true
static_field: "private static ClassName instance = null"
error_field: "private static RuntimeException re"
access_method:
access_method:
signature: "public static ClassName getInstance() throws PageException"
error_handling: "Throw PageException with initCause if initialization failed"

Expand All @@ -106,7 +106,7 @@ lifecycle_methods:
web_context_iteration: "configServer.getConfigWebs()"
context_filtering: "cw != null && cw.getServletContext() != null"
cli_exclusion: "!(cw.getServletContext() instanceof lucee.cli.servlet.ServletContextImpl)"

finalization:
method: "public void finalize()"
trigger: "Hook replacement or server shutdown"
Expand All @@ -126,7 +126,7 @@ error_handling:
storage: "Store RuntimeException in static field"
propagation: "Re-throw from constructor"
access: "Include as initCause in getInstance() PageException"

runtime_errors:
logging: "ConfigBase.log(config, log, throwable)"
continuation: "Process continues with remaining hooks"
Expand All @@ -136,7 +136,7 @@ implementation_details:
loading_trigger: "During ConfigServerImpl construction"
thread_safety: "Not required - sequential loading"
replacement_detection: "cd.equals(existing.cd)"

system_integration:
cfml_engine: "CFMLEngineFactory.getInstance()"
creation_util: "eng.getCreationUtil()"
Expand All @@ -148,12 +148,12 @@ common_patterns:
servlet_container: "ServletContext attributes"
jndi_binding: "Context.bind()"
system_properties: "System.getProperties().put()"

resource_initialization:
connection_pools: "DataSource configuration"
thread_pools: "ExecutorService creation"
cache_managers: "Cache provider setup"

web_context_management:
concurrent_map: "Map<String, Data> contexts"
context_id: "cw.getIdentification().getId()"
Expand All @@ -162,22 +162,22 @@ common_patterns:
dependencies:
required:
- name: "lucee-core"
classes:
classes:
- "lucee.runtime.config.Config"
- "lucee.runtime.config.ConfigServer"
- "lucee.runtime.config.ConfigWeb"
- name: "lucee.loader"
classes:
- "lucee.loader.engine.CFMLEngineFactory"

optional:
- name: "osgi-framework"
purpose: "Bundle class loading"
- name: "maven-resolver"
- name: "maven-resolver"
purpose: "Maven dependency resolution"

logging:
initialization: "System.out.println() for startup messages"
errors: "System.err.println() + printStackTrace()"
web_context_registration: "Log context ID and servlet path"
replacement: "Log when hooks are replaced"
replacement: "Log when hooks are replaced"
Loading
Loading