[ 
https://issues.apache.org/jira/browse/CAMEL-22169?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Raymond updated CAMEL-22169:
----------------------------
    Description: 
Currently, there are a couple of ways to load resources, such as scripts, 
templates. Think of XSLT, Jsonata, Velocity, Mustache etc.

For this, the generic "Resource" loader is used. By default this is using the 
classpath, but it can also load from file, url or bean.

When using a low-code platform, GUI or other used defined thing, these 
resources are loaded on start dynamically in runtime. Because of this, the 
default "classpath" is unusable. File is also not a good option as user don't 
have access to the filesystem and you need the volumes of containers to be 
persistent.

The best option (and what we use now) is to host the resource, and then access 
the url through https.

However this means:
 - You need an additional hosting by either a third-party (let's say [Apicurio 
registry|https://www.apicur.io/registry/]

or some self host file). Yes, it can also be done in the Camel registry, but 
that's not persistent.

The result is that when you start a route, the starting of the route becomes 
dependent on this external api. So that means you not only require an extra 
tool/api/certificate, but you also need to be careful when you migrate the 
Camel configuration. For example we migrated the Camel routes from a database 
to another machine, but we forget about such files. Then the routes didn't 
start anymore.

It's also harder to test, because mostly these files are secured and you cannot 
reach them. Because they are separate from the route, the often are not 
available when a developers wants to debug the route (so he needs to get them 
and put it on the classpath or filesystem).



So when the API is not available, or the resource is not available, the route 
will not start properly. Besides, loading external resources like scripts and 
template can bring additional security configuration and issues.

I see similar limitations in Kamelets. For example mustache-action:
{code:java}
spec:
  definition:
    title: "Mustache Template Action"
    description: |-
      Apply a Mustache Template.
    required:
      - template
    type: object
    properties:
      template:
        title: Template
        description: The inline template.
        type: string
        example: "file:////template.mustache"
        pattern: "^(http|https|file|classpath)://.*"
  dependencies:
  - "camel:mustache"
  - "camel:kamelet"
  template:
    from:
      uri: "kamelet:source"
      steps:
      - to:
          uri: "mustache:"
          parameters:
            resourceUri: "{{template}}" {code}
Alternatively, you could write a custom bean:
{code:java}
public class TemplateBean {
    public String getTemplate() {
        return "Dear {{headers.lastName}}, {{headers.firstName}}\n\n" +
               "Thanks for the order of {{headers.item}}.\n\n" +
               "Regards Camel Riders Bookstore\n{{body}}";
    }
} {code}
But I think Kamelets and low-code platforms like to avoid it.

In some cases, there is a query parameter like this:

*allowTemplateFromHeader*

However, this is
 * Not generic implemented (as for example this issue show: 
https://issues.apache.org/jira/browse/CAMEL-22112)
 * Not supersafe (as now it can be overwritten by a user / external producer 
and inject code)
 * Not performant, as this means loading it on every exchange.

I would like to have it something like this:
{code:java}
 <route id="myRoute">
      <resource name="mytemplate">Dear {{headers.lastName}}, 
{{headers.firstName}}
Thanks for the order of {{headers.item}}.
Regards Camel Riders Bookstore
{{body}}
</resource>
<from uri="direct:start"/>
<to uri="mustache:ref:mytemplate"/>
</route>
{code}
 

Thus this is a bit nice to have, but as others may find it practical too, then 
it would be nice to load resources as string directly from the route on startup.

  was:
Currently, there are a couple of ways to load resources, such as scripts, 
templates. Think of XSLT, Jsonata, Velocity, Mustache etc.

For this, the generic "Resource" loader is used. By default this is using the 
classpath, but it can also load from file, url or bean.

When using a low-code platform, GUI or other used defined thing, these 
resources are loaded on start dynamically in runtime. Because of this, the 
default "classpath" is unusable. File is also not a good option as user don't 
have access to the filesystem and you need the volumes of containers to be 
persistent.

The best option (and what we use now) is to host the resource, and then access 
the url through https. 

However this means:

- You need an additional hosting by either a third-party (let's say [Apicurio 
registry|https://www.apicur.io/registry/]

or some self host file). Yes, it can also be done in the Camel registry, but 
that's not persistent.

The result is that when you start a route, the starting of the route becomes 
dependent on this external api. So that means you not only need an extra 
tool/api/certificate, but you also need to be careful when you migrate the 
Camel configuration. For example we migrated the Camel routes from a database 
to another machine, but we forget about such files. Then the routes didn't 
start anymore.

So when the API is not available, or the resource is not available, the route 
will not start properly. Besides, loading external resources like scripts and 
template can bring additional security configuration and issues.

I see similar limitations in Kamelets. For example mustache-action:


{code:java}
spec:
  definition:
    title: "Mustache Template Action"
    description: |-
      Apply a Mustache Template.
    required:
      - template
    type: object
    properties:
      template:
        title: Template
        description: The inline template.
        type: string
        example: "file:////template.mustache"
        pattern: "^(http|https|file|classpath)://.*"
  dependencies:
  - "camel:mustache"
  - "camel:kamelet"
  template:
    from:
      uri: "kamelet:source"
      steps:
      - to:
          uri: "mustache:"
          parameters:
            resourceUri: "{{template}}" {code}

Alternatively, you could write a custom bean:


{code:java}
public class TemplateBean {
    public String getTemplate() {
        return "Dear {{headers.lastName}}, {{headers.firstName}}\n\n" +
               "Thanks for the order of {{headers.item}}.\n\n" +
               "Regards Camel Riders Bookstore\n{{body}}";
    }
} {code}

But I think Kamelets and low-code platforms like to avoid it.

In some cases, there is a query parameter like this:

*allowTemplateFromHeader*

However, this is
 * Not generic implemented (as for example this issue show: 
https://issues.apache.org/jira/browse/CAMEL-22112)
 * Not supersafe (as now it can be overwritten by a user / external producer 
and inject code)
 * Not performant, as this means loading it on every exchange. 

I would like to have it something like this:

{code:java}
 <route id="myRoute">
      <resource name="mytemplate">Dear {{headers.lastName}}, 
{{headers.firstName}}
Thanks for the order of {{headers.item}}.
Regards Camel Riders Bookstore
{{body}}
</resource>
<from uri="direct:start"/>
<to uri="mustache:ref:mytemplate"/>
</route>
{code}
 


Thus this is a bit nice to have, but as others may find it practical too, then 
it would be nice to load resources as string directly from the route on startup.


> Load resources dynamically from strings or exchange
> ---------------------------------------------------
>
>                 Key: CAMEL-22169
>                 URL: https://issues.apache.org/jira/browse/CAMEL-22169
>             Project: Camel
>          Issue Type: Wish
>          Components: came-core
>    Affects Versions: 4.12.0
>            Reporter: Raymond
>            Priority: Minor
>
> Currently, there are a couple of ways to load resources, such as scripts, 
> templates. Think of XSLT, Jsonata, Velocity, Mustache etc.
> For this, the generic "Resource" loader is used. By default this is using the 
> classpath, but it can also load from file, url or bean.
> When using a low-code platform, GUI or other used defined thing, these 
> resources are loaded on start dynamically in runtime. Because of this, the 
> default "classpath" is unusable. File is also not a good option as user don't 
> have access to the filesystem and you need the volumes of containers to be 
> persistent.
> The best option (and what we use now) is to host the resource, and then 
> access the url through https.
> However this means:
>  - You need an additional hosting by either a third-party (let's say 
> [Apicurio registry|https://www.apicur.io/registry/]
> or some self host file). Yes, it can also be done in the Camel registry, but 
> that's not persistent.
> The result is that when you start a route, the starting of the route becomes 
> dependent on this external api. So that means you not only require an extra 
> tool/api/certificate, but you also need to be careful when you migrate the 
> Camel configuration. For example we migrated the Camel routes from a database 
> to another machine, but we forget about such files. Then the routes didn't 
> start anymore.
> It's also harder to test, because mostly these files are secured and you 
> cannot reach them. Because they are separate from the route, the often are 
> not available when a developers wants to debug the route (so he needs to get 
> them and put it on the classpath or filesystem).
> So when the API is not available, or the resource is not available, the route 
> will not start properly. Besides, loading external resources like scripts and 
> template can bring additional security configuration and issues.
> I see similar limitations in Kamelets. For example mustache-action:
> {code:java}
> spec:
>   definition:
>     title: "Mustache Template Action"
>     description: |-
>       Apply a Mustache Template.
>     required:
>       - template
>     type: object
>     properties:
>       template:
>         title: Template
>         description: The inline template.
>         type: string
>         example: "file:////template.mustache"
>         pattern: "^(http|https|file|classpath)://.*"
>   dependencies:
>   - "camel:mustache"
>   - "camel:kamelet"
>   template:
>     from:
>       uri: "kamelet:source"
>       steps:
>       - to:
>           uri: "mustache:"
>           parameters:
>             resourceUri: "{{template}}" {code}
> Alternatively, you could write a custom bean:
> {code:java}
> public class TemplateBean {
>     public String getTemplate() {
>         return "Dear {{headers.lastName}}, {{headers.firstName}}\n\n" +
>                "Thanks for the order of {{headers.item}}.\n\n" +
>                "Regards Camel Riders Bookstore\n{{body}}";
>     }
> } {code}
> But I think Kamelets and low-code platforms like to avoid it.
> In some cases, there is a query parameter like this:
> *allowTemplateFromHeader*
> However, this is
>  * Not generic implemented (as for example this issue show: 
> https://issues.apache.org/jira/browse/CAMEL-22112)
>  * Not supersafe (as now it can be overwritten by a user / external producer 
> and inject code)
>  * Not performant, as this means loading it on every exchange.
> I would like to have it something like this:
> {code:java}
>  <route id="myRoute">
>       <resource name="mytemplate">Dear {{headers.lastName}}, 
> {{headers.firstName}}
> Thanks for the order of {{headers.item}}.
> Regards Camel Riders Bookstore
> {{body}}
> </resource>
> <from uri="direct:start"/>
> <to uri="mustache:ref:mytemplate"/>
> </route>
> {code}
>  
> Thus this is a bit nice to have, but as others may find it practical too, 
> then it would be nice to load resources as string directly from the route on 
> startup.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to