This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch blueprint in repository https://gitbox.apache.org/repos/asf/camel.git
commit e649eba609e6930025a0ca6fcad70cf7988a3b7e Author: Claus Ibsen <[email protected]> AuthorDate: Wed Aug 30 07:41:14 2023 +0200 CAMEL-19806: camel-jbang - Allow to load OSGi <blueprint> with embedded <camelContext> --- .../apache/camel/model/app/BeansDefinition.java | 14 +++++ .../java/org/apache/camel/xml/in/ModelParser.java | 14 ++++- .../java/org/apache/camel/xml/out/ModelWriter.java | 3 +- .../java/org/apache/camel/xml/in/BaseParser.java | 70 ++++++++++++++-------- .../org/apache/camel/yaml/out/ModelWriter.java | 3 +- .../apache/camel/dsl/jbang/core/commands/Run.java | 2 +- .../java/org/apache/camel/main/KameletMain.java | 35 +++++++---- .../apache/camel/dsl/xml/io/XmlModelParser.java | 20 +++++-- .../camel/dsl/xml/io/XmlRoutesBuilderLoader.java | 15 ++++- .../camel/dsl/xml/io/XmlBlueprintLoadTest.java | 39 ++++++++++++ .../apache/camel/dsl/xml/io/blueprintRoutes.xml | 50 ++++++++++++++++ .../packaging/ModelXmlParserGeneratorMojo.java | 4 +- 12 files changed, 219 insertions(+), 50 deletions(-) diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/app/BeansDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/app/BeansDefinition.java index debe7c0a9f0..a8230ccff11 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/app/BeansDefinition.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/app/BeansDefinition.java @@ -52,6 +52,7 @@ import org.apache.camel.spi.annotations.ExternalSchemaElement; "componentScanning", "beans", "springBeans", + "blueprintBeans", "restConfigurations", "rests", "routeConfigurations", @@ -82,6 +83,11 @@ public class BeansDefinition { documentElement = "beans") @XmlAnyElement private List<Element> springBeans = new ArrayList<>(); + @ExternalSchemaElement(names = { "bean" }, + namespace = "http://www.osgi.org/xmlns/blueprint/v1.0.0", + documentElement = "blueprint") + @XmlAnyElement + private List<Element> blueprintBeans = new ArrayList<>(); // the order comes from <camelContext> (org.apache.camel.spring.xml.CamelContextFactoryBean) // to make things less confusing, as it's not easy to simply tell JAXB to use <xsd:choice maxOccurs="unbounded"> @@ -127,6 +133,14 @@ public class BeansDefinition { this.springBeans = springBeans; } + public List<Element> getBlueprintBeans() { + return blueprintBeans; + } + + public void setBlueprintBeans(List<Element> blueprintBeans) { + this.blueprintBeans = blueprintBeans; + } + public List<RestConfigurationDefinition> getRestConfigurations() { return restConfigurations; } diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java index 074c655829e..d8890ea2ce6 100644 --- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java +++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java @@ -1568,7 +1568,7 @@ public class ModelParser extends BaseParser { } public Optional<ApplicationDefinition> parseApplicationDefinition() throws IOException, XmlPullParserException { - String tag = getNextTag("beans", "camel"); + String tag = getNextTag("beans", "blueprint", "camel"); if (tag != null) { return Optional.of(doParseApplicationDefinition()); } @@ -1580,7 +1580,7 @@ public class ModelParser extends BaseParser { } public Optional<BeansDefinition> parseBeansDefinition() throws IOException, XmlPullParserException { - String tag = getNextTag("beans", "camel"); + String tag = getNextTag("beans", "blueprint", "camel"); if (tag != null) { return Optional.of(doParseBeansDefinition()); } @@ -1588,7 +1588,15 @@ public class ModelParser extends BaseParser { } protected <T extends BeansDefinition> ElementHandler<T> beansDefinitionElementHandler() { return (def, key) -> { - if ("http://www.springframework.org/schema/beans".equals(parser.getNamespace())) { + if ("http://www.osgi.org/xmlns/blueprint/v1.0.0".equals(parser.getNamespace())) { + Element el = doParseDOMElement("blueprint", "http://www.osgi.org/xmlns/blueprint/v1.0.0", def.getBlueprintBeans()); + if (el != null) { + doAddElement(el, def.getBlueprintBeans(), def::setBlueprintBeans); + return true; + } + return false; + } + else if ("http://www.springframework.org/schema/beans".equals(parser.getNamespace())) { Element el = doParseDOMElement("beans", "http://www.springframework.org/schema/beans", def.getSpringBeans()); if (el != null) { doAddElement(el, def.getSpringBeans(), def::setSpringBeans); diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java index 3b2487ee6d6..2e89e6409c4 100644 --- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java +++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java @@ -2519,9 +2519,10 @@ public class ModelWriter extends BaseWriter { throws IOException { doWriteList(null, "route", def.getRoutes(), this::doWriteRouteDefinition); domElements(def.getSpringBeans()); - doWriteList(null, "restConfiguration", def.getRestConfigurations(), this::doWriteRestConfigurationDefinition); + domElements(def.getBlueprintBeans()); doWriteList(null, "component-scan", def.getComponentScanning(), this::doWriteComponentScanDefinition); doWriteList(null, "bean", def.getBeans(), this::doWriteRegistryBeanDefinition); + doWriteList(null, "restConfiguration", def.getRestConfigurations(), this::doWriteRestConfigurationDefinition); doWriteList(null, "rest", def.getRests(), this::doWriteRestDefinition); doWriteList(null, "routeConfiguration", def.getRouteConfigurations(), this::doWriteRouteConfigurationDefinition); doWriteList(null, "routeTemplate", def.getRouteTemplates(), this::doWriteRouteTemplateDefinition); diff --git a/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/BaseParser.java b/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/BaseParser.java index b811d62c339..33caa7cd943 100644 --- a/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/BaseParser.java +++ b/core/camel-xml-io/src/main/java/org/apache/camel/xml/in/BaseParser.java @@ -16,12 +16,29 @@ */ package org.apache.camel.xml.in; +import org.apache.camel.LineNumberAware; +import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.spi.NamespaceAware; +import org.apache.camel.spi.Resource; +import org.apache.camel.util.ObjectHelper; +import org.apache.camel.util.URISupport; +import org.apache.camel.xml.io.MXParser; +import org.apache.camel.xml.io.XmlPullParser; +import org.apache.camel.xml.io.XmlPullParserException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Text; + +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.util.ArrayList; import java.util.Arrays; import java.util.Base64; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -31,29 +48,11 @@ import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Text; - -import org.apache.camel.LineNumberAware; -import org.apache.camel.model.language.ExpressionDefinition; -import org.apache.camel.spi.NamespaceAware; -import org.apache.camel.spi.Resource; -import org.apache.camel.util.ObjectHelper; -import org.apache.camel.util.URISupport; -import org.apache.camel.xml.io.MXParser; -import org.apache.camel.xml.io.XmlPullParser; -import org.apache.camel.xml.io.XmlPullParserException; - public class BaseParser { protected final MXParser parser; protected String namespace; - protected String secondNamespace = ""; + protected Set<String> secondaryNamespaces = new HashSet<>(); protected Resource resource; public BaseParser(Resource resource) throws IOException, XmlPullParserException { @@ -88,8 +87,8 @@ public class BaseParser { this.namespace = namespace != null ? namespace : ""; } - public void addSecondNamespace(String secondNamespace) { - this.secondNamespace = secondNamespace; + public void addSecondaryNamespace(String namespace) { + this.secondaryNamespaces.add(namespace); } protected <T> T doParse( @@ -368,6 +367,20 @@ public class BaseParser { return pn; } + protected String getNextTag(String name, String name2, String name3) throws XmlPullParserException, IOException { + if (parser.nextTag() != XmlPullParser.START_TAG) { + throw new XmlPullParserException("Expected starting tag"); + } + + String pn = parser.getName(); + boolean match = Objects.equals(name, pn) || Objects.equals(name2, pn) || Objects.equals(name3, pn);; + if (!match || !matchNamespace(namespace, parser.getNamespace(), null, false)) { + return ""; // empty tag + } + + return pn; + } + protected void handleOtherAttribute(Object definition, String name, String ns, String val) throws XmlPullParserException { // Ignore if ("http://www.w3.org/2001/XMLSchema-instance".equals(ns)) { @@ -465,15 +478,22 @@ public class BaseParser { } protected boolean matchNamespace(String ns, boolean optional) { - return matchNamespace(ns, namespace, secondNamespace, optional); + return matchNamespace(ns, namespace, secondaryNamespaces, optional); } - protected static boolean matchNamespace(String ns, String namespace, String namespace2, boolean optional) { + protected static boolean matchNamespace(String ns, String namespace, Set<String> secondaryNamespaces, boolean optional) { if (optional && ns.isEmpty()) { return true; } - - return Objects.equals(ns, namespace) || Objects.equals(ns, namespace2); + if (Objects.equals(ns, namespace)) { + return true; + } + for (String second : secondaryNamespaces) { + if (Objects.equals(ns, second)) { + return true; + } + } + return false; } } diff --git a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java index 3ab7d56d7d0..3010257af60 100644 --- a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java +++ b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java @@ -2519,9 +2519,10 @@ public class ModelWriter extends BaseWriter { throws IOException { doWriteList(null, "route", def.getRoutes(), this::doWriteRouteDefinition); domElements(def.getSpringBeans()); - doWriteList(null, "restConfiguration", def.getRestConfigurations(), this::doWriteRestConfigurationDefinition); + domElements(def.getBlueprintBeans()); doWriteList(null, "component-scan", def.getComponentScanning(), this::doWriteComponentScanDefinition); doWriteList(null, "bean", def.getBeans(), this::doWriteRegistryBeanDefinition); + doWriteList(null, "restConfiguration", def.getRestConfigurations(), this::doWriteRestConfigurationDefinition); doWriteList(null, "rest", def.getRests(), this::doWriteRestDefinition); doWriteList(null, "routeConfiguration", def.getRouteConfigurations(), this::doWriteRouteConfigurationDefinition); doWriteList(null, "routeTemplate", def.getRouteTemplates(), this::doWriteRouteTemplateDefinition); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java index d4025154fd3..cf96925bb74 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java @@ -93,7 +93,7 @@ public class Run extends CamelCommand { "templatedRoute", "templatedRoutes", "rest", "rests", "routeConfiguration", - "beans", "camel" + "beans", "blueprint", "camel" }; private static final Set<String> ACCEPTED_XML_ROOT_ELEMENTS diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java index e437b035c2f..c2f947f032f 100644 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java @@ -679,26 +679,41 @@ public class KameletMain extends MainCommandLineSupport { @Override protected void preProcessCamelRegistry(CamelContext camelContext, MainConfigurationProperties config) { - // camel-kamelet-main has access to Spring libraries, so we can grab XML documents representing - // actual Spring Beans and read them using Spring's BeanFactory to populate Camel registry - final Map<String, Document> xmls = new TreeMap<>(); + final Map<String, Document> springXmls = new TreeMap<>(); + final Map<String, Document> blueprintXmls = new TreeMap<>(); - Map<String, Document> springBeansDocs = registry.findByTypeWithName(Document.class); - if (springBeansDocs != null) { - springBeansDocs.forEach((id, doc) -> { + Map<String, Document> xmlDocs = registry.findByTypeWithName(Document.class); + if (xmlDocs != null) { + xmlDocs.forEach((id, doc) -> { if (id.startsWith("camel-xml-io-dsl-spring-xml:")) { - xmls.put(id, doc); + springXmls.put(id, doc); + } else if (id.startsWith("camel-xml-io-dsl-blueprint-xml:")) { + blueprintXmls.put(id, doc); } }); } - - if (!xmls.isEmpty()) { - processSpringBeans(camelContext, config, xmls); + if (!springXmls.isEmpty()) { + // camel-kamelet-main has access to Spring libraries, so we can grab XML documents representing + // actual Spring Beans and read them using Spring's BeanFactory to populate Camel registry + processSpringBeans(camelContext, config, springXmls); + } + if (!blueprintXmls.isEmpty()) { + processBlueprintBeans(camelContext, config, blueprintXmls); } } + private void processBlueprintBeans( + CamelContext camelContext, MainConfigurationProperties config, final Map<String, Document> xmls) { + + LOG.debug("Loading beans from legacy OSGi <blueprint> XML"); + // TODO: detect and process beans + } + private void processSpringBeans( CamelContext camelContext, MainConfigurationProperties config, final Map<String, Document> xmls) { + + LOG.debug("Loading beans from classic Spring <beans> XML"); + // we _could_ create something like org.apache.camel.spring.spi.ApplicationContextBeanRepository, but // wrapping DefaultListableBeanFactory and use it as one of the // org.apache.camel.support.DefaultRegistry.repositories, but for now let's use it to populate diff --git a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlModelParser.java b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlModelParser.java index b440e0a90ce..fde9a848027 100644 --- a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlModelParser.java +++ b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlModelParser.java @@ -23,23 +23,31 @@ import org.apache.camel.xml.in.ModelParser; import org.apache.camel.xml.io.XmlPullParserException; /** - * XML {@link ModelParser} that supports loading classic Spring XML <beans> with embedded <camelContext>, with limited - * parsing, to discover <routes> inside <camelContext>. + * XML {@link ModelParser} that supports loading: + * <ul> + * <li>Standard Camel XML DSL</li> + * <li>Classic Spring XML <beans> with embedded <camelContext> (limited parsing, to discover <routes> inside + * <camelContext>)</li> + * <li>Legacy OSGi <blueprint> with embedded <camelContext> (limited parsing, to discover <routes> inside + * <camelContext>)</li> + * </ul> */ public class XmlModelParser extends ModelParser { private static final String SPRING_NS = "http://camel.apache.org/schema/spring"; + private static final String BLUEPRINT_NS = "http://camel.apache.org/schema/blueprint"; public XmlModelParser(Resource input, String namespace) throws IOException, XmlPullParserException { super(input, namespace); - addSecondNamespace(SPRING_NS); + addSecondaryNamespace(SPRING_NS); + addSecondaryNamespace(BLUEPRINT_NS); } @Override protected boolean handleUnexpectedElement(String namespace, String name) throws XmlPullParserException { - // accept embedded <camelContext> inside Spring XML <beans> files, so we can discover - // embedded <routes> inside this <camelContext>. - if ("camelContext".equals(name) && SPRING_NS.equals(namespace)) { + // accept embedded <camelContext> inside Spring XML <beans> files or OSGi <blueprint> files, + // so we can discover embedded <routes> inside this <camelContext>. + if ("camelContext".equals(name) && (SPRING_NS.equals(namespace) || BLUEPRINT_NS.equals(namespace))) { return true; } return super.handleUnexpectedElement(namespace, name); diff --git a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java index bae6983dbac..3dace301432 100644 --- a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java +++ b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java @@ -89,7 +89,7 @@ public class XmlRoutesBuilderLoader extends RouteBuilderLoaderSupport { XmlStreamInfo xmlInfo = xmlInfo(resource); if (xmlInfo.isValid()) { String root = xmlInfo.getRootElementName(); - if ("beans".equals(root) || "camel".equals(root)) { + if ("beans".equals(root) || "blueprint".equals(root) || "camel".equals(root)) { new XmlModelParser(resource, xmlInfo.getRootElementNamespace()) .parseBeansDefinition() .ifPresent(bd -> { @@ -116,7 +116,7 @@ public class XmlRoutesBuilderLoader extends RouteBuilderLoaderSupport { public void configure() throws Exception { String resourceLocation = input.getLocation(); switch (xmlInfo.getRootElementName()) { - case "beans", "camel" -> { + case "beans", "blueprint", "camel" -> { BeansDefinition def = camelAppCache.get(resourceLocation); if (def != null) { configureCamel(def); @@ -298,6 +298,17 @@ public class XmlRoutesBuilderLoader extends RouteBuilderLoaderSupport { String id = String.format("camel-xml-io-dsl-spring-xml:%05d:%s", counter.incrementAndGet(), resource.getLocation()); getCamelContext().getRegistry().bind(id, doc); } + + // <s:bean> elements - all the elements in single BeansDefinition have + // one parent org.w3c.dom.Document - and this is what we collect from each resource + if (!app.getBlueprintBeans().isEmpty()) { + Document doc = app.getBlueprintBeans().get(0).getOwnerDocument(); + // bind as Document, to be picked up later - bean id allows nice sorting + // (can also be single ID - documents will get collected in LinkedHashMap, so we'll be fine) + String id = String.format("camel-xml-io-dsl-blueprint-xml:%05d:%s", counter.incrementAndGet(), + resource.getLocation()); + getCamelContext().getRegistry().bind(id, doc); + } } /** diff --git a/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/XmlBlueprintLoadTest.java b/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/XmlBlueprintLoadTest.java new file mode 100644 index 00000000000..123f19bff39 --- /dev/null +++ b/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/XmlBlueprintLoadTest.java @@ -0,0 +1,39 @@ +/* + * 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.xml.io; + +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.spi.Resource; +import org.apache.camel.support.PluginHelper; +import org.junit.jupiter.api.Test; + +public class XmlBlueprintLoadTest { + + @Test + public void testLoadRoutesBuilderFromXml() throws Exception { + try (DefaultCamelContext context = new DefaultCamelContext()) { + // load OSGi blueprint XML <blueprint> with embedded <camelContext> + Resource resource = PluginHelper.getResourceLoader(context).resolveResource( + "/org/apache/camel/dsl/xml/io/blueprintRoutes.xml"); + + PluginHelper.getRoutesLoader(context).loadRoutes(resource); + + // should be able to parse the file and not fail (camel-jbang supports creating spring beans) + } + } + +} diff --git a/dsl/camel-xml-io-dsl/src/test/resources/org/apache/camel/dsl/xml/io/blueprintRoutes.xml b/dsl/camel-xml-io-dsl/src/test/resources/org/apache/camel/dsl/xml/io/blueprintRoutes.xml new file mode 100644 index 00000000000..96515d8c48f --- /dev/null +++ b/dsl/camel-xml-io-dsl/src/test/resources/org/apache/camel/dsl/xml/io/blueprintRoutes.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + 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. + +--> +<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> + + <!-- spring beans --> + <bean id="orderService" class="com.foo.OrderService"> + <argument index="0" value="true"/> + <argument index="1" ref="office"/> + </bean> + <!-- uses blueprint property placeholder ${xxx} syntax --> + <bean id="office" class="com.foo.Address"> + <property name="zip" value="${zipCode}"/> + <property name="street" value="${streetName}"/> + </bean> + + <!-- embed Camel with routes --> + <camelContext xmlns="http://camel.apache.org/schema/blueprint"> + + <route> + <from uri="timer:xml?period={{time:1000}}"/> + <setBody> + <simple>${random(1000)}</simple> + </setBody> + <bean ref="orderService"/> + <log message="${body}"/> + </route> + + </camelContext> + +</blueprint> diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java index 36db5315cf6..c2a5c7cb5ed 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java @@ -594,7 +594,9 @@ public class ModelXmlParserGeneratorMojo extends AbstractGeneratorMojo { .setName("parse" + name) .addThrows(IOException.class) .addThrows(XML_PULL_PARSER_EXCEPTION) - .setBody(String.format("String tag = getNextTag(\"%s\", \"%s\");", "beans", "camel"), + .setBody( + String.format("String tag = getNextTag(\"%s\", \"%s\", \"%s\");", "beans", "blueprint", + "camel"), "if (tag != null) {", String.format(" return Optional.of(doParse%s());", name), "}",
