From 347de21f39f34d0645db065a800d394f649f6e47 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Thu, 9 Apr 2026 14:52:41 +0200 Subject: [PATCH 1/7] chore: exclude .claude and .omc directories from license and RAT plugins Claude Code and OMC create worktree directories (.claude/worktrees/) inside the project root. The license-maven-plugin scans these and fails because files like KEYS, doap.rdf, and .sdkmanrc have no comment style mapping (failIfUnknown=true). Exclude both .claude/ and .omc/ from both the mycila license plugin and the Apache RAT plugin. Co-Authored-By: Claude Opus 4.6 --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index 976d3a5e71b19..284f360ab2386 100644 --- a/pom.xml +++ b/pom.xml @@ -370,6 +370,8 @@ **/zkserver*.conf **/*.wasm **/*.lock + .claude/** + .omc/** .mvn/** .sdkmanrc KEYS @@ -582,6 +584,9 @@ **/commands/edit/edit-help.txt **/examples/* **/src/main/resources/testdata/**/* + + .claude/**/* + .omc/**/* .mvn/**/* **/maven-wrapper/* From 3c48bdbb5f75ed81be01eb7d44117f19bab6d22b Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Thu, 9 Apr 2026 16:53:20 +0200 Subject: [PATCH 2/7] ci: add Scalpel-based POM dependency detection alongside grep Add Maveniverse Scalpel 0.1.0 permanently to .mvn/extensions.xml as a parallel POM dependency detection mechanism in incremental-build.sh. Scalpel compares effective POM models between base and PR branches, catching managed dependencies, plugin version changes, BOM imports, and transitive dependency impacts that the existing grep approach misses. Both detection methods run in parallel; results are merged (union) before testing. If Scalpel fails, the script falls back to grep-only. On developer machines, Scalpel is a no-op (no base branch env vars). --- .github/CI-ARCHITECTURE.md | 43 +++-- .../incremental-build/incremental-build.sh | 164 ++++++++++++++++-- .mvn/extensions.xml | 5 + 3 files changed, 183 insertions(+), 29 deletions(-) diff --git a/.github/CI-ARCHITECTURE.md b/.github/CI-ARCHITECTURE.md index 72982d383d7d7..4672dcd5a9c3c 100644 --- a/.github/CI-ARCHITECTURE.md +++ b/.github/CI-ARCHITECTURE.md @@ -90,10 +90,14 @@ PR comment: /component-test kafka http The core test runner. Determines which modules to test using: 1. **File-path analysis**: Maps changed files to Maven modules -2. **POM dependency analysis**: For `parent/pom.xml` changes, detects property changes and finds modules that reference the affected properties in their `pom.xml` files (uses simple grep, not Maveniverse Toolbox — see Known Limitations below) +2. **POM dependency analysis** (dual detection): + - **Grep-based**: For `parent/pom.xml` changes, detects property changes and finds modules that explicitly reference the affected properties via `${property}` in their `pom.xml` files + - **Scalpel-based**: Uses [Maveniverse Scalpel](https://github.com/maveniverse/scalpel) (Maven extension) for effective POM model comparison — catches managed dependencies, plugin version changes, BOM imports, and transitive dependency impacts that the grep approach misses 3. **Extra modules**: Additional modules passed via `/component-test` -Results are merged, deduplicated, and tested. The script also: +Both detection methods run in parallel. Their results are merged (union), deduplicated, and tested. If Scalpel fails (build error, runtime error), the script falls back to grep-only with no regression. + +The script also: - Detects tests disabled in CI (`@DisabledIfSystemProperty(named = "ci.env.name")`) - Applies an exclusion list for generated/meta modules @@ -119,21 +123,40 @@ Installs system packages required for the build. The CI sets `-Dci.env.name=github.com` via `MVND_OPTS` (in `install-mvnd`). Tests can use `@DisabledIfSystemProperty(named = "ci.env.name")` to skip flaky tests in CI. The test comment warns about these skipped tests. -## Known Limitations of POM Dependency Detection +## POM Dependency Detection: Dual Approach + +### Grep-based detection (legacy) + +The grep approach searches for `${property-name}` references in module `pom.xml` files. It has known limitations: + +1. **Managed dependencies without explicit ``** — Modules inheriting versions via `` without declaring `${property}` are missed. +2. **Maven plugin version changes** — Plugin version properties consumed in `parent/pom.xml` via `` are invisible to child modules. +3. **BOM imports** — Modules using artifacts from a BOM are not linked to the BOM version property. +4. **Transitive dependency changes** — Only direct property references are detected. +5. **Non-property version changes** — Structural `` edits without property substitution are not caught. + +### Scalpel-based detection (new) + +[Maveniverse Scalpel](https://github.com/maveniverse/scalpel) is a Maven core extension that compares effective POM models between the base branch and the PR. It resolves all 5 grep limitations by: -The property-grep approach has structural limitations that can cause missed modules: +- Reading old POM files from the merge-base commit (via JGit) +- Comparing properties, managed dependencies, and managed plugins between old and new POMs +- Resolving the full transitive dependency graph to find all affected modules +- Detecting plugin version changes via `project.getBuildPlugins()` comparison -1. **Managed dependencies without explicit** `` — Most Camel modules inherit dependency versions via `` in the parent POM and do not declare `${property}` themselves. When a managed dependency version property changes, only modules that explicitly reference the property are detected — modules relying on inheritance are missed. +Scalpel runs in **report mode** (`-Dscalpel.mode=report`), writing a JSON report to `target/scalpel-report.json` without modifying the Maven reactor. The report includes affected modules with reasons (`SOURCE_CHANGE`, `POM_CHANGE`, `TRANSITIVE_DEPENDENCY`, `MANAGED_PLUGIN`). -2. **Maven plugin version changes are completely invisible** — Plugin version properties (e.g. ``) are both defined and consumed in `parent/pom.xml` via ``. Since the module search excludes `parent/pom.xml`, no modules are found and **no tests run at all** for plugin updates. Modules inherit plugins from the parent without any `${property}` reference in their own `pom.xml`. +### Dual-detection strategy -3. **BOM imports** — When a BOM version property changes (e.g. ``), modules using artifacts from that BOM are not detected because they reference the BOM's artifacts, not the BOM property. +Both methods run in parallel. Results are merged (union) before testing. This lets us: -4. **Transitive dependency changes** — Modules affected only via transitive dependencies are not detected. +1. **Validate Scalpel** — Compare what each method detects across many PRs +2. **No regression** — If Scalpel fails, grep results are still used +3. **Gradual migration** — Once Scalpel is validated, grep can be removed -5. **Non-property version changes** — Direct edits to `` values (not using `${property}` substitution) or structural changes to `` sections are not caught. +Scalpel is configured permanently in `.mvn/extensions.xml` (version `0.1.0`). On developer machines it is a no-op — without CI environment variables (`GITHUB_BASE_REF`), no base branch is detected and Scalpel returns immediately. The `mvn validate` with report mode adds ~60-90 seconds in CI. -These limitations mean the incremental build may under-test when parent POM properties change. A future improvement could use [Maveniverse Toolbox](https://github.com/maveniverse/toolbox) `tree-find` or [Scalpel](https://github.com/maveniverse/scalpel) to resolve the full dependency graph and detect all affected modules. +Note: the script overrides `fullBuildTriggers` to empty (`-Dscalpel.fullBuildTriggers=`) because Scalpel's default (`.mvn/**`) would trigger a full build whenever `.mvn/extensions.xml` itself changes (e.g., Dependabot bumping Scalpel). ## Manual Integration Test Advisories diff --git a/.github/actions/incremental-build/incremental-build.sh b/.github/actions/incremental-build/incremental-build.sh index 1938b7c8cefb5..d2f01ae420a45 100755 --- a/.github/actions/incremental-build/incremental-build.sh +++ b/.github/actions/incremental-build/incremental-build.sh @@ -19,10 +19,14 @@ # # Determines which modules to test by: # 1. File-path analysis: maps changed files to their Maven modules -# 2. POM dependency analysis: for changed pom.xml files, detects property -# changes and finds modules that reference the affected properties +# 2. POM dependency analysis (dual detection): +# a. Grep-based: detects property changes in parent/pom.xml and finds +# modules that explicitly reference the affected properties +# b. Scalpel-based: uses Maveniverse Scalpel extension for effective POM +# model comparison — catches managed deps, plugin changes, BOM imports, +# and transitive dependency impacts that grep misses # -# Both sets of affected modules are merged and deduplicated before testing. +# All sets of affected modules are merged and deduplicated before testing. set -euo pipefail @@ -185,6 +189,84 @@ analyzePomDependencies() { done <<< "$changed_props" } +# ── POM dependency analysis via Scalpel (parallel) ───────────────────── +# +# Uses Maveniverse Scalpel (Maven extension) for effective POM model +# comparison. Detects changed properties, managed dependencies, managed +# plugins, and transitive dependency impacts that the grep approach misses. +# Runs alongside grep — results are merged (union) for testing. +# See https://github.com/maveniverse/scalpel + +# Run Scalpel in report mode to detect modules affected by POM changes. +# Sets caller-visible variables: scalpel_module_ids, scalpel_module_paths, +# scalpel_props, scalpel_managed_deps, scalpel_managed_plugins +runScalpelDetection() { + echo " Running Scalpel change detection..." + + # Ensure sufficient git history for JGit merge-base detection + # (CI uses shallow clones; Scalpel needs to find the merge base) + git fetch origin main:refs/remotes/origin/main --depth=200 2>/dev/null || true + git fetch --deepen=200 2>/dev/null || true + + # Scalpel is permanently configured in .mvn/extensions.xml. + # On developer machines it's a no-op (no GITHUB_BASE_REF → no base branch detected). + # Run Maven validate with Scalpel in report mode: + # - mode=report: write JSON report without trimming the reactor + # - fullBuildTriggers="": override .mvn/** default (Scalpel lives in .mvn/extensions.xml) + # - alsoMake/alsoMakeDependents=false: we only want directly affected modules + # (our script handles -amd expansion separately) + local scalpel_args="-Dscalpel.mode=report -Dscalpel.fullBuildTriggers= -Dscalpel.alsoMake=false -Dscalpel.alsoMakeDependents=false" + # For workflow_dispatch, GITHUB_BASE_REF may not be set + if [ -z "${GITHUB_BASE_REF:-}" ]; then + scalpel_args="$scalpel_args -Dscalpel.baseBranch=origin/main" + fi + + echo " Scalpel: running mvn validate (report mode)..." + ./mvnw -B -q validate $scalpel_args -l /tmp/scalpel-validate.log 2>/dev/null || { + echo " WARNING: Scalpel detection failed (exit $?), skipping" + grep -i "scalpel" /tmp/scalpel-validate.log 2>/dev/null | head -5 || true + return + } + + # Parse the Scalpel report + local report="target/scalpel-report.json" + if [ ! -f "$report" ]; then + echo " WARNING: Scalpel report not found at $report" + grep -i "scalpel" /tmp/scalpel-validate.log 2>/dev/null | head -5 || true + return + fi + + # Check if full build was triggered + local full_build + full_build=$(jq -r '.fullBuildTriggered' "$report") + if [ "$full_build" = "true" ]; then + local trigger_file + trigger_file=$(jq -r '.triggerFile // "unknown"' "$report") + echo " Scalpel: Full build triggered by change to $trigger_file" + return + fi + + # Extract affected module artifactIds (colon-prefixed for Maven -pl compatibility) + scalpel_module_ids=$(jq -r '.affectedModules[].artifactId' "$report" 2>/dev/null | sort -u | sed 's/^/:/' | tr '\n' ',' | sed 's/,$//' || true) + scalpel_module_paths=$(jq -r '.affectedModules[].path' "$report" 2>/dev/null | sort -u | tr '\n' ',' | sed 's/,$//' || true) + scalpel_props=$(jq -r '(.changedProperties // []) | if length > 0 then join(", ") else "" end' "$report" 2>/dev/null || true) + scalpel_managed_deps=$(jq -r '(.changedManagedDependencies // []) | if length > 0 then join(", ") else "" end' "$report" 2>/dev/null || true) + scalpel_managed_plugins=$(jq -r '(.changedManagedPlugins // []) | if length > 0 then join(", ") else "" end' "$report" 2>/dev/null || true) + + local mod_count + mod_count=$(jq '.affectedModules | length' "$report" 2>/dev/null || echo "0") + echo " Scalpel detected $mod_count affected modules" + if [ -n "$scalpel_props" ]; then + echo " Changed properties: $scalpel_props" + fi + if [ -n "$scalpel_managed_deps" ]; then + echo " Changed managed deps: $scalpel_managed_deps" + fi + if [ -n "$scalpel_managed_plugins" ]; then + echo " Changed managed plugins: $scalpel_managed_plugins" + fi +} + # ── Disabled-test detection ───────────────────────────────────────────── # Scan tested modules for @DisabledIfSystemProperty(named = "ci.env.name") @@ -269,6 +351,8 @@ writeComment() { local changed_props_summary="$4" local testedDependents="$5" local extra_modules="$6" + local managed_deps_summary="${7:-}" + local managed_plugins_summary="${8:-}" echo "" > "$comment_file" @@ -288,21 +372,33 @@ writeComment() { # Section 2: pom dependency-detected modules if [ -n "$dep_ids" ]; then + echo "" >> "$comment_file" + echo ":white_check_mark: **POM dependency changes: targeted tests included**" >> "$comment_file" echo "" >> "$comment_file" if [ -n "$changed_props_summary" ]; then - echo ":white_check_mark: **POM dependency changes: targeted tests included**" >> "$comment_file" - echo "" >> "$comment_file" echo "Changed properties: ${changed_props_summary}" >> "$comment_file" echo "" >> "$comment_file" - local dep_count - dep_count=$(echo "$dep_ids" | tr ',' '\n' | wc -l | tr -d ' ') - echo "
Modules affected by dependency changes (${dep_count})" >> "$comment_file" + fi + if [ -n "$managed_deps_summary" ]; then + echo "Changed managed dependencies: ${managed_deps_summary}" >> "$comment_file" echo "" >> "$comment_file" - echo "$dep_ids" | tr ',' '\n' | while read -r m; do - echo "- \`$m\`" >> "$comment_file" - done + fi + if [ -n "$managed_plugins_summary" ]; then + echo "Changed managed plugins: ${managed_plugins_summary}" >> "$comment_file" echo "" >> "$comment_file" - echo "
" >> "$comment_file" + fi + local dep_count + dep_count=$(echo "$dep_ids" | tr ',' '\n' | wc -l | tr -d ' ') + echo "
Modules affected by dependency changes (${dep_count})" >> "$comment_file" + echo "" >> "$comment_file" + echo "$dep_ids" | tr ',' '\n' | while read -r m; do + echo "- \`$m\`" >> "$comment_file" + done + echo "" >> "$comment_file" + echo "
" >> "$comment_file" + if [ -n "$managed_deps_summary" ] || [ -n "$managed_plugins_summary" ]; then + echo "" >> "$comment_file" + echo "> :microscope: Detected via [Maveniverse Scalpel](https://github.com/maveniverse/scalpel) effective POM comparison" >> "$comment_file" fi fi @@ -389,20 +485,27 @@ main() { done pl="${pl:1}" # strip leading comma - # Only analyze parent/pom.xml for dependency detection - # (matches original detect-test.sh behavior; detection improvements deferred to follow-up PR) + # Only analyze parent/pom.xml for grep-based dependency detection + # (matches original detect-test.sh behavior) if echo "$diff_body" | grep -q '^diff --git a/parent/pom.xml'; then pom_files="parent/pom.xml" fi - # ── Step 2: POM dependency analysis ── + # ── Step 2: POM dependency analysis (dual: grep + Scalpel) ── # Variables shared with analyzePomDependencies/findAffectedModules local dep_module_ids="" local all_changed_props="" - + # Scalpel results (not local — set by runScalpelDetection) + scalpel_module_ids="" + scalpel_module_paths="" + scalpel_props="" + scalpel_managed_deps="" + scalpel_managed_plugins="" + + # Step 2a: Grep-based detection (existing approach) if [ -n "$pom_files" ]; then echo "" - echo "Analyzing parent POM dependency changes..." + echo "Analyzing parent POM dependency changes (grep)..." while read -r pom_file; do [ -z "$pom_file" ] && continue @@ -421,6 +524,29 @@ main() { done <<< "$pom_files" fi + # Step 2b: Scalpel detection (parallel, for any pom.xml change) + # Scalpel uses effective POM model comparison — catches managed deps, + # plugin changes, and transitive impacts that grep misses. + if echo "$diff_body" | grep -q '^diff --git a/.*pom\.xml'; then + echo "" + echo "Running Scalpel POM analysis..." + runScalpelDetection + fi + + # Step 2c: Merge grep and Scalpel results (union, deduplicated) + if [ -n "$scalpel_module_ids" ]; then + dep_module_ids="${dep_module_ids:+${dep_module_ids},}${scalpel_module_ids}" + dep_module_ids=$(echo "$dep_module_ids" | tr ',' '\n' | sort -u | tr '\n' ',' | sed 's/,$//') + fi + if [ -n "$scalpel_props" ]; then + if [ -z "$all_changed_props" ]; then + all_changed_props="$scalpel_props" + else + # Merge and deduplicate property names + all_changed_props=$(printf '%s, %s' "$all_changed_props" "$scalpel_props" | tr ',' '\n' | sed 's/^ *//' | sort -u | tr '\n' ',' | sed 's/,$//' | sed 's/,/, /g') + fi + fi + # ── Step 3: Merge and deduplicate ── # Separate file-path modules into testable (has src/test) and pom-only. # Pom-only modules (e.g. "parent") are kept in the build list but must NOT @@ -458,7 +584,7 @@ main() { if [ -z "$final_pl" ]; then echo "" echo "No modules to test" - writeComment "incremental-test-comment.md" "" "" "" "" "" + writeComment "incremental-test-comment.md" "" "" "" "" "" "" "" exit 0 fi @@ -546,7 +672,7 @@ main() { # ── Step 5: Write comment and summary ── local comment_file="incremental-test-comment.md" - writeComment "$comment_file" "$pl" "$dep_module_ids" "$all_changed_props" "$testedDependents" "$extraModules" + writeComment "$comment_file" "$pl" "$dep_module_ids" "$all_changed_props" "$testedDependents" "$extraModules" "$scalpel_managed_deps" "$scalpel_managed_plugins" # Check for tests disabled in CI via @DisabledIfSystemProperty(named = "ci.env.name") local disabled_tests diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml index fff4f4d46edcf..9a8476957eb2f 100644 --- a/.mvn/extensions.xml +++ b/.mvn/extensions.xml @@ -20,4 +20,9 @@ common-custom-user-data-maven-extension 2.1.0 + + eu.maveniverse.maven.scalpel + extension3 + 0.1.0 + From 6d73ce4f6bbb01cafecd3c1ca20b29e4801a8e16 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Thu, 9 Apr 2026 17:22:38 +0200 Subject: [PATCH 3/7] CAMEL-23303: Fix JBang metadata generation to detect all commands and resolve completion candidates - Enhance PrepareCamelJBangCommandsMojo to scan for addCommand() calls and resolve referenced command classes (e.g. wrapper, transform dataweave) - Resolve picocli ${COMPLETION-CANDIDATES} placeholders by instantiating the completionCandidates class and joining its values - Process each glob pattern independently in docs gulpfile resilientSrc so an ENOENT in one pattern doesn't abort other patterns - Add missing import for picocli ITypeConverter - Regenerate jbang command docs and metadata --- docs/gulpfile.js | 52 ++++++--- .../jbang-commands/camel-jbang-bind.adoc | 7 +- .../camel-jbang-catalog-component.adoc | 2 +- .../camel-jbang-catalog-dataformat.adoc | 2 +- .../camel-jbang-catalog-dev-console.adoc | 2 +- .../camel-jbang-catalog-language.adoc | 2 +- .../camel-jbang-catalog-other.adoc | 2 +- .../camel-jbang-catalog-transformer.adoc | 2 +- .../camel-jbang-cmd-logger.adoc | 2 +- .../camel-jbang-cmd-receive.adoc | 2 +- .../jbang-commands/camel-jbang-commands.adoc | 3 +- .../jbang-commands/camel-jbang-debug.adoc | 11 +- .../camel-jbang-dependency-copy.adoc | 11 +- .../camel-jbang-dependency-list.adoc | 11 +- .../camel-jbang-dependency-update.adoc | 11 +- .../pages/jbang-commands/camel-jbang-doc.adoc | 2 +- .../jbang-commands/camel-jbang-explain.adoc | 2 +- .../jbang-commands/camel-jbang-export.adoc | 11 +- .../camel-jbang-get-blocked.adoc | 1 + .../camel-jbang-get-circuit-breaker.adoc | 1 + .../camel-jbang-get-consumer.adoc | 1 + .../camel-jbang-get-context.adoc | 1 + .../jbang-commands/camel-jbang-get-count.adoc | 1 + .../camel-jbang-get-endpoint.adoc | 1 + .../jbang-commands/camel-jbang-get-event.adoc | 1 + .../camel-jbang-get-groovy.adoc | 1 + .../jbang-commands/camel-jbang-get-group.adoc | 1 + .../camel-jbang-get-health.adoc | 1 + .../camel-jbang-get-inflight.adoc | 1 + .../camel-jbang-get-internal-task.adoc | 1 + .../jbang-commands/camel-jbang-get-kafka.adoc | 1 + .../camel-jbang-get-metric.adoc | 1 + .../camel-jbang-get-platform-http.adoc | 1 + .../camel-jbang-get-processor.adoc | 1 + .../camel-jbang-get-producer.adoc | 1 + .../camel-jbang-get-properties.adoc | 1 + .../jbang-commands/camel-jbang-get-rest.adoc | 1 + .../jbang-commands/camel-jbang-get-route.adoc | 1 + .../camel-jbang-get-service.adoc | 1 + .../camel-jbang-get-transformer.adoc | 1 + .../camel-jbang-get-variable.adoc | 1 + .../jbang-commands/camel-jbang-get-vault.adoc | 1 + .../jbang-commands/camel-jbang-harden.adoc | 2 +- .../jbang-commands/camel-jbang-init.adoc | 1 + .../pages/jbang-commands/camel-jbang-run.adoc | 11 +- .../jbang-commands/camel-jbang-sbom.adoc | 11 +- .../jbang-commands/camel-jbang-script.adoc | 2 +- .../camel-jbang-top-context.adoc | 1 + .../jbang-commands/camel-jbang-top-group.adoc | 1 + .../camel-jbang-top-processor.adoc | 1 + .../jbang-commands/camel-jbang-top-route.adoc | 1 + .../camel-jbang-transform-dataweave.adoc | 29 +++++ .../camel-jbang-transform-route.adoc | 2 +- .../jbang-commands/camel-jbang-transform.adoc | 1 + .../camel-jbang-version-list.adoc | 2 +- .../camel-jbang-version-set.adoc | 2 +- .../jbang-commands/camel-jbang-wrapper.adoc | 28 +++++ .../camel-jbang-commands-metadata.json | 35 +++--- .../PrepareCamelJBangCommandsMojo.java | 109 +++++++++++++++++- 59 files changed, 313 insertions(+), 87 deletions(-) create mode 100644 docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform-dataweave.adoc create mode 100644 docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-wrapper.adoc diff --git a/docs/gulpfile.js b/docs/gulpfile.js index 7481f5969106e..e73414e8b8422 100644 --- a/docs/gulpfile.js +++ b/docs/gulpfile.js @@ -316,23 +316,38 @@ const tasks = Array.from(sourcesMap).flatMap(([type, definition]) => { }) } - // Wraps gulp.src() to handle ENOENT errors from race conditions when - // builds run concurrently (e.g., test execution deleting target/surefire - // while the glob scans directories). Uses a passthrough stream to - // decouple error handling from gulp's task tracking. + // Wraps gulp.src to gracefully handle ENOENT from ephemeral directories + // (e.g. .camel-jbang/work created/deleted by tests running in parallel). + // Each source pattern is processed as a separate gulp.src stream so that + // an ENOENT in one pattern (e.g. the dsl glob) doesn't abort the other + // patterns (e.g. core, components). Results are merged into a single + // passthrough stream. + const ignorePatterns = ['**/target/**', '**/.camel-jbang/**'] const resilientSrc = (source, options) => { + const patterns = Array.isArray(source) ? source : [source] const passthrough = through2.obj() - const src = gulp.src(source, options) - - src.on('data', (file) => passthrough.push(file)) - src.on('end', () => passthrough.push(null)) - src.on('error', (err) => { - if (err.code === 'ENOENT' && err.path && err.path.includes(`${path.sep}target${path.sep}`)) { - console.warn(`⚠️ Ignoring ENOENT in build directory: ${err.path}`) - passthrough.push(null) - } else { - passthrough.destroy(err) + let remaining = patterns.length + + const onStreamDone = () => { + remaining-- + if (remaining === 0) { + passthrough.end() } + } + + patterns.forEach(pattern => { + const src = gulp.src(pattern, options) + let done = false + src.on('data', chunk => passthrough.write(chunk)) + src.on('error', err => { + if (err.code === 'ENOENT') { + console.error(`⚠️ ENOENT (skipped): ${err.path || err.message}`) + } else { + passthrough.destroy(err) + } + }) + src.on('end', () => { if (!done) { done = true; onStreamDone() } }) + src.on('close', () => { if (!done) { done = true; onStreamDone() } }) }) return passthrough @@ -350,10 +365,12 @@ const tasks = Array.from(sourcesMap).flatMap(([type, definition]) => { } }) - return resilientSrc(source, { ignore: ['**/target/**', '**/target'] }) + let fileCount = 0 + return resilientSrc(source, { ignore: ignorePatterns, allowEmpty: true }) .pipe(filterFn) .pipe( map((file, done) => { + fileCount++ // this flattens the output to just .../pages/.../file.ext // instead of .../pages/camel-.../src/main/docs/.../file.ext file.base = path.dirname(file.path) @@ -363,6 +380,9 @@ const tasks = Array.from(sourcesMap).flatMap(([type, definition]) => { .pipe(gulp.symlink(destination, { relativeSymlinks: true, })) + .on('end', () => { + console.log(` → symlinked ${fileCount} files to ${destination}`) + }) } // generates sorted & grouped nav.adoc file from a set of .adoc @@ -433,7 +453,7 @@ const tasks = Array.from(sourcesMap).flatMap(([type, definition]) => { return done() } - return resilientSrc(source, { ignore: ['**/target/**', '**/target'] }) // asciidoc files + return resilientSrc(source, { ignore: ignorePatterns, allowEmpty: true }) // asciidoc files .pipe(through2.obj(extractExamples)) // extracted example files // symlink links from a fixed directory, i.e. we could link to // the example files from `destination`, that would not work for diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-bind.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-bind.adoc index ed22844f67e52..0709193a4a8bb 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-bind.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-bind.adoc @@ -2,7 +2,10 @@ // AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE = camel bind -Bind source and sink Kamelets as a new Camel integration +DEPRECATED: Bind source and sink Kamelets as a new Camel integration + + +CAUTION: This command is deprecated. == Usage @@ -20,7 +23,7 @@ camel bind [options] |=== | Option | Description | Default | Type | `--error-handler` | Add error handler (none|log|sink:). Sink endpoints are expected in the format [[apigroup/]version:]kind:[namespace/]name, plain Camel URIs or Kamelet name. | | String -| `--output` | Output format generated by this command (supports: file, yaml or json). | file | String +| `--output` | Output format generated by this command (supports: file, yaml, json). | file | String | `--property` | Adds a pipe property in the form of [source|sink|error-handler|step-].= where is the step number starting from 1 | | String | `--sink` | Sink (to) such as a Kamelet or Camel endpoint uri | | String | `--source` | Source (from) such as a Kamelet or Camel endpoint uri | | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-component.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-component.adoc index 0689e6c949c99..59587bd999388 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-component.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-component.adoc @@ -27,7 +27,7 @@ camel catalog component [options] | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--since-after` | Filter by version more recent (inclusive) | | String | `--since-before` | Filter by version older (inclusive) | | String | `--sort` | Sort by name, support-level, or description | name | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-dataformat.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-dataformat.adoc index 9f617f9d2a7ca..4b29c82032ca8 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-dataformat.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-dataformat.adoc @@ -27,7 +27,7 @@ camel catalog dataformat [options] | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--since-after` | Filter by version more recent (inclusive) | | String | `--since-before` | Filter by version older (inclusive) | | String | `--sort` | Sort by name, support-level, or description | name | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-dev-console.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-dev-console.adoc index 9d7e793408a40..1a4cb31a6707a 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-dev-console.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-dev-console.adoc @@ -27,7 +27,7 @@ camel catalog dev-console [options] | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--since-after` | Filter by version more recent (inclusive) | | String | `--since-before` | Filter by version older (inclusive) | | String | `--sort` | Sort by name, support-level, or description | name | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-language.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-language.adoc index a6a6be0c84ac8..e191507990605 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-language.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-language.adoc @@ -27,7 +27,7 @@ camel catalog language [options] | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--since-after` | Filter by version more recent (inclusive) | | String | `--since-before` | Filter by version older (inclusive) | | String | `--sort` | Sort by name, support-level, or description | name | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-other.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-other.adoc index e0991c182f4e6..51c0de110d420 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-other.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-other.adoc @@ -27,7 +27,7 @@ camel catalog other [options] | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--since-after` | Filter by version more recent (inclusive) | | String | `--since-before` | Filter by version older (inclusive) | | String | `--sort` | Sort by name, support-level, or description | name | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-transformer.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-transformer.adoc index 91b6ffe9f4865..d176c6a8bc519 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-transformer.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-catalog-transformer.adoc @@ -27,7 +27,7 @@ camel catalog transformer [options] | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--since-after` | Filter by version more recent (inclusive) | | String | `--since-before` | Filter by version older (inclusive) | | String | `--sort` | Sort by name, support-level, or description | name | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-logger.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-logger.adoc index dd44666794155..6be32e4da52f9 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-logger.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-logger.adoc @@ -20,7 +20,7 @@ camel cmd logger [options] |=== | Option | Description | Default | Type | `--logger` | The logger name | root | String -| `--logging-level` | To change logging level () | | String +| `--logging-level` | To change logging level (ERROR, WARN, INFO, DEBUG, TRACE) | | String | `--sort` | Sort by pid, name or age | pid | String | `-h,--help` | Display the help and sub-commands | | boolean |=== diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-receive.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-receive.adoc index 2e9a1caded715..be7d06f01e2e4 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-receive.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-receive.adoc @@ -28,7 +28,7 @@ camel cmd receive [options] | `--logging-color` | Use colored logging | true | boolean | `--mask` | Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys | | boolean | `--only-body` | Show only message body in received messages | false | boolean -| `--output` | Output format (text or json) | | String +| `--output` | Output format (auto, true, false) | | String | `--prefix` | Print prefix with running Camel integration name. auto=only prefix when running multiple integrations. true=always prefix. false=prefix off. | auto | String | `--pretty` | Pretty print message body when using JSon or XML format | | boolean | `--prop,--property` | Additional properties; override existing (only applicable when NOT using an existing running Camel) | | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc index edfd48586a310..8d9e0406c6a9f 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-commands.adoc @@ -11,7 +11,7 @@ TIP: You can also use `camel --help` or `camel --help` to see availabl [cols="2,5",options="header"] |=== | Command | Description -| xref:jbang-commands/camel-jbang-bind.adoc[camel bind] | Bind source and sink Kamelets as a new Camel integration +| xref:jbang-commands/camel-jbang-bind.adoc[camel bind] | DEPRECATED: Bind source and sink Kamelets as a new Camel integration | xref:jbang-commands/camel-jbang-catalog.adoc[camel catalog] | List artifacts from Camel Catalog | xref:jbang-commands/camel-jbang-cmd.adoc[camel cmd] | Performs commands in the running Camel integrations, such as start/stop route, or change logging levels. | xref:jbang-commands/camel-jbang-completion.adoc[camel completion] | Generate completion script for bash/zsh @@ -43,4 +43,5 @@ TIP: You can also use `camel --help` or `camel --help` to see availabl | xref:jbang-commands/camel-jbang-transform.adoc[camel transform] | Transform message or Camel routes | xref:jbang-commands/camel-jbang-update.adoc[camel update] | Update Camel project | xref:jbang-commands/camel-jbang-version.adoc[camel version] | Manage Camel versions +| xref:jbang-commands/camel-jbang-wrapper.adoc[camel wrapper] | Install Camel wrapper scripts for version pinning |=== diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-debug.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-debug.adoc index f7bcff1d740bf..a545282a1cd8c 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-debug.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-debug.adoc @@ -36,6 +36,7 @@ camel debug [options] | `--gav` | The Maven group:artifact:version (used during exporting) | | String | `--health` _(deprecated)_ | Deprecated: use --observe instead. Health check at /q/health on local HTTP server (port 8080 by default) | false | boolean | `--ignore-loading-error` | Whether to ignore route loading and compilation errors (use this with care!) | false | boolean +| `--java-version,--java` | Java version (21, 25) | 21 | String | `--jfr` | Enables Java Flight Recorder saving recording to disk on exit | false | boolean | `--jfr-profile` | Java Flight Recorder profile to use (such as default or profile) | | String | `--jvm-debug` | To enable JVM remote debugging on port 4004 by default. The supported values are true to enable the remote debugging, false to disable the remote debugging or a number to use a custom port | | int @@ -45,10 +46,10 @@ camel debug [options] | `--log-lines` | Number of log lines to display on top of screen | 10 | int | `--logging` | Can be used to turn off logging | true | boolean | `--logging-category` | Used for individual logging levels (ex: org.apache.kafka=DEBUG) | | List -| `--logging-color` | Use colored logging | true | boolean +| `--logging-color` | Use colored logging. Default is auto-detected based on NO_COLOR, CI, FORCE_COLOR environment variables and terminal capabilities | | boolean | `--logging-config-path` | Path to file with custom logging configuration | | String | `--logging-json` | Use JSON logging (ECS Layout) | false | boolean -| `--logging-level` | Logging level () | info | String +| `--logging-level` | Logging level (ERROR, WARN, INFO, DEBUG, TRACE) | info | String | `--management-port` | To use a dedicated port for HTTP management (use 0 to dynamic assign a free random port number) | | int | `--mask` | Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys | | boolean | `--maven-apache-snapshot-enabled` | Whether downloading JARs from ASF Maven Snapshot repository is enabled | true | boolean @@ -67,7 +68,7 @@ camel debug [options] | `--package-scan-jars` | Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang | false | boolean | `--port` | Embeds a local HTTP server on this port (port 8080 by default; use 0 to dynamic assign a free random port number) | | int | `--pretty` | Pretty print message body when using JSon or XML format | | boolean -| `--profile` | Profile to run (dev, test, or prod). | dev | String +| `--profile` | Profile to run (dev, test, prod). | dev | String | `--prompt` | Allow user to type in required parameters in prompt if not present in application | false | boolean | `--prop,--property` | Additional properties (override existing) | | String | `--properties` | comma separated list of properties file (ex. /path/to/file.properties,/path/to/other.properties | | String @@ -77,13 +78,13 @@ camel debug [options] | `--reload,--dev` | Enables dev mode (live reload when source files are updated and saved) | | boolean | `--remote-attach` | Attaches debugger remotely to an existing running Camel integration. (Add camel-cli-debug JAR to the existing Camel application and run before attaching this debugger) | | boolean | `--repo,--repos` | Additional maven repositories (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | camel-main | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | camel-main | RuntimeType | `--show-body` | Show message body in debug messages | true | boolean | `--show-exception` | Show exception and stacktrace for failed messages | true | boolean | `--show-exchange-properties` | Show exchange properties in debug messages | false | boolean | `--show-exchange-variables` | Show exchange variables in debug messages | true | boolean | `--show-headers` | Show message headers in debug messages | true | boolean -| `--skip-plugins` | Skip plugins during export | false | boolean +| `--skip-plugins` | Skip resolving plugin dependencies | false | boolean | `--source` | Prefer to display source filename/code instead of IDs | | boolean | `--source-dir` | Source directory for dynamically loading Camel file(s) to run. When using this, then files cannot be specified at the same time. | | String | `--spring-boot-version` | Spring Boot version | RuntimeType.SPRING_BOOT_VERSION | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-copy.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-copy.adoc index 6f1f1a2367968..0972d120be048 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-copy.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-copy.adoc @@ -26,6 +26,7 @@ camel dependency copy [options] | `--dep,--dependency` | Add additional dependencies | | List | `--dir,--directory` | Directory where the project will be exported | . | String | `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean +| `--dry-run` | Preview export without writing files | false | boolean | `--exclude` | Exclude files by name or pattern | | List | `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean | `--gav` | The Maven group:artifact:version | | String @@ -33,12 +34,12 @@ camel dependency copy [options] | `--hawtio` | Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus) | false | boolean | `--hawtio-version` | Version of the Hawtio web console | HawtioVersion.HAWTIO_VERSION | String | `--ignore-loading-error` | Whether to ignore route loading and compilation errors (use this with care!) | false | boolean -| `--java-version` | Java version (21, 25) | 21 | String +| `--java-version,--java` | Java version (21, 25) | 21 | String | `--kamelets-version` | Apache Camel Kamelets version | RuntimeType.KAMELETS_VERSION | String | `--lazy-bean` | Whether to use lazy bean initialization (can help with complex classloading issues | true | boolean | `--local-kamelet-dir` | Local directory for loading Kamelets (takes precedence) | | String | `--logging` | Can be used to turn on logging to console (logs by default to file in /.camel directory) | false | boolean -| `--logging-level` | Logging level | info | String +| `--logging-level` | Logging level (ERROR, WARN, INFO, DEBUG, TRACE) | info | String | `--main-classname` | The class name of the Camel Main application class | CamelApplication | String | `--management-port` | To use a dedicated port for HTTP management | | int | `--maven-apache-snapshot-enabled` | Whether downloading JARs from ASF Maven Snapshot repository is enabled | true | boolean @@ -54,17 +55,19 @@ camel dependency copy [options] | `--package-name` | For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files. | | String | `--package-scan-jars` | Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang | false | boolean | `--port` | Embeds a local HTTP server on this port | | int -| `--profile` | Profile to export (dev, test, or prod). | | String +| `--profile` | Profile to export (dev, test, prod). | | String | `--prop,--property` | Camel application properties, ex. --property=prop1=foo | | String | `--quarkus-artifact-id` | Quarkus Platform Maven artifactId | quarkus-bom | String | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String +| `--quarkus-package-type` | Quarkus package type (uber-jar or fast-jar) | uber-jar | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--quiet` | Will be quiet, only print when error occurs | false | boolean | `--repo,--repos` | Additional maven repositories (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--skip-plugins` | Skip plugins during export | false | boolean | `--spring-boot-version` | Spring Boot version | RuntimeType.SPRING_BOOT_VERSION | String | `--verbose` | Verbose output of startup activity (dependency resolution and downloading | false | boolean +| `--yes,-y` | Automatically answer yes to confirmation prompts (e.g. when using --clean-dir) | false | boolean | `-h,--help` | Display the help and sub-commands | | boolean |=== diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-list.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-list.adoc index f58794bb7dee7..ab9e54994438e 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-list.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-list.adoc @@ -26,6 +26,7 @@ camel dependency list [options] | `--dep,--dependency` | Add additional dependencies | | List | `--dir,--directory` | Directory where the project will be exported | . | String | `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean +| `--dry-run` | Preview export without writing files | false | boolean | `--exclude` | Exclude files by name or pattern | | List | `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean | `--gav` | The Maven group:artifact:version | | String @@ -33,12 +34,12 @@ camel dependency list [options] | `--hawtio` | Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus) | false | boolean | `--hawtio-version` | Version of the Hawtio web console | HawtioVersion.HAWTIO_VERSION | String | `--ignore-loading-error` | Whether to ignore route loading and compilation errors (use this with care!) | false | boolean -| `--java-version` | Java version (21, 25) | 21 | String +| `--java-version,--java` | Java version (21, 25) | 21 | String | `--kamelets-version` | Apache Camel Kamelets version | RuntimeType.KAMELETS_VERSION | String | `--lazy-bean` | Whether to use lazy bean initialization (can help with complex classloading issues | true | boolean | `--local-kamelet-dir` | Local directory for loading Kamelets (takes precedence) | | String | `--logging` | Can be used to turn on logging to console (logs by default to file in /.camel directory) | false | boolean -| `--logging-level` | Logging level | info | String +| `--logging-level` | Logging level (ERROR, WARN, INFO, DEBUG, TRACE) | info | String | `--main-classname` | The class name of the Camel Main application class | CamelApplication | String | `--management-port` | To use a dedicated port for HTTP management | | int | `--maven-apache-snapshot-enabled` | Whether downloading JARs from ASF Maven Snapshot repository is enabled | true | boolean @@ -53,17 +54,19 @@ camel dependency list [options] | `--package-name` | For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files. | | String | `--package-scan-jars` | Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang | false | boolean | `--port` | Embeds a local HTTP server on this port | | int -| `--profile` | Profile to export (dev, test, or prod). | | String +| `--profile` | Profile to export (dev, test, prod). | | String | `--prop,--property` | Camel application properties, ex. --property=prop1=foo | | String | `--quarkus-artifact-id` | Quarkus Platform Maven artifactId | quarkus-bom | String | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String +| `--quarkus-package-type` | Quarkus package type (uber-jar or fast-jar) | uber-jar | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--quiet` | Will be quiet, only print when error occurs | false | boolean | `--repo,--repos` | Additional maven repositories (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--skip-plugins` | Skip plugins during export | false | boolean | `--spring-boot-version` | Spring Boot version | RuntimeType.SPRING_BOOT_VERSION | String | `--verbose` | Verbose output of startup activity (dependency resolution and downloading | false | boolean +| `--yes,-y` | Automatically answer yes to confirmation prompts (e.g. when using --clean-dir) | false | boolean | `-h,--help` | Display the help and sub-commands | | boolean |=== diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-update.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-update.adoc index 210d7a7d66451..9b3ae9fc34e0a 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-update.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-dependency-update.adoc @@ -27,6 +27,7 @@ camel dependency update [options] | `--dep,--dependency` | Add additional dependencies | | List | `--dir,--directory` | Directory where the project will be exported | . | String | `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean +| `--dry-run` | Preview export without writing files | false | boolean | `--exclude` | Exclude files by name or pattern | | List | `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean | `--gav` | The Maven group:artifact:version | | String @@ -34,12 +35,12 @@ camel dependency update [options] | `--hawtio` | Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus) | false | boolean | `--hawtio-version` | Version of the Hawtio web console | HawtioVersion.HAWTIO_VERSION | String | `--ignore-loading-error` | Whether to ignore route loading and compilation errors (use this with care!) | false | boolean -| `--java-version` | Java version (21, 25) | 21 | String +| `--java-version,--java` | Java version (21, 25) | 21 | String | `--kamelets-version` | Apache Camel Kamelets version | RuntimeType.KAMELETS_VERSION | String | `--lazy-bean` | Whether to use lazy bean initialization (can help with complex classloading issues | true | boolean | `--local-kamelet-dir` | Local directory for loading Kamelets (takes precedence) | | String | `--logging` | Can be used to turn on logging to console (logs by default to file in /.camel directory) | false | boolean -| `--logging-level` | Logging level | info | String +| `--logging-level` | Logging level (ERROR, WARN, INFO, DEBUG, TRACE) | info | String | `--main-classname` | The class name of the Camel Main application class | CamelApplication | String | `--management-port` | To use a dedicated port for HTTP management | | int | `--maven-apache-snapshot-enabled` | Whether downloading JARs from ASF Maven Snapshot repository is enabled | true | boolean @@ -54,17 +55,19 @@ camel dependency update [options] | `--package-name` | For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files. | | String | `--package-scan-jars` | Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang | false | boolean | `--port` | Embeds a local HTTP server on this port | | int -| `--profile` | Profile to export (dev, test, or prod). | | String +| `--profile` | Profile to export (dev, test, prod). | | String | `--prop,--property` | Camel application properties, ex. --property=prop1=foo | | String | `--quarkus-artifact-id` | Quarkus Platform Maven artifactId | quarkus-bom | String | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String +| `--quarkus-package-type` | Quarkus package type (uber-jar or fast-jar) | uber-jar | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--quiet` | Will be quiet, only print when error occurs | false | boolean | `--repo,--repos` | Additional maven repositories (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--skip-plugins` | Skip plugins during export | false | boolean | `--spring-boot-version` | Spring Boot version | RuntimeType.SPRING_BOOT_VERSION | String | `--verbose` | Verbose output of startup activity (dependency resolution and downloading | false | boolean +| `--yes,-y` | Automatically answer yes to confirmation prompts (e.g. when using --clean-dir) | false | boolean | `-h,--help` | Display the help and sub-commands | | boolean |=== diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-doc.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-doc.adoc index 417ac09990dc1..d2049ffdf83dc 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-doc.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-doc.adoc @@ -28,7 +28,7 @@ camel doc [options] | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--repo,--repos` | Additional maven repositories for download on-demand (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--url` | Prints the link to the online documentation on the Camel website | false | boolean | `-h,--help` | Display the help and sub-commands | | boolean |=== diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-explain.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-explain.adoc index 59ce60f22eee5..b87ed60b086e6 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-explain.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-explain.adoc @@ -22,7 +22,7 @@ camel explain [options] | `--api-key` | API key for authentication. Also reads OPENAI_API_KEY or LLM_API_KEY env vars | | String | `--api-type` | API type: 'ollama' or 'openai' (OpenAI-compatible) | ollama | ApiType | `--catalog-context` | Include Camel Catalog descriptions in the prompt | | boolean -| `--format` | Output format: text, markdown | text | String +| `--format` | Output format (text, markdown) | text | String | `--model` | Model to use | DEFAULT_MODEL | String | `--show-prompt` | Show the prompt sent to the LLM | | boolean | `--stream` | Stream the response as it's generated (shows progress) | true | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-export.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-export.adoc index 46aac43212502..9b56feb7ecdeb 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-export.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-export.adoc @@ -26,6 +26,7 @@ camel export [options] | `--dep,--dependency` | Add additional dependencies | | List | `--dir,--directory` | Directory where the project will be exported | . | String | `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean +| `--dry-run` | Preview export without writing files | false | boolean | `--exclude` | Exclude files by name or pattern | | List | `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean | `--gav` | The Maven group:artifact:version | | String @@ -33,12 +34,12 @@ camel export [options] | `--hawtio` | Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus) | false | boolean | `--hawtio-version` | Version of the Hawtio web console | HawtioVersion.HAWTIO_VERSION | String | `--ignore-loading-error` | Whether to ignore route loading and compilation errors (use this with care!) | false | boolean -| `--java-version` | Java version (21, 25) | 21 | String +| `--java-version,--java` | Java version (21, 25) | 21 | String | `--kamelets-version` | Apache Camel Kamelets version | RuntimeType.KAMELETS_VERSION | String | `--lazy-bean` | Whether to use lazy bean initialization (can help with complex classloading issues | true | boolean | `--local-kamelet-dir` | Local directory for loading Kamelets (takes precedence) | | String | `--logging` | Can be used to turn on logging to console (logs by default to file in /.camel directory) | false | boolean -| `--logging-level` | Logging level | info | String +| `--logging-level` | Logging level (ERROR, WARN, INFO, DEBUG, TRACE) | info | String | `--main-classname` | The class name of the Camel Main application class | CamelApplication | String | `--management-port` | To use a dedicated port for HTTP management | | int | `--maven-apache-snapshot-enabled` | Whether downloading JARs from ASF Maven Snapshot repository is enabled | true | boolean @@ -52,17 +53,19 @@ camel export [options] | `--package-name` | For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files. | | String | `--package-scan-jars` | Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang | false | boolean | `--port` | Embeds a local HTTP server on this port | | int -| `--profile` | Profile to export (dev, test, or prod). | | String +| `--profile` | Profile to export (dev, test, prod). | | String | `--prop,--property` | Camel application properties, ex. --property=prop1=foo | | String | `--quarkus-artifact-id` | Quarkus Platform Maven artifactId | quarkus-bom | String | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String +| `--quarkus-package-type` | Quarkus package type (uber-jar or fast-jar) | uber-jar | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--quiet` | Will be quiet, only print when error occurs | false | boolean | `--repo,--repos` | Additional maven repositories (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--skip-plugins` | Skip plugins during export | false | boolean | `--spring-boot-version` | Spring Boot version | RuntimeType.SPRING_BOOT_VERSION | String | `--verbose` | Verbose output of startup activity (dependency resolution and downloading | false | boolean +| `--yes,-y` | Automatically answer yes to confirmation prompts (e.g. when using --clean-dir) | false | boolean | `-h,--help` | Display the help and sub-commands | | boolean |=== diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-blocked.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-blocked.adoc index 7ba895d8bd7a4..6efb8d24f96fb 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-blocked.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-blocked.adoc @@ -19,6 +19,7 @@ camel get blocked [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name or age | pid | String | `--watch` | Execute periodically and showing output fullscreen | | boolean | `-h,--help` | Display the help and sub-commands | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-circuit-breaker.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-circuit-breaker.adoc index d7b85a10409f3..a0ad145972734 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-circuit-breaker.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-circuit-breaker.adoc @@ -19,6 +19,7 @@ camel get circuit-breaker [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name or age | pid | String | `--watch` | Execute periodically and showing output fullscreen | | boolean | `-h,--help` | Display the help and sub-commands | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-consumer.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-consumer.adoc index 5bd1777b7c007..c2f2d01220e6e 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-consumer.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-consumer.adoc @@ -20,6 +20,7 @@ camel get consumer [options] |=== | Option | Description | Default | Type | `--filter` | Filter consumers by URI | | String +| `--json` | Output in JSON Format | | boolean | `--limit` | Filter consumers by limiting to the given number of rows | | int | `--scheduled` | Filter consumer to only show scheduled based consumers | | boolean | `--short-uri` | List endpoint URI without query parameters (short) | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-context.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-context.adoc index 2ffa629c5ae66..14f755b959395 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-context.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-context.adoc @@ -19,6 +19,7 @@ camel get context [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--remote` | Break down counters into remote/total pairs | | boolean | `--sort` | Sort by pid, name or age | pid | String | `--watch` | Execute periodically and showing output fullscreen | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-count.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-count.adoc index c5d0e45c6b7d1..f3dee33650ce3 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-count.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-count.adoc @@ -20,6 +20,7 @@ camel get count [options] |=== | Option | Description | Default | Type | `--fail` | Get the failed exchanges from a running integration | | boolean +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name or age | pid | String | `--total` | Get the total exchanges from a running integration | | boolean | `--watch` | Execute periodically and showing output fullscreen | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-endpoint.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-endpoint.adoc index 931dd6152ea70..f8d3f58e16000 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-endpoint.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-endpoint.adoc @@ -22,6 +22,7 @@ camel get endpoint [options] | `--filter` | Filter endpoints by URI | | String | `--filter-direction` | Filter by direction (in or out) | | String | `--filter-total` | Filter endpoints that must be higher than the given usage | | long +| `--json` | Output in JSON Format | | boolean | `--limit` | Filter endpoints by limiting to the given number of rows | | int | `--short-uri` | List endpoint URI without query parameters (short) | | boolean | `--sort` | Sort by pid, name, age or total | pid | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-event.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-event.adoc index 36cda91ee973d..11138e12692f0 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-event.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-event.adoc @@ -20,6 +20,7 @@ camel get event [options] |=== | Option | Description | Default | Type | `--filter` | Filter event by event type: context, route, or exchange | | String +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name or age | pid | String | `--watch` | Execute periodically and showing output fullscreen | | boolean | `-h,--help` | Display the help and sub-commands | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-groovy.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-groovy.adoc index 93506034994a5..a0e298ca9454f 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-groovy.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-groovy.adoc @@ -19,6 +19,7 @@ camel get groovy [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid or name | pid | String | `--watch` | Execute periodically and showing output fullscreen | | boolean | `-h,--help` | Display the help and sub-commands | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-group.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-group.adoc index 59e4dd8e6d703..9369335e34355 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-group.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-group.adoc @@ -21,6 +21,7 @@ camel get group [options] | Option | Description | Default | Type | `--filter` | Filter groups by name | | String | `--filter-mean` | Filter groups that must be slower than the given time (ms) | | long +| `--json` | Output in JSON Format | | boolean | `--limit` | Filter groups by limiting to the given number of rows | | int | `--running` | Only include running groups | | boolean | `--sort` | Sort by pid, name, age or group | pid | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-health.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-health.adoc index d988ee64a88ff..cd923c42607a2 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-health.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-health.adoc @@ -21,6 +21,7 @@ camel get health [options] | Option | Description | Default | Type | `--depth` | Max depth of stack-trace | 1 | int | `--down` | Show only checks which are DOWN | | boolean +| `--json` | Output in JSON Format | | boolean | `--level` | Level of details: full, or default | default | String | `--live` | Show only liveness checks | | boolean | `--ready` | Show only readiness checks | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-inflight.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-inflight.adoc index e64962cb6218b..a3cd60c3afec5 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-inflight.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-inflight.adoc @@ -19,6 +19,7 @@ camel get inflight [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name or age | pid | String | `--watch` | Execute periodically and showing output fullscreen | | boolean | `-h,--help` | Display the help and sub-commands | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-internal-task.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-internal-task.adoc index 6d518fc9df4f8..ab3408e0ad4a7 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-internal-task.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-internal-task.adoc @@ -19,6 +19,7 @@ camel get internal-task [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name or age | pid | String | `--watch` | Execute periodically and showing output fullscreen | | boolean | `-h,--help` | Display the help and sub-commands | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-kafka.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-kafka.adoc index e710dd7b0110d..6bc8fd265a43d 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-kafka.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-kafka.adoc @@ -20,6 +20,7 @@ camel get kafka [options] |=== | Option | Description | Default | Type | `--committed` | Show committed offset (slower due to sync call to Kafka brokers) | | boolean +| `--json` | Output in JSON Format | | boolean | `--short-uri` | List endpoint URI without query parameters (short) | | boolean | `--sort` | Sort by pid, name or age | pid | String | `--watch` | Execute periodically and showing output fullscreen | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-metric.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-metric.adoc index ae466dc1a5094..05cdff9b8ce75 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-metric.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-metric.adoc @@ -22,6 +22,7 @@ camel get metric [options] | `--all` | Whether to show all metrics (also unused with counter being 0) | false | boolean | `--custom` | Only show custom metrics | false | boolean | `--filter` | Filter metric by type, name or tags | | String +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name or age | pid | String | `--tags` | Show metric tags | false | boolean | `--watch` | Execute periodically and showing output fullscreen | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-platform-http.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-platform-http.adoc index f1d426900de35..cd7e9e79d8d17 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-platform-http.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-platform-http.adoc @@ -20,6 +20,7 @@ camel get platform-http [options] |=== | Option | Description | Default | Type | `--all` | Include management endpoints | | boolean +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name or age | pid | String | `--watch` | Execute periodically and showing output fullscreen | | boolean | `-h,--help` | Display the help and sub-commands | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-processor.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-processor.adoc index 89c6603462ef4..592d461c77634 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-processor.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-processor.adoc @@ -23,6 +23,7 @@ camel get processor [options] | `--filter` | Filter processors by id | | String | `--filter-mean` | Filter processors that must be slower than the given time (ms) | | long | `--group` | Filter processors by group | | String +| `--json` | Output in JSON Format | | boolean | `--limit` | Filter routes by limiting to the given number of rows | | int | `--note` | Include note in the ID column (if available) | | boolean | `--remote` | Break down counters into remote/total pairs | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-producer.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-producer.adoc index 0b0aa1f290ab9..c1d06aee1b016 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-producer.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-producer.adoc @@ -20,6 +20,7 @@ camel get producer [options] |=== | Option | Description | Default | Type | `--filter` | Filter producers by URI | | String +| `--json` | Output in JSON Format | | boolean | `--limit` | Filter producers by limiting to the given number of rows | | int | `--short-uri` | List endpoint URI without query parameters (short) | | boolean | `--sort` | Sort by pid, name or age | pid | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-properties.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-properties.adoc index 0ce4298f3a4ce..75270705b6630 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-properties.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-properties.adoc @@ -20,6 +20,7 @@ camel get properties [options] |=== | Option | Description | Default | Type | `--internal` | Whether to include internal configuration | | boolean +| `--json` | Output in JSON Format | | boolean | `--mask` | Whether to mask configuration values to avoid printing sensitive information such as password or access keys | true | boolean | `--sort` | Sort by pid, name or key | pid | String | `--startup` | List only startup configuration | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-rest.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-rest.adoc index b88070d684c96..a5a6f3b0c9b7a 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-rest.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-rest.adoc @@ -19,6 +19,7 @@ camel get rest [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name or age | pid | String | `--verbose` | Show more details | | boolean | `--watch` | Execute periodically and showing output fullscreen | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-route.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-route.adoc index f1653bcc8c327..5b28bc5b27d1f 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-route.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-route.adoc @@ -24,6 +24,7 @@ camel get route [options] | `--filter` | Filter routes by id, or url | | String | `--filter-mean` | Filter routes that must be slower than the given time (ms) | | long | `--group` | Filter routes by group | | String +| `--json` | Output in JSON Format | | boolean | `--limit` | Filter routes by limiting to the given number of rows | | int | `--note` | Include note in the ID column (if available) | | boolean | `--running` | Only include running routes | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-service.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-service.adoc index 18db29fbe58a3..1293a2f1d5f16 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-service.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-service.adoc @@ -19,6 +19,7 @@ camel get service [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--metadata` | Show service metadata (only available for some services) | | boolean | `--short-uri` | List endpoint URI without query parameters (short) | | boolean | `--sort` | Sort by pid, name or age | pid | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-transformer.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-transformer.adoc index 3c4611729ccba..228864e1c6367 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-transformer.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-transformer.adoc @@ -19,6 +19,7 @@ camel get transformer [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name, age or total | pid | String | `-h,--help` | Display the help and sub-commands | | boolean |=== diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-variable.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-variable.adoc index b3abe7a630fb3..d02e7aa85091c 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-variable.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-variable.adoc @@ -19,6 +19,7 @@ camel get variable [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name or key | pid | String | `--watch` | Execute periodically and showing output fullscreen | | boolean | `-h,--help` | Display the help and sub-commands | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-vault.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-vault.adoc index f995cb1448643..ea9b2baa6136b 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-vault.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-get-vault.adoc @@ -19,6 +19,7 @@ camel get vault [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name | pid | String | `--watch` | Execute periodically and showing output fullscreen | | boolean | `-h,--help` | Display the help and sub-commands | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-harden.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-harden.adoc index f1d0e9f1b7ca9..077adf4ee47c0 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-harden.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-harden.adoc @@ -22,7 +22,7 @@ camel harden [options] | `--api-key` | API key for authentication. Also reads OPENAI_API_KEY or LLM_API_KEY env vars | | String | `--api-type` | API type: 'ollama' or 'openai' (OpenAI-compatible) | ollama | ApiType | `--catalog-context` | Include Camel Catalog descriptions in the prompt | | boolean -| `--format` | Output format: text, markdown | text | String +| `--format` | Output format (text, markdown) | text | String | `--model` | Model to use | DEFAULT_MODEL | String | `--show-prompt` | Show the prompt sent to the LLM | | boolean | `--stream` | Stream the response as it's generated (shows progress) | true | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-init.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-init.adoc index db8aee77b1696..d6f92e69357c3 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-init.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-init.adoc @@ -23,6 +23,7 @@ camel init [options] | `--dir,--directory` | Directory relative path where the new Camel integration will be saved | . | String | `--from-kamelet` | To be used when extending an existing Kamelet | | String | `--kamelets-version` | Apache Camel Kamelets version | | String +| `--list` | List available templates | | boolean | `--pipe` | When creating a yaml file should it be created as a Pipe CR | | boolean | `--repo,--repos` | Additional maven repositories (Use commas to separate multiple repositories) | | String | `-h,--help` | Display the help and sub-commands | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-run.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-run.adoc index 51f62b4859820..61648266fcaa4 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-run.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-run.adoc @@ -34,6 +34,7 @@ camel run [options] | `--gav` | The Maven group:artifact:version (used during exporting) | | String | `--health` _(deprecated)_ | Deprecated: use --observe instead. Health check at /q/health on local HTTP server (port 8080 by default) | false | boolean | `--ignore-loading-error` | Whether to ignore route loading and compilation errors (use this with care!) | false | boolean +| `--java-version,--java` | Java version (21, 25) | 21 | String | `--jfr` | Enables Java Flight Recorder saving recording to disk on exit | false | boolean | `--jfr-profile` | Java Flight Recorder profile to use (such as default or profile) | | String | `--jvm-debug` | To enable JVM remote debugging on port 4004 by default. The supported values are true to enable the remote debugging, false to disable the remote debugging or a number to use a custom port | | int @@ -42,10 +43,10 @@ camel run [options] | `--local-kamelet-dir` | Local directory (or github link) for loading Kamelets (takes precedence). Multiple directories can be specified separated by comma. | | String | `--logging` | Can be used to turn off logging | true | boolean | `--logging-category` | Used for individual logging levels (ex: org.apache.kafka=DEBUG) | | List -| `--logging-color` | Use colored logging | true | boolean +| `--logging-color` | Use colored logging. Default is auto-detected based on NO_COLOR, CI, FORCE_COLOR environment variables and terminal capabilities | | boolean | `--logging-config-path` | Path to file with custom logging configuration | | String | `--logging-json` | Use JSON logging (ECS Layout) | false | boolean -| `--logging-level` | Logging level () | info | String +| `--logging-level` | Logging level (ERROR, WARN, INFO, DEBUG, TRACE) | info | String | `--management-port` | To use a dedicated port for HTTP management (use 0 to dynamic assign a free random port number) | | int | `--maven-apache-snapshot-enabled` | Whether downloading JARs from ASF Maven Snapshot repository is enabled | true | boolean | `--maven-central-enabled` | Whether downloading JARs from Maven Central repository is enabled | true | boolean @@ -61,7 +62,7 @@ camel run [options] | `--open-api` | Adds an OpenAPI spec from the given file (json or yaml file) | | String | `--package-scan-jars` | Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang | false | boolean | `--port` | Embeds a local HTTP server on this port (port 8080 by default; use 0 to dynamic assign a free random port number) | | int -| `--profile` | Profile to run (dev, test, or prod). | dev | String +| `--profile` | Profile to run (dev, test, prod). | dev | String | `--prompt` | Allow user to type in required parameters in prompt if not present in application | false | boolean | `--prop,--property` | Additional properties (override existing) | | String | `--properties` | comma separated list of properties file (ex. /path/to/file.properties,/path/to/other.properties | | String @@ -70,8 +71,8 @@ camel run [options] | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--reload,--dev` | Enables dev mode (live reload when source files are updated and saved) | | boolean | `--repo,--repos` | Additional maven repositories (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | camel-main | RuntimeType -| `--skip-plugins` | Skip plugins during export | false | boolean +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | camel-main | RuntimeType +| `--skip-plugins` | Skip resolving plugin dependencies | false | boolean | `--source-dir` | Source directory for dynamically loading Camel file(s) to run. When using this, then files cannot be specified at the same time. | | String | `--spring-boot-version` | Spring Boot version | RuntimeType.SPRING_BOOT_VERSION | String | `--stub` | Stubs all the matching endpoint uri with the given component name or pattern. Multiple names can be separated by comma. (all = stub all endpoints). | | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-sbom.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-sbom.adoc index 4d16b265fb4c0..1b6cc655d11b9 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-sbom.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-sbom.adoc @@ -27,6 +27,7 @@ camel sbom [options] | `--dep,--dependency` | Add additional dependencies | | List | `--dir,--directory` | Directory where the project will be exported | . | String | `--download` | Whether to allow automatic downloading JAR dependencies (over the internet) | true | boolean +| `--dry-run` | Preview export without writing files | false | boolean | `--exclude` | Exclude files by name or pattern | | List | `--fresh` | Make sure we use fresh (i.e. non-cached) resources | false | boolean | `--gav` | The Maven group:artifact:version | | String @@ -34,12 +35,12 @@ camel sbom [options] | `--hawtio` | Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus) | false | boolean | `--hawtio-version` | Version of the Hawtio web console | HawtioVersion.HAWTIO_VERSION | String | `--ignore-loading-error` | Whether to ignore route loading and compilation errors (use this with care!) | false | boolean -| `--java-version` | Java version (21, 25) | 21 | String +| `--java-version,--java` | Java version (21, 25) | 21 | String | `--kamelets-version` | Apache Camel Kamelets version | RuntimeType.KAMELETS_VERSION | String | `--lazy-bean` | Whether to use lazy bean initialization (can help with complex classloading issues | true | boolean | `--local-kamelet-dir` | Local directory for loading Kamelets (takes precedence) | | String | `--logging` | Can be used to turn on logging to console (logs by default to file in /.camel directory) | false | boolean -| `--logging-level` | Logging level | info | String +| `--logging-level` | Logging level (ERROR, WARN, INFO, DEBUG, TRACE) | info | String | `--main-classname` | The class name of the Camel Main application class | CamelApplication | String | `--management-port` | To use a dedicated port for HTTP management | | int | `--maven-apache-snapshot-enabled` | Whether downloading JARs from ASF Maven Snapshot repository is enabled | true | boolean @@ -55,20 +56,22 @@ camel sbom [options] | `--package-name` | For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files. | | String | `--package-scan-jars` | Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang | false | boolean | `--port` | Embeds a local HTTP server on this port | | int -| `--profile` | Profile to export (dev, test, or prod). | | String +| `--profile` | Profile to export (dev, test, prod). | | String | `--prop,--property` | Camel application properties, ex. --property=prop1=foo | | String | `--quarkus-artifact-id` | Quarkus Platform Maven artifactId | quarkus-bom | String | `--quarkus-group-id` | Quarkus Platform Maven groupId | io.quarkus.platform | String +| `--quarkus-package-type` | Quarkus package type (uber-jar or fast-jar) | uber-jar | String | `--quarkus-version` | Quarkus Platform version | RuntimeType.QUARKUS_VERSION | String | `--quiet` | Will be quiet, only print when error occurs | false | boolean | `--repo,--repos` | Additional maven repositories (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `--sbom-format` | The SBOM format, possible values are cyclonedx or spdx | CYCLONEDX_FORMAT | String | `--sbom-output-format` | The SBOM output format, possible values are json or xml | SBOM_JSON_FORMAT | String | `--skip-plugins` | Skip plugins during export | false | boolean | `--spdx-plugin-version` | The SPDX Maven Plugin version | 0.7.4 | String | `--spring-boot-version` | Spring Boot version | RuntimeType.SPRING_BOOT_VERSION | String | `--verbose` | Verbose output of startup activity (dependency resolution and downloading | false | boolean +| `--yes,-y` | Automatically answer yes to confirmation prompts (e.g. when using --clean-dir) | false | boolean | `-h,--help` | Display the help and sub-commands | | boolean |=== diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-script.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-script.adoc index 1a61bc788d5fc..d032724f06f8a 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-script.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-script.adoc @@ -20,7 +20,7 @@ camel script [options] |=== | Option | Description | Default | Type | `--logging` | Can be used to turn on logging (logs to file in /.camel directory) | false | boolean -| `--logging-level` | Logging level () | info | String +| `--logging-level` | Logging level (ERROR, WARN, INFO, DEBUG, TRACE) | info | String | `--max-idle-seconds` | For how long time in seconds Camel can be idle before stopping | 1 | int | `--max-messages` | Max number of messages to process before stopping | 0 | int | `--max-seconds` | Max seconds to run before stopping | 0 | int diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-context.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-context.adoc index 25b43d2d860cd..76244eb20f224 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-context.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-context.adoc @@ -19,6 +19,7 @@ camel top context [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type +| `--json` | Output in JSON Format | | boolean | `--sort` | Sort by pid, name, mem, or age | mem | String | `--watch` | Execute periodically and showing output fullscreen | | boolean | `-h,--help` | Display the help and sub-commands | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-group.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-group.adoc index db86636f41d92..c1fb2b1ba961a 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-group.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-group.adoc @@ -21,6 +21,7 @@ camel top group [options] | Option | Description | Default | Type | `--filter` | Filter groups by name | | String | `--filter-mean` | Filter groups that must be slower than the given time (ms) | | long +| `--json` | Output in JSON Format | | boolean | `--limit` | Filter groups by limiting to the given number of rows | | int | `--running` | Only include running groups | | boolean | `--sort` | Sort by pid, name, age or group | pid | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-processor.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-processor.adoc index 9c9e19df5940e..f876fa1a56ad8 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-processor.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-processor.adoc @@ -23,6 +23,7 @@ camel top processor [options] | `--filter` | Filter processors by id | | String | `--filter-mean` | Filter processors that must be slower than the given time (ms) | | long | `--group` | Filter processors by group | | String +| `--json` | Output in JSON Format | | boolean | `--limit` | Filter routes by limiting to the given number of rows | | int | `--note` | Include note in the ID column (if available) | | boolean | `--remote` | Break down counters into remote/total pairs | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-route.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-route.adoc index 37ccb11b67a56..a7d4047366004 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-route.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-top-route.adoc @@ -24,6 +24,7 @@ camel top route [options] | `--filter` | Filter routes by id, or url | | String | `--filter-mean` | Filter routes that must be slower than the given time (ms) | | long | `--group` | Filter routes by group | | String +| `--json` | Output in JSON Format | | boolean | `--limit` | Filter routes by limiting to the given number of rows | | int | `--note` | Include note in the ID column (if available) | | boolean | `--running` | Only include running routes | | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform-dataweave.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform-dataweave.adoc new file mode 100644 index 0000000000000..27ce882fc4026 --- /dev/null +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform-dataweave.adoc @@ -0,0 +1,29 @@ + +// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE += camel transform dataweave + +Convert DataWeave scripts to DataSonnet format + + +== Usage + +[source,bash] +---- +camel transform dataweave [options] +---- + + + +== Options + +[cols="2,5,1,2",options="header"] +|=== +| Option | Description | Default | Type +| `--expression,-e` | Inline DataWeave expression to convert | | String +| `--include-comments` | Include conversion notes as comments in output | true | boolean +| `--input,-i` | Input .dwl file or directory containing .dwl files | | String +| `--output,-o` | Output .ds file or directory (defaults to stdout) | | String +| `-h,--help` | Display the help and sub-commands | | boolean +|=== + + diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform-route.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform-route.adoc index 1d30a51fc6665..0420d476056b2 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform-route.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform-route.adoc @@ -19,7 +19,7 @@ camel transform route [options] [cols="2,5,1,2",options="header"] |=== | Option | Description | Default | Type -| `--format` | Output format (xml or yaml), if only yaml files are provided, the format defaults to xml and vice versa | | String +| `--format` | Output format (xml, yaml), if only yaml files are provided, the format defaults to xml and vice versa | | String | `--ignore-loading-error` | Whether to ignore route loading and compilation errors (use this with care!) | | boolean | `--output` | File or directory to store transformed files. If none provide then output is printed to console. Use clipboard as name to copy content into clipboard. | | String | `--resolve-placeholders` | Whether to resolve property placeholders in the dumped output | false | boolean diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform.adoc index 782e71c87cef2..79c46f128eead 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-transform.adoc @@ -18,6 +18,7 @@ camel transform [options] [cols="2,5",options="header"] |=== | Subcommand | Description +| xref:jbang-commands/camel-jbang-transform-dataweave.adoc[dataweave] | Convert DataWeave scripts to DataSonnet format | xref:jbang-commands/camel-jbang-transform-message.adoc[message] | Transform message from one format to another via an existing running Camel integration | xref:jbang-commands/camel-jbang-transform-route.adoc[route] | Transform Camel routes to XML or YAML format |=== diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-version-list.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-version-list.adoc index 42218ca2a2291..7c1a2136baf54 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-version-list.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-version-list.adoc @@ -31,7 +31,7 @@ camel version list [options] | `--patch` | Whether to include patch releases (x.y.z) | true | boolean | `--rc` | Include also milestone or RC releases | false | boolean | `--repo,--repos` | Additional maven repositories (Use commas to separate multiple repositories) | | String -| `--runtime` | Runtime () | camel-main | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | camel-main | RuntimeType | `--sort` | Sort by (version, date, or days) | version | String | `--tail` | The number of lines from the end of the table to show. | | int | `--to-date` | Filter by release date (exclusive) | | String diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-version-set.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-version-set.adoc index eab7c8ba69b68..3b58ad383c459 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-version-set.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-version-set.adoc @@ -22,7 +22,7 @@ camel version set [options] | `--global` | Use global or local configuration | | boolean | `--repo,--repos` | Maven repository for downloading the dependencies (Use commas to separate multiple repositories) | | String | `--reset` | Reset by removing any custom version settings | | boolean -| `--runtime` | Runtime () | | RuntimeType +| `--runtime` | Runtime (camel-main, spring-boot, quarkus) | | RuntimeType | `-h,--help` | Display the help and sub-commands | | boolean |=== diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-wrapper.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-wrapper.adoc new file mode 100644 index 0000000000000..85299e1738df0 --- /dev/null +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-wrapper.adoc @@ -0,0 +1,28 @@ + +// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE += camel wrapper + +Install Camel wrapper scripts for version pinning + + +== Usage + +[source,bash] +---- +camel wrapper [options] +---- + + + +== Options + +[cols="2,5,1,2",options="header"] +|=== +| Option | Description | Default | Type +| `--camel-version` | Camel version to pin (defaults to current version) | | String +| `--dir,--directory` | Directory where wrapper files will be created | . | String +| `--repo-url` | Maven repository URL for downloading the launcher | DEFAULT_REPO_URL | String +| `-h,--help` | Display the help and sub-commands | | boolean +|=== + + diff --git a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json index 98bf97804a909..c7faf07a6118f 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json +++ b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json @@ -1,36 +1,37 @@ { "commands": [ - { "name": "bind", "fullName": "bind", "description": "Bind source and sink Kamelets as a new Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.bind.Bind", "options": [ { "names": "--error-handler", "description": "Add error handler (none|log|sink:). Sink endpoints are expected in the format [[apigroup\/]version:]kind:[namespace\/]name, plain Camel URIs or Kamelet name.", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "Output format generated by this command (supports: file, yaml or json).", "defaultValue": "file", "javaType": "java.lang.String", "type": "string" }, { "names": "--property", "description": "Adds a pipe property in the form of [source|sink|error-handler|step-].= where is the step number starting from 1", "javaType": "java.lang.String", "type": "string" }, { "names": "--sink", "description": "Sink (to) such as a Kamelet or Camel endpoint uri", "javaType": "java.lang.String", "type": "string", "required": true }, { "names": "--source", "description": "Source (from) such as a Kamelet or Camel endpoint uri", "javaType": "java.lang.String", "type": "string", "required": true }, { "names": "--step", "description": "Optional steps such as a Kamelet or Camel endpoint uri", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, - { "name": "catalog", "fullName": "catalog", "description": "List artifacts from Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "component", "fullName": "catalog component", "description": "List components from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogComponent", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "dataformat", "fullName": "catalog dataformat", "description": "List data formats from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogDataFormat", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "dev-console", "fullName": "catalog dev-console", "description": "List dev-consoles from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogDevConsole", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "kamelet", "fullName": "catalog kamelet", "description": "List Kamelets from the Kamelet Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogKamelet", "options": [ { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, type, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "--type,--filter-type", "description": "Filter by type: source, sink, or action", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "language", "fullName": "catalog language", "description": "List expression languages from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogLanguage", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "other", "fullName": "catalog other", "description": "List miscellaneous components from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogOther", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "transformer", "fullName": "catalog transformer", "description": "List data type transformers from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogTransformer", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, - { "name": "cmd", "fullName": "cmd", "description": "Performs commands in the running Camel integrations, such as start\/stop route, or change logging levels.", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "browse", "fullName": "cmd browse", "description": "Browse pending messages on endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelBrowseAction", "options": [ { "names": "--body-max-chars", "description": "Maximum size of the message body to include in the dump", "javaType": "int", "type": "integer" }, { "names": "--dump", "description": "Whether to include message dumps", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--endpoint", "description": "Endpoint to browse messages from (can be uri, pattern, or refer to a route id)", "javaType": "java.lang.String", "type": "string" }, { "names": "--fresh-size", "description": "Whether to calculate fresh queue size information (performance overhead)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Limits the number of messages to dump per endpoint", "defaultValue": "100", "javaType": "int", "type": "integer" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--only-body", "description": "Show only message body in browsed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in browsed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in browsed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by uri, or size", "defaultValue": "uri", "javaType": "java.lang.String", "type": "string" }, { "names": "--tail", "description": "The number of messages from the end (latest) to dump", "javaType": "int", "type": "integer" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "disable-processor", "fullName": "cmd disable-processor", "description": "Disable Camel processor", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelProcessorDisableAction", "options": [ { "names": "--id", "description": "Processor ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "enable-processor", "fullName": "cmd enable-processor", "description": "Enable Camel processor", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelProcessorEnableAction", "options": [ { "names": "--id", "description": "Processor ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "gc", "fullName": "cmd gc", "description": "Trigger Java Memory Garbage Collector", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelGCAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "load", "fullName": "cmd load", "description": "Loads new source files into an existing Camel", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelLoadAction", "options": [ { "names": "--restart", "description": "To force restart all routes after loading source files", "javaType": "boolean", "type": "boolean" }, { "names": "--source", "description": "Source file(s) to load", "javaType": "java.util.List", "type": "array" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "logger", "fullName": "cmd logger", "description": "List or change logging levels", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.LoggerAction", "options": [ { "names": "--logger", "description": "The logger name", "defaultValue": "root", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-level", "description": "To change logging level ()", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "receive", "fullName": "cmd receive", "description": "Receive and dump messages from remote endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelReceiveAction", "options": [ { "names": "--action", "description": "Action to start, stop, clear, status, or dump messages", "defaultValue": "status", "javaType": "java.lang.String", "type": "string" }, { "names": "--compact", "description": "Compact output (no empty line separating messages)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--endpoint,--uri", "description": "Endpoint to receive messages from (can be uri or pattern to refer to existing endpoint)", "javaType": "java.lang.String", "type": "string" }, { "names": "--find", "description": "Find and highlight matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--follow", "description": "Keep following and outputting new messages (press enter to exit).", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--grep", "description": "Filter messages to only output matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--only-body", "description": "Show only message body in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--output", "description": "Output format (text or json)", "javaType": "java.lang.String", "type": "string" }, { "names": "--prefix", "description": "Print prefix with running Camel integration name. auto=only prefix when running multiple integrations. true=always prefix. false=prefix off.", "defaultValue": "auto", "javaType": "java.lang.String", "type": "string" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties; override existing (only applicable when NOT using an existing running Camel)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (only applicable when NOT using an existing running Camel) (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in received messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in received messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--since", "description": "Return messages newer than a relative duration like 5s, 2m, or 1h. The value is in seconds if no unit specified.", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by pid, name or age for showing status of messages", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--tail", "description": "The number of messages from the end to show. Use -1 to read from the beginning. Use 0 to read only new lines. Defaults to showing all messages from beginning.", "defaultValue": "-1", "javaType": "int", "type": "integer" }, { "names": "--timeout", "description": "Timeout in millis waiting for message to be received", "defaultValue": "20000", "javaType": "long", "type": "integer" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "reload", "fullName": "cmd reload", "description": "Trigger reloading Camel", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelReloadAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "reset-stats", "fullName": "cmd reset-stats", "description": "Reset performance statistics", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelResetStatsAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "resume-route", "fullName": "cmd resume-route", "description": "Resume Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteResumeAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route-structure", "fullName": "cmd route-structure", "description": "Dump Camel route structure", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStructureAction", "options": [ { "names": "--brief", "description": "To show less detailed route structure", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter route by filename or route id (multiple names can be separated by comma)", "javaType": "java.lang.String", "type": "string" }, { "names": "--raw", "description": "To output raw without metadata", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort route by name or id", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "send", "fullName": "cmd send", "description": "Send messages to endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelSendAction", "options": [ { "names": "--body", "description": "Message body to send (prefix with file: to refer to loading message body from file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--endpoint,--uri", "description": "Endpoint where to send the message (can be uri, pattern, or refer to a route id)", "javaType": "java.lang.String", "type": "string" }, { "names": "--header", "description": "Message header (key=value)", "javaType": "java.util.List", "type": "array" }, { "names": "--infra", "description": "Send to infrastructure service (e.g., nats, kafka)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--poll", "description": "Poll instead of sending a message. This can be used to receive latest message from a Kafka topic or JMS queue.", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print response message body (InOut) when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties; override existing (only applicable when NOT using an existing running Camel)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (only applicable when NOT using an existing running Camel) (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--reply", "description": "Whether to expect a reply message (InOut vs InOut messaging style)", "javaType": "boolean", "type": "boolean" }, { "names": "--reply-file", "description": "Saves reply message to the file with the given name (override if exists)", "javaType": "java.lang.String", "type": "string" }, { "names": "--show-body", "description": "Show message body from response message (InOut)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties from response message (InOut)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables from response message (InOut)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers from response message (InOut)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--timeout", "description": "Timeout in millis waiting for message to be sent (and reply message if InOut messaging)", "defaultValue": "20000", "javaType": "long", "type": "integer" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "start-group", "fullName": "cmd start-group", "description": "Start Camel route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteGroupStartAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "start-route", "fullName": "cmd start-route", "description": "Start Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStartAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stop-group", "fullName": "cmd stop-group", "description": "Stop Camel route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteGroupStopAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stop-route", "fullName": "cmd stop-route", "description": "Stop Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStopAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stub", "fullName": "cmd stub", "description": "Browse stub endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelStubAction", "options": [ { "names": "--browse", "description": "Whether to browse messages queued in the stub endpoints", "javaType": "boolean", "type": "boolean" }, { "names": "--compact", "description": "Compact output (no empty line separating browsed messages)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter endpoints by queue name", "javaType": "java.lang.String", "type": "string" }, { "names": "--find", "description": "Find and highlight matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--grep", "description": "Filter browsing messages to only output trace matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--limit", "description": "Filter browsing queues by limiting to the given latest number of messages", "defaultValue": "10", "javaType": "int", "type": "integer" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in traced messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in traced messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by name, or total", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "--top", "description": "Whether to browse top (latest) messages queued in the stub endpoints", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "suspend-route", "fullName": "cmd suspend-route", "description": "Suspend Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteSuspendAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "thread-dump", "fullName": "cmd thread-dump", "description": "List threads in a running Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelThreadDump", "options": [ { "names": "--depth", "description": "Max depth of stack-trace", "defaultValue": "1", "javaType": "int", "type": "integer" }, { "names": "--filter", "description": "Filter thread names\/ids (use all to include all threads)", "defaultValue": "Camel", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by id, name or state", "defaultValue": "id", "javaType": "java.lang.String", "type": "string" }, { "names": "--state", "description": "To only show threads for a given state", "javaType": "java.lang.String", "type": "string" }, { "names": "--trace", "description": "Include stack-traces", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, + { "name": "bind", "fullName": "bind", "description": "DEPRECATED: Bind source and sink Kamelets as a new Camel integration", "deprecated": true, "sourceClass": "org.apache.camel.dsl.jbang.core.commands.bind.Bind", "options": [ { "names": "--error-handler", "description": "Add error handler (none|log|sink:). Sink endpoints are expected in the format [[apigroup\/]version:]kind:[namespace\/]name, plain Camel URIs or Kamelet name.", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "Output format generated by this command (supports: file, yaml, json).", "defaultValue": "file", "javaType": "java.lang.String", "type": "string" }, { "names": "--property", "description": "Adds a pipe property in the form of [source|sink|error-handler|step-].= where is the step number starting from 1", "javaType": "java.lang.String", "type": "string" }, { "names": "--sink", "description": "Sink (to) such as a Kamelet or Camel endpoint uri", "javaType": "java.lang.String", "type": "string", "required": true }, { "names": "--source", "description": "Source (from) such as a Kamelet or Camel endpoint uri", "javaType": "java.lang.String", "type": "string", "required": true }, { "names": "--step", "description": "Optional steps such as a Kamelet or Camel endpoint uri", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, + { "name": "catalog", "fullName": "catalog", "description": "List artifacts from Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "component", "fullName": "catalog component", "description": "List components from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogComponent", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "dataformat", "fullName": "catalog dataformat", "description": "List data formats from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogDataFormat", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "dev-console", "fullName": "catalog dev-console", "description": "List dev-consoles from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogDevConsole", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "kamelet", "fullName": "catalog kamelet", "description": "List Kamelets from the Kamelet Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogKamelet", "options": [ { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, type, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "--type,--filter-type", "description": "Filter by type: source, sink, or action", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "language", "fullName": "catalog language", "description": "List expression languages from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogLanguage", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "other", "fullName": "catalog other", "description": "List miscellaneous components from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogOther", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "transformer", "fullName": "catalog transformer", "description": "List data type transformers from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogTransformer", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, + { "name": "cmd", "fullName": "cmd", "description": "Performs commands in the running Camel integrations, such as start\/stop route, or change logging levels.", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "browse", "fullName": "cmd browse", "description": "Browse pending messages on endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelBrowseAction", "options": [ { "names": "--body-max-chars", "description": "Maximum size of the message body to include in the dump", "javaType": "int", "type": "integer" }, { "names": "--dump", "description": "Whether to include message dumps", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--endpoint", "description": "Endpoint to browse messages from (can be uri, pattern, or refer to a route id)", "javaType": "java.lang.String", "type": "string" }, { "names": "--fresh-size", "description": "Whether to calculate fresh queue size information (performance overhead)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Limits the number of messages to dump per endpoint", "defaultValue": "100", "javaType": "int", "type": "integer" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--only-body", "description": "Show only message body in browsed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in browsed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in browsed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by uri, or size", "defaultValue": "uri", "javaType": "java.lang.String", "type": "string" }, { "names": "--tail", "description": "The number of messages from the end (latest) to dump", "javaType": "int", "type": "integer" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "disable-processor", "fullName": "cmd disable-processor", "description": "Disable Camel processor", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelProcessorDisableAction", "options": [ { "names": "--id", "description": "Processor ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "enable-processor", "fullName": "cmd enable-processor", "description": "Enable Camel processor", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelProcessorEnableAction", "options": [ { "names": "--id", "description": "Processor ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "gc", "fullName": "cmd gc", "description": "Trigger Java Memory Garbage Collector", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelGCAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "load", "fullName": "cmd load", "description": "Loads new source files into an existing Camel", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelLoadAction", "options": [ { "names": "--restart", "description": "To force restart all routes after loading source files", "javaType": "boolean", "type": "boolean" }, { "names": "--source", "description": "Source file(s) to load", "javaType": "java.util.List", "type": "array" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "logger", "fullName": "cmd logger", "description": "List or change logging levels", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.LoggerAction", "options": [ { "names": "--logger", "description": "The logger name", "defaultValue": "root", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-level", "description": "To change logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "receive", "fullName": "cmd receive", "description": "Receive and dump messages from remote endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelReceiveAction", "options": [ { "names": "--action", "description": "Action to start, stop, clear, status, or dump messages", "defaultValue": "status", "javaType": "java.lang.String", "type": "string" }, { "names": "--compact", "description": "Compact output (no empty line separating messages)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--endpoint,--uri", "description": "Endpoint to receive messages from (can be uri or pattern to refer to existing endpoint)", "javaType": "java.lang.String", "type": "string" }, { "names": "--find", "description": "Find and highlight matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--follow", "description": "Keep following and outputting new messages (press enter to exit).", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--grep", "description": "Filter messages to only output matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--only-body", "description": "Show only message body in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--output", "description": "Output format (auto, true, false)", "javaType": "java.lang.String", "type": "string" }, { "names": "--prefix", "description": "Print prefix with running Camel integration name. auto=only prefix when running multiple integrations. true=always prefix. false=prefix off.", "defaultValue": "auto", "javaType": "java.lang.String", "type": "string" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties; override existing (only applicable when NOT using an existing running Camel)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (only applicable when NOT using an existing running Camel) (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in received messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in received messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--since", "description": "Return messages newer than a relative duration like 5s, 2m, or 1h. The value is in seconds if no unit specified.", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by pid, name or age for showing status of messages", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--tail", "description": "The number of messages from the end to show. Use -1 to read from the beginning. Use 0 to read only new lines. Defaults to showing all messages from beginning.", "defaultValue": "-1", "javaType": "int", "type": "integer" }, { "names": "--timeout", "description": "Timeout in millis waiting for message to be received", "defaultValue": "20000", "javaType": "long", "type": "integer" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "reload", "fullName": "cmd reload", "description": "Trigger reloading Camel", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelReloadAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "reset-stats", "fullName": "cmd reset-stats", "description": "Reset performance statistics", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelResetStatsAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "resume-route", "fullName": "cmd resume-route", "description": "Resume Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteResumeAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route-structure", "fullName": "cmd route-structure", "description": "Dump Camel route structure", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStructureAction", "options": [ { "names": "--brief", "description": "To show less detailed route structure", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter route by filename or route id (multiple names can be separated by comma)", "javaType": "java.lang.String", "type": "string" }, { "names": "--raw", "description": "To output raw without metadata", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort route by name or id", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "send", "fullName": "cmd send", "description": "Send messages to endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelSendAction", "options": [ { "names": "--body", "description": "Message body to send (prefix with file: to refer to loading message body from file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--endpoint,--uri", "description": "Endpoint where to send the message (can be uri, pattern, or refer to a route id)", "javaType": "java.lang.String", "type": "string" }, { "names": "--header", "description": "Message header (key=value)", "javaType": "java.util.List", "type": "array" }, { "names": "--infra", "description": "Send to infrastructure service (e.g., nats, kafka)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--poll", "description": "Poll instead of sending a message. This can be used to receive latest message from a Kafka topic or JMS queue.", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print response message body (InOut) when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties; override existing (only applicable when NOT using an existing running Camel)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (only applicable when NOT using an existing running Camel) (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--reply", "description": "Whether to expect a reply message (InOut vs InOut messaging style)", "javaType": "boolean", "type": "boolean" }, { "names": "--reply-file", "description": "Saves reply message to the file with the given name (override if exists)", "javaType": "java.lang.String", "type": "string" }, { "names": "--show-body", "description": "Show message body from response message (InOut)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties from response message (InOut)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables from response message (InOut)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers from response message (InOut)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--timeout", "description": "Timeout in millis waiting for message to be sent (and reply message if InOut messaging)", "defaultValue": "20000", "javaType": "long", "type": "integer" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "start-group", "fullName": "cmd start-group", "description": "Start Camel route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteGroupStartAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "start-route", "fullName": "cmd start-route", "description": "Start Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStartAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stop-group", "fullName": "cmd stop-group", "description": "Stop Camel route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteGroupStopAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stop-route", "fullName": "cmd stop-route", "description": "Stop Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStopAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stub", "fullName": "cmd stub", "description": "Browse stub endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelStubAction", "options": [ { "names": "--browse", "description": "Whether to browse messages queued in the stub endpoints", "javaType": "boolean", "type": "boolean" }, { "names": "--compact", "description": "Compact output (no empty line separating browsed messages)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter endpoints by queue name", "javaType": "java.lang.String", "type": "string" }, { "names": "--find", "description": "Find and highlight matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--grep", "description": "Filter browsing messages to only output trace matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--limit", "description": "Filter browsing queues by limiting to the given latest number of messages", "defaultValue": "10", "javaType": "int", "type": "integer" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in traced messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in traced messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by name, or total", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "--top", "description": "Whether to browse top (latest) messages queued in the stub endpoints", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "suspend-route", "fullName": "cmd suspend-route", "description": "Suspend Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteSuspendAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "thread-dump", "fullName": "cmd thread-dump", "description": "List threads in a running Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelThreadDump", "options": [ { "names": "--depth", "description": "Max depth of stack-trace", "defaultValue": "1", "javaType": "int", "type": "integer" }, { "names": "--filter", "description": "Filter thread names\/ids (use all to include all threads)", "defaultValue": "Camel", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by id, name or state", "defaultValue": "id", "javaType": "java.lang.String", "type": "string" }, { "names": "--state", "description": "To only show threads for a given state", "javaType": "java.lang.String", "type": "string" }, { "names": "--trace", "description": "Include stack-traces", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, { "name": "completion", "fullName": "completion", "description": "Generate completion script for bash\/zsh", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Complete", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "config", "fullName": "config", "description": "Get and set user configuration values", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config.ConfigCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "get", "fullName": "config get", "description": "Display user configuration value", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config.ConfigGet", "options": [ { "names": "--global", "description": "Use global or local configuration", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "list", "fullName": "config list", "description": "Displays user configuration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config.ConfigList", "options": [ { "names": "--global", "description": "Use global or local configuration", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "set", "fullName": "config set", "description": "Set user configuration value", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config.ConfigSet", "options": [ { "names": "--global", "description": "Use global or local configuration", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "unset", "fullName": "config unset", "description": "Remove user configuration value", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config.ConfigUnset", "options": [ { "names": "--global", "description": "Use global or local configurations", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, - { "name": "debug", "fullName": "debug", "description": "Debug local Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Debug", "options": [ { "names": "--ago", "description": "Use ago instead of yyyy-MM-dd HH:mm:ss in timestamp.", "javaType": "boolean", "type": "boolean" }, { "names": "--background", "description": "Run in the background", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--background-wait", "description": "To wait for run in background to startup successfully, before returning", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--backlog-trace", "description": "Enables backlog tracing of the routed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--breakpoint", "description": "To set breakpoint at the given node id (Multiple ids can be separated by comma). If no breakpoint is set, then the first route is automatic selected.", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-spring-boot-version", "description": "To run using a different Camel Spring Boot version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To run using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--code", "description": "Run the given text or file as Java DSL routes", "javaType": "java.lang.String", "type": "string" }, { "names": "--console", "description": "Developer console at \/q\/dev on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--empty", "description": "Run an empty Camel without loading source files", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version (used during exporting)", "javaType": "java.lang.String", "type": "string" }, { "names": "--health", "description": "Deprecated: use --observe instead. Health check at \/q\/health on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean", "deprecated": true }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--jfr", "description": "Enables Java Flight Recorder saving recording to disk on exit", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--jfr-profile", "description": "Java Flight Recorder profile to use (such as default or profile)", "javaType": "java.lang.String", "type": "string" }, { "names": "--jvm-debug", "description": "To enable JVM remote debugging on port 4004 by default. The supported values are true to enable the remote debugging, false to disable the remote debugging or a number to use a custom port", "javaType": "int", "type": "integer", "paramLabel": "" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory (or github link) for loading Kamelets (takes precedence). Multiple directories can be specified separated by comma.", "javaType": "java.lang.String", "type": "string" }, { "names": "--log-lines", "description": "Number of log lines to display on top of screen", "defaultValue": "10", "javaType": "int", "type": "integer" }, { "names": "--logging", "description": "Can be used to turn off logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-category", "description": "Used for individual logging levels (ex: org.apache.kafka=DEBUG)", "javaType": "java.util.List", "type": "array" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-config-path", "description": "Path to file with custom logging configuration", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-json", "description": "Use JSON logging (ECS Layout)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level ()", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management (use 0 to dynamic assign a free random port number)", "javaType": "int", "type": "integer" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--max-idle-seconds", "description": "For how long time in seconds Camel can be idle before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-messages", "description": "Max number of messages to process before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-seconds", "description": "Max seconds to run before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--metrics", "description": "Deprecated: use --observe instead. Metrics (Micrometer and Prometheus) at \/q\/metrics on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean", "deprecated": true }, { "names": "--modeline", "description": "Whether to support JBang style \/\/DEPS to specify additional dependencies", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The name of the Camel application", "defaultValue": "CamelJBang", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "File to store the current message body (will override). This allows for manual inspecting the message later.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port (port 8080 by default; use 0 to dynamic assign a free random port number)", "javaType": "int", "type": "integer" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--profile", "description": "Profile to run (dev, test, or prod).", "defaultValue": "dev", "javaType": "java.lang.String", "type": "string" }, { "names": "--prompt", "description": "Allow user to type in required parameters in prompt if not present in application", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties (override existing)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--reload,--dev", "description": "Enables dev mode (live reload when source files are updated and saved)", "javaType": "boolean", "type": "boolean" }, { "names": "--remote-attach", "description": "Attaches debugger remotely to an existing running Camel integration. (Add camel-cli-debug JAR to the existing Camel application and run before attaching this debugger)", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "defaultValue": "camel-main", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--show-body", "description": "Show message body in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties in debug messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--source-dir", "description": "Source directory for dynamically loading Camel file(s) to run. When using this, then files cannot be specified at the same time.", "javaType": "java.lang.String", "type": "string" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--stop-on-exit", "description": "Whether to stop the running Camel on exit", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--stub", "description": "Stubs all the matching endpoint uri with the given component name or pattern. Multiple names can be separated by comma. (all = stub all endpoints).", "javaType": "java.lang.String", "type": "string" }, { "names": "--timestamp", "description": "Print timestamp.", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--trace", "description": "Enables trace logging of the routed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, - { "name": "dependency", "fullName": "dependency", "description": "Displays all Camel dependencies required to run", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.DependencyCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "copy", "fullName": "dependency copy", "description": "Copies all Camel dependencies required to run to a specific directory", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.DependencyCopy", "options": [ { "names": "--build-property", "description": "Maven build properties, ex. --build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, { "names": "--camel-spring-boot-version", "description": "Camel version to use with Spring Boot", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To export using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--clean-dir", "description": "If exporting to current directory (default) then all existing files are preserved. Enabling this option will force cleaning current directory including all sub dirs (use this with care)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--dir,--directory", "description": "Directory where the project will be exported", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version", "javaType": "java.lang.String", "type": "string" }, { "names": "--groovy-pre-compiled", "description": "Whether to include pre-compiled Groovy classes in the export (only supported with runtime=camel-main)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio", "description": "Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio-version", "description": "Version of the Hawtio web console", "defaultValue": "HawtioVersion.HAWTIO_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory for loading Kamelets (takes precedence)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn on logging to console (logs by default to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--main-classname", "description": "The class name of the Camel Main application class", "defaultValue": "CamelApplication", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-wrapper", "description": "Include Maven Wrapper files in exported project", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The integration name. Use this when the name should not get derived otherwise.", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "Output format (gav, maven, jbang)", "defaultValue": "gav", "javaType": "java.lang.String", "type": "string" }, { "names": "--output-directory", "description": "Directory where dependencies should be copied", "defaultValue": "lib", "javaType": "java.lang.String", "type": "string", "required": true }, { "names": "--package-name", "description": "For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to export (dev, test, or prod).", "javaType": "java.lang.String", "type": "string" }, { "names": "--prop,--property", "description": "Camel application properties, ex. --property=prop1=foo", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--quiet", "description": "Will be quiet, only print when error occurs", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "list", "fullName": "dependency list", "description": "Displays all Camel dependencies required to run", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.DependencyList", "options": [ { "names": "--build-property", "description": "Maven build properties, ex. --build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, { "names": "--camel-spring-boot-version", "description": "Camel version to use with Spring Boot", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To export using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--clean-dir", "description": "If exporting to current directory (default) then all existing files are preserved. Enabling this option will force cleaning current directory including all sub dirs (use this with care)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--dir,--directory", "description": "Directory where the project will be exported", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version", "javaType": "java.lang.String", "type": "string" }, { "names": "--groovy-pre-compiled", "description": "Whether to include pre-compiled Groovy classes in the export (only supported with runtime=camel-main)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio", "description": "Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio-version", "description": "Version of the Hawtio web console", "defaultValue": "HawtioVersion.HAWTIO_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory for loading Kamelets (takes precedence)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn on logging to console (logs by default to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--main-classname", "description": "The class name of the Camel Main application class", "defaultValue": "CamelApplication", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-wrapper", "description": "Include Maven Wrapper files in exported project", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The integration name. Use this when the name should not get derived otherwise.", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "Output format (gav, maven, jbang)", "defaultValue": "gav", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-name", "description": "For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to export (dev, test, or prod).", "javaType": "java.lang.String", "type": "string" }, { "names": "--prop,--property", "description": "Camel application properties, ex. --property=prop1=foo", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--quiet", "description": "Will be quiet, only print when error occurs", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "runtime", "fullName": "dependency runtime", "description": "Display Camel runtime and version for given Maven project", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.DependencyRuntime", "options": [ { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "update", "fullName": "dependency update", "description": "Updates dependencies in Maven pom.xml or Java source file (JBang style)", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.DependencyUpdate", "options": [ { "names": "--build-property", "description": "Maven build properties, ex. --build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, { "names": "--camel-spring-boot-version", "description": "Camel version to use with Spring Boot", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To export using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--clean", "description": "Regenerate list of dependencies (do not keep existing dependencies). Not supported for pom.xml", "javaType": "boolean", "type": "boolean" }, { "names": "--clean-dir", "description": "If exporting to current directory (default) then all existing files are preserved. Enabling this option will force cleaning current directory including all sub dirs (use this with care)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--dir,--directory", "description": "Directory where the project will be exported", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version", "javaType": "java.lang.String", "type": "string" }, { "names": "--groovy-pre-compiled", "description": "Whether to include pre-compiled Groovy classes in the export (only supported with runtime=camel-main)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio", "description": "Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio-version", "description": "Version of the Hawtio web console", "defaultValue": "HawtioVersion.HAWTIO_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory for loading Kamelets (takes precedence)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn on logging to console (logs by default to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--main-classname", "description": "The class name of the Camel Main application class", "defaultValue": "CamelApplication", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-wrapper", "description": "Include Maven Wrapper files in exported project", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The integration name. Use this when the name should not get derived otherwise.", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "Output format (gav, maven, jbang)", "defaultValue": "gav", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-name", "description": "For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to export (dev, test, or prod).", "javaType": "java.lang.String", "type": "string" }, { "names": "--prop,--property", "description": "Camel application properties, ex. --property=prop1=foo", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--quiet", "description": "Will be quiet, only print when error occurs", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, + { "name": "debug", "fullName": "debug", "description": "Debug local Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Debug", "options": [ { "names": "--ago", "description": "Use ago instead of yyyy-MM-dd HH:mm:ss in timestamp.", "javaType": "boolean", "type": "boolean" }, { "names": "--background", "description": "Run in the background", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--background-wait", "description": "To wait for run in background to startup successfully, before returning", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--backlog-trace", "description": "Enables backlog tracing of the routed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--breakpoint", "description": "To set breakpoint at the given node id (Multiple ids can be separated by comma). If no breakpoint is set, then the first route is automatic selected.", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-spring-boot-version", "description": "To run using a different Camel Spring Boot version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To run using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--code", "description": "Run the given text or file as Java DSL routes", "javaType": "java.lang.String", "type": "string" }, { "names": "--console", "description": "Developer console at \/q\/dev on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--empty", "description": "Run an empty Camel without loading source files", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version (used during exporting)", "javaType": "java.lang.String", "type": "string" }, { "names": "--health", "description": "Deprecated: use --observe instead. Health check at \/q\/health on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean", "deprecated": true }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version,--java", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--jfr", "description": "Enables Java Flight Recorder saving recording to disk on exit", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--jfr-profile", "description": "Java Flight Recorder profile to use (such as default or profile)", "javaType": "java.lang.String", "type": "string" }, { "names": "--jvm-debug", "description": "To enable JVM remote debugging on port 4004 by default. The supported values are true to enable the remote debugging, false to disable the remote debugging or a number to use a custom port", "javaType": "int", "type": "integer", "paramLabel": "" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory (or github link) for loading Kamelets (takes precedence). Multiple directories can be specified separated by comma.", "javaType": "java.lang.String", "type": "string" }, { "names": "--log-lines", "description": "Number of log lines to display on top of screen", "defaultValue": "10", "javaType": "int", "type": "integer" }, { "names": "--logging", "description": "Can be used to turn off logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-category", "description": "Used for individual logging levels (ex: org.apache.kafka=DEBUG)", "javaType": "java.util.List", "type": "array" }, { "names": "--logging-color", "description": "Use colored logging. Default is auto-detected based on NO_COLOR, CI, FORCE_COLOR environment variables and terminal capabilities", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-config-path", "description": "Path to file with custom logging configuration", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-json", "description": "Use JSON logging (ECS Layout)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management (use 0 to dynamic assign a free random port number)", "javaType": "int", "type": "integer" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--max-idle-seconds", "description": "For how long time in seconds Camel can be idle before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-messages", "description": "Max number of messages to process before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-seconds", "description": "Max seconds to run before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--metrics", "description": "Deprecated: use --observe instead. Metrics (Micrometer and Prometheus) at \/q\/metrics on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean", "deprecated": true }, { "names": "--modeline", "description": "Whether to support JBang style \/\/DEPS to specify additional dependencies", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The name of the Camel application", "defaultValue": "CamelJBang", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "File to store the current message body (will override). This allows for manual inspecting the message later.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port (port 8080 by default; use 0 to dynamic assign a free random port number)", "javaType": "int", "type": "integer" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--profile", "description": "Profile to run (dev, test, prod).", "defaultValue": "dev", "javaType": "java.lang.String", "type": "string" }, { "names": "--prompt", "description": "Allow user to type in required parameters in prompt if not present in application", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties (override existing)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--reload,--dev", "description": "Enables dev mode (live reload when source files are updated and saved)", "javaType": "boolean", "type": "boolean" }, { "names": "--remote-attach", "description": "Attaches debugger remotely to an existing running Camel integration. (Add camel-cli-debug JAR to the existing Camel application and run before attaching this debugger)", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "defaultValue": "camel-main", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--show-body", "description": "Show message body in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties in debug messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--skip-plugins", "description": "Skip resolving plugin dependencies", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--source-dir", "description": "Source directory for dynamically loading Camel file(s) to run. When using this, then files cannot be specified at the same time.", "javaType": "java.lang.String", "type": "string" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--stop-on-exit", "description": "Whether to stop the running Camel on exit", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--stub", "description": "Stubs all the matching endpoint uri with the given component name or pattern. Multiple names can be separated by comma. (all = stub all endpoints).", "javaType": "java.lang.String", "type": "string" }, { "names": "--timestamp", "description": "Print timestamp.", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--trace", "description": "Enables trace logging of the routed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, + { "name": "dependency", "fullName": "dependency", "description": "Displays all Camel dependencies required to run", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.DependencyCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "copy", "fullName": "dependency copy", "description": "Copies all Camel dependencies required to run to a specific directory", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.DependencyCopy", "options": [ { "names": "--build-property", "description": "Maven build properties, ex. --build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, { "names": "--camel-spring-boot-version", "description": "Camel version to use with Spring Boot", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To export using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--clean-dir", "description": "If exporting to current directory (default) then all existing files are preserved. Enabling this option will force cleaning current directory including all sub dirs (use this with care)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--dir,--directory", "description": "Directory where the project will be exported", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--dry-run", "description": "Preview export without writing files", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version", "javaType": "java.lang.String", "type": "string" }, { "names": "--groovy-pre-compiled", "description": "Whether to include pre-compiled Groovy classes in the export (only supported with runtime=camel-main)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio", "description": "Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio-version", "description": "Version of the Hawtio web console", "defaultValue": "HawtioVersion.HAWTIO_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version,--java", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory for loading Kamelets (takes precedence)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn on logging to console (logs by default to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--main-classname", "description": "The class name of the Camel Main application class", "defaultValue": "CamelApplication", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-wrapper", "description": "Include Maven Wrapper files in exported project", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The integration name. Use this when the name should not get derived otherwise.", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "Output format (gav, maven, jbang)", "defaultValue": "gav", "javaType": "java.lang.String", "type": "string" }, { "names": "--output-directory", "description": "Directory where dependencies should be copied", "defaultValue": "lib", "javaType": "java.lang.String", "type": "string", "required": true }, { "names": "--package-name", "description": "For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to export (dev, test, prod).", "javaType": "java.lang.String", "type": "string" }, { "names": "--prop,--property", "description": "Camel application properties, ex. --property=prop1=foo", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-package-type", "description": "Quarkus package type (uber-jar or fast-jar)", "defaultValue": "uber-jar", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--quiet", "description": "Will be quiet, only print when error occurs", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--yes,-y", "description": "Automatically answer yes to confirmation prompts (e.g. when using --clean-dir)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "list", "fullName": "dependency list", "description": "Displays all Camel dependencies required to run", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.DependencyList", "options": [ { "names": "--build-property", "description": "Maven build properties, ex. --build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, { "names": "--camel-spring-boot-version", "description": "Camel version to use with Spring Boot", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To export using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--clean-dir", "description": "If exporting to current directory (default) then all existing files are preserved. Enabling this option will force cleaning current directory including all sub dirs (use this with care)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--dir,--directory", "description": "Directory where the project will be exported", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--dry-run", "description": "Preview export without writing files", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version", "javaType": "java.lang.String", "type": "string" }, { "names": "--groovy-pre-compiled", "description": "Whether to include pre-compiled Groovy classes in the export (only supported with runtime=camel-main)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio", "description": "Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio-version", "description": "Version of the Hawtio web console", "defaultValue": "HawtioVersion.HAWTIO_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version,--java", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory for loading Kamelets (takes precedence)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn on logging to console (logs by default to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--main-classname", "description": "The class name of the Camel Main application class", "defaultValue": "CamelApplication", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-wrapper", "description": "Include Maven Wrapper files in exported project", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The integration name. Use this when the name should not get derived otherwise.", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "Output format (gav, maven, jbang)", "defaultValue": "gav", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-name", "description": "For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to export (dev, test, prod).", "javaType": "java.lang.String", "type": "string" }, { "names": "--prop,--property", "description": "Camel application properties, ex. --property=prop1=foo", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-package-type", "description": "Quarkus package type (uber-jar or fast-jar)", "defaultValue": "uber-jar", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--quiet", "description": "Will be quiet, only print when error occurs", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--yes,-y", "description": "Automatically answer yes to confirmation prompts (e.g. when using --clean-dir)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "runtime", "fullName": "dependency runtime", "description": "Display Camel runtime and version for given Maven project", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.DependencyRuntime", "options": [ { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "update", "fullName": "dependency update", "description": "Updates dependencies in Maven pom.xml or Java source file (JBang style)", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.DependencyUpdate", "options": [ { "names": "--build-property", "description": "Maven build properties, ex. --build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, { "names": "--camel-spring-boot-version", "description": "Camel version to use with Spring Boot", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To export using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--clean", "description": "Regenerate list of dependencies (do not keep existing dependencies). Not supported for pom.xml", "javaType": "boolean", "type": "boolean" }, { "names": "--clean-dir", "description": "If exporting to current directory (default) then all existing files are preserved. Enabling this option will force cleaning current directory including all sub dirs (use this with care)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--dir,--directory", "description": "Directory where the project will be exported", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--dry-run", "description": "Preview export without writing files", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version", "javaType": "java.lang.String", "type": "string" }, { "names": "--groovy-pre-compiled", "description": "Whether to include pre-compiled Groovy classes in the export (only supported with runtime=camel-main)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio", "description": "Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio-version", "description": "Version of the Hawtio web console", "defaultValue": "HawtioVersion.HAWTIO_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version,--java", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory for loading Kamelets (takes precedence)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn on logging to console (logs by default to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--main-classname", "description": "The class name of the Camel Main application class", "defaultValue": "CamelApplication", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-wrapper", "description": "Include Maven Wrapper files in exported project", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The integration name. Use this when the name should not get derived otherwise.", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "Output format (gav, maven, jbang)", "defaultValue": "gav", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-name", "description": "For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to export (dev, test, prod).", "javaType": "java.lang.String", "type": "string" }, { "names": "--prop,--property", "description": "Camel application properties, ex. --property=prop1=foo", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-package-type", "description": "Quarkus package type (uber-jar or fast-jar)", "defaultValue": "uber-jar", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--quiet", "description": "Will be quiet, only print when error occurs", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--yes,-y", "description": "Automatically answer yes to confirmation prompts (e.g. when using --clean-dir)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, { "name": "dirty", "fullName": "dirty", "description": "Check if there are dirty files from previous Camel runs that did not terminate gracefully", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.Dirty", "options": [ { "names": "--clean", "description": "Clean dirty files which are no longer in use", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, - { "name": "doc", "fullName": "doc", "description": "Shows documentation for kamelet, component, and other Camel resources", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogDoc", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter option listed in tables by name, description, or group", "javaType": "java.lang.String", "type": "string" }, { "names": "--header", "description": "Whether to display component message headers", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--open-url", "description": "Opens the online documentation form the Camel website in the web browser", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--url", "description": "Prints the link to the online documentation on the Camel website", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, + { "name": "doc", "fullName": "doc", "description": "Shows documentation for kamelet, component, and other Camel resources", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogDoc", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter option listed in tables by name, description, or group", "javaType": "java.lang.String", "type": "string" }, { "names": "--header", "description": "Whether to display component message headers", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--open-url", "description": "Opens the online documentation form the Camel website in the web browser", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--url", "description": "Prints the link to the online documentation on the Camel website", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "eval", "fullName": "eval", "description": "Evaluate Camel expressions and scripts", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.EvalCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "expression", "fullName": "eval expression", "description": "Evaluates Camel expression", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.EvalExpressionCommand", "options": [ { "names": "--body", "description": "Message body (prefix with file: to refer to loading message body from file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To run using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--header", "description": "Message header (key=value)", "javaType": "java.util.List", "type": "array" }, { "names": "--isolated", "description": "Whether to run evaluation isolated in local process", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--language", "description": "Language to use", "defaultValue": "simple", "javaType": "java.lang.String", "type": "string" }, { "names": "--predicate", "description": "Whether to force evaluating as predicate", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--template", "description": "The template to use for evaluating (prefix with file: to refer to loading template from file)", "javaType": "java.lang.String", "type": "string", "required": true }, { "names": "--timeout", "description": "Timeout in millis waiting for evaluation to be done", "defaultValue": "10000", "javaType": "long", "type": "integer" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, - { "name": "explain", "fullName": "explain", "description": "Explain what a Camel route does using AI\/LLM", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Explain", "options": [ { "names": "--api-key", "description": "API key for authentication. Also reads OPENAI_API_KEY or LLM_API_KEY env vars", "javaType": "java.lang.String", "type": "string" }, { "names": "--api-type", "description": "API type: 'ollama' or 'openai' (OpenAI-compatible)", "defaultValue": "ollama", "javaType": "org.apache.camel.dsl.jbang.core.commands.ApiType", "type": "object" }, { "names": "--catalog-context", "description": "Include Camel Catalog descriptions in the prompt", "javaType": "boolean", "type": "boolean" }, { "names": "--format", "description": "Output format: text, markdown", "defaultValue": "text", "javaType": "java.lang.String", "type": "string" }, { "names": "--model", "description": "Model to use", "defaultValue": "DEFAULT_MODEL", "javaType": "java.lang.String", "type": "string" }, { "names": "--show-prompt", "description": "Show the prompt sent to the LLM", "javaType": "boolean", "type": "boolean" }, { "names": "--stream", "description": "Stream the response as it's generated (shows progress)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--system-prompt", "description": "Custom system prompt", "javaType": "java.lang.String", "type": "string" }, { "names": "--temperature", "description": "Temperature for response generation (0.0-2.0)", "defaultValue": "0.7", "javaType": "double", "type": "number" }, { "names": "--timeout", "description": "Timeout in seconds for LLM response", "defaultValue": "120", "javaType": "int", "type": "integer" }, { "names": "--url", "description": "LLM API endpoint URL. Auto-detected from 'camel infra' for Ollama if not specified.", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose,-v", "description": "Include detailed technical information", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, - { "name": "export", "fullName": "export", "description": "Export to other runtimes (Camel Main, Spring Boot, or Quarkus)", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Export", "options": [ { "names": "--build-property", "description": "Maven build properties, ex. --build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, { "names": "--camel-spring-boot-version", "description": "Camel version to use with Spring Boot", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To export using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--clean-dir", "description": "If exporting to current directory (default) then all existing files are preserved. Enabling this option will force cleaning current directory including all sub dirs (use this with care)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--dir,--directory", "description": "Directory where the project will be exported", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version", "javaType": "java.lang.String", "type": "string" }, { "names": "--groovy-pre-compiled", "description": "Whether to include pre-compiled Groovy classes in the export (only supported with runtime=camel-main)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio", "description": "Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio-version", "description": "Version of the Hawtio web console", "defaultValue": "HawtioVersion.HAWTIO_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory for loading Kamelets (takes precedence)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn on logging to console (logs by default to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--main-classname", "description": "The class name of the Camel Main application class", "defaultValue": "CamelApplication", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-wrapper", "description": "Include Maven Wrapper files in exported project", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The integration name. Use this when the name should not get derived otherwise.", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-name", "description": "For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to export (dev, test, or prod).", "javaType": "java.lang.String", "type": "string" }, { "names": "--prop,--property", "description": "Camel application properties, ex. --property=prop1=foo", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--quiet", "description": "Will be quiet, only print when error occurs", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, - { "name": "get", "fullName": "get", "description": "Get status of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelStatus", "options": [ { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "bean", "fullName": "get bean", "description": "List beans in a running Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelBeanDump", "options": [ { "names": "--dsl", "description": "Include only beans from YAML or XML DSL", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter beans names (use all to include all beans)", "defaultValue": "all", "javaType": "java.lang.String", "type": "string" }, { "names": "--internal", "description": "Include internal Camel beans", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--nulls", "description": "Include null values", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--properties", "description": "Show bean properties", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by name or type", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "blocked", "fullName": "get blocked", "description": "Get blocked messages of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListBlocked", "options": [ { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "circuit-breaker", "fullName": "get circuit-breaker", "description": "Get status of Circuit Breaker EIPs", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListCircuitBreaker", "options": [ { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "consumer", "fullName": "get consumer", "description": "Get status of Camel consumers", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListConsumer", "options": [ { "names": "--filter", "description": "Filter consumers by URI", "javaType": "java.lang.String", "type": "string" }, { "names": "--limit", "description": "Filter consumers by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--scheduled", "description": "Filter consumer to only show scheduled based consumers", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "context", "fullName": "get context", "description": "Get status of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelContextStatus", "options": [ { "names": "--remote", "description": "Break down counters into remote\/total pairs", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "count", "fullName": "get count", "description": "Get total and failed exchanges", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelCount", "options": [ { "names": "--fail", "description": "Get the failed exchanges from a running integration", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--total", "description": "Get the total exchanges from a running integration", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "endpoint", "fullName": "get endpoint", "description": "Get usage of Camel endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListEndpoint", "options": [ { "names": "--filter", "description": "Filter endpoints by URI", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-direction", "description": "Filter by direction (in or out)", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-total", "description": "Filter endpoints that must be higher than the given usage", "javaType": "long", "type": "integer" }, { "names": "--limit", "description": "Filter endpoints by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name, age or total", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "event", "fullName": "get event", "description": "Get latest events of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListEvent", "options": [ { "names": "--filter", "description": "Filter event by event type: context, route, or exchange", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "groovy", "fullName": "get groovy", "description": "Groovy Sources used of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListGroovy", "options": [ { "names": "--sort", "description": "Sort by pid or name", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "group", "fullName": "get group", "description": "Get status of Camel route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelRouteGroupStatus", "options": [ { "names": "--filter", "description": "Filter groups by name", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter groups that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--limit", "description": "Filter groups by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--running", "description": "Only include running groups", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name, age or group", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "health", "fullName": "get health", "description": "Get health check status of running Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListHealth", "options": [ { "names": "--depth", "description": "Max depth of stack-trace", "defaultValue": "1", "javaType": "int", "type": "integer" }, { "names": "--down", "description": "Show only checks which are DOWN", "javaType": "boolean", "type": "boolean" }, { "names": "--level", "description": "Level of details: full, or default", "defaultValue": "default", "javaType": "java.lang.String", "type": "string" }, { "names": "--live", "description": "Show only liveness checks", "javaType": "boolean", "type": "boolean" }, { "names": "--ready", "description": "Show only readiness checks", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--trace", "description": "Include stack-traces in error messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "history", "fullName": "get history", "description": "History of latest completed exchange", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelHistoryAction", "options": [ { "names": "--ago", "description": "Use ago instead of yyyy-MM-dd HH:mm:ss in timestamp.", "javaType": "boolean", "type": "boolean" }, { "names": "--depth", "description": "Depth of tracing. 0=Created Completed. 1=All events on 1st route, 2=All events on 1st 2nd depth, and so on. 9 = all events on every depth.", "defaultValue": "9", "javaType": "int", "type": "integer" }, { "names": "--it", "description": "Interactive mode for enhanced history information", "javaType": "boolean", "type": "boolean" }, { "names": "--limit-split", "description": "Limit Split to a maximum number of entries to be displayed", "javaType": "int", "type": "integer" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties in debug messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--timestamp", "description": "Print timestamp.", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "inflight", "fullName": "get inflight", "description": "Get inflight messages of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListInflight", "options": [ { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "internal-task", "fullName": "get internal-task", "description": "List internal tasks of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListInternalTask", "options": [ { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "kafka", "fullName": "get kafka", "description": "List Kafka consumers of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListKafka", "options": [ { "names": "--committed", "description": "Show committed offset (slower due to sync call to Kafka brokers)", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "metric", "fullName": "get metric", "description": "Get metrics (micrometer) of running Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListMetric", "options": [ { "names": "--all", "description": "Whether to show all metrics (also unused with counter being 0)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--custom", "description": "Only show custom metrics", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter metric by type, name or tags", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--tags", "description": "Show metric tags", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "platform-http", "fullName": "get platform-http", "description": "Get embedded HTTP services of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListPlatformHttp", "options": [ { "names": "--all", "description": "Include management endpoints", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "processor", "fullName": "get processor", "description": "Get status of Camel processors", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelProcessorStatus", "options": [ { "names": "--description", "description": "Include description in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter processors by id", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter processors that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--group", "description": "Filter processors by group", "javaType": "java.lang.String", "type": "string" }, { "names": "--limit", "description": "Filter routes by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--note", "description": "Include note in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--remote", "description": "Break down counters into remote\/total pairs", "javaType": "boolean", "type": "boolean" }, { "names": "--running", "description": "Only include running processors", "javaType": "boolean", "type": "boolean" }, { "names": "--show-group", "description": "Include group column", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid or name", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "producer", "fullName": "get producer", "description": "Get status of Camel producers", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListProducer", "options": [ { "names": "--filter", "description": "Filter producers by URI", "javaType": "java.lang.String", "type": "string" }, { "names": "--limit", "description": "Filter producers by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "properties", "fullName": "get properties", "description": "List configuration properties", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListProperties", "options": [ { "names": "--internal", "description": "Whether to include internal configuration", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask configuration values to avoid printing sensitive information such as password or access keys", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or key", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--startup", "description": "List only startup configuration", "javaType": "boolean", "type": "boolean" }, { "names": "--verbose", "description": "Whether to include more details", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "rest", "fullName": "get rest", "description": "Get REST services of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListRest", "options": [ { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Show more details", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route", "fullName": "get route", "description": "Get status of Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelRouteStatus", "options": [ { "names": "--description", "description": "Include description in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--error", "description": "Shows detailed information for routes that has error status", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter routes by id, or url", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter routes that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--group", "description": "Filter routes by group", "javaType": "java.lang.String", "type": "string" }, { "names": "--limit", "description": "Filter routes by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--note", "description": "Include note in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--running", "description": "Only include running routes", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-group", "description": "Include group column", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route-controller", "fullName": "get route-controller", "description": "List status of route controller", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.RouteControllerAction", "options": [ { "names": "--depth", "description": "Max depth of stack-trace", "defaultValue": "1", "javaType": "int", "type": "integer" }, { "names": "--header", "description": "Include controller configuration details", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by id, or state", "defaultValue": "id", "javaType": "java.lang.String", "type": "string" }, { "names": "--trace", "description": "Include stack-traces in error messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route-dump", "fullName": "get route-dump", "description": "Dump Camel route in XML or YAML format", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteDumpAction", "options": [ { "names": "--filter", "description": "Filter route by filename or route id (multiple names can be separated by comma)", "javaType": "java.lang.String", "type": "string" }, { "names": "--format", "description": "Output format (xml, or yaml)", "defaultValue": "yaml", "javaType": "java.lang.String", "type": "string" }, { "names": "--raw", "description": "To output raw without metadata", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort route by name or id", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "--uri-as-parameters", "description": "Whether to expand URIs into separated key\/value parameters (only in use for YAML format)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "service", "fullName": "get service", "description": "Get services of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListService", "options": [ { "names": "--metadata", "description": "Show service metadata (only available for some services)", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "source", "fullName": "get source", "description": "Display Camel route source code", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelSourceAction", "options": [ { "names": "--filter", "description": "Filter source by filename (multiple names can be separated by comma)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort source by name", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "startup-recorder", "fullName": "get startup-recorder", "description": "Display startup recording", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelStartupRecorderAction", "options": [ { "names": "--sort", "description": "Sort by duration, or type", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "transformer", "fullName": "get transformer", "description": "Get list of data type transformers", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListTransformer", "options": [ { "names": "--sort", "description": "Sort by pid, name, age or total", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "variable", "fullName": "get variable", "description": "List variables of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListVariable", "options": [ { "names": "--sort", "description": "Sort by pid, name or key", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "vault", "fullName": "get vault", "description": "List secrets from security vaults", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListVault", "options": [ { "names": "--sort", "description": "Sort by pid, name", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, - { "name": "harden", "fullName": "harden", "description": "Suggest security hardening for Camel routes using AI\/LLM", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Harden", "options": [ { "names": "--api-key", "description": "API key for authentication. Also reads OPENAI_API_KEY or LLM_API_KEY env vars", "javaType": "java.lang.String", "type": "string" }, { "names": "--api-type", "description": "API type: 'ollama' or 'openai' (OpenAI-compatible)", "defaultValue": "ollama", "javaType": "org.apache.camel.dsl.jbang.core.commands.ApiType", "type": "object" }, { "names": "--catalog-context", "description": "Include Camel Catalog descriptions in the prompt", "javaType": "boolean", "type": "boolean" }, { "names": "--format", "description": "Output format: text, markdown", "defaultValue": "text", "javaType": "java.lang.String", "type": "string" }, { "names": "--model", "description": "Model to use", "defaultValue": "DEFAULT_MODEL", "javaType": "java.lang.String", "type": "string" }, { "names": "--show-prompt", "description": "Show the prompt sent to the LLM", "javaType": "boolean", "type": "boolean" }, { "names": "--stream", "description": "Stream the response as it's generated (shows progress)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--system-prompt", "description": "Custom system prompt", "javaType": "java.lang.String", "type": "string" }, { "names": "--temperature", "description": "Temperature for response generation (0.0-2.0)", "defaultValue": "0.7", "javaType": "double", "type": "number" }, { "names": "--timeout", "description": "Timeout in seconds for LLM response", "defaultValue": "120", "javaType": "int", "type": "integer" }, { "names": "--url", "description": "LLM API endpoint URL. Auto-detected from 'camel infra' for Ollama if not specified.", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose,-v", "description": "Include detailed security recommendations with code examples", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, + { "name": "explain", "fullName": "explain", "description": "Explain what a Camel route does using AI\/LLM", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Explain", "options": [ { "names": "--api-key", "description": "API key for authentication. Also reads OPENAI_API_KEY or LLM_API_KEY env vars", "javaType": "java.lang.String", "type": "string" }, { "names": "--api-type", "description": "API type: 'ollama' or 'openai' (OpenAI-compatible)", "defaultValue": "ollama", "javaType": "org.apache.camel.dsl.jbang.core.commands.ApiType", "type": "object" }, { "names": "--catalog-context", "description": "Include Camel Catalog descriptions in the prompt", "javaType": "boolean", "type": "boolean" }, { "names": "--format", "description": "Output format (text, markdown)", "defaultValue": "text", "javaType": "java.lang.String", "type": "string" }, { "names": "--model", "description": "Model to use", "defaultValue": "DEFAULT_MODEL", "javaType": "java.lang.String", "type": "string" }, { "names": "--show-prompt", "description": "Show the prompt sent to the LLM", "javaType": "boolean", "type": "boolean" }, { "names": "--stream", "description": "Stream the response as it's generated (shows progress)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--system-prompt", "description": "Custom system prompt", "javaType": "java.lang.String", "type": "string" }, { "names": "--temperature", "description": "Temperature for response generation (0.0-2.0)", "defaultValue": "0.7", "javaType": "double", "type": "number" }, { "names": "--timeout", "description": "Timeout in seconds for LLM response", "defaultValue": "120", "javaType": "int", "type": "integer" }, { "names": "--url", "description": "LLM API endpoint URL. Auto-detected from 'camel infra' for Ollama if not specified.", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose,-v", "description": "Include detailed technical information", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, + { "name": "export", "fullName": "export", "description": "Export to other runtimes (Camel Main, Spring Boot, or Quarkus)", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Export", "options": [ { "names": "--build-property", "description": "Maven build properties, ex. --build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, { "names": "--camel-spring-boot-version", "description": "Camel version to use with Spring Boot", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To export using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--clean-dir", "description": "If exporting to current directory (default) then all existing files are preserved. Enabling this option will force cleaning current directory including all sub dirs (use this with care)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--dir,--directory", "description": "Directory where the project will be exported", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--dry-run", "description": "Preview export without writing files", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version", "javaType": "java.lang.String", "type": "string" }, { "names": "--groovy-pre-compiled", "description": "Whether to include pre-compiled Groovy classes in the export (only supported with runtime=camel-main)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio", "description": "Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio-version", "description": "Version of the Hawtio web console", "defaultValue": "HawtioVersion.HAWTIO_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version,--java", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory for loading Kamelets (takes precedence)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn on logging to console (logs by default to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--main-classname", "description": "The class name of the Camel Main application class", "defaultValue": "CamelApplication", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-wrapper", "description": "Include Maven Wrapper files in exported project", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The integration name. Use this when the name should not get derived otherwise.", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-name", "description": "For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to export (dev, test, prod).", "javaType": "java.lang.String", "type": "string" }, { "names": "--prop,--property", "description": "Camel application properties, ex. --property=prop1=foo", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-package-type", "description": "Quarkus package type (uber-jar or fast-jar)", "defaultValue": "uber-jar", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--quiet", "description": "Will be quiet, only print when error occurs", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--yes,-y", "description": "Automatically answer yes to confirmation prompts (e.g. when using --clean-dir)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, + { "name": "get", "fullName": "get", "description": "Get status of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelStatus", "options": [ { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "bean", "fullName": "get bean", "description": "List beans in a running Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelBeanDump", "options": [ { "names": "--dsl", "description": "Include only beans from YAML or XML DSL", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter beans names (use all to include all beans)", "defaultValue": "all", "javaType": "java.lang.String", "type": "string" }, { "names": "--internal", "description": "Include internal Camel beans", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--nulls", "description": "Include null values", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--properties", "description": "Show bean properties", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by name or type", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "blocked", "fullName": "get blocked", "description": "Get blocked messages of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListBlocked", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "circuit-breaker", "fullName": "get circuit-breaker", "description": "Get status of Circuit Breaker EIPs", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListCircuitBreaker", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "consumer", "fullName": "get consumer", "description": "Get status of Camel consumers", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListConsumer", "options": [ { "names": "--filter", "description": "Filter consumers by URI", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Filter consumers by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--scheduled", "description": "Filter consumer to only show scheduled based consumers", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "context", "fullName": "get context", "description": "Get status of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelContextStatus", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--remote", "description": "Break down counters into remote\/total pairs", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "count", "fullName": "get count", "description": "Get total and failed exchanges", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelCount", "options": [ { "names": "--fail", "description": "Get the failed exchanges from a running integration", "javaType": "boolean", "type": "boolean" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--total", "description": "Get the total exchanges from a running integration", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "endpoint", "fullName": "get endpoint", "description": "Get usage of Camel endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListEndpoint", "options": [ { "names": "--filter", "description": "Filter endpoints by URI", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-direction", "description": "Filter by direction (in or out)", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-total", "description": "Filter endpoints that must be higher than the given usage", "javaType": "long", "type": "integer" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Filter endpoints by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name, age or total", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "event", "fullName": "get event", "description": "Get latest events of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListEvent", "options": [ { "names": "--filter", "description": "Filter event by event type: context, route, or exchange", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "groovy", "fullName": "get groovy", "description": "Groovy Sources used of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListGroovy", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid or name", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "group", "fullName": "get group", "description": "Get status of Camel route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelRouteGroupStatus", "options": [ { "names": "--filter", "description": "Filter groups by name", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter groups that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Filter groups by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--running", "description": "Only include running groups", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name, age or group", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "health", "fullName": "get health", "description": "Get health check status of running Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListHealth", "options": [ { "names": "--depth", "description": "Max depth of stack-trace", "defaultValue": "1", "javaType": "int", "type": "integer" }, { "names": "--down", "description": "Show only checks which are DOWN", "javaType": "boolean", "type": "boolean" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--level", "description": "Level of details: full, or default", "defaultValue": "default", "javaType": "java.lang.String", "type": "string" }, { "names": "--live", "description": "Show only liveness checks", "javaType": "boolean", "type": "boolean" }, { "names": "--ready", "description": "Show only readiness checks", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--trace", "description": "Include stack-traces in error messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "history", "fullName": "get history", "description": "History of latest completed exchange", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelHistoryAction", "options": [ { "names": "--ago", "description": "Use ago instead of yyyy-MM-dd HH:mm:ss in timestamp.", "javaType": "boolean", "type": "boolean" }, { "names": "--depth", "description": "Depth of tracing. 0=Created Completed. 1=All events on 1st route, 2=All events on 1st 2nd depth, and so on. 9 = all events on every depth.", "defaultValue": "9", "javaType": "int", "type": "integer" }, { "names": "--it", "description": "Interactive mode for enhanced history information", "javaType": "boolean", "type": "boolean" }, { "names": "--limit-split", "description": "Limit Split to a maximum number of entries to be displayed", "javaType": "int", "type": "integer" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties in debug messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--timestamp", "description": "Print timestamp.", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "inflight", "fullName": "get inflight", "description": "Get inflight messages of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListInflight", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "internal-task", "fullName": "get internal-task", "description": "List internal tasks of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListInternalTask", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "kafka", "fullName": "get kafka", "description": "List Kafka consumers of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListKafka", "options": [ { "names": "--committed", "description": "Show committed offset (slower due to sync call to Kafka brokers)", "javaType": "boolean", "type": "boolean" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "metric", "fullName": "get metric", "description": "Get metrics (micrometer) of running Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListMetric", "options": [ { "names": "--all", "description": "Whether to show all metrics (also unused with counter being 0)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--custom", "description": "Only show custom metrics", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter metric by type, name or tags", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--tags", "description": "Show metric tags", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "platform-http", "fullName": "get platform-http", "description": "Get embedded HTTP services of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListPlatformHttp", "options": [ { "names": "--all", "description": "Include management endpoints", "javaType": "boolean", "type": "boolean" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "processor", "fullName": "get processor", "description": "Get status of Camel processors", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelProcessorStatus", "options": [ { "names": "--description", "description": "Include description in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter processors by id", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter processors that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--group", "description": "Filter processors by group", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Filter routes by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--note", "description": "Include note in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--remote", "description": "Break down counters into remote\/total pairs", "javaType": "boolean", "type": "boolean" }, { "names": "--running", "description": "Only include running processors", "javaType": "boolean", "type": "boolean" }, { "names": "--show-group", "description": "Include group column", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid or name", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "producer", "fullName": "get producer", "description": "Get status of Camel producers", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListProducer", "options": [ { "names": "--filter", "description": "Filter producers by URI", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Filter producers by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "properties", "fullName": "get properties", "description": "List configuration properties", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListProperties", "options": [ { "names": "--internal", "description": "Whether to include internal configuration", "javaType": "boolean", "type": "boolean" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask configuration values to avoid printing sensitive information such as password or access keys", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or key", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--startup", "description": "List only startup configuration", "javaType": "boolean", "type": "boolean" }, { "names": "--verbose", "description": "Whether to include more details", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "rest", "fullName": "get rest", "description": "Get REST services of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListRest", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Show more details", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route", "fullName": "get route", "description": "Get status of Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelRouteStatus", "options": [ { "names": "--description", "description": "Include description in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--error", "description": "Shows detailed information for routes that has error status", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter routes by id, or url", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter routes that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--group", "description": "Filter routes by group", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Filter routes by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--note", "description": "Include note in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--running", "description": "Only include running routes", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-group", "description": "Include group column", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route-controller", "fullName": "get route-controller", "description": "List status of route controller", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.RouteControllerAction", "options": [ { "names": "--depth", "description": "Max depth of stack-trace", "defaultValue": "1", "javaType": "int", "type": "integer" }, { "names": "--header", "description": "Include controller configuration details", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by id, or state", "defaultValue": "id", "javaType": "java.lang.String", "type": "string" }, { "names": "--trace", "description": "Include stack-traces in error messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route-dump", "fullName": "get route-dump", "description": "Dump Camel route in XML or YAML format", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteDumpAction", "options": [ { "names": "--filter", "description": "Filter route by filename or route id (multiple names can be separated by comma)", "javaType": "java.lang.String", "type": "string" }, { "names": "--format", "description": "Output format (xml, or yaml)", "defaultValue": "yaml", "javaType": "java.lang.String", "type": "string" }, { "names": "--raw", "description": "To output raw without metadata", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort route by name or id", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "--uri-as-parameters", "description": "Whether to expand URIs into separated key\/value parameters (only in use for YAML format)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "service", "fullName": "get service", "description": "Get services of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListService", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--metadata", "description": "Show service metadata (only available for some services)", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "source", "fullName": "get source", "description": "Display Camel route source code", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelSourceAction", "options": [ { "names": "--filter", "description": "Filter source by filename (multiple names can be separated by comma)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort source by name", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "startup-recorder", "fullName": "get startup-recorder", "description": "Display startup recording", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelStartupRecorderAction", "options": [ { "names": "--sort", "description": "Sort by duration, or type", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "transformer", "fullName": "get transformer", "description": "Get list of data type transformers", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListTransformer", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name, age or total", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "variable", "fullName": "get variable", "description": "List variables of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListVariable", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or key", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "vault", "fullName": "get vault", "description": "List secrets from security vaults", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListVault", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, + { "name": "harden", "fullName": "harden", "description": "Suggest security hardening for Camel routes using AI\/LLM", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Harden", "options": [ { "names": "--api-key", "description": "API key for authentication. Also reads OPENAI_API_KEY or LLM_API_KEY env vars", "javaType": "java.lang.String", "type": "string" }, { "names": "--api-type", "description": "API type: 'ollama' or 'openai' (OpenAI-compatible)", "defaultValue": "ollama", "javaType": "org.apache.camel.dsl.jbang.core.commands.ApiType", "type": "object" }, { "names": "--catalog-context", "description": "Include Camel Catalog descriptions in the prompt", "javaType": "boolean", "type": "boolean" }, { "names": "--format", "description": "Output format (text, markdown)", "defaultValue": "text", "javaType": "java.lang.String", "type": "string" }, { "names": "--model", "description": "Model to use", "defaultValue": "DEFAULT_MODEL", "javaType": "java.lang.String", "type": "string" }, { "names": "--show-prompt", "description": "Show the prompt sent to the LLM", "javaType": "boolean", "type": "boolean" }, { "names": "--stream", "description": "Stream the response as it's generated (shows progress)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--system-prompt", "description": "Custom system prompt", "javaType": "java.lang.String", "type": "string" }, { "names": "--temperature", "description": "Temperature for response generation (0.0-2.0)", "defaultValue": "0.7", "javaType": "double", "type": "number" }, { "names": "--timeout", "description": "Timeout in seconds for LLM response", "defaultValue": "120", "javaType": "int", "type": "integer" }, { "names": "--url", "description": "LLM API endpoint URL. Auto-detected from 'camel infra' for Ollama if not specified.", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose,-v", "description": "Include detailed security recommendations with code examples", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "hawtio", "fullName": "hawtio", "description": "Launch Hawtio web console", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.Hawtio", "options": [ { "names": "--openUrl", "description": "To automatic open Hawtio web console in the web browser", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Port number to use for Hawtio web console (port 8888 by default)", "defaultValue": "8888", "javaType": "int", "type": "integer" }, { "names": "--version", "description": "Version of the Hawtio web console", "defaultValue": "HawtioVersion.HAWTIO_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "infra", "fullName": "infra", "description": "List and Run external services for testing and prototyping", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.infra.InfraCommand", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "get", "fullName": "infra get", "description": "Displays running service(s) information", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.infra.InfraGet", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "list", "fullName": "infra list", "description": "Displays available external services", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.infra.InfraList", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "log", "fullName": "infra log", "description": "Displays external service logs", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.infra.InfraLog", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--lines", "description": "The number of lines from the end of the log to use as starting offset", "defaultValue": "50", "javaType": "int", "type": "integer" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "ps", "fullName": "infra ps", "description": "Displays running services", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.infra.InfraPs", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "run", "fullName": "infra run", "description": "Run an external service", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.infra.InfraRun", "options": [ { "names": "--background", "description": "Run in the background", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--log", "description": "Log container output to console", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Override the default port for the service", "javaType": "java.lang.Integer", "type": "integer" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stop", "fullName": "infra stop", "description": "Shuts down running external services", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.infra.InfraStop", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--kill", "description": "To force killing the process (SIGKILL)", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, - { "name": "init", "fullName": "init", "description": "Creates a new Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Init", "options": [ { "names": "--clean-dir,--clean-directory", "description": "Whether to clean directory first (deletes all files in directory)", "javaType": "boolean", "type": "boolean" }, { "names": "--dir,--directory", "description": "Directory relative path where the new Camel integration will be saved", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--from-kamelet", "description": "To be used when extending an existing Kamelet", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "javaType": "java.lang.String", "type": "string" }, { "names": "--pipe", "description": "When creating a yaml file should it be created as a Pipe CR", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, + { "name": "init", "fullName": "init", "description": "Creates a new Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Init", "options": [ { "names": "--clean-dir,--clean-directory", "description": "Whether to clean directory first (deletes all files in directory)", "javaType": "boolean", "type": "boolean" }, { "names": "--dir,--directory", "description": "Directory relative path where the new Camel integration will be saved", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--from-kamelet", "description": "To be used when extending an existing Kamelet", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "javaType": "java.lang.String", "type": "string" }, { "names": "--list", "description": "List available templates", "javaType": "boolean", "type": "boolean" }, { "names": "--pipe", "description": "When creating a yaml file should it be created as a Pipe CR", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "jolokia", "fullName": "jolokia", "description": "Attach Jolokia JVM Agent to a running Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.Jolokia", "options": [ { "names": "--port", "description": "To use a specific port number when attaching Jolokia JVM Agent (default a free port is found in range 8778-9999)", "javaType": "int", "type": "integer" }, { "names": "--stop", "description": "Stops the Jolokia JVM Agent in the running Camel integration", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "log", "fullName": "log", "description": "Tail logs from running Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelLogAction", "options": [ { "names": "--find", "description": "Find and highlight matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--follow", "description": "Keep following and outputting new log lines (press enter to exit).", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--grep", "description": "Filter logs to only output lines matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--prefix", "description": "Print prefix with running Camel integration name. auto=only prefix when running multiple integrations. true=always prefix. false=prefix off.", "defaultValue": "auto", "javaType": "java.lang.String", "type": "string" }, { "names": "--since", "description": "Return logs newer than a relative duration like 5s, 2m, or 1h. The value is in seconds if no unit specified.", "javaType": "java.lang.String", "type": "string" }, { "names": "--startup", "description": "Only shows logs from the starting phase to make it quick to look at how Camel was started.", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--tail", "description": "The number of lines from the end of the logs to show. Use -1 to read from the beginning. Use 0 to read only new lines. Defaults to showing all logs from beginning.", "defaultValue": "-1", "javaType": "int", "type": "integer" }, { "names": "--timestamp", "description": "Print timestamp.", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "nano", "fullName": "nano", "description": "Nano editor to edit file", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Nano", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "plugin", "fullName": "plugin", "description": "Manage plugins that add sub-commands to this CLI", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.plugin.PluginCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "add", "fullName": "plugin add", "description": "Add new plugin", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.plugin.PluginAdd", "options": [ { "names": "--artifactId", "description": "Maven artifactId", "javaType": "java.lang.String", "type": "string" }, { "names": "--command", "description": "The command that the plugin uses", "javaType": "java.lang.String", "type": "string" }, { "names": "--description", "description": "A short description of the plugin", "javaType": "java.lang.String", "type": "string" }, { "names": "--first-version", "description": "First version of this plugin", "defaultValue": "", "javaType": "java.lang.String", "type": "string" }, { "names": "--gav", "description": "Maven group and artifact coordinates.", "javaType": "java.lang.String", "type": "string" }, { "names": "--groupId", "description": "Maven groupId", "defaultValue": "org.apache.camel", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories to use for downloading the plugin (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--version", "description": "Maven artifact version", "defaultValue": "", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "delete", "fullName": "plugin delete", "description": "Removes a plugin", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.plugin.PluginDelete", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "get", "fullName": "plugin get", "description": "Display available plugins", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.plugin.PluginGet", "options": [ { "names": "--all", "description": "Display all available plugins", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repos", "description": "Display maven repository column", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, { "name": "ps", "fullName": "ps", "description": "List running Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.ListProcess", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--pid", "description": "List only pid in the output", "javaType": "boolean", "type": "boolean" }, { "names": "--remote", "description": "Break down counters into remote\/total pairs", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, - { "name": "run", "fullName": "run", "description": "Run as local Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Run", "options": [ { "names": "--background", "description": "Run in the background", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--background-wait", "description": "To wait for run in background to startup successfully, before returning", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--backlog-trace", "description": "Enables backlog tracing of the routed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--camel-spring-boot-version", "description": "To run using a different Camel Spring Boot version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To run using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--code", "description": "Run the given text or file as Java DSL routes", "javaType": "java.lang.String", "type": "string" }, { "names": "--console", "description": "Developer console at \/q\/dev on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--empty", "description": "Run an empty Camel without loading source files", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version (used during exporting)", "javaType": "java.lang.String", "type": "string" }, { "names": "--health", "description": "Deprecated: use --observe instead. Health check at \/q\/health on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean", "deprecated": true }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--jfr", "description": "Enables Java Flight Recorder saving recording to disk on exit", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--jfr-profile", "description": "Java Flight Recorder profile to use (such as default or profile)", "javaType": "java.lang.String", "type": "string" }, { "names": "--jvm-debug", "description": "To enable JVM remote debugging on port 4004 by default. The supported values are true to enable the remote debugging, false to disable the remote debugging or a number to use a custom port", "javaType": "int", "type": "integer", "paramLabel": "" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory (or github link) for loading Kamelets (takes precedence). Multiple directories can be specified separated by comma.", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn off logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-category", "description": "Used for individual logging levels (ex: org.apache.kafka=DEBUG)", "javaType": "java.util.List", "type": "array" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-config-path", "description": "Path to file with custom logging configuration", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-json", "description": "Use JSON logging (ECS Layout)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level ()", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management (use 0 to dynamic assign a free random port number)", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--max-idle-seconds", "description": "For how long time in seconds Camel can be idle before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-messages", "description": "Max number of messages to process before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-seconds", "description": "Max seconds to run before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--metrics", "description": "Deprecated: use --observe instead. Metrics (Micrometer and Prometheus) at \/q\/metrics on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean", "deprecated": true }, { "names": "--modeline", "description": "Whether to support JBang style \/\/DEPS to specify additional dependencies", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The name of the Camel application", "defaultValue": "CamelJBang", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port (port 8080 by default; use 0 to dynamic assign a free random port number)", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to run (dev, test, or prod).", "defaultValue": "dev", "javaType": "java.lang.String", "type": "string" }, { "names": "--prompt", "description": "Allow user to type in required parameters in prompt if not present in application", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties (override existing)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--reload,--dev", "description": "Enables dev mode (live reload when source files are updated and saved)", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "defaultValue": "camel-main", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--source-dir", "description": "Source directory for dynamically loading Camel file(s) to run. When using this, then files cannot be specified at the same time.", "javaType": "java.lang.String", "type": "string" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--stub", "description": "Stubs all the matching endpoint uri with the given component name or pattern. Multiple names can be separated by comma. (all = stub all endpoints).", "javaType": "java.lang.String", "type": "string" }, { "names": "--trace", "description": "Enables trace logging of the routed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, - { "name": "sbom", "fullName": "sbom", "description": "Generate a CycloneDX or SPDX SBOM for a specific project", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.SBOMGenerator", "options": [ { "names": "--build-property", "description": "Maven build properties, ex. --build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, { "names": "--camel-spring-boot-version", "description": "Camel version to use with Spring Boot", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To export using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--clean-dir", "description": "If exporting to current directory (default) then all existing files are preserved. Enabling this option will force cleaning current directory including all sub dirs (use this with care)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--cyclonedx-plugin-version", "description": "The CycloneDX Maven Plugin version", "defaultValue": "2.9.1", "javaType": "java.lang.String", "type": "string" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--dir,--directory", "description": "Directory where the project will be exported", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version", "javaType": "java.lang.String", "type": "string" }, { "names": "--groovy-pre-compiled", "description": "Whether to include pre-compiled Groovy classes in the export (only supported with runtime=camel-main)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio", "description": "Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio-version", "description": "Version of the Hawtio web console", "defaultValue": "HawtioVersion.HAWTIO_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory for loading Kamelets (takes precedence)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn on logging to console (logs by default to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--main-classname", "description": "The class name of the Camel Main application class", "defaultValue": "CamelApplication", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-wrapper", "description": "Include Maven Wrapper files in exported project", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The integration name. Use this when the name should not get derived otherwise.", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--output-directory", "description": "Directory where the SBOM will be saved", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--output-name", "description": "Output name of the SBOM file", "defaultValue": "sbom", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-name", "description": "For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to export (dev, test, or prod).", "javaType": "java.lang.String", "type": "string" }, { "names": "--prop,--property", "description": "Camel application properties, ex. --property=prop1=foo", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--quiet", "description": "Will be quiet, only print when error occurs", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--sbom-format", "description": "The SBOM format, possible values are cyclonedx or spdx", "defaultValue": "CYCLONEDX_FORMAT", "javaType": "java.lang.String", "type": "string" }, { "names": "--sbom-output-format", "description": "The SBOM output format, possible values are json or xml", "defaultValue": "SBOM_JSON_FORMAT", "javaType": "java.lang.String", "type": "string" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--spdx-plugin-version", "description": "The SPDX Maven Plugin version", "defaultValue": "0.7.4", "javaType": "java.lang.String", "type": "string" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, - { "name": "script", "fullName": "script", "description": "Run Camel integration as shell script for terminal scripting", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Script", "options": [ { "names": "--logging", "description": "Can be used to turn on logging (logs to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level ()", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--max-idle-seconds", "description": "For how long time in seconds Camel can be idle before stopping", "defaultValue": "1", "javaType": "int", "type": "integer" }, { "names": "--max-messages", "description": "Max number of messages to process before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-seconds", "description": "Max seconds to run before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--prop,--property", "description": "Additional properties (override existing)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "Load properties file for route placeholders (ex. \/path\/to\/file.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, + { "name": "run", "fullName": "run", "description": "Run as local Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Run", "options": [ { "names": "--background", "description": "Run in the background", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--background-wait", "description": "To wait for run in background to startup successfully, before returning", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--backlog-trace", "description": "Enables backlog tracing of the routed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--camel-spring-boot-version", "description": "To run using a different Camel Spring Boot version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To run using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--code", "description": "Run the given text or file as Java DSL routes", "javaType": "java.lang.String", "type": "string" }, { "names": "--console", "description": "Developer console at \/q\/dev on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--empty", "description": "Run an empty Camel without loading source files", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version (used during exporting)", "javaType": "java.lang.String", "type": "string" }, { "names": "--health", "description": "Deprecated: use --observe instead. Health check at \/q\/health on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean", "deprecated": true }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version,--java", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--jfr", "description": "Enables Java Flight Recorder saving recording to disk on exit", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--jfr-profile", "description": "Java Flight Recorder profile to use (such as default or profile)", "javaType": "java.lang.String", "type": "string" }, { "names": "--jvm-debug", "description": "To enable JVM remote debugging on port 4004 by default. The supported values are true to enable the remote debugging, false to disable the remote debugging or a number to use a custom port", "javaType": "int", "type": "integer", "paramLabel": "" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory (or github link) for loading Kamelets (takes precedence). Multiple directories can be specified separated by comma.", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn off logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-category", "description": "Used for individual logging levels (ex: org.apache.kafka=DEBUG)", "javaType": "java.util.List", "type": "array" }, { "names": "--logging-color", "description": "Use colored logging. Default is auto-detected based on NO_COLOR, CI, FORCE_COLOR environment variables and terminal capabilities", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-config-path", "description": "Path to file with custom logging configuration", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-json", "description": "Use JSON logging (ECS Layout)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management (use 0 to dynamic assign a free random port number)", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--max-idle-seconds", "description": "For how long time in seconds Camel can be idle before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-messages", "description": "Max number of messages to process before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-seconds", "description": "Max seconds to run before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--metrics", "description": "Deprecated: use --observe instead. Metrics (Micrometer and Prometheus) at \/q\/metrics on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean", "deprecated": true }, { "names": "--modeline", "description": "Whether to support JBang style \/\/DEPS to specify additional dependencies", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The name of the Camel application", "defaultValue": "CamelJBang", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port (port 8080 by default; use 0 to dynamic assign a free random port number)", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to run (dev, test, prod).", "defaultValue": "dev", "javaType": "java.lang.String", "type": "string" }, { "names": "--prompt", "description": "Allow user to type in required parameters in prompt if not present in application", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties (override existing)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--reload,--dev", "description": "Enables dev mode (live reload when source files are updated and saved)", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "defaultValue": "camel-main", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--skip-plugins", "description": "Skip resolving plugin dependencies", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--source-dir", "description": "Source directory for dynamically loading Camel file(s) to run. When using this, then files cannot be specified at the same time.", "javaType": "java.lang.String", "type": "string" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--stub", "description": "Stubs all the matching endpoint uri with the given component name or pattern. Multiple names can be separated by comma. (all = stub all endpoints).", "javaType": "java.lang.String", "type": "string" }, { "names": "--trace", "description": "Enables trace logging of the routed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, + { "name": "sbom", "fullName": "sbom", "description": "Generate a CycloneDX or SPDX SBOM for a specific project", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.SBOMGenerator", "options": [ { "names": "--build-property", "description": "Maven build properties, ex. --build-property=prop1=foo", "javaType": "java.util.List", "type": "array" }, { "names": "--camel-spring-boot-version", "description": "Camel version to use with Spring Boot", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To export using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--clean-dir", "description": "If exporting to current directory (default) then all existing files are preserved. Enabling this option will force cleaning current directory including all sub dirs (use this with care)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--cyclonedx-plugin-version", "description": "The CycloneDX Maven Plugin version", "defaultValue": "2.9.1", "javaType": "java.lang.String", "type": "string" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--dir,--directory", "description": "Directory where the project will be exported", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--dry-run", "description": "Preview export without writing files", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version", "javaType": "java.lang.String", "type": "string" }, { "names": "--groovy-pre-compiled", "description": "Whether to include pre-compiled Groovy classes in the export (only supported with runtime=camel-main)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio", "description": "Whether to include Hawtio web console (only available for exporting to Spring Boot or Quarkus)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--hawtio-version", "description": "Version of the Hawtio web console", "defaultValue": "HawtioVersion.HAWTIO_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version,--java", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory for loading Kamelets (takes precedence)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging", "description": "Can be used to turn on logging to console (logs by default to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--main-classname", "description": "The class name of the Camel Main application class", "defaultValue": "CamelApplication", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management", "javaType": "int", "type": "integer" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-wrapper", "description": "Include Maven Wrapper files in exported project", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The integration name. Use this when the name should not get derived otherwise.", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--output-directory", "description": "Directory where the SBOM will be saved", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--output-name", "description": "Output name of the SBOM file", "defaultValue": "sbom", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-name", "description": "For Java source files should they have the given package name. By default the package name is computed from the Maven GAV. Use false to turn off and not include package name in the Java source files.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port", "javaType": "int", "type": "integer" }, { "names": "--profile", "description": "Profile to export (dev, test, prod).", "javaType": "java.lang.String", "type": "string" }, { "names": "--prop,--property", "description": "Camel application properties, ex. --property=prop1=foo", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-package-type", "description": "Quarkus package type (uber-jar or fast-jar)", "defaultValue": "uber-jar", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--quiet", "description": "Will be quiet, only print when error occurs", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--sbom-format", "description": "The SBOM format, possible values are cyclonedx or spdx", "defaultValue": "CYCLONEDX_FORMAT", "javaType": "java.lang.String", "type": "string" }, { "names": "--sbom-output-format", "description": "The SBOM output format, possible values are json or xml", "defaultValue": "SBOM_JSON_FORMAT", "javaType": "java.lang.String", "type": "string" }, { "names": "--skip-plugins", "description": "Skip plugins during export", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--spdx-plugin-version", "description": "The SPDX Maven Plugin version", "defaultValue": "0.7.4", "javaType": "java.lang.String", "type": "string" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--yes,-y", "description": "Automatically answer yes to confirmation prompts (e.g. when using --clean-dir)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, + { "name": "script", "fullName": "script", "description": "Run Camel integration as shell script for terminal scripting", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Script", "options": [ { "names": "--logging", "description": "Can be used to turn on logging (logs to file in \/.camel directory)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--max-idle-seconds", "description": "For how long time in seconds Camel can be idle before stopping", "defaultValue": "1", "javaType": "int", "type": "integer" }, { "names": "--max-messages", "description": "Max number of messages to process before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-seconds", "description": "Max seconds to run before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--prop,--property", "description": "Additional properties (override existing)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "Load properties file for route placeholders (ex. \/path\/to\/file.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "shell", "fullName": "shell", "description": "Interactive Camel JBang shell.", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Shell", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stop", "fullName": "stop", "description": "Shuts down running Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.StopProcess", "options": [ { "names": "--kill", "description": "To force killing the process (SIGKILL)", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, - { "name": "top", "fullName": "top", "description": "Top status of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelTop", "options": [ { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "context", "fullName": "top context", "description": "Top status of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelContextTop", "options": [ { "names": "--sort", "description": "Sort by pid, name, mem, or age", "defaultValue": "mem", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "group", "fullName": "top group", "description": "Top performing route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelRouteGroupTop", "options": [ { "names": "--filter", "description": "Filter groups by name", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter groups that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--limit", "description": "Filter groups by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--running", "description": "Only include running groups", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name, age or group", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "processor", "fullName": "top processor", "description": "Top performing processors", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelProcessorTop", "options": [ { "names": "--description", "description": "Include description in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter processors by id", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter processors that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--group", "description": "Filter processors by group", "javaType": "java.lang.String", "type": "string" }, { "names": "--limit", "description": "Filter routes by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--note", "description": "Include note in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--remote", "description": "Break down counters into remote\/total pairs", "javaType": "boolean", "type": "boolean" }, { "names": "--running", "description": "Only include running processors", "javaType": "boolean", "type": "boolean" }, { "names": "--show-group", "description": "Include group column", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid or name", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route", "fullName": "top route", "description": "Top performing routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelRouteTop", "options": [ { "names": "--description", "description": "Include description in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--error", "description": "Shows detailed information for routes that has error status", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter routes by id, or url", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter routes that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--group", "description": "Filter routes by group", "javaType": "java.lang.String", "type": "string" }, { "names": "--limit", "description": "Filter routes by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--note", "description": "Include note in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--running", "description": "Only include running routes", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-group", "description": "Include group column", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "source", "fullName": "top source", "description": "List top processors (source) in a running Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelSourceTop", "options": [ { "names": "--filter-mean", "description": "Filter processors that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--limit", "description": "Filter processors by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, + { "name": "top", "fullName": "top", "description": "Top status of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelTop", "options": [ { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "context", "fullName": "top context", "description": "Top status of Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelContextTop", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name, mem, or age", "defaultValue": "mem", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "group", "fullName": "top group", "description": "Top performing route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelRouteGroupTop", "options": [ { "names": "--filter", "description": "Filter groups by name", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter groups that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Filter groups by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--running", "description": "Only include running groups", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name, age or group", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "processor", "fullName": "top processor", "description": "Top performing processors", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelProcessorTop", "options": [ { "names": "--description", "description": "Include description in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter processors by id", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter processors that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--group", "description": "Filter processors by group", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Filter routes by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--note", "description": "Include note in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--remote", "description": "Break down counters into remote\/total pairs", "javaType": "boolean", "type": "boolean" }, { "names": "--running", "description": "Only include running processors", "javaType": "boolean", "type": "boolean" }, { "names": "--show-group", "description": "Include group column", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid or name", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route", "fullName": "top route", "description": "Top performing routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.process.CamelRouteTop", "options": [ { "names": "--description", "description": "Include description in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--error", "description": "Shows detailed information for routes that has error status", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter routes by id, or url", "javaType": "java.lang.String", "type": "string" }, { "names": "--filter-mean", "description": "Filter routes that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--group", "description": "Filter routes by group", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Filter routes by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--note", "description": "Include note in the ID column (if available)", "javaType": "boolean", "type": "boolean" }, { "names": "--running", "description": "Only include running routes", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-group", "description": "Include group column", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "source", "fullName": "top source", "description": "List top processors (source) in a running Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelSourceTop", "options": [ { "names": "--filter-mean", "description": "Filter processors that must be slower than the given time (ms)", "javaType": "long", "type": "integer" }, { "names": "--limit", "description": "Filter processors by limiting to the given number of rows", "javaType": "int", "type": "integer" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, { "name": "trace", "fullName": "trace", "description": "Tail message traces from running Camel integrations", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelTraceAction", "options": [ { "names": "--action", "description": "Action to start, stop, clear, list status, or dump traces", "defaultValue": "status", "javaType": "java.lang.String", "type": "string" }, { "names": "--ago", "description": "Use ago instead of yyyy-MM-dd HH:mm:ss in timestamp.", "javaType": "boolean", "type": "boolean" }, { "names": "--compact", "description": "Compact output (no empty line separating traced messages)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--depth", "description": "Depth of tracing. 0=Created Completed. 1=All events on 1st route, 2=All events on 1st 2nd depth, and so on. 9 = all events on every depth.", "defaultValue": "9", "javaType": "int", "type": "integer" }, { "names": "--find", "description": "Find and highlight matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--follow", "description": "Keep following and outputting new traces (press enter to exit).", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--grep", "description": "Filter traces to only output trace matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--latest", "description": "Only output traces from the latest (follow if necessary until complete and exit)", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--prefix", "description": "Print prefix with running Camel integration name. auto=only prefix when running multiple integrations. true=always prefix. false=prefix off.", "defaultValue": "auto", "javaType": "java.lang.String", "type": "string" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in traced messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties in traced messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables in traced messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in traced messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--since", "description": "Return traces newer than a relative duration like 5s, 2m, or 1h. The value is in seconds if no unit specified.", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by pid, name or age for showing status of tracing", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--tail", "description": "The number of traces from the end of the trace to show. Use -1 to read from the beginning. Use 0 to read only new lines. Defaults to showing all traces from beginning.", "defaultValue": "-1", "javaType": "int", "type": "integer" }, { "names": "--timestamp", "description": "Print timestamp.", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, - { "name": "transform", "fullName": "transform", "description": "Transform message or Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.TransformCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "message", "fullName": "transform message", "description": "Transform message from one format to another via an existing running Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.TransformMessageAction", "options": [ { "names": "--body", "description": "Message body to send (prefix with file: to refer to loading message body from file)", "javaType": "java.lang.String", "type": "string", "required": true }, { "names": "--camel-version", "description": "To run using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--component", "description": "The component to use for message transformation", "javaType": "java.lang.String", "type": "string" }, { "names": "--dataformat", "description": "The dataformat to use for message transformation", "javaType": "java.lang.String", "type": "string" }, { "names": "--header", "description": "Message header (key=value)", "javaType": "java.util.List", "type": "array" }, { "names": "--language", "description": "The language to use for message transformation", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--option", "description": "Option for additional configuration of the used language, component or dataformat (key=value)", "javaType": "java.util.List", "type": "array" }, { "names": "--output", "description": "File to store output. If none provide then output is printed to console.", "javaType": "java.lang.String", "type": "string" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--show-body", "description": "Show message body from the output message", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed transformation", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties from the output message", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers from the output message", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--source", "description": "Instead of using external template file then refer to an existing Camel route source with inlined Camel language expression in a route. (use :line-number or :id to refer to the exact location of the EIP to use)", "javaType": "java.lang.String", "type": "string" }, { "names": "--template", "description": "The template to use for message transformation (prefix with file: to refer to loading template from file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--timeout", "description": "Timeout in millis waiting for message to be transformed", "defaultValue": "20000", "javaType": "long", "type": "integer" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route", "fullName": "transform route", "description": "Transform Camel routes to XML or YAML format", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.TransformRoute", "options": [ { "names": "--format", "description": "Output format (xml or yaml), if only yaml files are provided, the format defaults to xml and vice versa", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "javaType": "boolean", "type": "boolean" }, { "names": "--output", "description": "File or directory to store transformed files. If none provide then output is printed to console. Use clipboard as name to copy content into clipboard.", "javaType": "java.lang.String", "type": "string" }, { "names": "--resolve-placeholders", "description": "Whether to resolve property placeholders in the dumped output", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--uri-as-parameters", "description": "Whether to expand URIs into separated key\/value parameters (only in use for YAML format)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, + { "name": "transform", "fullName": "transform", "description": "Transform message or Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.TransformCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "dataweave", "fullName": "transform dataweave", "description": "Convert DataWeave scripts to DataSonnet format", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.TransformDataWeave", "options": [ { "names": "--expression,-e", "description": "Inline DataWeave expression to convert", "javaType": "java.lang.String", "type": "string" }, { "names": "--include-comments", "description": "Include conversion notes as comments in output", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--input,-i", "description": "Input .dwl file or directory containing .dwl files", "javaType": "java.lang.String", "type": "string" }, { "names": "--output,-o", "description": "Output .ds file or directory (defaults to stdout)", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "message", "fullName": "transform message", "description": "Transform message from one format to another via an existing running Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.TransformMessageAction", "options": [ { "names": "--body", "description": "Message body to send (prefix with file: to refer to loading message body from file)", "javaType": "java.lang.String", "type": "string", "required": true }, { "names": "--camel-version", "description": "To run using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--component", "description": "The component to use for message transformation", "javaType": "java.lang.String", "type": "string" }, { "names": "--dataformat", "description": "The dataformat to use for message transformation", "javaType": "java.lang.String", "type": "string" }, { "names": "--header", "description": "Message header (key=value)", "javaType": "java.util.List", "type": "array" }, { "names": "--language", "description": "The language to use for message transformation", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--option", "description": "Option for additional configuration of the used language, component or dataformat (key=value)", "javaType": "java.util.List", "type": "array" }, { "names": "--output", "description": "File to store output. If none provide then output is printed to console.", "javaType": "java.lang.String", "type": "string" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--show-body", "description": "Show message body from the output message", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed transformation", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties from the output message", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers from the output message", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--source", "description": "Instead of using external template file then refer to an existing Camel route source with inlined Camel language expression in a route. (use :line-number or :id to refer to the exact location of the EIP to use)", "javaType": "java.lang.String", "type": "string" }, { "names": "--template", "description": "The template to use for message transformation (prefix with file: to refer to loading template from file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--timeout", "description": "Timeout in millis waiting for message to be transformed", "defaultValue": "20000", "javaType": "long", "type": "integer" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route", "fullName": "transform route", "description": "Transform Camel routes to XML or YAML format", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.TransformRoute", "options": [ { "names": "--format", "description": "Output format (xml, yaml), if only yaml files are provided, the format defaults to xml and vice versa", "javaType": "java.lang.String", "type": "string" }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "javaType": "boolean", "type": "boolean" }, { "names": "--output", "description": "File or directory to store transformed files. If none provide then output is printed to console. Use clipboard as name to copy content into clipboard.", "javaType": "java.lang.String", "type": "string" }, { "names": "--resolve-placeholders", "description": "Whether to resolve property placeholders in the dumped output", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--uri-as-parameters", "description": "Whether to expand URIs into separated key\/value parameters (only in use for YAML format)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, { "name": "update", "fullName": "update", "description": "Update Camel project", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.update.UpdateCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "list", "fullName": "update list", "description": "List available update versions for Camel and its runtime variants", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.update.UpdateList", "options": [ { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--use-cache", "description": "Use Maven cache", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "run", "fullName": "update run", "description": "Update Camel project", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.update.UpdateRun", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, - { "name": "version", "fullName": "version", "description": "Manage Camel versions", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.version.VersionCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "get", "fullName": "version get", "description": "Displays current Camel version", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.version.VersionGet", "options": [ { "names": "--global", "description": "Use global or local configuration", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "list", "fullName": "version list", "description": "Displays available Camel versions", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.version.VersionList", "options": [ { "names": "--date-format", "description": "The format to show the date (such as dd-MM-yyyy)", "defaultValue": "DEFAULT_DATE_FORMAT", "javaType": "java.lang.String", "type": "string" }, { "names": "--days", "description": "Whether to include days since release", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--eol", "description": "Include releases that are end-of-life", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--from-date", "description": "Filter by release date (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--from-version", "description": "Filter by Camel version (inclusive). Will start from 4.0 if no version ranges provided.", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--lts", "description": "Only show LTS supported releases", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--patch", "description": "Whether to include patch releases (x.y.z)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--rc", "description": "Include also milestone or RC releases", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime ()", "defaultValue": "camel-main", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--sort", "description": "Sort by (version, date, or days)", "defaultValue": "version", "javaType": "java.lang.String", "type": "string" }, { "names": "--tail", "description": "The number of lines from the end of the table to show.", "javaType": "int", "type": "integer" }, { "names": "--to-date", "description": "Filter by release date (exclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--to-version", "description": "Filter by Camel version (exclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--vendor", "description": "Vendor of Apache Camel distribution to use when filtering versions", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "set", "fullName": "version set", "description": "Set\/change current Camel version", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.version.VersionSet", "options": [ { "names": "--global", "description": "Use global or local configuration", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Maven repository for downloading the dependencies (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--reset", "description": "Reset by removing any custom version settings", "javaType": "boolean", "type": "boolean" }, { "names": "--runtime", "description": "Runtime ()", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] } + { "name": "version", "fullName": "version", "description": "Manage Camel versions", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.version.VersionCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "get", "fullName": "version get", "description": "Displays current Camel version", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.version.VersionGet", "options": [ { "names": "--global", "description": "Use global or local configuration", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "list", "fullName": "version list", "description": "Displays available Camel versions", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.version.VersionList", "options": [ { "names": "--date-format", "description": "The format to show the date (such as dd-MM-yyyy)", "defaultValue": "DEFAULT_DATE_FORMAT", "javaType": "java.lang.String", "type": "string" }, { "names": "--days", "description": "Whether to include days since release", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--eol", "description": "Include releases that are end-of-life", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--from-date", "description": "Filter by release date (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--from-version", "description": "Filter by Camel version (inclusive). Will start from 4.0 if no version ranges provided.", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--lts", "description": "Only show LTS supported releases", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--patch", "description": "Whether to include patch releases (x.y.z)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--rc", "description": "Include also milestone or RC releases", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "defaultValue": "camel-main", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--sort", "description": "Sort by (version, date, or days)", "defaultValue": "version", "javaType": "java.lang.String", "type": "string" }, { "names": "--tail", "description": "The number of lines from the end of the table to show.", "javaType": "int", "type": "integer" }, { "names": "--to-date", "description": "Filter by release date (exclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--to-version", "description": "Filter by Camel version (exclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--vendor", "description": "Vendor of Apache Camel distribution to use when filtering versions", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "set", "fullName": "version set", "description": "Set\/change current Camel version", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.version.VersionSet", "options": [ { "names": "--global", "description": "Use global or local configuration", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Maven repository for downloading the dependencies (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--reset", "description": "Reset by removing any custom version settings", "javaType": "boolean", "type": "boolean" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, + { "name": "wrapper", "fullName": "wrapper", "description": "Install Camel wrapper scripts for version pinning", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.WrapperCommand", "options": [ { "names": "--camel-version", "description": "Camel version to pin (defaults to current version)", "javaType": "java.lang.String", "type": "string" }, { "names": "--dir,--directory", "description": "Directory where wrapper files will be created", "defaultValue": ".", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo-url", "description": "Maven repository URL for downloading the launcher", "defaultValue": "DEFAULT_REPO_URL", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] } diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsMojo.java index 078fccd7d1625..e5614031299a6 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareCamelJBangCommandsMojo.java @@ -48,6 +48,7 @@ import org.jboss.forge.roaster.model.source.AnnotationSource; import org.jboss.forge.roaster.model.source.FieldSource; import org.jboss.forge.roaster.model.source.JavaClassSource; +import org.jboss.forge.roaster.model.source.JavaSource; /** * Prepares camel-jbang by scanning command classes and generating command metadata for documentation. @@ -56,9 +57,9 @@ requiresDependencyResolution = ResolutionScope.COMPILE) public class PrepareCamelJBangCommandsMojo extends AbstractGeneratorMojo { - // Pattern to match .addSubcommand("name", new CommandLine(new ClassName(main)) + // Pattern to match .addSubcommand("name", new CommandLine(new ClassName(this/main)) private static final Pattern SUBCOMMAND_PATTERN = Pattern.compile( - "\\.addSubcommand\\(\\s*\"([^\"]+)\"\\s*,\\s*new\\s+CommandLine\\(\\s*new\\s+([A-Za-z0-9_]+)\\s*\\(\\s*main\\s*\\)\\s*\\)"); + "\\.addSubcommand\\(\\s*\"([^\"]+)\"\\s*,\\s*new\\s+CommandLine\\(\\s*new\\s+([A-Za-z0-9_]+)\\s*\\(\\s*(?:this|main)\\s*\\)\\s*\\)"); @Parameter(defaultValue = "${project.basedir}/src/generated/resources") protected File outFolder; @@ -164,7 +165,8 @@ private void parseCommandHierarchy( // Find the start of the commandLine builder chain int startLine = -1; for (int i = 0; i < lines.size(); i++) { - if (lines.get(i).contains("commandLine = new CommandLine(main)")) { + if (lines.get(i).contains("commandLine = new CommandLine(this)") + || lines.get(i).contains("commandLine = new CommandLine(main)")) { startLine = i; break; } @@ -486,7 +488,17 @@ private OptionInfo parseOption(FieldSource field) { String description = optionAnn.getStringValue("description"); if (description != null) { description = description.replace("\"", ""); - // Remove Picocli placeholders that AsciiDoctor interprets as attributes + // Resolve ${COMPLETION-CANDIDATES} by looking up the completionCandidates class + if (description.contains("${COMPLETION-CANDIDATES}")) { + String candidatesLiteral = optionAnn.getLiteralValue("completionCandidates"); + if (candidatesLiteral != null) { + String resolved = resolveCompletionCandidates(candidatesLiteral, field.getOrigin()); + if (resolved != null) { + description = description.replace("${COMPLETION-CANDIDATES}", resolved); + } + } + } + // Remove any remaining Picocli placeholders that AsciiDoctor interprets as attributes description = sanitizeDescription(description); option.description = description; } @@ -536,11 +548,14 @@ private String sanitizeDescription(String description) { if (description == null) { return null; } - // Remove ${COMPLETION-CANDIDATES} placeholder + // Remove ${COMPLETION-CANDIDATES} placeholder (should already be resolved, but clean up if not) description = description.replace("${COMPLETION-CANDIDATES}", ""); - description = description.replace("(${COMPLETION-CANDIDATES})", ""); // Remove ${camel-version} and similar version placeholders description = description.replaceAll("\\$\\{[^}]+\\}", ""); + // Clean up empty or near-empty parentheses left after placeholder removal + // e.g. "(supports: )" or "()" or "( )" + description = description.replaceAll("\\([^)]*:\\s*\\)", ""); + description = description.replaceAll("\\(\\s*\\)", ""); // Remove Java string concatenation artifacts (+ at end of line from multi-line strings) description = description.replaceAll("\\s*\\+\\s*", " "); // Clean up any resulting double spaces @@ -548,6 +563,88 @@ private String sanitizeDescription(String description) { return description; } + /** + * Resolves picocli completionCandidates class reference to extract the actual candidate values. + */ + private String resolveCompletionCandidates(String candidatesLiteral, JavaClassSource declaringClass) { + // Extract class name from literal (e.g., "OutputFormatCompletionCandidates.class") + String className = candidatesLiteral.replace(".class", "").trim(); + if (className.contains(".")) { + className = className.substring(className.lastIndexOf('.') + 1); + } + + // Try to find as a nested type in the declaring class + for (JavaSource nested : declaringClass.getNestedTypes()) { + if (nested instanceof JavaClassSource nestedClass && nestedClass.getName().equals(className)) { + return extractCandidateValues(nestedClass); + } + } + + // Try to find as a separate class file in commands/ or common/ directories + File classFile = findClassFileRecursive(commandsDir, className); + if (classFile == null) { + // Also search in common/ sibling directory + File commonDir = new File(commandsDir.getParentFile(), "common"); + if (commonDir.exists()) { + classFile = new File(commonDir, className + ".java"); + if (!classFile.exists()) { + classFile = null; + } + } + } + + if (classFile != null) { + try { + JavaClassSource candidatesClass = (JavaClassSource) Roaster.parse(classFile); + return extractCandidateValues(candidatesClass); + } catch (Exception e) { + getLog().debug("Could not parse completion candidates class: " + className + " - " + e.getMessage()); + } + } + + return null; + } + + /** + * Extracts candidate values from a CompletionCandidates class by finding List.of() or Arrays.asList() calls in the + * source. + */ + private String extractCandidateValues(JavaClassSource clazz) { + String source = clazz.toString(); + + // Look for List.of("value1", "value2", ...) pattern + Matcher matcher = Pattern.compile("List\\.of\\(([^)]+)\\)").matcher(source); + if (matcher.find()) { + String result = extractStringLiterals(matcher.group(1)); + if (result != null) { + return result; + } + } + + // Also try Arrays.asList pattern + matcher = Pattern.compile("Arrays\\.asList\\(([^)]+)\\)").matcher(source); + if (matcher.find()) { + String result = extractStringLiterals(matcher.group(1)); + if (result != null) { + return result; + } + } + + return null; + } + + /** + * Extracts string literals from a source fragment like {@code "a", "b", "c"}. + */ + private String extractStringLiterals(String source) { + Matcher matcher = Pattern.compile("\"([^\"]+)\"").matcher(source); + List values = new ArrayList<>(); + while (matcher.find()) { + values.add(matcher.group(1)); + } + return values.isEmpty() ? null : String.join(", ", values); + } + // Helper classes private static class CommandInfo { String className; From f82a5c6ab30d7f899dbd1d6948c45cc4673cc73a Mon Sep 17 00:00:00 2001 From: Croway Date: Thu, 9 Apr 2026 13:56:30 +0200 Subject: [PATCH 4/7] CAMEL-23299: propagate transacted flag in AggregateProcessor for synchronous executor Exchange.copy() does not preserve the transacted flag. When the aggregate uses SynchronousExecutorService, the completion runs on the caller thread and can legitimately be transactional. Propagate the flag so Pipeline.process() uses scheduleQueue instead of scheduleMain, avoiding a queue-swap deadlock in the reactive executor's executeFromQueue loop. --- .../aggregate/AggregateProcessor.java | 10 ++ ...gateDirectRouteTransactedDeadlockTest.java | 144 ++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 core/camel-core/src/test/java/org/apache/camel/processor/aggregator/SplitAggregateDirectRouteTransactedDeadlockTest.java diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java index 7d7ad406059fd..4b5298b6c9bfb 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java @@ -397,6 +397,16 @@ protected boolean doProcess(Exchange exchange, String key, AsyncCallback callbac // copy exchange, and do not share the unit of work // the aggregated output runs in another unit of work Exchange copy = ExchangeHelper.createCorrelatedCopy(exchange, false); + // when using a synchronous executor the completion task runs on the caller thread, + // so it can preserve the transacted flag; this ensures downstream Pipeline.process() + // uses scheduleQueue instead of scheduleMain, avoiding queue-swap deadlocks in the + // reactive executor's executeFromQueue loop + if (executorService instanceof SynchronousExecutorService && exchange.isTransacted()) { + copy.getExchangeExtension().setTransacted(true); + if (copy.getProperty(Exchange.TRANSACTION_CONTEXT_DATA) == null) { + copy.setProperty(Exchange.TRANSACTION_CONTEXT_DATA, exchange.getProperty(Exchange.TRANSACTION_CONTEXT_DATA)); + } + } // remove the complete all groups flags as it should not be on the copy removeFlagCompleteCurrentGroup(copy); diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/SplitAggregateDirectRouteTransactedDeadlockTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/SplitAggregateDirectRouteTransactedDeadlockTest.java new file mode 100644 index 0000000000000..a36329b03a27e --- /dev/null +++ b/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/SplitAggregateDirectRouteTransactedDeadlockTest.java @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.processor.aggregator; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; +import org.apache.camel.builder.AggregationStrategies; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.util.concurrent.SynchronousExecutorService; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.apache.camel.Exchange.SPLIT_COMPLETE; +import static org.apache.camel.Exchange.SPLIT_INDEX; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; + +/** + * Reproducer for CAMEL-23281 regression: split + aggregate + transacted deadlocks when the aggregated exchange is + * routed to a separate route via direct:. + * + * The CAMEL-23281 fix processes the aggregate completion inline for SynchronousExecutorService, which avoids the + * deadlock when the destination is a simple endpoint (e.g. mock:). However, when the aggregated exchange is sent to a + * direct: endpoint that starts a new route, the inline processing re-enters Pipeline.process() which goes through + * CamelInternalProcessor.processTransacted() and DefaultAsyncProcessorAwaitManager.await(). The nested await() loops on + * executeFromQueue(), which does NOT restore from the reactive executor's back stack, so the callback latch never fires + * and the thread blocks forever. + */ +public class SplitAggregateDirectRouteTransactedDeadlockTest extends ContextTestSupport { + + private final Map txData = new ConcurrentHashMap<>(); + + @Test + @Timeout(30) + public void testSplitAggregateTransactedDirectRoute() throws Exception { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 11; i++) { + sb.append("Line ").append(i).append("\n"); + } + + MockEndpoint result = getMockEndpoint("mock:aggregated"); + result.expectedMessageCount(3); + + template.request("direct:transacted", e -> { + e.getIn().setBody(sb.toString()); + }); + + MockEndpoint.assertIsSatisfied(10, SECONDS, result); + + // verify TRANSACTION_CONTEXT_DATA was propagated to the aggregated exchanges + for (Exchange received : result.getReceivedExchanges()) { + Map ctx = received.getProperty(Exchange.TRANSACTION_CONTEXT_DATA, Map.class); + assertNotNull(ctx, "TRANSACTION_CONTEXT_DATA should be propagated"); + assertSame(txData, ctx, "TRANSACTION_CONTEXT_DATA should reference the same map"); + } + } + + @Test + @Timeout(30) + public void testSplitAggregateTransactedDirectRouteInChoice() throws Exception { + StringBuilder sb = new StringBuilder(); + sb.append("HEADER\n"); + for (int i = 1; i <= 11; i++) { + sb.append("Line ").append(i).append("\n"); + } + + MockEndpoint result = getMockEndpoint("mock:aggregated"); + result.expectedMessageCount(3); + + template.request("direct:transacted-choice", e -> { + e.getIn().setBody(sb.toString()); + }); + + MockEndpoint.assertIsSatisfied(10, SECONDS, result); + + for (Exchange received : result.getReceivedExchanges()) { + Map ctx = received.getProperty(Exchange.TRANSACTION_CONTEXT_DATA, Map.class); + assertNotNull(ctx, "TRANSACTION_CONTEXT_DATA should be propagated"); + assertSame(txData, ctx, "TRANSACTION_CONTEXT_DATA should reference the same map"); + } + } + + @Override + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() { + // Transacted split + aggregate sending to direct: route — deadlocks + from("direct:transacted") + .process(e -> { + e.getExchangeExtension().setTransacted(true); + e.setProperty(Exchange.TRANSACTION_CONTEXT_DATA, txData); + }) + .split(body().tokenize("\n")).streaming().stopOnException() + .aggregate(constant(true), AggregationStrategies.groupedBody()) + .eagerCheckCompletion() + .executorService(new SynchronousExecutorService()) + .completionSize(5) + .completionPredicate(exchangeProperty(SPLIT_COMPLETE)) + .to("direct:process"); + + // Transacted split + aggregate inside choice/when sending to direct: route — deadlocks + from("direct:transacted-choice") + .process(e -> { + e.getExchangeExtension().setTransacted(true); + e.setProperty(Exchange.TRANSACTION_CONTEXT_DATA, txData); + }) + .split(body().tokenize("\n")).streaming().stopOnException() + .choice() + .when(exchangeProperty(SPLIT_INDEX).isGreaterThan(0)) + .aggregate(constant(true), AggregationStrategies.groupedBody()) + .eagerCheckCompletion() + .executorService(new SynchronousExecutorService()) + .completionSize(5) + .completionPredicate(exchangeProperty(SPLIT_COMPLETE)) + .to("direct:process"); + + // Separate route that processes the aggregated exchange + from("direct:process") + .log("Aggregated batch: ${body}") + .to("mock:aggregated"); + } + }; + } +} From 83376c75e22812edf580f980ed248589369347c1 Mon Sep 17 00:00:00 2001 From: Croway Date: Thu, 9 Apr 2026 17:19:15 +0200 Subject: [PATCH 5/7] CAMEL-23243: Convert OpenAI operation property from String to enum --- .../camel/catalog/components/openai.json | 2 +- .../apache/camel/component/openai/openai.json | 2 +- .../component/openai/OpenAIComponent.java | 2 +- .../component/openai/OpenAIEndpoint.java | 17 +++---- .../component/openai/OpenAIOperations.java | 49 +++++++++++++++++++ .../endpoint/StaticEndpointBuilders.java | 4 ++ .../dsl/OpenAIEndpointBuilderFactory.java | 4 ++ 7 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIOperations.java diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openai.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openai.json index feb4bfac903dc..a3b430392764a 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openai.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/openai.json @@ -63,7 +63,7 @@ "CamelOpenAIOriginalText": { "index": 27, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String or List", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Original text content when embeddings operation is used", "constantName": "org.apache.camel.component.openai.OpenAIConstants#ORIGINAL_TEXT" } }, "properties": { - "operation": { "index": 0, "kind": "path", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform: 'chat-completion', 'embeddings', or 'tool-execution'" }, + "operation": { "index": 0, "kind": "path", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.openai.OpenAIOperations", "enum": [ "chat-completion", "embeddings", "tool-execution" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform: 'chat-completion', 'embeddings', or 'tool-execution'" }, "additionalBodyProperty": { "index": 1, "kind": "parameter", "displayName": "Additional Body Property", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "java.util.Map", "prefix": "additionalBodyProperty.", "multiValue": true, "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Additional JSON properties to include in the request body (e.g. additionalBodyProperty.traceId=123). This is a multi-value option with prefix: additionalBodyProperty." }, "apiKey": { "index": 2, "kind": "parameter", "displayName": "Api Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "OpenAI API key. Can also be set via OPENAI_API_KEY environment variable." }, "autoToolExecution": { "index": 3, "kind": "parameter", "displayName": "Auto Tool Execution", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "When true and MCP servers are configured, automatically execute tool calls and loop back to the model. When false, tool calls are returned as the message body for manual handling." }, diff --git a/components/camel-ai/camel-openai/src/generated/resources/META-INF/org/apache/camel/component/openai/openai.json b/components/camel-ai/camel-openai/src/generated/resources/META-INF/org/apache/camel/component/openai/openai.json index feb4bfac903dc..a3b430392764a 100644 --- a/components/camel-ai/camel-openai/src/generated/resources/META-INF/org/apache/camel/component/openai/openai.json +++ b/components/camel-ai/camel-openai/src/generated/resources/META-INF/org/apache/camel/component/openai/openai.json @@ -63,7 +63,7 @@ "CamelOpenAIOriginalText": { "index": 27, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String or List", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Original text content when embeddings operation is used", "constantName": "org.apache.camel.component.openai.OpenAIConstants#ORIGINAL_TEXT" } }, "properties": { - "operation": { "index": 0, "kind": "path", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform: 'chat-completion', 'embeddings', or 'tool-execution'" }, + "operation": { "index": 0, "kind": "path", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "org.apache.camel.component.openai.OpenAIOperations", "enum": [ "chat-completion", "embeddings", "tool-execution" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform: 'chat-completion', 'embeddings', or 'tool-execution'" }, "additionalBodyProperty": { "index": 1, "kind": "parameter", "displayName": "Additional Body Property", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "java.util.Map", "prefix": "additionalBodyProperty.", "multiValue": true, "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "Additional JSON properties to include in the request body (e.g. additionalBodyProperty.traceId=123). This is a multi-value option with prefix: additionalBodyProperty." }, "apiKey": { "index": 2, "kind": "parameter", "displayName": "Api Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "OpenAI API key. Can also be set via OPENAI_API_KEY environment variable." }, "autoToolExecution": { "index": 3, "kind": "parameter", "displayName": "Auto Tool Execution", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.openai.OpenAIConfiguration", "configurationField": "configuration", "description": "When true and MCP servers are configured, automatically execute tool calls and loop back to the model. When false, tool calls are returned as the message body for manual handling." }, diff --git a/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIComponent.java b/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIComponent.java index 566f05e00c41b..6c5a933363915 100644 --- a/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIComponent.java +++ b/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIComponent.java @@ -66,7 +66,7 @@ protected Endpoint createEndpoint(String uri, String remaining, Map new OpenAIProducer(this); - case "embeddings" -> new OpenAIEmbeddingsProducer(this); - case "tool-execution" -> new OpenAIToolExecutionProducer(this); - default -> throw new IllegalArgumentException( - "Unknown operation: " + operation + ". Supported: chat-completion, embeddings, tool-execution"); + case chatCompletion -> new OpenAIProducer(this); + case embeddings -> new OpenAIEmbeddingsProducer(this); + case toolExecution -> new OpenAIToolExecutionProducer(this); }; } @@ -500,11 +497,11 @@ private String resolveOAuthToken() throws Exception { return OAuthHelper.resolveOAuthToken(getCamelContext(), configuration.getOauthProfile()); } - public String getOperation() { + public OpenAIOperations getOperation() { return operation; } - public void setOperation(String operation) { + public void setOperation(OpenAIOperations operation) { this.operation = operation; } diff --git a/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIOperations.java b/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIOperations.java new file mode 100644 index 0000000000000..7f1ac265733e5 --- /dev/null +++ b/components/camel-ai/camel-openai/src/main/java/org/apache/camel/component/openai/OpenAIOperations.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.openai; + +public enum OpenAIOperations { + + chatCompletion("chat-completion"), + embeddings("embeddings"), + toolExecution("tool-execution"); + + private final String value; + + OpenAIOperations(String value) { + this.value = value; + } + + public static OpenAIOperations fromValue(String value) { + for (OpenAIOperations op : values()) { + if (op.value.equalsIgnoreCase(value) || op.name().equalsIgnoreCase(value)) { + return op; + } + } + throw new IllegalArgumentException( + "Unknown operation: " + value + ". Supported: chat-completion, embeddings, tool-execution"); + } + + public String getValue() { + return value; + } + + @Override + public String toString() { + return value; + } +} diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java index 94fc5482e3c8a..16749098ece9c 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java @@ -12557,6 +12557,8 @@ public static OnceEndpointBuilderFactory.OnceEndpointBuilder once(String compone * Path parameter: operation (required) * The operation to perform: 'chat-completion', 'embeddings', or * 'tool-execution' + * There are 3 enums and the value can be one of: chat-completion, + * embeddings, tool-execution * * @param path operation * @return the dsl builder @@ -12577,6 +12579,8 @@ public static OpenAIEndpointBuilderFactory.OpenAIEndpointBuilder openai(String p * Path parameter: operation (required) * The operation to perform: 'chat-completion', 'embeddings', or * 'tool-execution' + * There are 3 enums and the value can be one of: chat-completion, + * embeddings, tool-execution * * @param componentName to use a custom component name for the endpoint * instead of the default name diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenAIEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenAIEndpointBuilderFactory.java index d719573604a73..21a722c59c844 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenAIEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/OpenAIEndpointBuilderFactory.java @@ -962,6 +962,8 @@ default OpenAIHeaderNameBuilder openai() { * Path parameter: operation (required) * The operation to perform: 'chat-completion', 'embeddings', or * 'tool-execution' + * There are 3 enums and the value can be one of: chat-completion, + * embeddings, tool-execution * * @param path operation * @return the dsl builder @@ -982,6 +984,8 @@ default OpenAIEndpointBuilder openai(String path) { * Path parameter: operation (required) * The operation to perform: 'chat-completion', 'embeddings', or * 'tool-execution' + * There are 3 enums and the value can be one of: chat-completion, + * embeddings, tool-execution * * @param componentName to use a custom component name for the endpoint * instead of the default name From 04e15705c75bc27144f640b295acf4d1d88ff925 Mon Sep 17 00:00:00 2001 From: Croway Date: Thu, 9 Apr 2026 17:36:35 +0200 Subject: [PATCH 6/7] CAMEL-23249: preserve Response headers during stream cache conversion When stream caching converts a JAX-RS Response to StreamCache, the Content-Type and other response metadata headers were lost because only the HTTP status code was saved before the conversion. This fix preserves the Content-Type via Response.getMediaType() and other headers via the PROTOCOL_HEADERS map. It also removes the containsKey guard in populateViaResponse that prevented the explicit Content-Type from overriding CXF's default */* value. --- .../component/cxf/jaxrs/CxfConverter.java | 29 ++++ .../cxf/jaxrs/DefaultCxfRsBinding.java | 13 +- .../CxfRsStreamCacheContentTypeTest.java | 136 ++++++++++++++++++ 3 files changed, 172 insertions(+), 6 deletions(-) create mode 100644 components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsStreamCacheContentTypeTest.java diff --git a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java index 6d9343282ad00..9be2aa4e556f9 100644 --- a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java +++ b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java @@ -20,7 +20,10 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.util.Arrays; import java.util.Collection; +import java.util.Map; +import java.util.TreeMap; import jakarta.ws.rs.core.Response; import jakarta.xml.soap.SOAPException; @@ -139,6 +142,32 @@ public static StreamCache toStreamCache(Response response, Exchange exchange) { exchange.getMessage().setHeader(Exchange.HTTP_RESPONSE_CODE, status); } + // Preserve response metadata headers (e.g. Content-Type) before the Response object + // is consumed by the conversion. Without this, headers set via Response.type() or + // Response.header() are lost when the body becomes a StreamCache (CAMEL-23249). + jakarta.ws.rs.core.MediaType mediaType = response.getMediaType(); + if (mediaType != null) { + exchange.getMessage().setHeader(Exchange.CONTENT_TYPE, mediaType.toString()); + } + // Save other response headers (e.g. custom headers) into the PROTOCOL_HEADERS map + // so they are propagated to the CXF outMessage by populateViaResponse. + jakarta.ws.rs.core.MultivaluedMap metadata = response.getMetadata(); + if (metadata != null && !metadata.isEmpty()) { + Map protocolHeaders = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + for (String headerName : metadata.keySet()) { + if ("Content-Type".equalsIgnoreCase(headerName)) { + continue; + } + String headerValue = response.getHeaderString(headerName); + if (headerValue != null) { + protocolHeaders.put(headerName, Arrays.asList(headerValue)); + } + } + if (!protocolHeaders.isEmpty()) { + exchange.getMessage().setHeader(org.apache.cxf.message.Message.PROTOCOL_HEADERS, protocolHeaders); + } + } + // Convert the body (entity) to an InputStream InputStream is = toInputStream(response, exchange); //If there is no entity body, provide an empty stream diff --git a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java index ef462b3162dbf..b62e53dc854a7 100644 --- a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java +++ b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java @@ -106,16 +106,17 @@ private static void populateViaResponse(org.apache.cxf.message.Exchange cxfExcha cxfExchange.put(org.apache.cxf.message.Message.RESPONSE_CODE, response.getHeader(CxfConstants.HTTP_RESPONSE_CODE, Integer.class)); } - if (response.getHeader(CxfConstants.CONTENT_TYPE) != null - && !cxfExchange.containsKey(org.apache.cxf.message.Message.CONTENT_TYPE)) { + if (response.getHeader(CxfConstants.CONTENT_TYPE) != null) { + // Set the Content-Type on the CXF exchange unconditionally when it comes from the Camel + // message, because CXF pre-sets a default Content-Type of */* which would otherwise + // prevent the explicit value from being applied (CAMEL-23249). if (!ObjectHelper.isEmpty(cxfExchange) && !ObjectHelper.isEmpty(cxfExchange.getOutMessage())) { cxfExchange.getOutMessage().putIfAbsent(CxfConstants.PROTOCOL_HEADERS, new TreeMap<>(String.CASE_INSENSITIVE_ORDER)); - } - final Map> cxfHeaders = CastUtils - .cast((Map) cxfExchange.getOutMessage().get(CxfConstants.PROTOCOL_HEADERS)); - if (!cxfHeaders.containsKey(CxfConstants.CONTENT_TYPE)) { + final Map> cxfHeaders = CastUtils + .cast((Map) cxfExchange.getOutMessage().get(CxfConstants.PROTOCOL_HEADERS)); + List a = Arrays.asList((String) response.getHeader(CxfConstants.CONTENT_TYPE)); cxfHeaders.put(CxfConstants.CONTENT_TYPE, a); cxfExchange.getOutMessage().put(CxfConstants.CONTENT_TYPE, response.getHeader(CxfConstants.CONTENT_TYPE)); diff --git a/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsStreamCacheContentTypeTest.java b/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsStreamCacheContentTypeTest.java new file mode 100644 index 0000000000000..50f19f16129f0 --- /dev/null +++ b/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsStreamCacheContentTypeTest.java @@ -0,0 +1,136 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.cxf.jaxrs; + +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.cxf.common.CXFTestSupport; +import org.apache.camel.test.junit6.CamelTestSupport; +import org.apache.hc.client5.http.classic.methods.HttpPut; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.io.entity.EntityUtils; +import org.apache.hc.core5.http.io.entity.StringEntity; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * CAMEL-23249: CXF RS Rest service loses content-type with stream caching enabled. + * + * When a CXF RS consumer route returns a JAX-RS {@link Response} with an explicit content type set via + * {@code Response.type(MediaType)}, and stream caching is enabled (the default in Camel 4.x), the content-type header + * is lost because {@code CxfConverter.toStreamCache(Response, Exchange)} only preserves the HTTP status code but not + * the response metadata headers. + * + * @see CAMEL-23249 + * @see Reproducer project + */ +public class CxfRsStreamCacheContentTypeTest extends CamelTestSupport { + + private static final String PUT_REQUEST = "Mary123"; + private static final String JSON_RESPONSE = "{\"name\":\"Mary\",\"id\":123}"; + private static final String CONTEXT = "/CxfRsStreamCacheContentTypeTest"; + private static final int PORT = CXFTestSupport.getPort5(); + private static final String CXT = PORT + CONTEXT; + + private static final String CXF_RS_ENDPOINT_URI + = "cxfrs://http://localhost:" + CXT + + "/rest?resourceClasses=org.apache.camel.component.cxf.jaxrs.testbean.CustomerService"; + + @Override + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + public void configure() { + from(CXF_RS_ENDPOINT_URI) + .process(exchange -> { + // Return a Response with explicit JSON content type and a custom header, + // mimicking the reproducer's EchoServiceImpl.echoVariable() + Response resp = Response + .status(Response.Status.OK) + .type(MediaType.APPLICATION_JSON) + .header("X-Custom-Header", "custom-value") + .entity(JSON_RESPONSE) + .build(); + exchange.getMessage().setBody(resp); + }) + // The log() EIP triggers stream cache conversion of the Response body. + // After this point the body is a StreamCache, not a Response. + .log("Response body: ${body}"); + } + }; + } + + /** + * Verifies that the content-type set via {@code Response.type(MediaType.APPLICATION_JSON)} is preserved in the HTTP + * response when stream caching converts the {@link Response} to a {@code StreamCache}. + * + * This test reproduces the exact scenario from CAMEL-23249: a CXF RS consumer route returns a JAX-RS Response with + * an explicit content type, but the client receives "application/octet-stream" instead. + */ + @Test + public void testContentTypePreservedAfterStreamCacheConversion() throws Exception { + HttpPut put = new HttpPut("http://localhost:" + CXT + "/rest/customerservice/customers"); + StringEntity entity = new StringEntity(PUT_REQUEST, ContentType.parse("text/xml; charset=ISO-8859-1")); + put.setEntity(entity); + + try (CloseableHttpClient httpclient = HttpClientBuilder.create().build()) { + httpclient.execute(put, response -> { + assertEquals(200, response.getCode(), "HTTP status should be 200"); + + assertNotNull(response.getFirstHeader("Content-Type"), + "Content-Type header should be present in response"); + String contentType = response.getFirstHeader("Content-Type").getValue(); + assertEquals("application/json", contentType, + "Content-Type should be application/json but was: " + contentType); + + String body = EntityUtils.toString(response.getEntity()); + assertEquals(JSON_RESPONSE, body); + + return null; + }); + } + } + + /** + * Verifies that custom response headers set via {@code Response.header(name, value)} are also preserved when stream + * caching converts the {@link Response} to a {@code StreamCache}. + */ + @Test + public void testCustomHeaderPreservedAfterStreamCacheConversion() throws Exception { + HttpPut put = new HttpPut("http://localhost:" + CXT + "/rest/customerservice/customers"); + StringEntity entity = new StringEntity(PUT_REQUEST, ContentType.parse("text/xml; charset=ISO-8859-1")); + put.setEntity(entity); + + try (CloseableHttpClient httpclient = HttpClientBuilder.create().build()) { + httpclient.execute(put, response -> { + assertEquals(200, response.getCode(), "HTTP status should be 200"); + + assertNotNull(response.getFirstHeader("X-Custom-Header"), + "X-Custom-Header should be present in response"); + assertEquals("custom-value", response.getFirstHeader("X-Custom-Header").getValue(), + "Custom header value should be preserved after stream cache conversion"); + + return null; + }); + } + } +} From 5eab0803a39c78a1efe0954b164db4126b1f0687 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Thu, 9 Apr 2026 18:19:36 +0200 Subject: [PATCH 7/7] CAMEL-21975: Add route-diagram command to display Camel route diagrams in terminal Co-Authored-By: Claude Opus 4.6 --- .../ROOT/images/jbang/route-diagram-dark.png | Bin 0 -> 151329 bytes .../ROOT/images/jbang/route-diagram-light.png | Bin 0 -> 144838 bytes .../camel-jbang-cmd-route-diagram.adoc | 29 + .../pages/jbang-commands/camel-jbang-cmd.adoc | 1 + .../camel-jbang-commands-metadata.json | 2 +- .../jbang/core/commands/CamelJBangMain.java | 1 + .../action/CamelRouteDiagramAction.java | 760 ++++++++++++++++++ .../action/CamelRouteDiagramActionTest.java | 188 +++++ 8 files changed, 980 insertions(+), 1 deletion(-) create mode 100644 docs/user-manual/modules/ROOT/images/jbang/route-diagram-dark.png create mode 100644 docs/user-manual/modules/ROOT/images/jbang/route-diagram-light.png create mode 100644 docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-route-diagram.adoc create mode 100644 dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java create mode 100644 dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramActionTest.java diff --git a/docs/user-manual/modules/ROOT/images/jbang/route-diagram-dark.png b/docs/user-manual/modules/ROOT/images/jbang/route-diagram-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..70699e1b934876a3123201a77bb88af04ad59270 GIT binary patch literal 151329 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 z``�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 Bb7lYl literal 0 HcmV?d00001 diff --git a/docs/user-manual/modules/ROOT/images/jbang/route-diagram-light.png b/docs/user-manual/modules/ROOT/images/jbang/route-diagram-light.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec2e522c132e78ff5b936f946c87bb64193ee5b GIT binary patch literal 144838 zcmc$`Q*% zt9o};{qV1fQc{pagu{aa004;6Qer9q0N4ot05b~&2b~F@)GY*Uz+6-$MF6$a1gD?_ zF>@_x3we0}9cUj20E@5&K>kYt`r(0o002Y*7ytsa1^aid0Q`Tif}IpV{O>-@?7xKA zg6eJnfDk}hOjykm>~9ZjqTX00Ra)j{b=76pT)Si9urL~6K$MI&8iV#HTIuHM>RfDh zp}vpBpt~LSs6hm^JHG)RK?DBom8XTNhp8pT7rYr8Bti_z=si-I6wg2ssbEOq4NI<< z-h|Gr)Q?6YCA*DHA@#l=XM(G~;}hx3w=>LN`rdA5e3`v?b1e>lU?PDiB#=K~z?21w zzL$goNQHnX;Ba7M4mL3V9jM`gi*2ZD7*jC)cSUSt0s6l@6>N}^?N!x-QhNX0AhNv@ z5d|ESL&+S7;;gA1mel?~_i|RnCxHazD40MY*{f}YBX@@V?~!|Dod2E_DwIkpG^}rq zDY1w4FT2pNy#2od0fXp710%a8=wgQ{|78!1%wGGSvZ;pyP(4!BaiV1ZWe1>gwfx^I zAb`D3A09$c!`Eiu4Thos;e!isfXIWW+}mG1FBso7DRsxSDRIJm@;vO}M!1c8mnCSz zF-);UcW7l|x~?Jwhk(Xqz{)E&k!f35cEJOk0MzK`!yZl@9JI2�)N(pg~Z{jg)~` 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

