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

Adrian Crum updated OFBIZ-1485:
-------------------------------

    Attachment: props_tng.patch

While I was working on adding the XML properties file capability to 
UtilProperties, I noticed a few things about the UtilProperties class that 
bothered me. After the initial XML properties support was committed (rev 
599356) I went back to the UtilProperties class to work on those issues.

#1 The caching algorithm in getInternalRbmWrapper(...) (line 493) - could 
potentially store multiple copies of the same ResourceBundle in the cache.
#2 The getProperties(String resource, Locale locale) method wasn't fully 
implemented (see notes at line 546).

Issue #1 was easy to fix - I just used the ResourceBundle.getLocale() method to 
do a second cache lookup, around line 506. If one was found, I cached the new 
key with the existing bundle. Now multiple locales could share a single 
ResourceBundle instance. There was still the potential to have multiple copies 
of the same ResourceBundle though. I'll get back to that later.

The solution to issue #2 was obvious - UtilProperties needed a properties file 
location resolver. I already had one working in the XmlResourceBundle inner 
class, so I just moved that code from the inner class to the outer class. I did 
the same for the XML properties file to Map conversion code.

At this point, everything was working well - but something else started to 
bother me. Why does UtilProperties have three caches? They all contain 
basically the same thing. Technically, UtilProperties only needs two - one for 
non-locale-specific properties, and one for locale-specific properties. I 
changed the code a bit so that the ResourceBundle cache wasn't needed - I wrote 
a method that wraps a XmlResourceBundle (renamed to UtilResourceBundle) 
instance around an existing cached properties object. Methods that need a 
ResourceBundle call the wrapper method. That eliminated one cache. That also 
solved the issue that bugged me about the multiple same ResourceBundle 
instances in the cache.

Now that the code was reduced down to two caches of FlexibleProperties objects, 
I started to look at the FlexibleProperties class to see if there was a way to 
convert it to a Javalution FastMap. So I traced through the 
UtilProperties-to-FlexibleProperties code. I determined that the 
FlexibleProperties object contributes nothing to the UtilProperties class. I 
converted all references to FlexibleProperties to plain Maps, and used the 
Javalution FastMap for new instances.

The final step was to rewrite bits of code so that UtilProperties would pass 
around Maps internally, and only use the Properties class when one is requested.

The attached patch is the result. I have used it for about a week - it seems to 
work well. The performance gains, memory savings, etc will have to be 
determined by real-world installations.

Comments are welcome.


> UtilProperties - The Next Generation
> ------------------------------------
>
>                 Key: OFBIZ-1485
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-1485
>             Project: OFBiz
>          Issue Type: Improvement
>          Components: framework
>            Reporter: Adrian Crum
>            Priority: Minor
>         Attachments: props_tng.patch
>
>
> Improve the UtilProperties class. Details in comments.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to