Vincent Massol wrote:
  Sergiu,
 I don't understand this. You're doing a synchronization on an object
 that's recreated every time the method is called so it'll always have
 a different location in memory and there's no risk of contention. 
Which method are you talking about?
 On Nov 6, 2008, at 7:38 AM, sdumitriu (SVN) wrote:
> Author: sdumitriu
> Date: 2008-11-06 07:38:49 +0100 (Thu, 06 Nov 2008)
> New Revision: 14000
>
> Modified:
>   platform/core/trunk/xwiki-localization/src/main/java/org/xwiki/
> localization/internal/PulledDocumentsBundle.java
>   platform/core/trunk/xwiki-localization/src/main/java/org/xwiki/
> localization/internal/PulledFilesBundle.java
>   platform/core/trunk/xwiki-localization/src/main/java/org/xwiki/
> localization/internal/StaticDocumentsBundle.java
> Log:
> XWIKI-2811: Possible threading issues in the localization component
> Fixed.
>
>
> Modified: platform/core/trunk/xwiki-localization/src/main/java/org/
> xwiki/localization/internal/PulledDocumentsBundle.java
> ===================================================================
> --- platform/core/trunk/xwiki-localization/src/main/java/org/xwiki/
> localization/internal/PulledDocumentsBundle.java   2008-11-06 06:31:12
> UTC (rev 13999)
> +++ platform/core/trunk/xwiki-localization/src/main/java/org/xwiki/
> localization/internal/PulledDocumentsBundle.java   2008-11-06 06:38:49
> UTC (rev 14000)
> @@ -63,17 +63,19 @@
>         List<String> documentNames = (List<String>)
> this.execution.getContext().getProperty(PULLED_CONTEXT_KEY);
>         if (documentNames != null) {
>             Properties props;
> -            for (String documentName : documentNames) {
> -                try {
> -                    // The document names should contain the wiki
> prefix already.
> -                    props = getDocumentBundle(documentName,
> language);
> -                    if (props.containsKey(key)) {
> -                        translation = props.getProperty(key);
> -                        // The first translation found is returned.
> -                        break;
> +            synchronized (documentNames) {
> +                for (String documentName : documentNames) {
> +                    try {
> +                        // The document names should contain the
> wiki prefix already.
> +                        props = getDocumentBundle(documentName,
> language);
> +                        if (props.containsKey(key)) {
> +                            translation = props.getProperty(key);
> +                            // The first translation found is
> returned.
> +                            break;
> +                        }
> +                    } catch (Exception ex) {
> +                        getLogger().warn("Cannot load document
> bundle: [{0}]", documentName);
>                     }
> -                } catch (Exception ex) {
> -                    getLogger().warn("Cannot load document bundle:
> [{0}]", documentName);
>                 }
>             }
>         }
> @@ -102,7 +104,9 @@
>                 documentNames = new ArrayList<String>();
>
> this.execution.getContext().setProperty(PULLED_CONTEXT_KEY,
> documentNames);
>             }
> -            documentNames.add(documentName);
> +            synchronized (documentNames) {
> +                documentNames.add(documentName);
> +            }
>         }
>     }
>
>
> Modified: platform/core/trunk/xwiki-localization/src/main/java/org/
> xwiki/localization/internal/PulledFilesBundle.java
> ===================================================================
> --- platform/core/trunk/xwiki-localization/src/main/java/org/xwiki/
> localization/internal/PulledFilesBundle.java       2008-11-06 06:31:12 UTC
> (rev 13999)
> +++ platform/core/trunk/xwiki-localization/src/main/java/org/xwiki/
> localization/internal/PulledFilesBundle.java       2008-11-06 06:38:49 UTC
> (rev 14000)
> @@ -54,16 +54,18 @@
>         List<String> fileNames = (List<String>)
> this.execution.getContext().getProperty(PULLED_CONTEXT_KEY);
>         if (fileNames != null) {
>             Properties props;
> -            for (String fileName : fileNames) {
> -                try {
> -                    props = getFileBundle(fileName, language);
> -                    if (props.containsKey(key)) {
> -                        translation = props.getProperty(key);
> -                        // The first translation found is returned.
> -                        break;
> +            synchronized (fileNames) {
> +                for (String fileName : fileNames) {
> +                    try {
> +                        props = getFileBundle(fileName, language);
> +                        if (props.containsKey(key)) {
> +                            translation = props.getProperty(key);
> +                            // The first translation found is
> returned.
> +                            break;
> +                        }
> +                    } catch (Exception e) {
> +                        getLogger().warn("Cannot load resource
> bundle: [{0}]", fileName);
>                     }
> -                } catch (Exception e) {
> -                    getLogger().warn("Cannot load resource bundle:
> [{0}]", fileName);
>                 }
>             }
>         }
> @@ -86,7 +88,9 @@
>                 fileNames = new ArrayList<String>();
>
> this.execution.getContext().setProperty(PULLED_CONTEXT_KEY,
> fileNames);
>             }
> -            fileNames.add(bundleLocation);
> +            synchronized (fileNames) {
> +                fileNames.add(bundleLocation);
> +            }
>         }
>     }
> }
>
> Modified: platform/core/trunk/xwiki-localization/src/main/java/org/
> xwiki/localization/internal/StaticDocumentsBundle.java
> ===================================================================
> --- platform/core/trunk/xwiki-localization/src/main/java/org/xwiki/
> localization/internal/StaticDocumentsBundle.java   2008-11-06 06:31:12
> UTC (rev 13999)
> +++ platform/core/trunk/xwiki-localization/src/main/java/org/xwiki/
> localization/internal/StaticDocumentsBundle.java   2008-11-06 06:38:49
> UTC (rev 14000)
> @@ -111,7 +111,9 @@
>                     String oldBundleNames =
> StringUtils.join(this.staticBundleNames.remove(wiki), JOIN_SEPARATOR);
>                     String newBundleNames =
> StringUtils.join(this.getStaticDocumentBundles(wiki), JOIN_SEPARATOR);
>                     if (!StringUtils.equals(oldBundleNames,
> newBundleNames)) {
> -                        this.staticBundles.remove(wiki);
> +                        synchronized (this.staticBundles) {
> +                            this.staticBundles.remove(wiki);
> +                        }
>                     }
>                 }
>             } 
--
Sergiu Dumitriu
http://purl.org/net/sergiu/