This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch chore/reorganize-jbang-examples in repository https://gitbox.apache.org/repos/asf/camel.git
commit cc2c3b7236625ff1342ba439308f800cd253d8c1 Author: Claus Ibsen <[email protected]> AuthorDate: Tue Jul 7 11:48:23 2026 +0200 chore: reorganize bundled jbang examples into categorized folders Organize bundled examples into topic-based subfolders matching the companion reorganization of apache/camel-jbang-examples: - beginner/ - timer-log, cron-log, rest-api, routes, tui-hello-world, camel-1-tribute - eip/ - circuit-breaker, content-based-router (new), splitter (new), aggregator (new) - database/ - sql - language/ - groovy - observability/ - memory-leak, message-size, route-topology - transformation/ - xslt Three new EIP examples added: - content-based-router: choice/when routing by message content - splitter: split batch into individual messages - aggregator: collect messages into batches Catalog JSON updated with new paths for all 29 examples. Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../{ => beginner}/camel-1-tribute/README.md | 0 .../camel-1-tribute/application.properties | 0 .../camel-1-tribute/jms-to-file.camel.yaml | 0 .../examples/{ => beginner}/cron-log/README.md | 0 .../{ => beginner}/cron-log/application.properties | 0 .../{ => beginner}/cron-log/cron-log.camel.yaml | 0 .../examples/{ => beginner}/rest-api/README.md | 0 .../{ => beginner}/rest-api/application.properties | 0 .../{ => beginner}/rest-api/rest-api.camel.yaml | 0 .../examples/{ => beginner}/routes/Greeter.java | 0 .../examples/{ => beginner}/routes/README.md | 0 .../{ => beginner}/routes/application.properties | 0 .../examples/{ => beginner}/routes/beans.yaml | 0 .../{ => beginner}/routes/routes.camel.yaml | 0 .../examples/{ => beginner}/timer-log/README.md | 0 .../timer-log/application.properties | 0 .../{ => beginner}/timer-log/timer-log.camel.yaml | 0 .../{ => beginner}/tui-hello-world/README.md | 0 .../tui-hello-world/tui-hello-world.yaml | 0 .../examples/camel-jbang-example-catalog.json | 638 +++++++++++---------- .../examples/{ => database}/sql/README.md | 0 .../{ => database}/sql/application.properties | 0 .../examples/{ => database}/sql/sql.camel.yaml | 0 .../resources/examples/eip/aggregator/README.md | 47 ++ .../examples/eip/aggregator/aggregator.camel.yaml | 37 ++ .../examples/{ => eip}/circuit-breaker/README.md | 0 .../{ => eip}/circuit-breaker/route.camel.yaml | 0 .../examples/eip/content-based-router/README.md | 48 ++ .../content-based-router.camel.yaml | 45 ++ .../main/resources/examples/eip/splitter/README.md | 47 ++ .../examples/eip/splitter/splitter.camel.yaml | 22 + .../examples/{ => language}/groovy/README.md | 0 .../{ => language}/groovy/application.properties | 0 .../{ => language}/groovy/groovy.camel.yaml | 0 .../memory-leak/MemoryLeak.java | 0 .../{ => observability}/memory-leak/README.md | 0 .../{ => observability}/message-size/README.md | 0 .../message-size/message-size.camel.yaml | 0 .../message-size/orders.camel.yaml | 0 .../{ => observability}/route-topology/README.md | 0 .../route-topology/application.properties | 0 .../route-topology/route-topology.camel.yaml | 0 .../examples/{ => transformation}/xslt/README.md | 0 .../{ => transformation}/xslt/consumer.camel.yaml | 0 .../{ => transformation}/xslt/input/account.xml | 0 .../{ => transformation}/xslt/stylesheet.xsl | 0 46 files changed, 592 insertions(+), 292 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/camel-1-tribute/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/camel-1-tribute/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/camel-1-tribute/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/camel-1-tribute/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/camel-1-tribute/application.properties b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/camel-1-tribute/application.properties similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/camel-1-tribute/application.properties rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/camel-1-tribute/application.properties diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/camel-1-tribute/jms-to-file.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/camel-1-tribute/jms-to-file.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/camel-1-tribute/jms-to-file.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/camel-1-tribute/jms-to-file.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/cron-log/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/cron-log/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/cron-log/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/cron-log/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/cron-log/application.properties b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/cron-log/application.properties similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/cron-log/application.properties rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/cron-log/application.properties diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/cron-log/cron-log.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/cron-log/cron-log.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/cron-log/cron-log.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/cron-log/cron-log.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/rest-api/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/rest-api/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/rest-api/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/rest-api/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/rest-api/application.properties b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/rest-api/application.properties similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/rest-api/application.properties rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/rest-api/application.properties diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/rest-api/rest-api.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/rest-api/rest-api.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/rest-api/rest-api.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/rest-api/rest-api.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/routes/Greeter.java b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/routes/Greeter.java similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/routes/Greeter.java rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/routes/Greeter.java diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/routes/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/routes/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/routes/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/routes/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/routes/application.properties b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/routes/application.properties similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/routes/application.properties rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/routes/application.properties diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/routes/beans.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/routes/beans.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/routes/beans.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/routes/beans.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/routes/routes.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/routes/routes.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/routes/routes.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/routes/routes.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/timer-log/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/timer-log/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/timer-log/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/timer-log/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/timer-log/application.properties b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/timer-log/application.properties similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/timer-log/application.properties rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/timer-log/application.properties diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/timer-log/timer-log.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/timer-log/timer-log.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/timer-log/timer-log.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/timer-log/timer-log.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/tui-hello-world/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/tui-hello-world/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/tui-hello-world/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/tui-hello-world/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/tui-hello-world/tui-hello-world.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/tui-hello-world/tui-hello-world.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/tui-hello-world/tui-hello-world.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/beginner/tui-hello-world/tui-hello-world.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/camel-jbang-example-catalog.json b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/camel-jbang-example-catalog.json index a065576cc70f..bd1affbb688b 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/camel-jbang-example-catalog.json +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/camel-jbang-example-catalog.json @@ -1,13 +1,14 @@ [ { - "name": "artemis", - "title": "Apache ActiveMQ Artemis", - "description": "Setup connection factory to a remote Apache ActiveMQ Artemis messaging broker", - "level": "intermediate", + "name": "ai/docling-langchain4j-rag", + "title": "Document Analysis with Docling and LangChain4j RAG", + "description": "RAG workflow combining Docling document conversion with LangChain4j and Ollama", + "level": "advanced", "tags": [ - "messaging", - "jms", - "artemis" + "ai", + "rag", + "langchain4j", + "docling" ], "bundled": false, "requiresDocker": true, @@ -15,59 +16,112 @@ "files": [ "README.md", "application.properties", - "consumer.camel.yaml", - "producer.camel.yaml" + "docling-langchain4j-rag.yaml", + "sample.md" ], "infraServices": [ - "artemis" + "docling", + "ollama" ] }, { - "name": "aws/aws-s3-event-based", - "title": "AWS S3 CDC", - "description": "Consume S3 events using EventBridge and SQS for change data capture", + "name": "ai/financial-doc-analyzer", + "title": "Financial Document Analyzer", + "description": "Automated financial document analysis with Docling, LangChain4j, and market data", "level": "advanced", "tags": [ - "aws", - "s3", - "sqs", - "eventbridge", - "cloud" + "ai", + "langchain4j", + "docling", + "finance" + ], + "bundled": false, + "requiresDocker": true, + "hasCitrusTests": false, + "files": [ + "README.md", + "application.properties", + "examples/banking-sector-brief.pdf", + "examples/magnificent-seven-update.pdf", + "examples/semiconductor-sector-analysis.pdf", + "examples/tesla-q3-2024.pdf", + "financial-doc-analyzer.yaml" + ], + "infraServices": [ + "docling", + "ollama" + ] + }, + { + "name": "ai/openai-pii-redaction", + "title": "OpenAI PII Redaction", + "description": "Redact personal identifiable information from text using OpenAI-compatible LLMs", + "level": "advanced", + "tags": [ + "ai", + "openai", + "privacy", + "security" ], "bundled": false, "requiresDocker": false, - "hasCitrusTests": true, + "hasCitrusTests": false, "files": [ "README.md", "application.properties", - "aws-s3-cdc-log.camel.yaml", - "example-file.txt", - "policy-queue.json", - "terraform/main.tf" + "pii-redaction.camel.yaml", + "pii.schema.json" ] }, { - "name": "aws/aws-sqs", - "title": "AWS SQS Sink", - "description": "Push messages to AWS SQS queue via HTTP service", + "name": "ai/smart-log-analyzer", + "title": "Smart Log Analyzer", + "description": "Intelligent observability correlating OpenTelemetry logs and traces with LLM analysis", "level": "advanced", "tags": [ - "aws", - "sqs", - "http", - "cloud" + "ai", + "observability", + "opentelemetry", + "logging" ], "bundled": false, "requiresDocker": false, "hasCitrusTests": true, "files": [ "README.md", - "application.properties", - "http-to-aws-sqs.camel.yaml" + "analyzer/application-dev.properties", + "analyzer/error-analyzer.camel.yaml", + "containers/caches/infinispan-events-config.json", + "containers/caches/infinispan-events-to-process-config.json", + "containers/otel-collector-config.yaml", + "correlator/application-dev.properties", + "correlator/correlated-log-schema.json", + "correlator/correlated-trace-schema.json", + "correlator/infinispan.camel.yaml", + "correlator/kafka-ca-cert.pem", + "correlator/kaoto-datamapper-4a94acc3.xsl", + "correlator/kaoto-datamapper-8f5bb2dd.xsl", + "correlator/logs-mapper.camel.yaml", + "correlator/otel-log-record-schema.json", + "correlator/otel-logs-schema.json", + "correlator/otel-span-schema.json", + "correlator/otel-traces-schema.json", + "correlator/traces-mapper.camel.yaml", + "first-iteration/analyzer.camel.yaml", + "first-iteration/application.properties", + "first-iteration/load-generator.camel.yaml", + "log-generator/agent.properties", + "log-generator/application-dev.properties", + "log-generator/log-generator.camel.yaml", + "log-generator/opentelemetry-javaagent.jar", + "ui-console/application-dev.properties", + "ui-console/index.html", + "ui-console/jms-file-storage.camel.yaml", + "ui-console/rest-api.camel.yaml" ] }, { - "name": "camel-1-tribute", + "name": "beginner/camel-1-tribute", "title": "Camel 1.0 Tribute", "description": "A tribute to the very first Apache Camel example from 2007 - JMS to File", "level": "beginner", @@ -91,31 +145,73 @@ ] }, { - "name": "circuit-breaker", - "title": "Circuit Breaker", - "description": "Use the circuit breaker EIP for fault tolerance", + "name": "beginner/cron-log", + "title": "Cron Log", + "description": "Scheduled task that logs every 5 seconds", "level": "beginner", "tags": [ - "eip", - "resilience" + "beginner", + "timer", + "cron", + "log" ], "bundled": true, "requiresDocker": false, "hasCitrusTests": false, "files": [ "README.md", - "route.camel.yaml" + "application.properties", + "cron-log.camel.yaml" ] }, { - "name": "cron-log", - "title": "Cron Log", - "description": "Scheduled task that logs every 5 seconds", + "name": "beginner/rest-api", + "title": "REST API", + "description": "REST API with hello endpoints", + "level": "beginner", + "tags": [ + "beginner", + "rest", + "http" + ], + "bundled": true, + "requiresDocker": false, + "hasCitrusTests": false, + "files": [ + "README.md", + "application.properties", + "rest-api.camel.yaml" + ] + }, + { + "name": "beginner/routes", + "title": "Routes", + "description": "Define routes in YAML with Java beans", + "level": "beginner", + "tags": [ + "beginner", + "yaml", + "bean" + ], + "bundled": true, + "requiresDocker": false, + "hasCitrusTests": false, + "files": [ + "Greeter.java", + "README.md", + "application.properties", + "beans.yaml", + "routes.camel.yaml" + ] + }, + { + "name": "beginner/timer-log", + "title": "Timer Log", + "description": "Simple timer that logs a hello message every second", "level": "beginner", "tags": [ "beginner", "timer", - "cron", "log" ], "bundled": true, @@ -124,88 +220,167 @@ "files": [ "README.md", "application.properties", - "cron-log.camel.yaml" + "timer-log.camel.yaml" ] }, { - "name": "docling-langchain4j-rag", - "title": "Document Analysis with Docling and LangChain4j RAG", - "description": "RAG workflow combining Docling document conversion with LangChain4j and Ollama", + "name": "beginner/tui-hello-world", + "title": "TUI Hello World", + "description": "Say hello via TUI Send Message (F2) or CLI", + "level": "beginner", + "tags": [ + "beginner", + "direct", + "send", + "tui" + ], + "bundled": true, + "requiresDocker": false, + "hasCitrusTests": false, + "files": [ + "README.md", + "tui-hello-world.yaml" + ] + }, + { + "name": "cloud/aws-s3-event-based", + "title": "AWS S3 CDC", + "description": "Consume S3 events using EventBridge and SQS for change data capture", "level": "advanced", "tags": [ - "ai", - "rag", - "langchain4j", - "docling" + "aws", + "s3", + "sqs", + "eventbridge", + "cloud" ], "bundled": false, - "requiresDocker": true, - "hasCitrusTests": false, + "requiresDocker": false, + "hasCitrusTests": true, "files": [ "README.md", "application.properties", - "docling-langchain4j-rag.yaml", - "sample.md" - ], - "infraServices": [ - "docling", - "ollama" + "aws-s3-cdc-log.camel.yaml", + "example-file.txt", + "policy-queue.json", + "terraform/main.tf" ] }, { - "name": "financial-doc-analyzer", - "title": "Financial Document Analyzer", - "description": "Automated financial document analysis with Docling, LangChain4j, and market data", + "name": "cloud/aws-sqs", + "title": "AWS SQS Sink", + "description": "Push messages to AWS SQS queue via HTTP service", "level": "advanced", "tags": [ - "ai", - "langchain4j", - "docling", - "finance" + "aws", + "sqs", + "http", + "cloud" ], "bundled": false, - "requiresDocker": true, - "hasCitrusTests": false, + "requiresDocker": false, + "hasCitrusTests": true, "files": [ "README.md", "application.properties", - "examples/banking-sector-brief.pdf", - "examples/magnificent-seven-update.pdf", - "examples/semiconductor-sector-analysis.pdf", - "examples/tesla-q3-2024.pdf", - "financial-doc-analyzer.yaml" - ], - "infraServices": [ - "docling", - "ollama" + "http-to-aws-sqs.camel.yaml" ] }, { - "name": "ftp", - "title": "ActiveMQ to FTP", - "description": "Integrate ActiveMQ messaging with an FTP server", + "name": "database/sql", + "title": "SQL Database", + "description": "Use a SQL database with Camel and Postgres", "level": "intermediate", "tags": [ - "messaging", - "ftp", - "activemq" + "database", + "sql", + "postgres" ], - "bundled": false, + "bundled": true, "requiresDocker": true, - "hasCitrusTests": true, + "hasCitrusTests": false, "files": [ "README.md", "application.properties", - "ftp.camel.yaml", - "jbang.properties" + "sql.camel.yaml" ], "infraServices": [ - "artemis", - "ftp" + "postgres" + ] + }, + { + "name": "eip/aggregator", + "title": "Aggregator", + "description": "Collect individual messages into a batch using the Aggregator EIP", + "level": "beginner", + "tags": [ + "eip", + "aggregator", + "batch" + ], + "bundled": true, + "requiresDocker": false, + "hasCitrusTests": false, + "files": [ + "README.md", + "aggregator.camel.yaml" + ] + }, + { + "name": "eip/circuit-breaker", + "title": "Circuit Breaker", + "description": "Use the circuit breaker EIP for fault tolerance", + "level": "beginner", + "tags": [ + "eip", + "resilience" + ], + "bundled": true, + "requiresDocker": false, + "hasCitrusTests": false, + "files": [ + "README.md", + "route.camel.yaml" + ] + }, + { + "name": "eip/content-based-router", + "title": "Content Based Router", + "description": "Route messages to different destinations based on message content using the Choice EIP", + "level": "beginner", + "tags": [ + "eip", + "choice", + "routing" + ], + "bundled": true, + "requiresDocker": false, + "hasCitrusTests": false, + "files": [ + "README.md", + "content-based-router.camel.yaml" + ] + }, + { + "name": "eip/splitter", + "title": "Splitter", + "description": "Split a batch of items into individual messages for processing", + "level": "beginner", + "tags": [ + "eip", + "splitter", + "batch" + ], + "bundled": true, + "requiresDocker": false, + "hasCitrusTests": false, + "files": [ + "README.md", + "splitter.camel.yaml" ] }, { - "name": "groovy", + "name": "language/groovy", "title": "Groovy", "description": "Use Groovy with extra dependencies and content-based routing", "level": "beginner", @@ -224,15 +399,14 @@ ] }, { - "name": "keycloak-introspection-rest", - "title": "Keycloak Token Introspection REST API", - "description": "Secure REST APIs with Keycloak OAuth 2.0 token introspection", - "level": "advanced", + "name": "messaging/artemis", + "title": "Apache ActiveMQ Artemis", + "description": "Setup connection factory to a remote Apache ActiveMQ Artemis messaging broker", + "level": "intermediate", "tags": [ - "security", - "keycloak", - "rest", - "oauth" + "messaging", + "jms", + "artemis" ], "bundled": false, "requiresDocker": true, @@ -240,37 +414,63 @@ "files": [ "README.md", "application.properties", - "rest-api.camel.yaml" + "consumer.camel.yaml", + "producer.camel.yaml" ], "infraServices": [ - "keycloak" + "artemis" ] }, { - "name": "keycloak-security-rest", - "title": "Keycloak Security REST API", - "description": "Secure REST APIs with Keycloak authentication and authorization", - "level": "advanced", + "name": "messaging/ftp", + "title": "ActiveMQ to FTP", + "description": "Integrate ActiveMQ messaging with an FTP server", + "level": "intermediate", "tags": [ - "security", - "keycloak", - "rest", - "oauth" + "messaging", + "ftp", + "activemq" ], "bundled": false, "requiresDocker": true, - "hasCitrusTests": false, + "hasCitrusTests": true, "files": [ "README.md", "application.properties", - "rest-api.camel.yaml" + "ftp.camel.yaml", + "jbang.properties" ], "infraServices": [ - "keycloak" + "artemis", + "ftp" + ] + }, + { + "name": "messaging/mqtt", + "title": "MQTT", + "description": "Receive MQTT events from an external MQTT broker", + "level": "intermediate", + "tags": [ + "messaging", + "mqtt", + "iot" + ], + "bundled": false, + "requiresDocker": true, + "hasCitrusTests": true, + "files": [ + "README.md", + "application.properties", + "infra/mosquitto.conf", + "mqtt.camel.yaml", + "start.sh" + ], + "infraServices": [ + "mosquitto" ] }, { - "name": "memory-leak", + "name": "observability/memory-leak", "title": "Memory Leak", "description": "Simulates a memory leak for testing JFR Old Object Sample diagnostics", "level": "beginner", @@ -289,7 +489,7 @@ ] }, { - "name": "message-size", + "name": "observability/message-size", "title": "Message Size", "description": "Track message body and header sizes per endpoint", "level": "beginner", @@ -307,52 +507,30 @@ ] }, { - "name": "mqtt", - "title": "MQTT", - "description": "Receive MQTT events from an external MQTT broker", + "name": "observability/route-topology", + "title": "Route Topology", + "description": "Demonstrates inter-route topology with triggers, shared routes, and external systems", "level": "intermediate", "tags": [ - "messaging", - "mqtt", - "iot" + "topology", + "direct", + "kafka", + "timer" ], - "bundled": false, + "bundled": true, "requiresDocker": true, - "hasCitrusTests": true, + "hasCitrusTests": false, "files": [ "README.md", "application.properties", - "infra/mosquitto.conf", - "mqtt.camel.yaml", - "start.sh" + "route-topology.camel.yaml" ], "infraServices": [ - "mosquitto" - ] - }, - { - "name": "openai/pii-redaction", - "title": "OpenAI PII Redaction", - "description": "Redact personal identifiable information from text using OpenAI-compatible LLMs", - "level": "advanced", - "tags": [ - "ai", - "openai", - "privacy", - "security" - ], - "bundled": false, - "requiresDocker": false, - "hasCitrusTests": false, - "files": [ - "README.md", - "application.properties", - "pii-redaction.camel.yaml", - "pii.schema.json" + "kafka" ] }, { - "name": "openapi/client", + "name": "rest/openapi-client", "title": "OpenAPI Client", "description": "REST client generated from an OpenAPI specification", "level": "intermediate", @@ -373,7 +551,7 @@ ] }, { - "name": "openapi/server", + "name": "rest/openapi-server", "title": "OpenAPI Server", "description": "REST service implemented from an OpenAPI specification", "level": "intermediate", @@ -394,177 +572,53 @@ ] }, { - "name": "rest-api", - "title": "REST API", - "description": "REST API with hello endpoints", - "level": "beginner", + "name": "security/keycloak-introspection-rest", + "title": "Keycloak Token Introspection REST API", + "description": "Secure REST APIs with Keycloak OAuth 2.0 token introspection", + "level": "advanced", "tags": [ - "beginner", + "security", + "keycloak", "rest", - "http" - ], - "bundled": true, - "requiresDocker": false, - "hasCitrusTests": false, - "files": [ - "README.md", - "application.properties", - "rest-api.camel.yaml" - ] - }, - { - "name": "route-topology", - "title": "Route Topology", - "description": "Demonstrates inter-route topology with triggers, shared routes, and external systems", - "level": "intermediate", - "tags": [ - "topology", - "direct", - "kafka", - "timer" + "oauth" ], - "bundled": true, + "bundled": false, "requiresDocker": true, "hasCitrusTests": false, "files": [ "README.md", "application.properties", - "route-topology.camel.yaml" + "rest-api.camel.yaml" ], "infraServices": [ - "kafka" - ] - }, - { - "name": "routes", - "title": "Routes", - "description": "Define routes in YAML with Java beans", - "level": "beginner", - "tags": [ - "beginner", - "yaml", - "bean" - ], - "bundled": true, - "requiresDocker": false, - "hasCitrusTests": false, - "files": [ - "Greeter.java", - "README.md", - "application.properties", - "beans.yaml", - "routes.camel.yaml" + "keycloak" ] }, { - "name": "smart-log-analyzer", - "title": "Smart Log Analyzer", - "description": "Intelligent observability correlating OpenTelemetry logs and traces with LLM analysis", + "name": "security/keycloak-security-rest", + "title": "Keycloak Security REST API", + "description": "Secure REST APIs with Keycloak authentication and authorization", "level": "advanced", "tags": [ - "ai", - "observability", - "opentelemetry", - "logging" + "security", + "keycloak", + "rest", + "oauth" ], "bundled": false, - "requiresDocker": false, - "hasCitrusTests": true, - "files": [ - "README.md", - "analyzer/application-dev.properties", - "analyzer/error-analyzer.camel.yaml", - "containers/caches/infinispan-events-config.json", - "containers/caches/infinispan-events-to-process-config.json", - "containers/otel-collector-config.yaml", - "correlator/application-dev.properties", - "correlator/correlated-log-schema.json", - "correlator/correlated-trace-schema.json", - "correlator/infinispan.camel.yaml", - "correlator/kafka-ca-cert.pem", - "correlator/kaoto-datamapper-4a94acc3.xsl", - "correlator/kaoto-datamapper-8f5bb2dd.xsl", - "correlator/logs-mapper.camel.yaml", - "correlator/otel-log-record-schema.json", - "correlator/otel-logs-schema.json", - "correlator/otel-span-schema.json", - "correlator/otel-traces-schema.json", - "correlator/traces-mapper.camel.yaml", - "first-iteration/analyzer.camel.yaml", - "first-iteration/application.properties", - "first-iteration/load-generator.camel.yaml", - "log-generator/agent.properties", - "log-generator/application-dev.properties", - "log-generator/log-generator.camel.yaml", - "log-generator/opentelemetry-javaagent.jar", - "ui-console/application-dev.properties", - "ui-console/index.html", - "ui-console/jms-file-storage.camel.yaml", - "ui-console/rest-api.camel.yaml" - ] - }, - { - "name": "sql", - "title": "SQL Database", - "description": "Use a SQL database with Camel and Postgres", - "level": "intermediate", - "tags": [ - "database", - "sql", - "postgres" - ], - "bundled": true, "requiresDocker": true, "hasCitrusTests": false, "files": [ "README.md", "application.properties", - "sql.camel.yaml" + "rest-api.camel.yaml" ], "infraServices": [ - "postgres" - ] - }, - { - "name": "timer-log", - "title": "Timer Log", - "description": "Simple timer that logs a hello message every second", - "level": "beginner", - "tags": [ - "beginner", - "timer", - "log" - ], - "bundled": true, - "requiresDocker": false, - "hasCitrusTests": false, - "files": [ - "README.md", - "application.properties", - "timer-log.camel.yaml" - ] - }, - { - "name": "tui-hello-world", - "title": "TUI Hello World", - "description": "Say hello via TUI Send Message (F2) or CLI", - "level": "beginner", - "tags": [ - "beginner", - "direct", - "send", - "tui" - ], - "bundled": true, - "requiresDocker": false, - "hasCitrusTests": false, - "files": [ - "README.md", - "tui-hello-world.yaml" + "keycloak" ] }, { - "name": "xslt", + "name": "transformation/xslt", "title": "XSLT Transformation", "description": "Basic XML transformation using XSLT style sheets", "level": "beginner", diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/sql/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/database/sql/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/sql/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/database/sql/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/sql/application.properties b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/database/sql/application.properties similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/sql/application.properties rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/database/sql/application.properties diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/sql/sql.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/database/sql/sql.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/sql/sql.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/database/sql/sql.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/aggregator/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/aggregator/README.md new file mode 100644 index 000000000000..2f66737101fe --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/aggregator/README.md @@ -0,0 +1,47 @@ +## Aggregator + +This example demonstrates the Aggregator EIP. + +Individual order messages are collected into batches of 5 using the Aggregator EIP. +The `StringAggregationStrategy` joins message bodies with a comma delimiter. + +A timer generates one order per second. The aggregator collects 5 orders before +releasing the batch, which is then logged as a single combined message. + +### Install JBang + +First install JBang according to https://www.jbang.dev + +When JBang is installed then you should be able to run from a shell: + +```sh +$ jbang --version +``` + +This will output the version of JBang. + +To run this example you can either install Camel on JBang via: + +```sh +$ jbang app install camel@apache/camel +``` + +Which allows to run Camel CLI with `camel` as shown below. + +### How to run + +You can run this example using: + +```sh +$ camel run * +``` + +### Help and contributions + +If you hit any problem using Camel or have some feedback, then please +[let us know](https://camel.apache.org/community/support/). + +We also love contributors, so +[get involved](https://camel.apache.org/community/contributing/) :-) + +The Camel riders! diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/aggregator/aggregator.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/aggregator/aggregator.camel.yaml new file mode 100644 index 000000000000..45a750c03a9b --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/aggregator/aggregator.camel.yaml @@ -0,0 +1,37 @@ +- beans: + - name: myAggregationStrategy + type: "#class:org.apache.camel.processor.aggregate.StringAggregationStrategy" + properties: + delimiter: ", " + +- route: + id: order-generator + from: + uri: timer + parameters: + timerName: orders + period: 1000 + steps: + - setBody: + expression: + simple: + expression: "Order-${exchangeProperty.CamelTimerCounter}" + - log: + message: "New: ${body}" + - to: + uri: direct:aggregate + +- route: + id: order-aggregator + from: + uri: direct:aggregate + steps: + - aggregate: + aggregationStrategy: "#bean:myAggregationStrategy" + correlationExpression: + constant: + expression: "true" + completionSize: 5 + steps: + - log: + message: "Batch of 5: ${body}" diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/circuit-breaker/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/circuit-breaker/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/circuit-breaker/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/circuit-breaker/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/circuit-breaker/route.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/circuit-breaker/route.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/circuit-breaker/route.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/circuit-breaker/route.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/content-based-router/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/content-based-router/README.md new file mode 100644 index 000000000000..d030d8dde2ad --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/content-based-router/README.md @@ -0,0 +1,48 @@ +## Content Based Router + +This example demonstrates the Content Based Router EIP. + +A simulated temperature sensor generates random readings between 0 and 40. +The route uses the `choice` EIP to classify each reading: + +- **Hot** (>= 30): logged as an alert +- **Normal** (15-29): logged as normal +- **Cold** (< 15): logged as an alert + +### Install JBang + +First install JBang according to https://www.jbang.dev + +When JBang is installed then you should be able to run from a shell: + +```sh +$ jbang --version +``` + +This will output the version of JBang. + +To run this example you can either install Camel on JBang via: + +```sh +$ jbang app install camel@apache/camel +``` + +Which allows to run Camel CLI with `camel` as shown below. + +### How to run + +You can run this example using: + +```sh +$ camel run * +``` + +### Help and contributions + +If you hit any problem using Camel or have some feedback, then please +[let us know](https://camel.apache.org/community/support/). + +We also love contributors, so +[get involved](https://camel.apache.org/community/contributing/) :-) + +The Camel riders! diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/content-based-router/content-based-router.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/content-based-router/content-based-router.camel.yaml new file mode 100644 index 000000000000..698c2b1c39dc --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/content-based-router/content-based-router.camel.yaml @@ -0,0 +1,45 @@ +- route: + id: sensor + from: + uri: timer + parameters: + timerName: sensor + period: 1000 + steps: + - setBody: + expression: + simple: + expression: "${random(0,40)}" + - convertBodyTo: + type: int + - choice: + when: + - simple: + expression: "${body} >= 30" + steps: + - setHeader: + name: level + expression: + constant: + expression: hot + - log: + message: "Hot alert: ${body} C" + - simple: + expression: "${body} >= 15" + steps: + - setHeader: + name: level + expression: + constant: + expression: normal + - log: + message: "Normal: ${body} C" + otherwise: + steps: + - setHeader: + name: level + expression: + constant: + expression: cold + - log: + message: "Cold alert: ${body} C" diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/splitter/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/splitter/README.md new file mode 100644 index 000000000000..ea673ccfe3aa --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/splitter/README.md @@ -0,0 +1,47 @@ +## Splitter + +This example demonstrates the Splitter EIP. + +A batch of comma-separated product names is split into individual messages. +Each item is logged with its split index. + +The splitter processes each part of the message independently, which is useful +for breaking down bulk data into individual records for downstream processing. + +### Install JBang + +First install JBang according to https://www.jbang.dev + +When JBang is installed then you should be able to run from a shell: + +```sh +$ jbang --version +``` + +This will output the version of JBang. + +To run this example you can either install Camel on JBang via: + +```sh +$ jbang app install camel@apache/camel +``` + +Which allows to run Camel CLI with `camel` as shown below. + +### How to run + +You can run this example using: + +```sh +$ camel run * +``` + +### Help and contributions + +If you hit any problem using Camel or have some feedback, then please +[let us know](https://camel.apache.org/community/support/). + +We also love contributors, so +[get involved](https://camel.apache.org/community/contributing/) :-) + +The Camel riders! diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/splitter/splitter.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/splitter/splitter.camel.yaml new file mode 100644 index 000000000000..b87b5b4b4d56 --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/eip/splitter/splitter.camel.yaml @@ -0,0 +1,22 @@ +- route: + id: order-splitter + from: + uri: timer + parameters: + timerName: orders + period: 5000 + repeatCount: 3 + steps: + - setBody: + expression: + constant: + expression: "Laptop,Phone,Tablet,Monitor,Keyboard" + - log: + message: "Received batch: ${body}" + - split: + expression: + tokenize: + token: "," + steps: + - log: + message: "Processing item ${headers.CamelSplitIndex}: ${body}" diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/groovy/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/language/groovy/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/groovy/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/language/groovy/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/groovy/application.properties b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/language/groovy/application.properties similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/groovy/application.properties rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/language/groovy/application.properties diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/groovy/groovy.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/language/groovy/groovy.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/groovy/groovy.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/language/groovy/groovy.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/memory-leak/MemoryLeak.java b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/memory-leak/MemoryLeak.java similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/memory-leak/MemoryLeak.java rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/memory-leak/MemoryLeak.java diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/memory-leak/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/memory-leak/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/memory-leak/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/memory-leak/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/message-size/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/message-size/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/message-size/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/message-size/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/message-size/message-size.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/message-size/message-size.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/message-size/message-size.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/message-size/message-size.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/message-size/orders.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/message-size/orders.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/message-size/orders.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/message-size/orders.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/route-topology/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/route-topology/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/route-topology/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/route-topology/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/route-topology/application.properties b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/route-topology/application.properties similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/route-topology/application.properties rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/route-topology/application.properties diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/route-topology/route-topology.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/route-topology/route-topology.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/route-topology/route-topology.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/observability/route-topology/route-topology.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/xslt/README.md b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/transformation/xslt/README.md similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/xslt/README.md rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/transformation/xslt/README.md diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/xslt/consumer.camel.yaml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/transformation/xslt/consumer.camel.yaml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/xslt/consumer.camel.yaml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/transformation/xslt/consumer.camel.yaml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/xslt/input/account.xml b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/transformation/xslt/input/account.xml similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/xslt/input/account.xml rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/transformation/xslt/input/account.xml diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/xslt/stylesheet.xsl b/dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/transformation/xslt/stylesheet.xsl similarity index 100% rename from dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/xslt/stylesheet.xsl rename to dsl/camel-jbang/camel-jbang-core/src/main/resources/examples/transformation/xslt/stylesheet.xsl
