diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 32a416ac8e..dc22b16aa5 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -2,11 +2,11 @@
# We start with defining ownership globally and later on can get more granular.
# General content
-* @renejeglinsky @danjoa
+* @smahati @danjoa
-node.js/ @smahati @renejeglinsky @danjoa
-java/ @smahati @renejeglinsky @danjoa
-tools/ @chgeo @swaldmann @renejeglinsky
+node.js/ @smahati @danjoa
+java/ @smahati @danjoa
+tools/ @chgeo @swaldmann @smahati
# Infra
.github/ @chgeo @swaldmann
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index b8a996c671..36fe73a71f 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -25,13 +25,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v7
- name: Setup Pages
- uses: actions/configure-pages@v5
+ uses: actions/configure-pages@v6
- name: Use Node.js
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6
with:
- node-version: 22
+ node-version: 24
cache: 'npm'
- run: npm ci
- run: npm run lint
@@ -58,4 +58,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
- uses: actions/deploy-pages@v4
+ uses: actions/deploy-pages@v5
diff --git a/.vitepress/config.js b/.vitepress/config.js
index b2baa5b6a7..d8e16645a3 100644
--- a/.vitepress/config.js
+++ b/.vitepress/config.js
@@ -97,11 +97,6 @@ const config = defineConfig({
vite: {
plugins: [...playground.plugins()],
- esbuild: {
- supported: {
- 'top-level-await': true //browsers can handle top-level-await features in special cases
- },
- },
build: {
chunkSizeWarningLimit: 6000, // chunk for local search index dominates
},
@@ -139,8 +134,8 @@ const siteURL = new URL(process.env.SITE_HOSTNAME || 'http://localhost:4173/docs
if (!siteURL.pathname.endsWith('/')) siteURL.pathname += '/'
config.themeConfig.capire = {
versions: {
- java_services: '5.0.0',
- java_cds4j: '5.0.0',
+ java_services: '5.0.2',
+ java_cds4j: '5.0.2',
cloud_sec_ams: '3.8.1'
},
gotoLinks: [],
@@ -169,7 +164,7 @@ config.themeConfig.search = {
tokenize: text => text.split( /[\n\r #%*,=/:;?[\]{}()&]+/u ), // simplified charset: removed [-_.@] and non-english chars (diacritics etc.)
processTerm: (term, fieldName) => {
term = term.trim().toLowerCase().replace(/^\.+/, '').replace(/\.+$/, '')
- const stopWords = ['frontmatter', '$frontmatter.synopsis', 'and', 'about', 'but', 'now', 'the', 'with', 'you']
+ const stopWords = ['frontmatter', '$frontmatter.description', 'and', 'about', 'but', 'now', 'the', 'with', 'you']
if (term.length < 2 || stopWords.includes(term)) return false
if (fieldName === 'text') {
diff --git a/.vitepress/theme/components/ConfigInspect.vue b/.vitepress/theme/components/ConfigInspect.vue
index 617720ef7b..73f4be5104 100644
--- a/.vitepress/theme/components/ConfigInspect.vue
+++ b/.vitepress/theme/components/ConfigInspect.vue
@@ -120,7 +120,7 @@
pkgStr.value = JSON.stringify(pkg, null, 2)
rcJsonStr.value = JSON.stringify(pkg.cds??{}, null, 2)
- rcJsStr.value = 'exports.' + Object.keys(pkg.cds??{})[0] + ' = ' + (JSON.stringify(Object.values(pkg.cds??{})[0], null, 2)??'').replaceAll('"', '')
+ rcJsStr.value = 'exports.' + Object.keys(pkg.cds??{})[0] + ' = ' + (JSON.stringify(Object.values(pkg.cds??{})[0], null, 2)??'').replace(/"([^"]+)":/g, '$1:')
rcYmlStr.value = yaml.stringify(pkg.cds)
let envKey = fqn.replaceAll('_', '__').replaceAll(keyDel, '_')
diff --git a/.vitepress/theme/components/IndexList.vue b/.vitepress/theme/components/IndexList.vue
index 9ad27c66b7..dea64e8b64 100644
--- a/.vitepress/theme/components/IndexList.vue
+++ b/.vitepress/theme/components/IndexList.vue
@@ -11,7 +11,7 @@
- {{ p.title }}
-
+
diff --git a/.vitepress/theme/components/ShortcutsList.vue b/.vitepress/theme/components/ShortcutsList.vue
index 7b88de875d..40f068f785 100644
--- a/.vitepress/theme/components/ShortcutsList.vue
+++ b/.vitepress/theme/components/ShortcutsList.vue
@@ -6,7 +6,7 @@
×
Keyboard Shortcuts
-
+
| {{ cmd.name }} |
@@ -194,8 +194,11 @@ td, th {
/* Modal Content */
.modal-content {
position: relative;
+ display: flex;
+ flex-direction: column;
overflow: hidden;
resize: both;
+ box-sizing: border-box;
background-color: var(--vp-c-bg-soft);
margin: 10% auto;
border: 1px solid var(--vp-c-divider);
@@ -219,6 +222,9 @@ td, th {
/* Modal Body */
.modal-body {
+ flex: 1 1 auto;
+ min-height: 0;
+ overflow: auto;
font-size: 14px;
}
diff --git a/.vitepress/theme/components/StatusBadge.vue b/.vitepress/theme/components/StatusBadge.vue
index 0b48f31b4c..e596d5332e 100644
--- a/.vitepress/theme/components/StatusBadge.vue
+++ b/.vitepress/theme/components/StatusBadge.vue
@@ -1,17 +1,11 @@
-
+
+
\ No newline at end of file
diff --git a/.vitepress/theme/components/cds-playground/MonacoEditor.vue b/.vitepress/theme/components/cds-playground/MonacoEditor.vue
index dcfc08a305..4e605a772f 100644
--- a/.vitepress/theme/components/cds-playground/MonacoEditor.vue
+++ b/.vitepress/theme/components/cds-playground/MonacoEditor.vue
@@ -10,7 +10,6 @@
-{{ $frontmatter.synopsis }}
+{{ $frontmatter.description }}
CAP Java offers a [variety of plugins that integrate with SAP BTP services](../plugins/) and keep your application free of hard-coded service dependencies. In the CAP ecosystem, this approach is called [Calesi (CAP level service integration)](../get-started/concepts#the-calesi-pattern). Most Calesi plugins expose a CAP service that you can inject as a Spring Boot component. As the CAP runtime can run alongside a Spring Boot application without a CDS model, this lets you use proven service integration through CAP plugins with a growing set of SAP BTP services.
diff --git a/java/cds-data.md b/java/cds-data.md
index 761289f163..f5920fad80 100644
--- a/java/cds-data.md
+++ b/java/cds-data.md
@@ -1,5 +1,5 @@
---
-synopsis: >
+description: >
This section describes how CDS data is represented and used in CAP Java.
uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/65de2977205c403bbc107264b8eccf4b/9186ed9ab00842e1a31309ff1be38792.html
---
@@ -12,7 +12,7 @@ uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/
}
-{{ $frontmatter.synopsis }}
+{{ $frontmatter.description }}
diff --git a/java/change-tracking.md b/java/change-tracking.md
index 6a20ad44dd..4aec34bfe4 100644
--- a/java/change-tracking.md
+++ b/java/change-tracking.md
@@ -1,7 +1,6 @@
---
-synopsis: >
+description: >
Find here information about the change tracking feature in CAP Java.
-status: released
---
# Change Tracking
@@ -165,7 +164,7 @@ For example, for a book you can store an author name if you have an association
For compositions, no special annotations are required. The identifiers of the target entity are used instead.
-For example, given the following model:
+For example, given the following model:
```cds
entity Orders : cuid {
@@ -194,11 +193,11 @@ annotate OrderItems with @changelog: [
];
```
-Changes for `Orders` and `OrderItems` will have their own respective target or root identifiers filled.
+Changes for `Orders` and `OrderItems` will have their own respective target or root identifiers filled.
### Human-readable values for associations
-For associations, the value of the foreign key is stored in the changelog by default. You can change this and store the values of the associated entity instead.
+For associations, the value of the foreign key is stored in the changelog by default. You can change this and store the values of the associated entity instead.
This kind of identifier changes the values stored in the changelog, while [entity identifiers](#identifiers-for-entities) annotate changed values.
You annotate your entity like this:
@@ -218,12 +217,12 @@ such cases in the custom code or use annotations, for example, [`@assert.target`
### Caveats of Identifiers
-Consider the following important points that are relevant for all kinds of identifiers and human-readable values:
+Consider the following important points that are relevant for all kinds of identifiers and human-readable values:
- When you define the identifier for an entity, keep in mind that the projections of the annotated entity
inherit the annotation `@changelog`. If you change the structure of the projection,
for example, exclude or rename the elements that are used in the identifier, you must annotate the projection again
-to provide updated element names in the identifier. This is one additional benefit of annotating the top-most projection for change tracking.
+to provide updated element names in the identifier. This is one additional benefit of annotating the top-most projection for change tracking.
- The values of the identifier are stored together with the change log as-is. They are not translated and some data types might
not be formatted per user locale or some requirements, for example, different units of measurement or currencies.
@@ -391,7 +390,7 @@ Changes are correctly referenced to the root if the following conditions are tru
Avoid Direct modifications of composition items, they aren't supported by change tracking.
:::
-In the following example, the item's updated changelog entry _won't_ be associated with an order:
+In the following example, the item's updated changelog entry _won't_ be associated with an order:
```java
OrderItems item = OrderItems.create("...");
@@ -440,10 +439,10 @@ You can query the change log entries via CQN statements, as usual.
### Advanced Identifiers for Associated Entities
-By default, the identifier is read from the association when the feature captures images of the data.
+By default, the identifier is read from the association when the feature captures images of the data.
Additional joins might be expensive or impossible under some circumstances.
-:::warning Configuration change required!
+:::warning Configuration change required!
Enable [optimization for path expressions](/releases/2025/aug25#optimized-path-expressions).
:::
@@ -463,7 +462,7 @@ entity Entity {
Let's assume that `User` is impossible to join with the standard identifier or requires an identifier depending on the context of the user who reads the change log.
-You model the association like this:
+You model the association like this:
```cds
entity Entity {
@@ -474,9 +473,9 @@ entity Entity {
The change log will contain one entry for the field `user` just like the other associations with [human-readable values](#human-readable-values-for-associations), but the identifier will be its primary key.
-You need a custom handler to fetch your own custom identifier.
+You need a custom handler to fetch your own custom identifier.
-Here's the sketch for the handler to adapt the change log after read:
+Here's the sketch for the handler to adapt the change log after read:
```java
@Component
diff --git a/java/cqn-services/application-services.md b/java/cqn-services/application-services.md
index 73c6753493..f5292de3be 100644
--- a/java/cqn-services/application-services.md
+++ b/java/cqn-services/application-services.md
@@ -1,6 +1,6 @@
---
-synopsis: >
- Application Services define the APIs that a CAP application exposes to its clients, for example through OData. This section describes how to add business logic to these services, by extending CRUD events and implementing actions and functions.
+description: >
+ How to add business logic to Application Services — the APIs a CAP application exposes to its clients, for example through OData — by extending CRUD events and implementing actions and functions.
uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/65de2977205c403bbc107264b8eccf4b/9186ed9ab00842e1a31309ff1be38792.html
---
@@ -11,7 +11,7 @@ uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/
}
-{{ $frontmatter.synopsis }}
+{{ $frontmatter.description }}
## Handling CRUD Events { #crudevents}
diff --git a/java/cqn-services/index.md b/java/cqn-services/index.md
index 8be621f3e4..2a4bf24ff5 100644
--- a/java/cqn-services/index.md
+++ b/java/cqn-services/index.md
@@ -1,5 +1,6 @@
---
-synopsis: CQN Services are the core services of CAP that deal with CDS data. One of the key APIs provided by these services is the uniform query API based on CQN statements.
+description: >
+ Introduces CQN Services, the core services of CAP that deal with CDS data, providing a uniform query API based on CQN statements.
uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/65de2977205c403bbc107264b8eccf4b/9186ed9ab00842e1a31309ff1be38792.html
---
diff --git a/java/cqn-services/persistence-services.md b/java/cqn-services/persistence-services.md
index f087445657..6756355484 100644
--- a/java/cqn-services/persistence-services.md
+++ b/java/cqn-services/persistence-services.md
@@ -1,6 +1,6 @@
---
-synopsis: >
- Persistence Services are CQN-based database clients. This section describes which database types are supported, how datasources to these databases are created and how they are turned into Persistence Services.
+description: >
+ How CQN-based Persistence Services are created from datasources to supported database types and used as database clients.
uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/65de2977205c403bbc107264b8eccf4b/9186ed9ab00842e1a31309ff1be38792.html
---
@@ -11,7 +11,7 @@ uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/
}
-{{ $frontmatter.synopsis }}
+{{ $frontmatter.description }}
## Database Support { #database-support}
@@ -570,7 +570,7 @@ See [Class JdbcTemplate](https://docs.spring.io/spring-framework/docs/current/ja
The static model and accessor interfaces can be generated using the [CDS Maven Plugin](../developing-applications/building#cds-maven-plugin).
-::: warning
+::: warning
Currently, the generator doesn't support using reserved [Java keywords](https://docs.oracle.com/javase/specs/jls/se13/html/jls-3.html#jls-3.9) as identifiers in the CDS model. Conflicting element names can be renamed in Java using the [@cds.java.name](../cds-data#renaming-elements-in-java) annotation. For entities it is recommended to use [@cds.java.this.name](../cds-data#renaming-types-in-java).
:::
diff --git a/java/cqn-services/remote-services.md b/java/cqn-services/remote-services.md
index 7c408e4eb9..1388ed4234 100644
--- a/java/cqn-services/remote-services.md
+++ b/java/cqn-services/remote-services.md
@@ -1,5 +1,5 @@
---
-synopsis: >
+description: >
Remote Services are CQN-based clients to remote APIs that a CAP application consumes. This section describes how to configure and use these services.
uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/65de2977205c403bbc107264b8eccf4b/9186ed9ab00842e1a31309ff1be38792.html
---
@@ -11,7 +11,7 @@ uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/
}
-{{ $frontmatter.synopsis }}
+{{ $frontmatter.description }}
The CAP Java SDK supports _Remote Services_ for OData V2 and V4 APIs out of the box.
The CQN query APIs enable [late-cut microservices](../../get-started/features#late-cut-microservices) with simplified mocking capabilities. Regarding multitenant applications, these APIs keep you extensible, even towards remote APIs. In addition, they free developers from having to map CQN to OData themselves.
diff --git a/java/developing-applications/building.md b/java/developing-applications/building.md
index a6f1e8c5b6..94d553d9f7 100644
--- a/java/developing-applications/building.md
+++ b/java/developing-applications/building.md
@@ -1,7 +1,6 @@
---
-synopsis: >
- This section describes various options to create a CAP Java project from scratch, to build your application with Maven, and to modify an existing project with the CDS Maven plugin.
-
+description: >
+ How to create a CAP Java project from scratch, build it with Maven, and modify an existing project using the CDS Maven plugin.
uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/65de2977205c403bbc107264b8eccf4b/9186ed9ab00842e1a31309ff1be38792.html
---
diff --git a/java/developing-applications/configuring.md b/java/developing-applications/configuring.md
index f7e74a7007..057f82e187 100644
--- a/java/developing-applications/configuring.md
+++ b/java/developing-applications/configuring.md
@@ -1,5 +1,5 @@
---
-synopsis: >
+description: >
This section describes how to configure CAP Java applications.
uacp: Used as link target from Help Portal at https://help.sap.com/products/BTP/65de2977205c403bbc107264b8eccf4b/9186ed9ab00842e1a31309ff1be38792.html
@@ -42,7 +42,7 @@ Property defaults adjusted with the production profile are the following:
Note, that explicit configuration in the application takes precedence over property defaults from the production profile.
-::: warning
+::: warning
**Do not manually enable features for production that are disabled by the production profile**, as this could introduce serious security vulnerabilities.
:::
diff --git a/java/developing-applications/index.md b/java/developing-applications/index.md
index 2eacbb2286..b9f2b6c1eb 100644
--- a/java/developing-applications/index.md
+++ b/java/developing-applications/index.md
@@ -1,13 +1,12 @@
---
-synopsis: >
+description: >
Learn here about developing a CAP Java application.
-status: released
---
# Developing CAP Java Applications
-{{ $frontmatter.synopsis }}
+{{ $frontmatter.description }}