Hi everyone,

I've been working on a blueprint based applications for soem weeks and
I had to deal with a number of properties placeholders so I've used
camel-properties and I found some issues/limitation for which I've
raised the following JIRA:

1. CAMEL-10352: Optionally delegate to Aries PropertyEvaluator services
   in BlueprintPropertiesParser
2. CAMEL-10393: Add an option to disable using default value if a
   property does not exists
3. CAMEL-10417: Support adding location using child nodes of
   propertyPlaceholder element
4. CAMEL-10419: Allow to individually set whether to silently ignore a
   missing location


CAMEL-10352 and CAMEL-10393 have already been merged and I've just
completed the implementation of CAMEL-10417 and CAMEL-10419 which you
can find in my fork:

    https://github.com/lburgazzoli/apache-camel/tree/camel-properties


Before merge it I'd like to have your opinion as there are some small
changes about the XML configuration I'm going to highlight here:

1. As today, you can customize the property placeholders with the tag
   propertyPlaceholder where the attribute location is mandatory and
   that is fine untill you just want to register your own function in
   blueprint which lead to something like that:

   <propertyPlaceholder
     id="myPropertyPlaceholder"
     location="none"
     ignoreMissingLocation="true">

    <propertiesFunction ref="beerFunction"/>

   </propertyPlaceholder>

   So you may think that you have no locations set but that is not true
   because by default camel-blueprint detects OSGi blueprint property
   placeholders services and add them to the mix. Of course you can
   disable such behavior but I found this a little bit confusing so I
   made it not more mandatory (in fact that is the same behavior you'd
   have if you define a PropertiesComponent bean instead of using the
   propertyPlaceholder tag) and now you can now write it as:

   <propertyPlaceholder id="myPropertyPlaceholder">
    <propertiesFunction ref="beerFunction"/>
   </propertyPlaceholder>

2. As today to add new properties placeholder locations you need to set
   them with the location attribute using comma as separator and this
   work just fine but it may result confusing if you need to deal with a
   number of properties files. In addition you can't set which location
   is required and which may be missing as the option to ignore missing
   location is global so I've enhanced the propertyPlaceholder tag in a
   way you can add locations as:

   <propertyPlaceholder id="myPropertyPlaceholder">

    <propertiesLocation
      resolver = "classpath"
      path     = "com/my/company/something/my-properties-1.properties"
      optional = "false"/>

    <propertiesLocation
      resolver = "classpath"
      path     = "com/my/company/something/my-properties-2.properties"
      optional = "false"/>

    <propertiesLocation
      resolver = "file"
      path     = "${karaf.home}/etc/my-override.properties"
      optional = "true"/>

   </propertyPlaceholder>

   Note that the attribute resolver and optional are not mandatory and
   have classpath and false as default value respectivley.

   Of course setting locations via location attribute is still supported
   and it has been enhanced to support additional attributes, i.e.:

   <propertyPlaceholder
       id="myPropertyPlaceholder"
       location="file:${karaf.home}/etc/my.properties;optional=true"/>

   Note that the locations defined by the propertiesLocation tag are
   added to those defined in location attribute.


Any objection/suggestion on such implementation ?


Regards,
Luca

---
Luca Burgazzoli

Reply via email to