[
https://issues.apache.org/jira/browse/SLING-2477?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13587796#comment-13587796
]
Ian Boston commented on SLING-2477:
-----------------------------------
(apologies for saying "consensus" earlier).
To summarise both approaches.
name{type} approach:
-------------------------------
The Valid mappings for property names are:
Valid Property name type combinations:
property name: JCR Type, java Type
name{byte}: long, byte
name{short}: long, short
name{int}: long, int
name{float}: double, float
name{char}: string, char
name: string, string
name: long, long
name: double, double
name: boolean, boolean
If any {type} JCR type mapping not in this list is found, the whole config is
rejected.
When writing back:
If the java type is one of byte,short,int, float,char then all matching
properties of the form "name" and "name{type}" are deleted and a property of
the form name{byte|short|int|float|char} is created of the appropriate type.
(reusing existing if possible).
If the java type is one of string, long, double, boolean then all matching
properties of the form "name" and "name{type}" are deleted and a property of
the form "name" is created with the appropriate type (if "name" of the
appropriate types exists, its reused)
Conversion from sling:OsgiConfig storage to OutputStream or Writer will:
where the type is {byte}, {short}, {int}, {float}, {char} change the name
to remove the {type} and write out in x"*", s"*", i"*", f"*", c"*" format.
where the type is long, double, boolean keep the name and write out in
l"*",d"*",b"*" format
where the type is string and matches the value matches the pattern
/^([TIiLlFfDdSsXxCcBb])\"(.*)\"/ keep the name and write the value out as T"*"
ie T"T"text""
where the type is string and does not match the pattern
/^([TIiLlFfDdSsXxCcBb])\"(.*)\"/ keep the name and write the value out.
Conversion from InputStream or Reader will read I"100" format and write
name{type} format.
where the value matches /^([IiFfSsXxCc])\"(.*)\"/ create a propery with
name{int|float|short|byte|char} and write the encoded value.
where the value matches /^([TLlDdBb])\"(.*)\"/ create a property of type
string,long,double,boolean and set the raw value.
where there is no match, create a property of the same name, type string and
write the raw value.
In all cases where special handling has to be performed for arrays.
I"100" approach:
--------------------------------------------
Name, JCR Types, Java type
name: long, long
name: double, double
name: boolean, boolean
name: string, string where no match found for
/^([TIiLlFfDdSsXxCcBb])\"(.*)\"/
name: string, string where matching for /^(T)\"(.*)\"/
name: string, integer where matching for /^([Ii])\"(.*)\"/
name: string, float where matching for /^([Ff])\"(.*)\"/
name: string, short where matching for /^([Ss])\"(.*)\"/
name: string, byte where matching for /^([Xx])\"(.*)\"/
name: string, character where matching for /^([Cc])\"(.*)\"/
(optional if write back is not to change the type of a property from what a
user set the value to)
name: string, long where matching for /^([Ll])\"(.*)\"/
name: string, double where matching for /^([Dd])\"(.*)\"/
name: string, boolean where matching for /^([Bb])\"(.*)\"/
Write back:
If the name exists and is a string then the appropriate I"100" format is
used.
For types of string matching /^([TIiLlFfDdSsXxCcBb])\"(.*)\"/ the value is
encoded as T"<value>"
For types of long, double, boolean if the name does not exist an appropriate
JCR property is created.
For all other types a string property is created with the appropriate I"100"
format.
Conversion from sling:OsgiConfig to OutputStream or Writer will convert types
long, double, boolean to the I"100" format, no name conversion required.
Conversion from InputStream or Reader will
where the value matches /^([LlDdBb])\"(.*)\"/ create a jcr property of the
same name and type long, double, boolean with the extracted value, if the
property exists and is a string, reuse it with the string format.
for all other values create a string property of the same name and set the
value.
In all cases where special handling has to be performed for arrays.
--------------------------------------------------------
My view (non binding :)) having just written the above is that the I"100"
approach requires fewer rules and transitions to implement than the name{type}
approach, which will require good unit test coverage to ensure a user can
always edit a sling:OsgiConfig node and its properties, without ending up in a
invalid state.
I will create a Jira to track documentation of whatever approach is chosen
since AFAICT neither are documented.
> Configuration via sling:OsgiConfig nodes does not support all types
> -------------------------------------------------------------------
>
> Key: SLING-2477
> URL: https://issues.apache.org/jira/browse/SLING-2477
> Project: Sling
> Issue Type: Bug
> Components: Installer
> Affects Versions: JCR Installer 3.1.2
> Reporter: Alexander Klimetschek
> Assignee: Ian Boston
> Attachments: SLING-2477.patch
>
>
> Most notably, the common "service.ranking" needs to be an Integer, while the
> jcr property mapping only allows for "Long" types at the moment. The problem
> is that JCR has a smaller set of property types than the OSGi config admin
> (JCR: String, Boolean, Long, Double, Decimal; OSGi: String, Boolean, Long,
> Integer, Float, Double, and probably more differences...).
> Similarly to properties files (which do it in the value like
> 'service.ranking=I"-10000"' with I=Integer), there must be a way to
> explicitly specify the type regardless of the JCR type. For example, encoding
> it in the property name like "service.ranking{int}".
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira