You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by an...@apache.org on 2011/12/19 15:06:00 UTC

svn commit: r1220753 - /cocoon/cocoon3/trunk/cocoon-sax/src/main/java/org/apache/cocoon/sax/component/I18nTransformer.java

Author: andreas
Date: Mon Dec 19 14:06:00 2011
New Revision: 1220753

URL: http://svn.apache.org/viewvc?rev=1220753&view=rev
Log:
Support custom encodings for i18n resource bundles.

Modified:
    cocoon/cocoon3/trunk/cocoon-sax/src/main/java/org/apache/cocoon/sax/component/I18nTransformer.java

Modified: cocoon/cocoon3/trunk/cocoon-sax/src/main/java/org/apache/cocoon/sax/component/I18nTransformer.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-sax/src/main/java/org/apache/cocoon/sax/component/I18nTransformer.java?rev=1220753&r1=1220752&r2=1220753&view=diff
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-sax/src/main/java/org/apache/cocoon/sax/component/I18nTransformer.java (original)
+++ cocoon/cocoon3/trunk/cocoon-sax/src/main/java/org/apache/cocoon/sax/component/I18nTransformer.java Mon Dec 19 14:06:00 2011
@@ -13,6 +13,11 @@
  */
 package org.apache.cocoon.sax.component;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
 import java.text.DateFormat;
 import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
@@ -26,9 +31,12 @@ import java.util.HashSet;
 import java.util.Locale;
 import java.util.Map;
 import java.util.MissingResourceException;
+import java.util.PropertyResourceBundle;
 import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.StringTokenizer;
+import java.util.ResourceBundle.Control;
+
 import org.apache.cocoon.pipeline.SetupException;
 import org.apache.cocoon.pipeline.caching.CacheKey;
 import org.apache.cocoon.pipeline.caching.ParameterCacheKey;
@@ -559,6 +567,16 @@ public class I18nTransformer extends Abs
     public static final String PARAM_UNTRANSLATED = "untranslated-text";
 
     /**
+     * The encoding of the resource bundle files.
+     */
+    public static final String PARAM_ENCODING = "encoding";
+
+    /**
+     * The default encoding of the resource bundle files.
+     */
+    public static final String DEFAULT_ENCODING = "ISO-8859-1";
+
+    /**
      * States of the transformer.
      */
     private enum TransformerState {
@@ -630,7 +648,7 @@ public class I18nTransformer extends Abs
      * Bundle name.
      */
     private String bundleName;
-
+    
     /**
      * Current (local) untranslated message value
      */
@@ -720,11 +738,11 @@ public class I18nTransformer extends Abs
 
         super();
 
-        this.init(locale, bundle, untranslated);
+        this.init(locale, bundle, untranslated, DEFAULT_ENCODING);
     }
 
     private void init(final Locale locale, final String bundle,
-            final String untranslated) {
+            final String untranslated, final String encoding) {
 
         LOG.debug("Initializing with locale={}, bundle={}, untraslated={}",
                 new Object[]{locale, bundle, untranslated});
@@ -736,7 +754,7 @@ public class I18nTransformer extends Abs
         this.locale = locale == null ? Locale.getDefault() : locale;
 
         try {
-            this.bundle = ResourceBundle.getBundle(bundle, this.locale);
+            this.bundle = ResourceBundle.getBundle(bundle, this.locale, new CustomEncodingControl(encoding));
         } catch (MissingResourceException e) {
             throw new SetupException(e);
         }
@@ -783,10 +801,14 @@ public class I18nTransformer extends Abs
         if (parameters == null || !parameters.containsKey(PARAM_BUNDLE)) {
             return;
         }
+        
+        final String encoding = (String) (parameters.containsKey(PARAM_ENCODING)
+                ? parameters.get(PARAM_ENCODING) : DEFAULT_ENCODING);
 
         this.init(parseLocale((String) parameters.get(PARAM_LOCALE)),
                 (String) parameters.get(PARAM_BUNDLE),
-                (String) parameters.get(PARAM_UNTRANSLATED));
+                (String) parameters.get(PARAM_UNTRANSLATED),
+                (String) parameters.get(PARAM_ENCODING));
     }
 
     public CacheKey constructCacheKey() {
@@ -1906,4 +1928,50 @@ public class I18nTransformer extends Abs
 
         return result;
     }
+
+    /**
+     * Support for custom encodings in bundle files.
+     */
+    public class CustomEncodingControl extends Control {
+        
+        private String encoding;
+
+        public CustomEncodingControl(final String encoding) {
+            this.encoding = encoding;
+        }
+        
+        public ResourceBundle newBundle(final String baseName, final Locale locale, final String format,
+                final ClassLoader loader, final boolean reload) throws IllegalAccessException,
+                InstantiationException, IOException {
+            // This is a copy of the default implementation.
+            final String bundleName = toBundleName(baseName, locale);
+            final String resourceName = toResourceName(bundleName, "properties");
+            ResourceBundle bundle = null;
+            InputStream stream = null;
+            if (reload) {
+                // use parent classloader because the current classloader can't access
+                // the resource bundle in RCL mode
+                final URL url = loader.getParent().getResource(resourceName);
+                if (url != null) {
+                    final URLConnection connection = url.openConnection();
+                    if (connection != null) {
+                        connection.setUseCaches(false);
+                        stream = connection.getInputStream();
+                    }
+                }
+            } else {
+                stream = loader.getResourceAsStream(resourceName);
+            }
+            if (stream != null) {
+                try {
+                    // Only this line is changed to make it to read properties files with custom encodings.
+                    bundle = new PropertyResourceBundle(new InputStreamReader(stream, this.encoding));
+                } finally {
+                    stream.close();
+                }
+            }
+            return bundle;
+        }
+        
+    }
 }