[jboss-cvs] jboss-seam/src/main/org/jboss/seam/core ...

Gavin King gavin.king at jboss.com
Tue Jul 10 12:46:57 EDT 2007


  User: gavin   
  Date: 07/07/10 12:46:57

  Modified:    src/main/org/jboss/seam/core     ResourceBundle.java
                        ResourceLoader.java Validators.java
  Added:       src/main/org/jboss/seam/core     SeamResourceBundle.java
  Log:
  redesigned resource bundle handling
  
  Revision  Changes    Path
  1.37      +9 -195    jboss-seam/src/main/org/jboss/seam/core/ResourceBundle.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: ResourceBundle.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/core/ResourceBundle.java,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -b -r1.36 -r1.37
  --- ResourceBundle.java	10 Jul 2007 10:23:20 -0000	1.36
  +++ ResourceBundle.java	10 Jul 2007 16:46:57 -0000	1.37
  @@ -1,214 +1,32 @@
   package org.jboss.seam.core;
   
  -import static org.jboss.seam.ScopeType.EVENT;
   import static org.jboss.seam.annotations.Install.BUILT_IN;
   
  -import java.util.ArrayList;
  -import java.util.Collections;
  -import java.util.Enumeration;
  -import java.util.List;
  -import java.util.MissingResourceException;
  -
   import org.jboss.seam.Component;
   import org.jboss.seam.ScopeType;
  -import org.jboss.seam.annotations.Factory;
   import org.jboss.seam.annotations.Install;
   import org.jboss.seam.annotations.Name;
   import org.jboss.seam.annotations.Scope;
  +import org.jboss.seam.annotations.Unwrap;
   import org.jboss.seam.annotations.intercept.BypassInterceptors;
  -import org.jboss.seam.contexts.Contexts;
  -import org.jboss.seam.log.LogProvider;
  -import org.jboss.seam.log.Logging;
  -import org.jboss.seam.navigation.Pages;
  -import org.jboss.seam.util.EnumerationEnumeration;
  -import org.jboss.seam.util.Strings;
   
   /**
  - * Factory for a session-scoped localized resource bundle
  - * that searches for resources in delegate resource bundles
  - * specified in pages.xml, and a configurable list of 
  - * delegate resource bundles. 
  + * Manager component for the Seam resource bundle
  + * 
  + * @see SeamResourceBundle
    * 
    * @author Gavin King
    */
   @Scope(ScopeType.STATELESS)
   @BypassInterceptors
  - at Name("org.jboss.seam.core.resourceBundleFactory")
  + at Name("org.jboss.seam.core.resourceBundle")
   @Install(precedence=BUILT_IN)
   public class ResourceBundle 
   {
  -   
  -   private static final long serialVersionUID = -3236251335438092538L;
  -   private static final LogProvider log = Logging.getLogProvider(ResourceBundle.class);
  -
  -   private String[] bundleNames = {"messages"};
  -   
  -   public class UberResourceBundle extends java.util.ResourceBundle
  -   {
  -      private final List<java.util.ResourceBundle> bundles;
  -
  -      public UberResourceBundle(List<java.util.ResourceBundle> bundles)
  -      {
  -         this.bundles = bundles;
  -      }
  -
  -      @Override
  -      public java.util.Locale getLocale()
  -      {
  -         return org.jboss.seam.core.Locale.instance();
  -      }
  -
  -      @Override
  -      public Enumeration<String> getKeys()
  -      {
  -         List<java.util.ResourceBundle> pageBundles = getPageResourceBundles();
  -         Enumeration<String>[] enumerations = new Enumeration[ bundles.size() + pageBundles.size() ];
  -         int i=0;
  -         for (; i<pageBundles.size(); i++)
  +   @Unwrap
  +   public java.util.ResourceBundle getResourceBundle()
            {
  -            enumerations[i++] = pageBundles.get(i).getKeys();
  -         }
  -         for (; i<bundles.size(); i++)
  -         {
  -            enumerations[i] = bundles.get(i).getKeys();
  -         }
  -         return new EnumerationEnumeration<String>(enumerations);
  -      }
  -
  -      @Override
  -      protected Object handleGetObject(String key)
  -      {
  -         List<java.util.ResourceBundle> pageBundles = getPageResourceBundles();
  -         for (java.util.ResourceBundle pageBundle: pageBundles)
  -         {
  -            try
  -            {
  -               return pageBundle.getObject(key);
  -            }
  -            catch (MissingResourceException mre) {}
  -         }
  -         
  -         for (java.util.ResourceBundle littleBundle: bundles)
  -         {
  -            if (littleBundle!=null)
  -            {
  -               try
  -               {
  -                  return littleBundle.getObject(key);
  -               }
  -               catch (MissingResourceException mre) {}
  -            }
  -         }
  -         
  -         return null; //superclass is responsible for throwing MRE
  -      }
  -
  -      private List<java.util.ResourceBundle> getPageResourceBundles()
  -      {
  -         String viewId = Pages.getCurrentViewId();
  -         if (viewId!=null)
  -         {
  -            //we can't cache these bundles, since the viewId
  -            //may change in the middle of a request
  -            return Pages.instance().getResourceBundles(viewId);
  -         }
  -         else
  -         {
  -            return Collections.EMPTY_LIST;
  -         }
  -      }
  -   }
  -
  -   /**
  -    * The configurable list of delegate resource bundle names
  -    * 
  -    * @return an array of resource bundle names
  -    */
  -   public String[] getBundleNames() 
  -   {
  -      return bundleNames;
  -   }
  -   
  -   public void setBundleNames(String[] bundleNames) 
  -   {
  -      this.bundleNames = bundleNames;
  -   }
  -   
  -   @Deprecated
  -   public void setBundleName(String bundleName)
  -   {
  -      bundleNames = bundleName==null ? null : new String[] { bundleName };
  -   }
  -   
  -   @Deprecated
  -   public String getBundleName()
  -   {
  -      return bundleNames==null || bundleNames.length==0 ? null : bundleNames[0];
  -   }
  -   
  -   /**
  -    * Load a resource bundle by name (may be overridden by subclasses
  -    * who want to use non-standard resource bundle types).
  -    * 
  -    * @param bundleName the name of the resource bundle
  -    * @return an instance of java.util.ResourceBundle
  -    */
  -   protected java.util.ResourceBundle loadBundle(String bundleName) 
  -   {
  -      try
  -      {
  -         java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle( 
  -               bundleName, 
  -               org.jboss.seam.core.Locale.instance(), 
  -               Thread.currentThread().getContextClassLoader() 
  -            );
  -         log.debug("loaded resource bundle: " + bundleName);
  -         return bundle;
  -      }
  -      catch (MissingResourceException mre)
  -      {
  -         log.debug("resource bundle missing: " + bundleName);
  -         return null;
  -      }
  -   }
  -   
  -   protected java.util.ResourceBundle createUberBundle()
  -   {
  -      final List<java.util.ResourceBundle> littleBundles = new ArrayList<java.util.ResourceBundle>();
  -      if (bundleNames!=null)
  -      {  
  -         for (String bundleName: bundleNames)
  -         {
  -            java.util.ResourceBundle littleBundle = loadBundle(bundleName);
  -            if (littleBundle!=null) littleBundles.add(littleBundle);
  -         }
  -      }
  -      
  -      java.util.ResourceBundle validatorBundle = loadBundle("ValidatorMessages");
  -      if (validatorBundle!=null) littleBundles.add(validatorBundle);
  -      java.util.ResourceBundle validatorDefaultBundle = loadBundle("org/hibernate/validator/resources/DefaultValidatorMessages");
  -      if (validatorDefaultBundle!=null) littleBundles.add(validatorDefaultBundle);
  -         
  -      return new UberResourceBundle(littleBundles);
  -   }
  -
  -   /**
  -    * Create a ResourceBundle in the event scope. When the Locale is changed, LocaleSelector
  -    * is responsible for removing the ResourceBundle from the event context.
  -    * 
  -    * @return a ResourceBundle that wraps all the delegate bundles
  -    */
  -   @Factory(value="org.jboss.seam.core.resourceBundle", autoCreate=true, scope=EVENT)
  -   public java.util.ResourceBundle getBundle()
  -   {
  -      return createUberBundle();
  -   }
  -   
  -   @Override
  -   public String toString()
  -   {
  -      String concat = bundleNames==null ? "" : Strings.toString( ", ", (Object[]) bundleNames );
  -      return "ResourceBundle(" + concat + ")";
  +      return SeamResourceBundle.getBundle();
      }
   
      /**
  @@ -216,11 +34,7 @@
       */
      public static java.util.ResourceBundle instance()
      {
  -      if ( !Contexts.isSessionContextActive() )
  -      {
  -         throw new IllegalStateException("no session context active");
  -      }
  -      return (java.util.ResourceBundle) Component.getInstance("org.jboss.seam.core.resourceBundle", true);
  +      return (java.util.ResourceBundle) Component.getInstance(ResourceBundle.class);
      }
      
   }
  
  
  
  1.3       +57 -1     jboss-seam/src/main/org/jboss/seam/core/ResourceLoader.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: ResourceLoader.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/core/ResourceLoader.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -b -r1.2 -r1.3
  --- ResourceLoader.java	21 Jun 2007 05:27:27 -0000	1.2
  +++ ResourceLoader.java	10 Jul 2007 16:46:57 -0000	1.3
  @@ -4,6 +4,7 @@
   
   import java.io.InputStream;
   import java.net.URL;
  +import java.util.MissingResourceException;
   
   import org.jboss.seam.Component;
   import org.jboss.seam.ScopeType;
  @@ -12,10 +13,13 @@
   import org.jboss.seam.annotations.Scope;
   import org.jboss.seam.annotations.intercept.BypassInterceptors;
   import org.jboss.seam.contexts.ServletLifecycle;
  +import org.jboss.seam.log.LogProvider;
  +import org.jboss.seam.log.Logging;
   import org.jboss.seam.util.Resources;
  +import org.jboss.seam.util.Strings;
   
   /**
  - * Access to application resources.
  + * Access to application resources and resource bundles.
    * 
    * @author Gavin King
    *
  @@ -26,6 +30,25 @@
   @Name("org.jboss.seam.core.resourceLoader")
   public class ResourceLoader
   {
  +   private static final LogProvider log = Logging.getLogProvider(ResourceLoader.class);
  +
  +   private String[] bundleNames = {"messages"};
  +   
  +   /**
  +    * The configurable list of delegate resource bundle names
  +    * 
  +    * @return an array of resource bundle names
  +    */
  +   public String[] getBundleNames() 
  +   {
  +      return bundleNames;
  +   }
  +   
  +   public void setBundleNames(String[] bundleNames) 
  +   {
  +      this.bundleNames = bundleNames;
  +   }
  +   
      public InputStream getResourceAsStream(String resource)
      {
         return Resources.getResourceAsStream( resource, ServletLifecycle.getServletContext() );
  @@ -36,6 +59,39 @@
         return Resources.getResource( resource, ServletLifecycle.getServletContext() );
      }
      
  +   /**
  +    * Load a resource bundle by name (may be overridden by subclasses
  +    * who want to use non-standard resource bundle types).
  +    * 
  +    * @param bundleName the name of the resource bundle
  +    * @return an instance of java.util.ResourceBundle
  +    */
  +   public java.util.ResourceBundle loadBundle(String bundleName) 
  +   {
  +      try
  +      {
  +         java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle( 
  +               bundleName, 
  +               Locale.instance(), 
  +               Thread.currentThread().getContextClassLoader() 
  +            );
  +         log.debug("loaded resource bundle: " + bundleName);
  +         return bundle;
  +      }
  +      catch (MissingResourceException mre)
  +      {
  +         log.debug("resource bundle missing: " + bundleName);
  +         return null;
  +      }
  +   }
  +   
  +   @Override
  +   public String toString()
  +   {
  +      String concat = bundleNames==null ? "" : Strings.toString( ", ", (Object[]) bundleNames );
  +      return "ResourceBundle(" + concat + ")";
  +   }
  +
      public static ResourceLoader instance()
      {
         return (ResourceLoader) Component.getInstance(ResourceLoader.class, ScopeType.STATELESS);
  
  
  
  1.13      +3 -3      jboss-seam/src/main/org/jboss/seam/core/Validators.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: Validators.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/core/Validators.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -b -r1.12 -r1.13
  --- Validators.java	26 Jun 2007 00:59:34 -0000	1.12
  +++ Validators.java	10 Jul 2007 16:46:57 -0000	1.13
  @@ -75,9 +75,9 @@
       */
      public <T> ClassValidator<T> getValidator(Class<T> modelClass)
      {
  -      java.util.ResourceBundle bundle = ResourceBundle.instance();
  +      java.util.ResourceBundle bundle = SeamResourceBundle.getBundle();
         Locale none = bundle==null ? new Locale("NONE") : bundle.getLocale();
  -      Key key = new Key( modelClass, none );
  +      Key key = new Key(modelClass, none);
         ClassValidator result = classValidators.get(key);
         if (result==null)
         {
  @@ -96,7 +96,7 @@
       */
      protected <T> ClassValidator<T> createValidator(Class<T> modelClass)
      {
  -      java.util.ResourceBundle bundle = ResourceBundle.instance();
  +      java.util.ResourceBundle bundle = SeamResourceBundle.getBundle();
         return bundle==null ? 
               new ClassValidator(modelClass) : 
               new ClassValidator(modelClass, bundle);
  
  
  
  1.1      date: 2007/07/10 16:46:57;  author: gavin;  state: Exp;jboss-seam/src/main/org/jboss/seam/core/SeamResourceBundle.java
  
  Index: SeamResourceBundle.java
  ===================================================================
  package org.jboss.seam.core;
  
  import java.util.ArrayList;
  import java.util.Collections;
  import java.util.Enumeration;
  import java.util.List;
  import java.util.MissingResourceException;
  
  import org.jboss.seam.contexts.Contexts;
  import org.jboss.seam.navigation.Pages;
  import org.jboss.seam.util.EnumerationEnumeration;
  
  /**
   * The Seam resource bundle which searches for resources in delegate 
   * resource bundles specified in pages.xml, and a configurable list of 
   * delegate resource bundles specified in components.xml.
   * 
   * @see ResourceLoader
   * @author Gavin King
   *
   */
  public class SeamResourceBundle extends java.util.ResourceBundle
  {
     private final List<java.util.ResourceBundle> bundles = new ArrayList<java.util.ResourceBundle>();
     private boolean initialized;
     
     /**
      * Get an instance for the current Seam Locale
      * 
      * @see Locale
      * 
      * @return a SeamResourceBundle
      */
     public static java.util.ResourceBundle getBundle()
     {
        return java.util.ResourceBundle.getBundle( SeamResourceBundle.class.getName(), Locale.instance() );
     }
     
     private void init()
     {
        if ( !initialized && Contexts.isApplicationContextActive() )
        {
           ResourceLoader instance = ResourceLoader.instance();
           if (instance.getBundleNames()!=null)
           {  
              for ( String bundleName: instance.getBundleNames() )
              {
                 java.util.ResourceBundle littleBundle = instance.loadBundle(bundleName);
                 if (littleBundle!=null) bundles.add(littleBundle);
              }
           }
           
           java.util.ResourceBundle validatorBundle = instance.loadBundle("ValidatorMessages");
           if (validatorBundle!=null) bundles.add(validatorBundle);
           java.util.ResourceBundle validatorDefaultBundle = instance.loadBundle("org/hibernate/validator/resources/DefaultValidatorMessages");
           if (validatorDefaultBundle!=null) bundles.add(validatorDefaultBundle);
           java.util.ResourceBundle facesBundle = instance.loadBundle("javax.faces.Messages"); //ie. FacesMessage.FACES_MESSAGES;
           if (facesBundle!=null) bundles.add(facesBundle);
           
           initialized = true;
        }
     }
     
     @Override
     public Enumeration<String> getKeys()
     {
        init();
        List<java.util.ResourceBundle> pageBundles = getPageResourceBundles();
        Enumeration<String>[] enumerations = new Enumeration[ bundles.size() + pageBundles.size() ];
        int i=0;
        for (; i<pageBundles.size(); i++)
        {
           enumerations[i++] = pageBundles.get(i).getKeys();
        }
        for (; i<bundles.size(); i++)
        {
           enumerations[i] = bundles.get(i).getKeys();
        }
        return new EnumerationEnumeration<String>(enumerations);
     }
  
     @Override
     protected Object handleGetObject(String key)
     {
        init();
        List<java.util.ResourceBundle> pageBundles = getPageResourceBundles();
        for (java.util.ResourceBundle pageBundle: pageBundles)
        {
           try
           {
              return interpolate( pageBundle.getObject(key) );
           }
           catch (MissingResourceException mre) {}
        }
        
        for (java.util.ResourceBundle littleBundle: bundles)
        {
           if (littleBundle!=null)
           {
              try
              {
                 return interpolate( littleBundle.getObject(key) );
              }
              catch (MissingResourceException mre) {}
           }
        }
        
        return null; //superclass is responsible for throwing MRE
     }
     
     private Object interpolate(Object message)
     {
        return message!=null && message instanceof String ?
                 Interpolator.instance().interpolate( (String) message ) :
                 message;
     }
  
     private List<java.util.ResourceBundle> getPageResourceBundles()
     {
        //TODO: oops! A hard dependency to JSF!
        String viewId = Pages.getCurrentViewId();
        if (viewId!=null)
        {
           //we can't cache these bundles, since the viewId
           //may change in the middle of a request
           return Pages.instance().getResourceBundles(viewId);
        }
        else
        {
           return Collections.EMPTY_LIST;
        }
     }
     
  }
  
  



More information about the jboss-cvs-commits mailing list