e`^%&ISaB|k1* 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

cb@HO<&k#FU%{V(PgRPp~0;j(ZSu9RL+1z#8Ho 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 LTeDgduRH$%T4JKA literal 0 HcmV?d00001 diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-route-diagram.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-route-diagram.adoc new file mode 100644 index 0000000000000..73ac68717fde8 --- /dev/null +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-route-diagram.adoc @@ -0,0 +1,29 @@ + +// AUTO-GENERATED by camel-package-maven-plugin - DO NOT EDIT THIS FILE += camel cmd route-diagram + +Display Camel route diagram in the terminal + + +== Usage + +[source,bash] +---- +camel cmd route-diagram [options] +---- + + + +== Options + +[cols="2,5,1,2",options="header"] +|=== +| Option | Description | Default | Type +| `--filter` | Filter route by filename or route id | | String +| `--output` | Save diagram to a PNG file instead of displaying in terminal | | String +| `--theme,--colors` | Color theme preset (dark, light, transparent) or custom colors (e.g. bg=#1e1e1e:from=#2e7d32:to=#1565c0). Use bg= for transparent. | dark | String +| `--width` | Image width in pixels | 0 | int +| `-h,--help` | Display the help and sub-commands | | boolean +|=== + + diff --git a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd.adoc b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd.adoc index 0d0c1ec7544b8..5ce6c69d3117c 100644 --- a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd.adoc +++ b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd.adoc @@ -28,6 +28,7 @@ camel cmd [options] | xref:jbang-commands/camel-jbang-cmd-reload.adoc[reload] | Trigger reloading Camel | xref:jbang-commands/camel-jbang-cmd-reset-stats.adoc[reset-stats] | Reset performance statistics | xref:jbang-commands/camel-jbang-cmd-resume-route.adoc[resume-route] | Resume Camel routes +| xref:jbang-commands/camel-jbang-cmd-route-diagram.adoc[route-diagram] | Display Camel route diagram in the terminal | xref:jbang-commands/camel-jbang-cmd-route-structure.adoc[route-structure] | Dump Camel route structure | xref:jbang-commands/camel-jbang-cmd-send.adoc[send] | Send messages to endpoints | xref:jbang-commands/camel-jbang-cmd-start-group.adoc[start-group] | Start Camel route groups diff --git a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json index c7faf07a6118f..5fe1a308e235d 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json +++ b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json @@ -2,7 +2,7 @@ "commands": [ { "name": "bind", "fullName": "bind", "description": "DEPRECATED: Bind source and sink Kamelets as a new Camel integration", "deprecated": true, "sourceClass": "org.apache.camel.dsl.jbang.core.commands.bind.Bind", "options": [ { "names": "--error-handler", "description": "Add error handler (none|log|sink:). Sink endpoints are expected in the format [[apigroup\/]version:]kind:[namespace\/]name, plain Camel URIs or Kamelet name.", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "Output format generated by this command (supports: file, yaml, json).", "defaultValue": "file", "javaType": "java.lang.String", "type": "string" }, { "names": "--property", "description": "Adds a pipe property in the form of [source|sink|error-handler|step-].= where is the step number starting from 1", "javaType": "java.lang.String", "type": "string" }, { "names": "--sink", "description": "Sink (to) such as a Kamelet or Camel endpoint uri", "javaType": "java.lang.String", "type": "string", "required": true }, { "names": "--source", "description": "Source (from) such as a Kamelet or Camel endpoint uri", "javaType": "java.lang.String", "type": "string", "required": true }, { "names": "--step", "description": "Optional steps such as a Kamelet or Camel endpoint uri", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "catalog", "fullName": "catalog", "description": "List artifacts from Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "component", "fullName": "catalog component", "description": "List components from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogComponent", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "dataformat", "fullName": "catalog dataformat", "description": "List data formats from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogDataFormat", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "dev-console", "fullName": "catalog dev-console", "description": "List dev-consoles from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogDevConsole", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "kamelet", "fullName": "catalog kamelet", "description": "List Kamelets from the Kamelet Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogKamelet", "options": [ { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "defaultValue": "RuntimeType.KAMELETS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, type, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "--type,--filter-type", "description": "Filter by type: source, sink, or action", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "language", "fullName": "catalog language", "description": "List expression languages from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogLanguage", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "other", "fullName": "catalog other", "description": "List miscellaneous components from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogOther", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "transformer", "fullName": "catalog transformer", "description": "List data type transformers from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.catalog.CatalogTransformer", "options": [ { "names": "--camel-version", "description": "To use a different Camel version than the default version", "javaType": "java.lang.String", "type": "string" }, { "names": "--display-gav", "description": "Display Maven GAV instead of name", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter by name or description", "javaType": "java.lang.String", "type": "string" }, { "names": "--json", "description": "Output in JSON Format", "javaType": "boolean", "type": "boolean" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--repo,--repos", "description": "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--since-after", "description": "Filter by version more recent (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--since-before", "description": "Filter by version older (inclusive)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by name, support-level, or description", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, - { "name": "cmd", "fullName": "cmd", "description": "Performs commands in the running Camel integrations, such as start\/stop route, or change logging levels.", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "browse", "fullName": "cmd browse", "description": "Browse pending messages on endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelBrowseAction", "options": [ { "names": "--body-max-chars", "description": "Maximum size of the message body to include in the dump", "javaType": "int", "type": "integer" }, { "names": "--dump", "description": "Whether to include message dumps", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--endpoint", "description": "Endpoint to browse messages from (can be uri, pattern, or refer to a route id)", "javaType": "java.lang.String", "type": "string" }, { "names": "--fresh-size", "description": "Whether to calculate fresh queue size information (performance overhead)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Limits the number of messages to dump per endpoint", "defaultValue": "100", "javaType": "int", "type": "integer" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--only-body", "description": "Show only message body in browsed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in browsed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in browsed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by uri, or size", "defaultValue": "uri", "javaType": "java.lang.String", "type": "string" }, { "names": "--tail", "description": "The number of messages from the end (latest) to dump", "javaType": "int", "type": "integer" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "disable-processor", "fullName": "cmd disable-processor", "description": "Disable Camel processor", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelProcessorDisableAction", "options": [ { "names": "--id", "description": "Processor ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "enable-processor", "fullName": "cmd enable-processor", "description": "Enable Camel processor", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelProcessorEnableAction", "options": [ { "names": "--id", "description": "Processor ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "gc", "fullName": "cmd gc", "description": "Trigger Java Memory Garbage Collector", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelGCAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "load", "fullName": "cmd load", "description": "Loads new source files into an existing Camel", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelLoadAction", "options": [ { "names": "--restart", "description": "To force restart all routes after loading source files", "javaType": "boolean", "type": "boolean" }, { "names": "--source", "description": "Source file(s) to load", "javaType": "java.util.List", "type": "array" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "logger", "fullName": "cmd logger", "description": "List or change logging levels", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.LoggerAction", "options": [ { "names": "--logger", "description": "The logger name", "defaultValue": "root", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-level", "description": "To change logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "receive", "fullName": "cmd receive", "description": "Receive and dump messages from remote endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelReceiveAction", "options": [ { "names": "--action", "description": "Action to start, stop, clear, status, or dump messages", "defaultValue": "status", "javaType": "java.lang.String", "type": "string" }, { "names": "--compact", "description": "Compact output (no empty line separating messages)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--endpoint,--uri", "description": "Endpoint to receive messages from (can be uri or pattern to refer to existing endpoint)", "javaType": "java.lang.String", "type": "string" }, { "names": "--find", "description": "Find and highlight matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--follow", "description": "Keep following and outputting new messages (press enter to exit).", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--grep", "description": "Filter messages to only output matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--only-body", "description": "Show only message body in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--output", "description": "Output format (auto, true, false)", "javaType": "java.lang.String", "type": "string" }, { "names": "--prefix", "description": "Print prefix with running Camel integration name. auto=only prefix when running multiple integrations. true=always prefix. false=prefix off.", "defaultValue": "auto", "javaType": "java.lang.String", "type": "string" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties; override existing (only applicable when NOT using an existing running Camel)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (only applicable when NOT using an existing running Camel) (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in received messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in received messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--since", "description": "Return messages newer than a relative duration like 5s, 2m, or 1h. The value is in seconds if no unit specified.", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by pid, name or age for showing status of messages", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--tail", "description": "The number of messages from the end to show. Use -1 to read from the beginning. Use 0 to read only new lines. Defaults to showing all messages from beginning.", "defaultValue": "-1", "javaType": "int", "type": "integer" }, { "names": "--timeout", "description": "Timeout in millis waiting for message to be received", "defaultValue": "20000", "javaType": "long", "type": "integer" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "reload", "fullName": "cmd reload", "description": "Trigger reloading Camel", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelReloadAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "reset-stats", "fullName": "cmd reset-stats", "description": "Reset performance statistics", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelResetStatsAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "resume-route", "fullName": "cmd resume-route", "description": "Resume Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteResumeAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route-structure", "fullName": "cmd route-structure", "description": "Dump Camel route structure", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStructureAction", "options": [ { "names": "--brief", "description": "To show less detailed route structure", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter route by filename or route id (multiple names can be separated by comma)", "javaType": "java.lang.String", "type": "string" }, { "names": "--raw", "description": "To output raw without metadata", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort route by name or id", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "send", "fullName": "cmd send", "description": "Send messages to endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelSendAction", "options": [ { "names": "--body", "description": "Message body to send (prefix with file: to refer to loading message body from file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--endpoint,--uri", "description": "Endpoint where to send the message (can be uri, pattern, or refer to a route id)", "javaType": "java.lang.String", "type": "string" }, { "names": "--header", "description": "Message header (key=value)", "javaType": "java.util.List", "type": "array" }, { "names": "--infra", "description": "Send to infrastructure service (e.g., nats, kafka)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--poll", "description": "Poll instead of sending a message. This can be used to receive latest message from a Kafka topic or JMS queue.", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print response message body (InOut) when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties; override existing (only applicable when NOT using an existing running Camel)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (only applicable when NOT using an existing running Camel) (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--reply", "description": "Whether to expect a reply message (InOut vs InOut messaging style)", "javaType": "boolean", "type": "boolean" }, { "names": "--reply-file", "description": "Saves reply message to the file with the given name (override if exists)", "javaType": "java.lang.String", "type": "string" }, { "names": "--show-body", "description": "Show message body from response message (InOut)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties from response message (InOut)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables from response message (InOut)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers from response message (InOut)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--timeout", "description": "Timeout in millis waiting for message to be sent (and reply message if InOut messaging)", "defaultValue": "20000", "javaType": "long", "type": "integer" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "start-group", "fullName": "cmd start-group", "description": "Start Camel route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteGroupStartAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "start-route", "fullName": "cmd start-route", "description": "Start Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStartAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stop-group", "fullName": "cmd stop-group", "description": "Stop Camel route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteGroupStopAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stop-route", "fullName": "cmd stop-route", "description": "Stop Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStopAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stub", "fullName": "cmd stub", "description": "Browse stub endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelStubAction", "options": [ { "names": "--browse", "description": "Whether to browse messages queued in the stub endpoints", "javaType": "boolean", "type": "boolean" }, { "names": "--compact", "description": "Compact output (no empty line separating browsed messages)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter endpoints by queue name", "javaType": "java.lang.String", "type": "string" }, { "names": "--find", "description": "Find and highlight matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--grep", "description": "Filter browsing messages to only output trace matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--limit", "description": "Filter browsing queues by limiting to the given latest number of messages", "defaultValue": "10", "javaType": "int", "type": "integer" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in traced messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in traced messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by name, or total", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "--top", "description": "Whether to browse top (latest) messages queued in the stub endpoints", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "suspend-route", "fullName": "cmd suspend-route", "description": "Suspend Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteSuspendAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "thread-dump", "fullName": "cmd thread-dump", "description": "List threads in a running Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelThreadDump", "options": [ { "names": "--depth", "description": "Max depth of stack-trace", "defaultValue": "1", "javaType": "int", "type": "integer" }, { "names": "--filter", "description": "Filter thread names\/ids (use all to include all threads)", "defaultValue": "Camel", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by id, name or state", "defaultValue": "id", "javaType": "java.lang.String", "type": "string" }, { "names": "--state", "description": "To only show threads for a given state", "javaType": "java.lang.String", "type": "string" }, { "names": "--trace", "description": "Include stack-traces", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, + { "name": "cmd", "fullName": "cmd", "description": "Performs commands in the running Camel integrations, such as start\/stop route, or change logging levels.", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "browse", "fullName": "cmd browse", "description": "Browse pending messages on endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelBrowseAction", "options": [ { "names": "--body-max-chars", "description": "Maximum size of the message body to include in the dump", "javaType": "int", "type": "integer" }, { "names": "--dump", "description": "Whether to include message dumps", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--endpoint", "description": "Endpoint to browse messages from (can be uri, pattern, or refer to a route id)", "javaType": "java.lang.String", "type": "string" }, { "names": "--fresh-size", "description": "Whether to calculate fresh queue size information (performance overhead)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--limit", "description": "Limits the number of messages to dump per endpoint", "defaultValue": "100", "javaType": "int", "type": "integer" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--only-body", "description": "Show only message body in browsed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in browsed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in browsed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by uri, or size", "defaultValue": "uri", "javaType": "java.lang.String", "type": "string" }, { "names": "--tail", "description": "The number of messages from the end (latest) to dump", "javaType": "int", "type": "integer" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "disable-processor", "fullName": "cmd disable-processor", "description": "Disable Camel processor", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelProcessorDisableAction", "options": [ { "names": "--id", "description": "Processor ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "enable-processor", "fullName": "cmd enable-processor", "description": "Enable Camel processor", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelProcessorEnableAction", "options": [ { "names": "--id", "description": "Processor ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "gc", "fullName": "cmd gc", "description": "Trigger Java Memory Garbage Collector", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelGCAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "load", "fullName": "cmd load", "description": "Loads new source files into an existing Camel", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelLoadAction", "options": [ { "names": "--restart", "description": "To force restart all routes after loading source files", "javaType": "boolean", "type": "boolean" }, { "names": "--source", "description": "Source file(s) to load", "javaType": "java.util.List", "type": "array" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "logger", "fullName": "cmd logger", "description": "List or change logging levels", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.LoggerAction", "options": [ { "names": "--logger", "description": "The logger name", "defaultValue": "root", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-level", "description": "To change logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by pid, name or age", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "receive", "fullName": "cmd receive", "description": "Receive and dump messages from remote endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelReceiveAction", "options": [ { "names": "--action", "description": "Action to start, stop, clear, status, or dump messages", "defaultValue": "status", "javaType": "java.lang.String", "type": "string" }, { "names": "--compact", "description": "Compact output (no empty line separating messages)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--endpoint,--uri", "description": "Endpoint to receive messages from (can be uri or pattern to refer to existing endpoint)", "javaType": "java.lang.String", "type": "string" }, { "names": "--find", "description": "Find and highlight matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--follow", "description": "Keep following and outputting new messages (press enter to exit).", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--grep", "description": "Filter messages to only output matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--only-body", "description": "Show only message body in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--output", "description": "Output format (auto, true, false)", "javaType": "java.lang.String", "type": "string" }, { "names": "--prefix", "description": "Print prefix with running Camel integration name. auto=only prefix when running multiple integrations. true=always prefix. false=prefix off.", "defaultValue": "auto", "javaType": "java.lang.String", "type": "string" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties; override existing (only applicable when NOT using an existing running Camel)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (only applicable when NOT using an existing running Camel) (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--short-uri", "description": "List endpoint URI without query parameters (short)", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in received messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables in received messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in received messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--since", "description": "Return messages newer than a relative duration like 5s, 2m, or 1h. The value is in seconds if no unit specified.", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by pid, name or age for showing status of messages", "defaultValue": "pid", "javaType": "java.lang.String", "type": "string" }, { "names": "--tail", "description": "The number of messages from the end to show. Use -1 to read from the beginning. Use 0 to read only new lines. Defaults to showing all messages from beginning.", "defaultValue": "-1", "javaType": "int", "type": "integer" }, { "names": "--timeout", "description": "Timeout in millis waiting for message to be received", "defaultValue": "20000", "javaType": "long", "type": "integer" }, { "names": "--wide-uri", "description": "List endpoint URI in full details", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "reload", "fullName": "cmd reload", "description": "Trigger reloading Camel", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelReloadAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "reset-stats", "fullName": "cmd reset-stats", "description": "Reset performance statistics", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelResetStatsAction", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "resume-route", "fullName": "cmd resume-route", "description": "Resume Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteResumeAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route-diagram", "fullName": "cmd route-diagram", "description": "Display Camel route diagram in the terminal", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteDiagramAction", "options": [ { "names": "--filter", "description": "Filter route by filename or route id", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "Save diagram to a PNG file instead of displaying in terminal", "javaType": "java.lang.String", "type": "string" }, { "names": "--theme,--colors", "description": "Color theme preset (dark, light, transparent) or custom colors (e.g. bg=#1e1e1e:from=#2e7d32:to=#1565c0). Use bg= for transparent.", "defaultValue": "dark", "javaType": "java.lang.String", "type": "string" }, { "names": "--width", "description": "Image width in pixels", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "route-structure", "fullName": "cmd route-structure", "description": "Dump Camel route structure", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStructureAction", "options": [ { "names": "--brief", "description": "To show less detailed route structure", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter route by filename or route id (multiple names can be separated by comma)", "javaType": "java.lang.String", "type": "string" }, { "names": "--raw", "description": "To output raw without metadata", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort route by name or id", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "send", "fullName": "cmd send", "description": "Send messages to endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelSendAction", "options": [ { "names": "--body", "description": "Message body to send (prefix with file: to refer to loading message body from file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--endpoint,--uri", "description": "Endpoint where to send the message (can be uri, pattern, or refer to a route id)", "javaType": "java.lang.String", "type": "string" }, { "names": "--header", "description": "Message header (key=value)", "javaType": "java.util.List", "type": "array" }, { "names": "--infra", "description": "Send to infrastructure service (e.g., nats, kafka)", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--poll", "description": "Poll instead of sending a message. This can be used to receive latest message from a Kafka topic or JMS queue.", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print response message body (InOut) when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties; override existing (only applicable when NOT using an existing running Camel)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (only applicable when NOT using an existing running Camel) (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--reply", "description": "Whether to expect a reply message (InOut vs InOut messaging style)", "javaType": "boolean", "type": "boolean" }, { "names": "--reply-file", "description": "Saves reply message to the file with the given name (override if exists)", "javaType": "java.lang.String", "type": "string" }, { "names": "--show-body", "description": "Show message body from response message (InOut)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties from response message (InOut)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables from response message (InOut)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers from response message (InOut)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--timeout", "description": "Timeout in millis waiting for message to be sent (and reply message if InOut messaging)", "defaultValue": "20000", "javaType": "long", "type": "integer" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "start-group", "fullName": "cmd start-group", "description": "Start Camel route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteGroupStartAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "start-route", "fullName": "cmd start-route", "description": "Start Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStartAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stop-group", "fullName": "cmd stop-group", "description": "Stop Camel route groups", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteGroupStopAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stop-route", "fullName": "cmd stop-route", "description": "Stop Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteStopAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "stub", "fullName": "cmd stub", "description": "Browse stub endpoints", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelStubAction", "options": [ { "names": "--browse", "description": "Whether to browse messages queued in the stub endpoints", "javaType": "boolean", "type": "boolean" }, { "names": "--compact", "description": "Compact output (no empty line separating browsed messages)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--filter", "description": "Filter endpoints by queue name", "javaType": "java.lang.String", "type": "string" }, { "names": "--find", "description": "Find and highlight matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--grep", "description": "Filter browsing messages to only output trace matching text (ignore case).", "javaType": "java.lang.String", "type": "string" }, { "names": "--limit", "description": "Filter browsing queues by limiting to the given latest number of messages", "defaultValue": "10", "javaType": "int", "type": "integer" }, { "names": "--logging-color", "description": "Use colored logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--show-body", "description": "Show message body in traced messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in traced messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--sort", "description": "Sort by name, or total", "defaultValue": "name", "javaType": "java.lang.String", "type": "string" }, { "names": "--top", "description": "Whether to browse top (latest) messages queued in the stub endpoints", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "suspend-route", "fullName": "cmd suspend-route", "description": "Suspend Camel routes", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelRouteSuspendAction", "options": [ { "names": "--id", "description": "Route ids (multiple ids can be separated by comma)", "defaultValue": "*", "javaType": "java.lang.String", "type": "string" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "thread-dump", "fullName": "cmd thread-dump", "description": "List threads in a running Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.action.CamelThreadDump", "options": [ { "names": "--depth", "description": "Max depth of stack-trace", "defaultValue": "1", "javaType": "int", "type": "integer" }, { "names": "--filter", "description": "Filter thread names\/ids (use all to include all threads)", "defaultValue": "Camel", "javaType": "java.lang.String", "type": "string" }, { "names": "--sort", "description": "Sort by id, name or state", "defaultValue": "id", "javaType": "java.lang.String", "type": "string" }, { "names": "--state", "description": "To only show threads for a given state", "javaType": "java.lang.String", "type": "string" }, { "names": "--trace", "description": "Include stack-traces", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--watch", "description": "Execute periodically and showing output fullscreen", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, { "name": "completion", "fullName": "completion", "description": "Generate completion script for bash\/zsh", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Complete", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "config", "fullName": "config", "description": "Get and set user configuration values", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config.ConfigCommand", "options": [ { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "get", "fullName": "config get", "description": "Display user configuration value", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config.ConfigGet", "options": [ { "names": "--global", "description": "Use global or local configuration", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "list", "fullName": "config list", "description": "Displays user configuration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config.ConfigList", "options": [ { "names": "--global", "description": "Use global or local configuration", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "set", "fullName": "config set", "description": "Set user configuration value", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config.ConfigSet", "options": [ { "names": "--global", "description": "Use global or local configuration", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, { "name": "unset", "fullName": "config unset", "description": "Remove user configuration value", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.config.ConfigUnset", "options": [ { "names": "--global", "description": "Use global or local configurations", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] } ] }, { "name": "debug", "fullName": "debug", "description": "Debug local Camel integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Debug", "options": [ { "names": "--ago", "description": "Use ago instead of yyyy-MM-dd HH:mm:ss in timestamp.", "javaType": "boolean", "type": "boolean" }, { "names": "--background", "description": "Run in the background", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--background-wait", "description": "To wait for run in background to startup successfully, before returning", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--backlog-trace", "description": "Enables backlog tracing of the routed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--breakpoint", "description": "To set breakpoint at the given node id (Multiple ids can be separated by comma). If no breakpoint is set, then the first route is automatic selected.", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-spring-boot-version", "description": "To run using a different Camel Spring Boot version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--camel-version", "description": "To run using a different Camel version than the default version.", "javaType": "java.lang.String", "type": "string" }, { "names": "--code", "description": "Run the given text or file as Java DSL routes", "javaType": "java.lang.String", "type": "string" }, { "names": "--console", "description": "Developer console at \/q\/dev on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--dep,--dependency", "description": "Add additional dependencies", "javaType": "java.util.List", "type": "array" }, { "names": "--download", "description": "Whether to allow automatic downloading JAR dependencies (over the internet)", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--empty", "description": "Run an empty Camel without loading source files", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--exclude", "description": "Exclude files by name or pattern", "javaType": "java.util.List", "type": "array" }, { "names": "--fresh", "description": "Make sure we use fresh (i.e. non-cached) resources", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--gav", "description": "The Maven group:artifact:version (used during exporting)", "javaType": "java.lang.String", "type": "string" }, { "names": "--health", "description": "Deprecated: use --observe instead. Health check at \/q\/health on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean", "deprecated": true }, { "names": "--ignore-loading-error", "description": "Whether to ignore route loading and compilation errors (use this with care!)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--java-version,--java", "description": "Java version (21, 25)", "defaultValue": "21", "javaType": "java.lang.String", "type": "string" }, { "names": "--jfr", "description": "Enables Java Flight Recorder saving recording to disk on exit", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--jfr-profile", "description": "Java Flight Recorder profile to use (such as default or profile)", "javaType": "java.lang.String", "type": "string" }, { "names": "--jvm-debug", "description": "To enable JVM remote debugging on port 4004 by default. The supported values are true to enable the remote debugging, false to disable the remote debugging or a number to use a custom port", "javaType": "int", "type": "integer", "paramLabel": "" }, { "names": "--kamelets-version", "description": "Apache Camel Kamelets version", "javaType": "java.lang.String", "type": "string" }, { "names": "--lazy-bean", "description": "Whether to use lazy bean initialization (can help with complex classloading issues)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--local-kamelet-dir", "description": "Local directory (or github link) for loading Kamelets (takes precedence). Multiple directories can be specified separated by comma.", "javaType": "java.lang.String", "type": "string" }, { "names": "--log-lines", "description": "Number of log lines to display on top of screen", "defaultValue": "10", "javaType": "int", "type": "integer" }, { "names": "--logging", "description": "Can be used to turn off logging", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-category", "description": "Used for individual logging levels (ex: org.apache.kafka=DEBUG)", "javaType": "java.util.List", "type": "array" }, { "names": "--logging-color", "description": "Use colored logging. Default is auto-detected based on NO_COLOR, CI, FORCE_COLOR environment variables and terminal capabilities", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-config-path", "description": "Path to file with custom logging configuration", "javaType": "java.lang.String", "type": "string" }, { "names": "--logging-json", "description": "Use JSON logging (ECS Layout)", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--logging-level", "description": "Logging level (ERROR, WARN, INFO, DEBUG, TRACE)", "defaultValue": "info", "javaType": "java.lang.String", "type": "string" }, { "names": "--management-port", "description": "To use a dedicated port for HTTP management (use 0 to dynamic assign a free random port number)", "javaType": "int", "type": "integer" }, { "names": "--mask", "description": "Whether to mask endpoint URIs to avoid printing sensitive information such as password or access keys", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-apache-snapshot-enabled", "description": "Whether downloading JARs from ASF Maven Snapshot repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-central-enabled", "description": "Whether downloading JARs from Maven Central repository is enabled", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--maven-settings", "description": "Optional location of Maven settings.xml file to configure servers, repositories, mirrors and proxies. If set to false, not even the default ~\/.m2\/settings.xml will be used.", "javaType": "java.lang.String", "type": "string" }, { "names": "--maven-settings-security", "description": "Optional location of Maven settings-security.xml file to decrypt settings.xml", "javaType": "java.lang.String", "type": "string" }, { "names": "--max-idle-seconds", "description": "For how long time in seconds Camel can be idle before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-messages", "description": "Max number of messages to process before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--max-seconds", "description": "Max seconds to run before stopping", "defaultValue": "0", "javaType": "int", "type": "integer" }, { "names": "--metrics", "description": "Deprecated: use --observe instead. Metrics (Micrometer and Prometheus) at \/q\/metrics on local HTTP server (port 8080 by default)", "defaultValue": "false", "javaType": "boolean", "type": "boolean", "deprecated": true }, { "names": "--modeline", "description": "Whether to support JBang style \/\/DEPS to specify additional dependencies", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--name", "description": "The name of the Camel application", "defaultValue": "CamelJBang", "javaType": "java.lang.String", "type": "string" }, { "names": "--observe", "description": "Enable observability services", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--open-api", "description": "Adds an OpenAPI spec from the given file (json or yaml file)", "javaType": "java.lang.String", "type": "string" }, { "names": "--output", "description": "File to store the current message body (will override). This allows for manual inspecting the message later.", "javaType": "java.lang.String", "type": "string" }, { "names": "--package-scan-jars", "description": "Whether to automatic package scan JARs for custom Spring or Quarkus beans making them available for Camel JBang", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--port", "description": "Embeds a local HTTP server on this port (port 8080 by default; use 0 to dynamic assign a free random port number)", "javaType": "int", "type": "integer" }, { "names": "--pretty", "description": "Pretty print message body when using JSon or XML format", "javaType": "boolean", "type": "boolean" }, { "names": "--profile", "description": "Profile to run (dev, test, prod).", "defaultValue": "dev", "javaType": "java.lang.String", "type": "string" }, { "names": "--prompt", "description": "Allow user to type in required parameters in prompt if not present in application", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--prop,--property", "description": "Additional properties (override existing)", "javaType": "java.lang.String", "type": "string" }, { "names": "--properties", "description": "comma separated list of properties file (ex. \/path\/to\/file.properties,\/path\/to\/other.properties", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-artifact-id", "description": "Quarkus Platform Maven artifactId", "defaultValue": "quarkus-bom", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-group-id", "description": "Quarkus Platform Maven groupId", "defaultValue": "io.quarkus.platform", "javaType": "java.lang.String", "type": "string" }, { "names": "--quarkus-version", "description": "Quarkus Platform version", "defaultValue": "RuntimeType.QUARKUS_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--reload,--dev", "description": "Enables dev mode (live reload when source files are updated and saved)", "javaType": "boolean", "type": "boolean" }, { "names": "--remote-attach", "description": "Attaches debugger remotely to an existing running Camel integration. (Add camel-cli-debug JAR to the existing Camel application and run before attaching this debugger)", "javaType": "boolean", "type": "boolean" }, { "names": "--repo,--repos", "description": "Additional maven repositories (Use commas to separate multiple repositories)", "javaType": "java.lang.String", "type": "string" }, { "names": "--runtime", "description": "Runtime (camel-main, spring-boot, quarkus)", "defaultValue": "camel-main", "javaType": "org.apache.camel.dsl.jbang.core.common.RuntimeType", "type": "object" }, { "names": "--show-body", "description": "Show message body in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exception", "description": "Show exception and stacktrace for failed messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-properties", "description": "Show exchange properties in debug messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--show-exchange-variables", "description": "Show exchange variables in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--show-headers", "description": "Show message headers in debug messages", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--skip-plugins", "description": "Skip resolving plugin dependencies", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--source", "description": "Prefer to display source filename\/code instead of IDs", "javaType": "boolean", "type": "boolean" }, { "names": "--source-dir", "description": "Source directory for dynamically loading Camel file(s) to run. When using this, then files cannot be specified at the same time.", "javaType": "java.lang.String", "type": "string" }, { "names": "--spring-boot-version", "description": "Spring Boot version", "defaultValue": "RuntimeType.SPRING_BOOT_VERSION", "javaType": "java.lang.String", "type": "string" }, { "names": "--stop-on-exit", "description": "Whether to stop the running Camel on exit", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--stub", "description": "Stubs all the matching endpoint uri with the given component name or pattern. Multiple names can be separated by comma. (all = stub all endpoints).", "javaType": "java.lang.String", "type": "string" }, { "names": "--timestamp", "description": "Print timestamp.", "defaultValue": "true", "javaType": "boolean", "type": "boolean" }, { "names": "--trace", "description": "Enables trace logging of the routed messages", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "--verbose", "description": "Verbose output of startup activity (dependency resolution and downloading", "defaultValue": "false", "javaType": "boolean", "type": "boolean" }, { "names": "-h,--help", "description": "Display the help and sub-commands", "javaType": "boolean", "type": "boolean" } ] }, diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java index bd03af9ee39c3..477769c861254 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java @@ -108,6 +108,7 @@ public void execute(String... args) { .addSubcommand("reload", new CommandLine(new CamelReloadAction(this))) .addSubcommand("reset-stats", new CommandLine(new CamelResetStatsAction(this))) .addSubcommand("resume-route", new CommandLine(new CamelRouteResumeAction(this))) + .addSubcommand("route-diagram", new CommandLine(new CamelRouteDiagramAction(this))) .addSubcommand("route-structure", new CommandLine(new CamelRouteStructureAction(this))) .addSubcommand("send", new CommandLine(new CamelSendAction(this))) .addSubcommand("start-group", new CommandLine(new CamelRouteGroupStartAction(this))) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java new file mode 100644 index 0000000000000..26bd492473287 --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java @@ -0,0 +1,760 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.dsl.jbang.core.commands.action; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; +import java.io.File; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import javax.imageio.ImageIO; + +import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain; +import org.apache.camel.dsl.jbang.core.common.PathUtils; +import org.apache.camel.support.PatternHelper; +import org.apache.camel.util.json.JsonArray; +import org.apache.camel.util.json.JsonObject; +import org.apache.camel.util.json.Jsoner; +import org.jline.terminal.Terminal; +import org.jline.terminal.TerminalBuilder; +import org.jline.terminal.impl.TerminalGraphics; +import org.jline.terminal.impl.TerminalGraphicsManager; +import picocli.CommandLine; +import picocli.CommandLine.Command; + +@Command(name = "route-diagram", description = "Display Camel route diagram in the terminal", sortOptions = false, + showDefaultValues = true) +public class CamelRouteDiagramAction extends ActionBaseCommand { + + // Render at 2x for crisp text on terminal image protocols + private static final int SCALE = 2; + private static final int NODE_WIDTH = 180 * SCALE; + private static final int NODE_HEIGHT = 32 * SCALE; + private static final int H_GAP = 30 * SCALE; + private static final int V_GAP = 40 * SCALE; + private static final int PADDING = 30 * SCALE; + private static final int ARC = 14 * SCALE; + private static final int FONT_SIZE_LABEL = 13 * SCALE; + private static final int FONT_SIZE_NODE = 12 * SCALE; + private static final int ARROW_SIZE = 6 * SCALE; + private static final int MERGE_DOT = 5 * SCALE; + + // Color scheme keys: bg, text, arrow, label, from, to, eip, choice, default + // Format: "key=#rrggbb:key=#rrggbb:..." or a preset name (dark, light, transparent) + // Use bg= (empty) for transparent background + private static final String DARK_COLORS + = "bg=#1e1e1e:text=#ffffff:arrow=#b4b4b4:label=#c8c8c8:from=#2e7d32:to=#1565c0:eip=#9c27b0:choice=#e65100:default=#455a64"; + private static final String LIGHT_COLORS + = "bg=#f5f5f5:text=#1e1e1e:arrow=#646464:label=#505050:from=#388e3c:to=#1976d2:eip=#ab47bc:choice=#f57c00:default=#78909c"; + private static final String TRANSPARENT_COLORS + = "bg=:text=#ffffff:arrow=#b4b4b4:label=#c8c8c8:from=#2e7d32:to=#1565c0:eip=#9c27b0:choice=#e65100:default=#455a64"; + + private static final Map COLOR_PRESETS = Map.of( + "dark", DARK_COLORS, + "light", LIGHT_COLORS, + "transparent", TRANSPARENT_COLORS); + + static class DiagramColors { + Color bg, text, arrow, routeLabel; + Color nodeFrom, nodeTo, nodeEip, nodeChoice, nodeDefault; + + static DiagramColors parse(String spec) { + // Resolve preset aliases + String resolved = COLOR_PRESETS.getOrDefault(spec, spec); + Map map = new HashMap<>(); + // Start with dark defaults + for (String entry : DARK_COLORS.split(":")) { + int eq = entry.indexOf('='); + if (eq > 0) { + map.put(entry.substring(0, eq), entry.substring(eq + 1)); + } + } + // Override with user values + for (String entry : resolved.split(":")) { + int eq = entry.indexOf('='); + if (eq > 0) { + map.put(entry.substring(0, eq), entry.substring(eq + 1)); + } + } + DiagramColors c = new DiagramColors(); + c.bg = parseColor(map.get("bg")); + c.text = parseColor(map.getOrDefault("text", "#ffffff")); + c.arrow = parseColor(map.getOrDefault("arrow", "#b4b4b4")); + c.routeLabel = parseColor(map.getOrDefault("label", "#c8c8c8")); + c.nodeFrom = parseColor(map.getOrDefault("from", "#2e7d32")); + c.nodeTo = parseColor(map.getOrDefault("to", "#1565c0")); + c.nodeEip = parseColor(map.getOrDefault("eip", "#9c27b0")); + c.nodeChoice = parseColor(map.getOrDefault("choice", "#e65100")); + c.nodeDefault = parseColor(map.getOrDefault("default", "#455a64")); + return c; + } + + private static Color parseColor(String hex) { + if (hex == null || hex.isEmpty()) { + return null; // transparent + } + if (hex.startsWith("#")) { + hex = hex.substring(1); + } + try { + return new Color(Integer.parseInt(hex, 16)); + } catch (NumberFormatException e) { + return null; + } + } + } + + // EIP types that create horizontal branches (their direct children are laid out side by side) + private static final Set BRANCHING_EIPS = Set.of( + "choice", "multicast", "doTry", "loadBalance", "recipientList"); + + @CommandLine.Parameters(description = "Name or pid of running Camel integration", arity = "0..1") + String name = "*"; + + @CommandLine.Option(names = { "--filter" }, + description = "Filter route by filename or route id") + String filter; + + @CommandLine.Option(names = { "--width" }, + description = "Image width in pixels", defaultValue = "0") + int width; + + @CommandLine.Option(names = { "--output" }, + description = "Save diagram to a PNG file instead of displaying in terminal") + String output; + + @CommandLine.Option(names = { "--theme", "--colors" }, + description = "Color theme preset (dark, light, transparent) or custom colors " + + "(e.g. bg=#1e1e1e:from=#2e7d32:to=#1565c0). Use bg= for transparent.", + defaultValue = "dark") + String theme; + + private DiagramColors colors; + + public CamelRouteDiagramAction(CamelJBangMain main) { + super(main); + } + + @Override + public Integer doCall() throws Exception { + String colorSpec = System.getenv("DIAGRAM_COLORS"); + colors = DiagramColors.parse(colorSpec != null ? colorSpec : theme); + + List pids = findPids(name); + if (pids.isEmpty()) { + return 1; + } else if (pids.size() > 1) { + printer().println("Name or pid " + name + " matches " + pids.size() + + " running Camel integrations. Specify a name or PID that matches exactly one."); + return 1; + } + + long pid = pids.get(0); + + // Fetch route structure from the running Camel integration + Path outputFile = prepareAction(Long.toString(pid), "route-structure", root -> { + root.put("filter", "*"); + root.put("brief", false); + }); + + try { + JsonObject jo = getJsonObject(outputFile); + if (jo == null) { + printer().println("Response from running Camel with PID " + pid + " not received within 5 seconds"); + return 1; + } + + List routes = parseRoutes(jo); + if (routes.isEmpty()) { + printer().println("No routes found"); + return 0; + } + + // Filter routes if needed + if (filter != null) { + routes.removeIf(r -> (r.routeId == null || !PatternHelper.matchPattern(r.routeId, filter)) + && (r.source == null || !PatternHelper.matchPattern(r.source, filter))); + } + + if (routes.isEmpty()) { + printer().println("No routes match filter: " + filter); + return 0; + } + + // Render diagram + BufferedImage image = renderDiagram(routes); + + if (output != null) { + // Save to file + File file = new File(output); + ImageIO.write(image, "PNG", file); + printer().println("Diagram saved to: " + file.getAbsolutePath()); + } else { + // Display using JLine terminal graphics + try (Terminal terminal = TerminalBuilder.builder().system(true).build()) { + Optional protocol = TerminalGraphicsManager.getBestProtocol(terminal); + if (protocol.isPresent()) { + TerminalGraphics.ImageOptions opts = new TerminalGraphics.ImageOptions() + .preserveAspectRatio(true); + if (width > 0) { + opts.width(width); + } + protocol.get().displayImage(terminal, image, opts); + terminal.writer().println(); + terminal.flush(); + } else { + printer().println("Terminal does not support graphics protocols (Kitty, iTerm2, or Sixel)."); + printer().println( + "Try running in a supported terminal: Kitty, iTerm2, WezTerm, Ghostty, or VS Code."); + printTextDiagram(routes); + } + } + } + + return 0; + } finally { + PathUtils.deleteFile(outputFile); + } + } + + // ------- Parsing ------- + + private List parseRoutes(JsonObject jo) { + List routes = new ArrayList<>(); + JsonArray arr = (JsonArray) jo.get("routes"); + if (arr == null) { + return routes; + } + + for (int i = 0; i < arr.size(); i++) { + JsonObject o = (JsonObject) arr.get(i); + RouteInfo route = new RouteInfo(); + route.routeId = o.getString("routeId"); + route.source = CamelRouteStructureAction.extractSourceName(o.getString("source")); + + List lines = o.getCollection("code"); + if (lines != null) { + for (JsonObject line : lines) { + NodeInfo node = new NodeInfo(); + node.type = line.getString("type"); + node.code = Jsoner.unescape(line.getString("code")); + node.level = line.getInteger("level"); + route.nodes.add(node); + } + } + routes.add(route); + } + return routes; + } + + // ------- Tree building ------- + + /** + * Build a tree from the flat node list using level to determine parent-child relationships. + */ + static TreeNode buildTree(List nodes) { + if (nodes.isEmpty()) { + return null; + } + TreeNode root = new TreeNode(nodes.get(0)); + TreeNode current = root; + + for (int i = 1; i < nodes.size(); i++) { + NodeInfo ni = nodes.get(i); + TreeNode tn = new TreeNode(ni); + + if (ni.level > current.info.level) { + // Child of current + current.children.add(tn); + tn.parent = current; + } else if (ni.level == current.info.level) { + // Sibling of current + TreeNode parent = current.parent; + if (parent != null) { + parent.children.add(tn); + tn.parent = parent; + } else { + root.children.add(tn); + tn.parent = root; + } + } else { + // Walk up to find the right parent + TreeNode ancestor = current.parent; + while (ancestor != null && ancestor.info.level >= ni.level) { + ancestor = ancestor.parent; + } + if (ancestor != null) { + ancestor.children.add(tn); + tn.parent = ancestor; + } else { + root.children.add(tn); + tn.parent = root; + } + } + current = tn; + } + return root; + } + + // ------- Layout (Hawtio-style) ------- + + private LayoutRoute layoutRoute(RouteInfo route, int startY) { + LayoutRoute lr = new LayoutRoute(); + lr.routeId = route.routeId; + lr.source = route.source; + lr.labelY = startY; + + TreeNode tree = buildTree(route.nodes); + if (tree == null) { + lr.maxX = PADDING + NODE_WIDTH; + lr.maxY = startY + 24 * SCALE; + return lr; + } + + computeSubtreeWidth(tree); + assignPositions(tree, PADDING, startY + 24 * SCALE, tree.subtreeWidth, lr); + + int maxX = 0; + for (LayoutNode ln : lr.nodes) { + maxX = Math.max(maxX, ln.x + NODE_WIDTH); + } + lr.maxX = maxX + PADDING; + + return lr; + } + + /** + * Compute the width each subtree needs (in pixels) for horizontal layout. + */ + private int computeSubtreeWidth(TreeNode node) { + if (node.children.isEmpty()) { + node.subtreeWidth = NODE_WIDTH; + return node.subtreeWidth; + } + + if (isBranchingEip(node.info.type)) { + // Branches are laid out side by side + int totalWidth = 0; + for (int i = 0; i < node.children.size(); i++) { + if (i > 0) { + totalWidth += H_GAP; + } + totalWidth += computeSubtreeWidth(node.children.get(i)); + } + node.subtreeWidth = Math.max(NODE_WIDTH, totalWidth); + } else { + // Sequential: the width is the max of all children + int maxChildWidth = NODE_WIDTH; + for (TreeNode child : node.children) { + maxChildWidth = Math.max(maxChildWidth, computeSubtreeWidth(child)); + } + node.subtreeWidth = maxChildWidth; + } + return node.subtreeWidth; + } + + /** + * Assign x,y positions to each node in the tree. + * + * @param parentWidth the available width from the parent's subtree (used to center sequential children) + */ + private void assignPositions(TreeNode node, int x, int y, int parentWidth, LayoutRoute lr) { + int availableWidth = Math.max(node.subtreeWidth, parentWidth); + int nodeX = x + (availableWidth - NODE_WIDTH) / 2; + + LayoutNode ln = new LayoutNode(); + ln.label = truncateLabel(node.info.code); + ln.type = node.info.type; + ln.x = nodeX; + ln.y = y; + ln.treeNode = node; + node.layoutNode = ln; + lr.nodes.add(ln); + + // Connect to parent + if (node.parent != null && node.parent.layoutNode != null) { + TreeNode parentNode = node.parent; + if (!isBranchingEip(parentNode.info.type)) { + // Sequential: connect to previous sibling or parent + int myIndex = parentNode.children.indexOf(node); + if (myIndex > 0) { + TreeNode prevSibling = parentNode.children.get(myIndex - 1); + if (isBranchingEip(prevSibling.info.type)) { + // Previous sibling was a branching EIP — connect from its merge point + ln.connectFromMerge = true; + ln.mergeY = findMaxY(prevSibling) + V_GAP / 2; + ln.mergeCx = prevSibling.layoutNode.x + NODE_WIDTH / 2; + ln.parentNode = prevSibling.layoutNode; + } else { + ln.parentNode = findLastLayoutNode(prevSibling); + } + } else { + ln.parentNode = parentNode.layoutNode; + } + } else { + // Branching: connect directly to parent + ln.parentNode = parentNode.layoutNode; + } + } + + lr.maxY = Math.max(lr.maxY, y + NODE_HEIGHT + V_GAP); + + if (node.children.isEmpty()) { + return; + } + + int childY = y + NODE_HEIGHT + V_GAP; + + if (isBranchingEip(node.info.type)) { + // Lay out children side by side horizontally + int childX = x + (availableWidth - node.subtreeWidth) / 2; + for (TreeNode child : node.children) { + assignPositions(child, childX, childY, child.subtreeWidth, lr); + childX += child.subtreeWidth + H_GAP; + } + } else { + // Sequential: stack children vertically + int curY = childY; + for (int i = 0; i < node.children.size(); i++) { + TreeNode child = node.children.get(i); + assignPositions(child, x, curY, availableWidth, lr); + curY = findMaxY(child) + V_GAP; + // Extra gap after branching children for merge line + if (isBranchingEip(child.info.type) && i < node.children.size() - 1) { + curY += V_GAP; + } + } + } + } + + /** + * Find the last (deepest) layout node in a sequential subtree. For branching EIPs, returns the node itself + * (branches merge back at the parent). + */ + private LayoutNode findLastLayoutNode(TreeNode node) { + if (node.children.isEmpty()) { + return node.layoutNode; + } + if (isBranchingEip(node.info.type)) { + return node.layoutNode; + } + return findLastLayoutNode(node.children.get(node.children.size() - 1)); + } + + private int findMaxY(TreeNode node) { + int maxY = node.layoutNode != null ? node.layoutNode.y + NODE_HEIGHT : 0; + for (TreeNode child : node.children) { + maxY = Math.max(maxY, findMaxY(child)); + } + return maxY; + } + + private boolean isBranchingEip(String type) { + return type != null && BRANCHING_EIPS.contains(type); + } + + // ------- Rendering ------- + + private BufferedImage renderDiagram(List routes) { + List layoutRoutes = new ArrayList<>(); + int currentY = PADDING; + + for (RouteInfo route : routes) { + LayoutRoute lr = layoutRoute(route, currentY); + layoutRoutes.add(lr); + currentY = lr.maxY + V_GAP; + } + + int imgWidth = layoutRoutes.stream().mapToInt(lr -> lr.maxX).max().orElse(400) + PADDING; + int imgHeight = currentY + PADDING; + + int imageType = colors.bg == null ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB; + BufferedImage image = new BufferedImage(imgWidth, imgHeight, imageType); + Graphics2D g = image.createGraphics(); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); + + if (colors.bg != null) { + g.setColor(colors.bg); + g.fillRect(0, 0, imgWidth, imgHeight); + } + + for (LayoutRoute lr : layoutRoutes) { + drawRoute(g, lr); + } + + g.dispose(); + return image; + } + + private void drawRoute(Graphics2D g, LayoutRoute lr) { + // Route label + g.setColor(colors.routeLabel); + g.setFont(new Font("SansSerif", Font.BOLD, FONT_SIZE_LABEL)); + String label = lr.routeId; + if (lr.source != null && !lr.source.isEmpty()) { + label += " (" + lr.source + ")"; + } + g.drawString(label, PADDING, lr.labelY + 14 * SCALE); + + g.setStroke(new BasicStroke(1.5f * SCALE)); + + // Draw merge lines for branching nodes + for (LayoutNode ln : lr.nodes) { + if (isBranchingEip(ln.type) && ln.treeNode != null && !ln.treeNode.children.isEmpty()) { + drawMergeLines(g, ln); + } + } + + // Draw arrows + for (LayoutNode ln : lr.nodes) { + if (ln.parentNode != null) { + if (ln.connectFromMerge) { + drawArrowFromMerge(g, ln); + } else { + drawArrow(g, ln.parentNode, ln); + } + } + } + + // Draw nodes on top + for (LayoutNode ln : lr.nodes) { + drawNode(g, ln); + } + } + + /** + * Draw merge lines below all branches of a branching EIP: vertical lines from each branch's last node down to a + * horizontal merge line, with a dot at center. + */ + private void drawMergeLines(Graphics2D g, LayoutNode branchingNode) { + TreeNode tn = branchingNode.treeNode; + if (tn.children.isEmpty()) { + return; + } + + // Only draw merge if there's a next sequential sibling + TreeNode parentNode = tn.parent; + if (parentNode == null) { + return; + } + int myIndex = parentNode.children.indexOf(tn); + if (myIndex < 0 || myIndex >= parentNode.children.size() - 1) { + return; + } + + int branchesMaxY = findMaxY(tn); + int mergeY = branchesMaxY + V_GAP / 2; + + g.setColor(colors.arrow); + g.setStroke(new BasicStroke(1.5f * SCALE)); + + // Draw vertical lines from each branch's last node down to merge Y + int minCx = Integer.MAX_VALUE; + int maxCx = Integer.MIN_VALUE; + for (TreeNode child : tn.children) { + LayoutNode lastNode = findLastLayoutNode(child); + if (lastNode != null) { + int cx = lastNode.x + NODE_WIDTH / 2; + int by = lastNode.y + NODE_HEIGHT; + g.drawLine(cx, by, cx, mergeY); + minCx = Math.min(minCx, cx); + maxCx = Math.max(maxCx, cx); + } + } + + // Draw horizontal merge line + if (minCx < maxCx) { + g.drawLine(minCx, mergeY, maxCx, mergeY); + } + + // Draw merge dot at center + int mergeCx = branchingNode.x + NODE_WIDTH / 2; + g.fillOval(mergeCx - MERGE_DOT, mergeY - MERGE_DOT, MERGE_DOT * 2, MERGE_DOT * 2); + } + + private void drawArrowFromMerge(Graphics2D g, LayoutNode to) { + g.setColor(colors.arrow); + g.setStroke(new BasicStroke(1.5f * SCALE)); + + int toCx = to.x + NODE_WIDTH / 2; + int toTy = to.y; + int mergeCx = to.mergeCx; + int mergeY = to.mergeY; + + if (mergeCx == toCx) { + g.drawLine(mergeCx, mergeY, toCx, toTy); + } else { + int midY = mergeY + (toTy - mergeY) / 2; + g.drawLine(mergeCx, mergeY, mergeCx, midY); + g.drawLine(mergeCx, midY, toCx, midY); + g.drawLine(toCx, midY, toCx, toTy); + } + drawArrowHead(g, toCx, toTy); + } + + private void drawNode(Graphics2D g, LayoutNode node) { + Color color = getNodeColor(node.type); + + g.setColor(color); + g.fillRoundRect(node.x, node.y, NODE_WIDTH, NODE_HEIGHT, ARC, ARC); + + g.setColor(color.brighter()); + g.setStroke(new BasicStroke(1.0f * SCALE)); + g.drawRoundRect(node.x, node.y, NODE_WIDTH, NODE_HEIGHT, ARC, ARC); + + g.setColor(colors.text); + g.setFont(new Font("SansSerif", Font.PLAIN, FONT_SIZE_NODE)); + FontMetrics fm = g.getFontMetrics(); + String text = node.label; + while (fm.stringWidth(text) > NODE_WIDTH - 16 * SCALE && text.length() > 3) { + text = text.substring(0, text.length() - 4) + "..."; + } + int textX = node.x + (NODE_WIDTH - fm.stringWidth(text)) / 2; + int textY = node.y + (NODE_HEIGHT + fm.getAscent() - fm.getDescent()) / 2; + g.drawString(text, textX, textY); + } + + private void drawArrow(Graphics2D g, LayoutNode from, LayoutNode to) { + g.setColor(colors.arrow); + g.setStroke(new BasicStroke(1.5f * SCALE)); + + int fromCx = from.x + NODE_WIDTH / 2; + int fromBy = from.y + NODE_HEIGHT; + int toCx = to.x + NODE_WIDTH / 2; + int toTy = to.y; + + if (fromCx == toCx) { + g.drawLine(fromCx, fromBy, toCx, toTy); + } else { + int midY = fromBy + V_GAP / 2; + g.drawLine(fromCx, fromBy, fromCx, midY); + g.drawLine(fromCx, midY, toCx, midY); + g.drawLine(toCx, midY, toCx, toTy); + } + drawArrowHead(g, toCx, toTy); + } + + private void drawArrowHead(Graphics2D g, int x, int y) { + int[] xPoints = { x - ARROW_SIZE, x, x + ARROW_SIZE }; + int[] yPoints = { y - ARROW_SIZE, y, y - ARROW_SIZE }; + g.fillPolygon(xPoints, yPoints, 3); + } + + private Color getNodeColor(String type) { + if (type == null) { + return colors.nodeDefault; + } + return switch (type) { + case "from" -> colors.nodeFrom; + case "to", "toD", "wireTap", "enrich", "pollEnrich" -> colors.nodeTo; + case "choice", "when", "otherwise" -> colors.nodeChoice; + case "filter", "split", "aggregate", "multicast", "recipientList", + "routingSlip", "dynamicRouter", "loadBalance", + "circuitBreaker", "saga", "doTry", "doCatch", "doFinally", + "onException", "onCompletion", "intercept", + "loop", "resequence", "throttle" -> + colors.nodeEip; + default -> colors.nodeDefault; + }; + } + + static String truncateLabel(String code) { + if (code == null) { + return ""; + } + code = code.replaceFirst("^\\.", ""); + if (code.length() > 40) { + code = code.substring(0, 37) + "..."; + } + return code; + } + + private void printTextDiagram(List routes) { + for (RouteInfo route : routes) { + printer().println(); + printer().printf("Route: %s (%s)%n", route.routeId, route.source); + printer().println("---"); + for (NodeInfo node : route.nodes) { + String indent = " ".repeat(node.level); + String prefix = node.level == 0 ? "[*] " : " -> "; + printer().printf("%s%s%s%n", indent, prefix, node.code); + } + printer().println(); + } + } + + // ------- Data classes ------- + + private static class RouteInfo { + String routeId; + String source; + List nodes = new ArrayList<>(); + } + + static class NodeInfo { + String type; + String code; + int level; + } + + static class TreeNode { + final NodeInfo info; + TreeNode parent; + List children = new ArrayList<>(); + int subtreeWidth; + LayoutNode layoutNode; + + TreeNode(NodeInfo info) { + this.info = info; + } + } + + private static class LayoutRoute { + String routeId; + String source; + int labelY; + int maxX; + int maxY; + List nodes = new ArrayList<>(); + } + + private static class LayoutNode { + String label; + String type; + int x; + int y; + LayoutNode parentNode; + TreeNode treeNode; + boolean connectFromMerge; + int mergeY; + int mergeCx; + } +} diff --git a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramActionTest.java b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramActionTest.java new file mode 100644 index 0000000000000..3765db3a0e838 --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramActionTest.java @@ -0,0 +1,188 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.dsl.jbang.core.commands.action; + +import java.awt.Color; +import java.util.List; + +import org.apache.camel.dsl.jbang.core.commands.action.CamelRouteDiagramAction.DiagramColors; +import org.apache.camel.dsl.jbang.core.commands.action.CamelRouteDiagramAction.NodeInfo; +import org.apache.camel.dsl.jbang.core.commands.action.CamelRouteDiagramAction.TreeNode; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class CamelRouteDiagramActionTest { + + // ------- buildTree tests ------- + + @Test + void testBuildTreeEmpty() { + assertNull(CamelRouteDiagramAction.buildTree(List.of())); + } + + @Test + void testBuildTreeSingleNode() { + List nodes = List.of(node("from", "timer:tick", 0)); + TreeNode root = CamelRouteDiagramAction.buildTree(nodes); + + assertNotNull(root); + assertEquals("from", root.info.type); + assertTrue(root.children.isEmpty()); + } + + @Test + void testBuildTreeSequential() { + List nodes = List.of( + node("from", "timer:tick", 0), + node("to", "log:a", 1), + node("to", "log:b", 1)); + TreeNode root = CamelRouteDiagramAction.buildTree(nodes); + + assertNotNull(root); + assertEquals(2, root.children.size()); + assertEquals("log:a", root.children.get(0).info.code); + assertEquals("log:b", root.children.get(1).info.code); + } + + @Test + void testBuildTreeBranching() { + // from -> choice -> when (level 2) -> to (level 3) + // -> otherwise (level 2) -> to (level 3) + List nodes = List.of( + node("from", "timer:tick", 0), + node("choice", "choice()", 1), + node("when", "when(simple(...))", 2), + node("to", "log:a", 3), + node("otherwise", "otherwise()", 2), + node("to", "log:b", 3)); + TreeNode root = CamelRouteDiagramAction.buildTree(nodes); + + assertNotNull(root); + assertEquals(1, root.children.size()); // choice + TreeNode choice = root.children.get(0); + assertEquals("choice", choice.info.type); + assertEquals(2, choice.children.size()); // when + otherwise + assertEquals("when", choice.children.get(0).info.type); + assertEquals("otherwise", choice.children.get(1).info.type); + assertEquals(1, choice.children.get(0).children.size()); // to under when + assertEquals(1, choice.children.get(1).children.size()); // to under otherwise + } + + @Test + void testBuildTreeWalkUpMultipleLevels() { + // from (0) -> choice (1) -> when (2) -> to (3) + // -> to (1) <-- walks back up from level 3 to level 1 + List nodes = List.of( + node("from", "timer:tick", 0), + node("choice", "choice()", 1), + node("when", "when(...)", 2), + node("to", "log:deep", 3), + node("to", "log:after-choice", 1)); + TreeNode root = CamelRouteDiagramAction.buildTree(nodes); + + assertNotNull(root); + assertEquals(2, root.children.size()); // choice + to + assertEquals("choice", root.children.get(0).info.type); + assertEquals("log:after-choice", root.children.get(1).info.code); + } + + // ------- DiagramColors tests ------- + + @Test + void testColorPresetDark() { + DiagramColors colors = DiagramColors.parse("dark"); + assertNotNull(colors.bg); + assertNotNull(colors.text); + assertNotNull(colors.nodeFrom); + assertEquals(new Color(0x1e1e1e), colors.bg); + } + + @Test + void testColorPresetLight() { + DiagramColors colors = DiagramColors.parse("light"); + assertEquals(new Color(0xf5f5f5), colors.bg); + assertEquals(new Color(0x1e1e1e), colors.text); + } + + @Test + void testColorPresetTransparent() { + DiagramColors colors = DiagramColors.parse("transparent"); + assertNull(colors.bg); // transparent = null bg + assertNotNull(colors.text); + } + + @Test + void testColorCustomOverride() { + DiagramColors colors = DiagramColors.parse("bg=#ff0000:from=#00ff00"); + assertEquals(new Color(0xff0000), colors.bg); + assertEquals(new Color(0x00ff00), colors.nodeFrom); + // Other colors should fall back to dark defaults + assertNotNull(colors.text); + assertNotNull(colors.nodeTo); + } + + @Test + void testColorInvalidHexFallsBack() { + DiagramColors colors = DiagramColors.parse("bg=notacolor"); + assertNull(colors.bg); // invalid hex returns null + } + + // ------- truncateLabel tests ------- + + @Test + void testTruncateLabelNull() { + assertEquals("", CamelRouteDiagramAction.truncateLabel(null)); + } + + @Test + void testTruncateLabelShort() { + assertEquals("log:hello", CamelRouteDiagramAction.truncateLabel("log:hello")); + } + + @Test + void testTruncateLabelLeadingDot() { + assertEquals("to(\"log:a\")", CamelRouteDiagramAction.truncateLabel(".to(\"log:a\")")); + } + + @Test + void testTruncateLabelLong() { + String longLabel = "to(\"http://very-long-endpoint-url-that-exceeds-forty-characters\")"; + String result = CamelRouteDiagramAction.truncateLabel(longLabel); + assertTrue(result.length() <= 40); + assertTrue(result.endsWith("...")); + } + + @Test + void testTruncateLabelExactly40() { + String label40 = "a".repeat(40); + assertEquals(label40, CamelRouteDiagramAction.truncateLabel(label40)); + } + + // ------- helpers ------- + + private static NodeInfo node(String type, String code, int level) { + NodeInfo n = new NodeInfo(); + n.type = type; + n.code = code; + n.level = level; + return n; + } +}