Cargar varios ficheros de recursos (bundles) sin necesidad de usar las llaves de los bundles

2176 vistas

El principio consiste a fusiona los resources-bundles al momento de la carga.

Veamos la clase que se encarga de hacerlo (en este ejemplo se usa el API commons Logging):



java
  1. package bla.bla.bla.struts;
  2.  
  3. import java.io.InputStream;
  4. import java.util.Enumeration;
  5. import java.util.Properties;
  6.  
  7. import org.apache.commons.logging.Log;
  8. import org.apache.commons.logging.LogFactory;
  9. import org.apache.struts.util.MessageResourcesFactory;
  10. import org.apache.struts.util.PropertyMessageResources;
  11.  
  12. public class MultiPropertyMessageResources extends PropertyMessageResources
  13. {
  14.  
  15.     protected static final Log log;
  16.    
  17.     public MultiPropertyMessageResources(MessageResourcesFactory factory, String config)
  18.     {
  19.         super(factory, config);
  20.         log.info("Initializing, config='" + config + "'");
  21.     }
  22.  
  23.     public MultiPropertyMessageResources(MessageResourcesFactory factory, String config, boolean returnNull)
  24.     {
  25.         super(factory, config, returnNull);
  26.         log.info("Initializing, config='" + config + "', returnNull=" + returnNull);
  27.     }
  28.  
  29.     protected void loadLocale(String localeKey)
  30.     {
  31. label0:
  32.         {
  33.             if(log.isTraceEnabled())
  34.                 log.trace("loadLocale(" + localeKey + ")");
  35.             synchronized(locales)
  36.             {
  37.                 if(locales.get(localeKey) == null)
  38.                     break label0;
  39.             }
  40.             return;
  41.         }
  42.         locales.put(localeKey, localeKey);
  43.  
  44.         String configFiles[] = config.split(",");
  45.         for(int i = 0; i < configFiles.length; i++)
  46.         {
  47.             String name = configFiles[i].trim().replace('.', '/');
  48.             if(localeKey.length() > 0)
  49.                 name = name + "_" + localeKey;
  50.             name = name + ".properties";
  51.             InputStream is = null;
  52.             Properties props = new Properties();
  53.             try
  54.             {
  55.                 if(log.isTraceEnabled())
  56.                     log.trace("  Loading resource '" + name + "'");
  57.                 ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
  58.                 if(classLoader == null)
  59.                     classLoader = getClass().getClassLoader();
  60.                 is = classLoader.getResourceAsStream(name);
  61.                 if(is != null)
  62.                 {
  63.                     props.load(is);
  64.                     is.close();
  65.                 }
  66.                 if(log.isTraceEnabled())
  67.                     log.trace("  Loading resource completed");
  68.             }
  69.             catch(Throwable t)
  70.             {
  71.                 log.error("loadLocale()", t);
  72.                 if(is != null)
  73.                     try
  74.                     {
  75.                         is.close();
  76.                     }
  77.                     catch(Throwable u) { }
  78.             }
  79.             if(props.size() < 1)
  80.                 return;
  81.             synchronized(messages)
  82.             {
  83.                 String key;
  84.                 for(Enumeration names = props.keys(); names.hasMoreElements(); messages.put(messageKey(localeKey, key), props.getProperty(key)))
  85.                 {
  86.                     key = (String)names.nextElement();
  87.                     if(log.isTraceEnabled())
  88.                         log.trace("  Saving message key '" + messageKey(localeKey, key));
  89.                 }
  90.  
  91.             }
  92.         }
  93.  
  94.         return;
  95.     }
  96.  
  97.  
  98.     static
  99.     {
  100.         log = LogFactory.getLog(MultiPropertyMessageResources.class);
  101.     }
  102. }



Ahora tenemos que escribir una Factory para Struts:



java
  1. package bla.bla.bla.struts;
  2.  
  3. import org.apache.struts.util.MessageResources;
  4. import org.apache.struts.util.PropertyMessageResourcesFactory;
  5.  
  6.  
  7. public class MultiPropertyMessageResourcesFactory extends PropertyMessageResourcesFactory
  8. {
  9.  
  10.     public MultiPropertyMessageResourcesFactory()
  11.     {
  12.     }
  13.  
  14.     public MessageResources createResources(String config)
  15.     {
  16.         return new MultiPropertyMessageResources(this, config, returnNull);
  17.     }
  18. }



Ahora sólo queda modificar el struts-config.xml:



xml
  1. <message-resources
  2. parameter="fichero1,fichero2,fichero3"
  3. factory="bla.bla.bla.struts.MultiPropertyMessageResourcesFactory"
  4. />