# 1.0.0-Beta8

BoxLang Betas are released weekly. This is our eigth beta marker and we are excited to report that we are 100% tag compatible with Adobe/Lucee and 99% BIF compatible. We can estimate that in the next 2 betas we will be 100% compatible with both Adobe/Lucee CFML engines when running BoxLang in compatibility mode.

{% hint style="danger" %}
Please note that this is our core competency definition. You can see our lists here:

* BIFS: <https://docs.google.com/spreadsheets/d/1SVr9NTYU51n9VyPrKVUjfF3EeEkEnkZOkrNmj1TE120/edit?pli=1&gid=0#gid=0&fvid=1144231850>
* Tags/Components\
  <https://docs.google.com/spreadsheets/d/1XkCQ8CPXslQWGCr8LHaQcDHZOMiwxST2nzX63_CSzvI/edit?gid=0#gid=0>
  {% endhint %}

## New Features

### [BL-394](https://ortussolutions.atlassian.net/browse/BL-394) contractPath() BIF

This allows you to get a relative path or mapping path from a fully expanded path in your system. This is useful, to understand where a full absolute path comes from:

```java
expandedPath = expandPath( "/brad" );  // /absolute/path/to/brad
contractPath( expandedPath ); // /brad
```

### [BL-395](https://ortussolutions.atlassian.net/browse/BL-395) Add loop times=n

We have added a new construct for looping by using the keyword `times` in your `loop` statements:

```groovy
loop times=5 {
    result &= "*";
}
```

You can also use `times` and the `index`

```groovy
loop times=5 index="i" {
    result &= i;
}
```

Or the `item` alias can be used as well as the `index`

```groovy
loop times=5 item="i" {
    result &= i;
}
```

### [BL-396](https://ortussolutions.atlassian.net/browse/BL-396) Implement GetBaseTagList() and getBaseTagData()

These two methods are to bring us closer to finalizing the creation of custom templating language constructs.

* `getBaseTagList( [caller] )` : Gets a comma-delimited list of uppercase ancestor tag names, as a string. The first list element is the current tag. If the current tag is nested, the next element is the parent tag. If the function is called for a top-level tag, it returns an empty string.
* `getBaseTagData( tagName, [level=1] )` : Used within a custom tag. Finds calling (ancestor) tag by name and accesses its data.

### [BL-397](https://ortussolutions.atlassian.net/browse/BL-397) Improve parser error messages for unpopped parser modes

For code like

```
<--- I never end
```

or

```
foo = "trumcated...
```

instead of our default “unpopped modes”, detect what specific mode is on the stack (comment\_mode, quotesMode, etc), find the start token (comment\_start, OPEN\_QUOTE, etc) and report the line number that the unclosed construct started, which could be hundreds of lines from the end of the file when parsing finally stopped.

### [BL-408](https://ortussolutions.atlassian.net/browse/BL-408) Transaction events

The BoxLang JDBC Transactions framework is now complete and incredibly robust. More than the other CFML engines or even Spring-based transaction demarcations. It is fully documented here:\
<https://boxlang.ortusbooks.com/boxlang-framework/transactions>

We have also added several events that you can listen to during the transaction processes:

* `onTransactionBegin`
* `onTransactionEnd`
* `onTransactionCommit`
* `onTransactionRollback`
* `onTransactionSetSavepoint`
* `onTransactionAcquire*`
* `onTransactionRelease*`

Note that all these events (with the exception of `onTransactionAcquire` and `onTransactionRelease`) have the potential to be acting upon a no-op transaction, with a null `connection` parameter since no connection was ever obtained.

## Improvements

[BL-402](https://ortussolutions.atlassian.net/browse/BL-402) Allow for circular references in structs and arrays

[BL-406](https://ortussolutions.atlassian.net/browse/BL-406) Java 21 update to URL creation as new URL is deprecated

[BL-407](https://ortussolutions.atlassian.net/browse/BL-407) add getMimeType method in FileSystemUtil to make it easier to get mime types of remote files ( e.g. PDF creation )

## Bugs

[BL-398](https://ortussolutions.atlassian.net/browse/BL-398) \<bx:loop query="query"> doesn't iterate over each item in the query, stays on the first item

[BL-404](https://ortussolutions.atlassian.net/browse/BL-404) session scope can be null in onSessionEnd, causing errors

## Tasks

[BL-372](https://ortussolutions.atlassian.net/browse/BL-372) Create tests for all valid and invalid dot and array access expressions


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://boxlang.ortusbooks.com/readme/release-history/beta-stage/1.0.0-beta8.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
