[seam-commits] Seam SVN: r10663 - in modules/trunk/international: src/main/java/org/jboss/seam/international and 2 other directories.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Mon Apr 27 22:43:30 EDT 2009


Author: shane.bryzak at jboss.com
Date: 2009-04-27 22:43:30 -0400 (Mon, 27 Apr 2009)
New Revision: 10663

Added:
   modules/trunk/international/src/main/java/org/jboss/seam/international/ResourceLoader.java
   modules/trunk/international/src/main/java/org/jboss/seam/international/SeamResourceBundle.java
   modules/trunk/international/src/main/java/org/jboss/seam/international/events/TimeZoneSelectedEvent.java
   modules/trunk/international/src/main/java/org/jboss/seam/international/util/Resources.java
Modified:
   modules/trunk/international/pom.xml
   modules/trunk/international/src/main/java/org/jboss/seam/international/LocaleSelector.java
   modules/trunk/international/src/main/java/org/jboss/seam/international/MessagesProducer.java
   modules/trunk/international/src/main/java/org/jboss/seam/international/StatusMessage.java
   modules/trunk/international/src/main/java/org/jboss/seam/international/TimeZoneSelector.java
Log:
add event class, util classes, component conversion

Modified: modules/trunk/international/pom.xml
===================================================================
--- modules/trunk/international/pom.xml	2009-04-28 01:07:37 UTC (rev 10662)
+++ modules/trunk/international/pom.xml	2009-04-28 02:43:30 UTC (rev 10663)
@@ -35,6 +35,14 @@
          <groupId>org.jboss.webbeans</groupId>
          <artifactId>webbeans-logging</artifactId>
       </dependency> 
+      <dependency>
+         <groupId>org.jboss.seam</groupId>
+         <artifactId>seam-faces</artifactId>
+      </dependency> 
+      <dependency>
+         <groupId>org.jboss.seam</groupId>
+         <artifactId>seam-el</artifactId>
+      </dependency> 
    </dependencies>
 
 </project>

Modified: modules/trunk/international/src/main/java/org/jboss/seam/international/LocaleSelector.java
===================================================================
--- modules/trunk/international/src/main/java/org/jboss/seam/international/LocaleSelector.java	2009-04-28 01:07:37 UTC (rev 10662)
+++ modules/trunk/international/src/main/java/org/jboss/seam/international/LocaleSelector.java	2009-04-28 02:43:30 UTC (rev 10663)
@@ -16,12 +16,11 @@
 import javax.inject.Produces;
 import javax.inject.manager.Manager;
 import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
 
-import org.jboss.seam.contexts.Contexts;
 import org.jboss.seam.faces.Selector;
 import org.jboss.seam.international.events.LocaleSelectedEvent;
 import org.jboss.seam.international.util.Strings;
-import org.jboss.seam.web.ServletContexts;
 
 /**
  * Selects the current user's locale
@@ -35,6 +34,7 @@
    private static final long serialVersionUID = -6087667065688208261L;
    
    @Current Manager manager;
+   @Current HttpServletRequest request;
    
    private String language;
    private String country;
@@ -150,28 +150,14 @@
          return facesContext.getApplication().getViewHandler().calculateLocale(facesContext);
       }
       
-      ServletContexts servletContexts = ServletContexts.getInstance();
-      if (servletContexts!=null)
+      if (request!=null)
       {
-         ServletRequest request = servletContexts.getRequest();
-         if (request!=null)
-         {
-            return calculateLocale( request.getLocale() );
-         }
+         return calculateLocale( request.getLocale() );
       }
 
       return calculateLocale( Locale.getDefault() );
    }
 
-   public static LocaleSelector instance()
-   {
-      if ( !Contexts.isSessionContextActive() )
-      {
-         throw new IllegalStateException("No active session context");
-      }
-      return (LocaleSelector) Component.getInstance(LocaleSelector.class, ScopeType.SESSION);
-   }
-
    public String getCountry() 
    {
       if (country==null) return getLocale().getCountry();

Modified: modules/trunk/international/src/main/java/org/jboss/seam/international/MessagesProducer.java
===================================================================
--- modules/trunk/international/src/main/java/org/jboss/seam/international/MessagesProducer.java	2009-04-28 01:07:37 UTC (rev 10662)
+++ modules/trunk/international/src/main/java/org/jboss/seam/international/MessagesProducer.java	2009-04-28 02:43:30 UTC (rev 10663)
@@ -7,16 +7,13 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.MissingResourceException;
+import java.util.ResourceBundle;
 import java.util.Set;
 
 import javax.context.RequestScoped;
+import javax.inject.Current;
 import javax.inject.Produces;
 
-import org.jboss.seam.Component;
-import org.jboss.seam.ScopeType;
-import org.jboss.seam.contexts.Contexts;
-import org.jboss.seam.core.SeamResourceBundle;
-
 /**
  * Factory for a Map that contains interpolated messages defined in the
  * Seam ResourceBundle.
@@ -28,15 +25,15 @@
 public class MessagesProducer
 {
    //TODO: now we have ELResolver, it doesn't *have* to be a Map...
+   
+   @Current ResourceBundle bundle;
       
    protected Map createMap() 
    {  
 	  // AbstractMap uses the implementation of entrySet to perform all its 
 	  // operations - for a resource bundle this is very inefficient for keys
       return new AbstractMap<String, String>()
-      {
-         private java.util.ResourceBundle bundle = SeamResourceBundle.getBundle();
-         
+      {         
          @Override
          public String get(Object key) 
          {
@@ -108,16 +105,4 @@
    {
       return createMap();
    }
-   
-   /**
-    * @return the message Map instance
-    */
-   public static Map<String, String> instance()
-   {
-      if ( !Contexts.isSessionContextActive() )
-      {
-         throw new IllegalStateException("no event context active");
-      }
-      return (Map<String, String>) Component.getInstance("org.jboss.seam.international.messages", true);
-   }
 }

Added: modules/trunk/international/src/main/java/org/jboss/seam/international/ResourceLoader.java
===================================================================
--- modules/trunk/international/src/main/java/org/jboss/seam/international/ResourceLoader.java	                        (rev 0)
+++ modules/trunk/international/src/main/java/org/jboss/seam/international/ResourceLoader.java	2009-04-28 02:43:30 UTC (rev 10663)
@@ -0,0 +1,89 @@
+package org.jboss.seam.international;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Locale;
+import java.util.MissingResourceException;
+
+import javax.context.Dependent;
+import javax.inject.Current;
+import javax.servlet.ServletContext;
+
+import org.jboss.webbeans.log.LogProvider;
+import org.jboss.webbeans.log.Logging;
+import org.jboss.seam.international.util.Resources;
+import org.jboss.seam.international.util.Strings;
+
+/**
+ * Access to application resources and resource bundles.
+ * 
+ * @author Gavin King
+ *
+ */
+ at Dependent
+public class ResourceLoader
+{
+   private static final LogProvider log = Logging.getLogProvider(ResourceLoader.class);
+
+   private String[] bundleNames = {"messages"};
+   
+   @Current ServletContext servletContext;
+   @Current Locale locale;
+   
+   /**
+    * 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, servletContext );
+   }
+
+   public URL getResource(String resource) 
+   {
+      return Resources.getResource( resource, servletContext );
+   }
+   
+   /**
+    * 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,
+               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 + ")";
+   }   
+}

Added: modules/trunk/international/src/main/java/org/jboss/seam/international/SeamResourceBundle.java
===================================================================
--- modules/trunk/international/src/main/java/org/jboss/seam/international/SeamResourceBundle.java	                        (rev 0)
+++ modules/trunk/international/src/main/java/org/jboss/seam/international/SeamResourceBundle.java	2009-04-28 02:43:30 UTC (rev 10663)
@@ -0,0 +1,158 @@
+package org.jboss.seam.international;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.inject.Current;
+
+import org.jboss.seam.el.Interpolator;
+
+/**
+ * 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 Map<Locale, List<ResourceBundle>> bundleCache = new ConcurrentHashMap<Locale, List<ResourceBundle>>();
+   
+   @Current Locale locale;
+   @Current Interpolator interpolator;
+   @Current ResourceLoader resourceLoader;
+
+   /**
+    * Get an instance for the current Seam Locale
+    * 
+    * @see Locale
+    * 
+    * @return a SeamResourceBundle
+    */
+   public java.util.ResourceBundle getBundle()
+   {
+      return java.util.ResourceBundle.getBundle(SeamResourceBundle.class.getName(), locale);
+   }
+
+   
+   public java.util.ResourceBundle getBundleNamed(String bundleName)
+   {
+      return java.util.ResourceBundle.getBundle(bundleName, locale);
+   }
+
+   
+   private List<java.util.ResourceBundle> getBundlesForCurrentLocale()
+   {
+      List<ResourceBundle> bundles = bundleCache.get(locale);
+      if ( bundles==null )
+      {
+         bundles = loadBundlesForCurrentLocale();
+         bundleCache.put(locale, bundles);
+      }
+      return bundles;
+
+   }
+
+   private List<ResourceBundle> loadBundlesForCurrentLocale()
+   {
+      List<ResourceBundle> bundles = new ArrayList<ResourceBundle>();
+      for (String bundleName : resourceLoader.getBundleNames())
+      {
+         ResourceBundle bundle = resourceLoader.loadBundle(bundleName);
+         if (bundle != null) bundles.add(bundle);
+      }
+      ResourceBundle bundle = resourceLoader.loadBundle("ValidatorMessages");
+      if (bundle != null)
+      {
+         bundles.add(bundle);
+      }
+      bundle = resourceLoader.loadBundle("org/hibernate/validator/resources/DefaultValidatorMessages");
+      if (bundle != null) bundles.add(bundle);
+      bundle = resourceLoader.loadBundle("javax.faces.Messages");
+      if (bundle != null) bundles.add(bundle);
+      return Collections.unmodifiableList(bundles);
+   }
+
+   @Override
+   public Enumeration<String> getKeys()
+   {
+      List<java.util.ResourceBundle> pageBundles = getPageResourceBundles();
+      List<ResourceBundle> bundles = getBundlesForCurrentLocale();
+      Enumeration<String>[] enumerations = new Enumeration[bundles.size() + pageBundles.size()];
+
+      int i = 0;
+      for (java.util.ResourceBundle bundle: pageBundles) {
+          enumerations[i++] = bundle.getKeys();
+      }
+       
+      for (ResourceBundle bundle: bundles) {
+          enumerations[i++] = bundle.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 interpolate(pageBundle.getObject(key));
+         }
+         catch (MissingResourceException mre) {}
+      }
+
+      for (java.util.ResourceBundle littleBundle : getBundlesForCurrentLocale())
+      {
+         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.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;
+      }
+   }
+   
+   @Override
+   public Locale getLocale()
+   {
+      return locale;
+   }
+   
+}
\ No newline at end of file

Modified: modules/trunk/international/src/main/java/org/jboss/seam/international/StatusMessage.java
===================================================================
--- modules/trunk/international/src/main/java/org/jboss/seam/international/StatusMessage.java	2009-04-28 01:07:37 UTC (rev 10662)
+++ modules/trunk/international/src/main/java/org/jboss/seam/international/StatusMessage.java	2009-04-28 02:43:30 UTC (rev 10663)
@@ -4,7 +4,9 @@
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
-import org.jboss.seam.core.Interpolator;
+import javax.inject.Current;
+
+import org.jboss.seam.el.Interpolator;
 import org.jboss.seam.core.SeamResourceBundle;
 import org.jboss.seam.international.util.Strings;
 
@@ -17,6 +19,7 @@
  */
 public class StatusMessage implements Serializable
 {
+   @Current Interpolator interpolator;
    
    /**
     * The severity of the status message
@@ -61,11 +64,11 @@
    {
       if (!Strings.isEmpty(summaryTemplate))
       {
-         this.summary = Interpolator.instance().interpolate(summaryTemplate, params);
+         this.summary = interpolator.interpolate(summaryTemplate, params);
       }
       if (!Strings.isEmpty(detailTemplate))
       {
-         this.detail = Interpolator.instance().interpolate(detailTemplate, params);
+         this.detail = interpolator.interpolate(detailTemplate, params);
       }
    }
 

Modified: modules/trunk/international/src/main/java/org/jboss/seam/international/TimeZoneSelector.java
===================================================================
--- modules/trunk/international/src/main/java/org/jboss/seam/international/TimeZoneSelector.java	2009-04-28 01:07:37 UTC (rev 10662)
+++ modules/trunk/international/src/main/java/org/jboss/seam/international/TimeZoneSelector.java	2009-04-28 02:43:30 UTC (rev 10663)
@@ -3,10 +3,13 @@
 import javax.annotation.Named;
 import javax.context.SessionScoped;
 import javax.faces.event.ValueChangeEvent;
+import javax.inject.Current;
 import javax.inject.Initializer;
 import javax.inject.Produces;
+import javax.inject.manager.Manager;
 
 import org.jboss.seam.faces.Selector;
+import org.jboss.seam.international.events.TimeZoneSelectedEvent;
 
 /**
  * Selects the current user's time zone, defaulting
@@ -21,6 +24,8 @@
    
    private String id;
    
+   @Current Manager manager;
+   
    @Initializer
    public void initTimeZone()
    {
@@ -42,10 +47,7 @@
    {
       setCookieValueIfEnabled( getTimeZoneId() );
 
-      if ( Events.exists() ) 
-      {
-          Events.instance().raiseEvent( "org.jboss.seam.timeZoneSelected", getTimeZoneId() );
-      }
+      manager.fireEvent(new TimeZoneSelectedEvent(getTimeZoneId()));
    }
 
    public void select(ValueChangeEvent event) 

Added: modules/trunk/international/src/main/java/org/jboss/seam/international/events/TimeZoneSelectedEvent.java
===================================================================
--- modules/trunk/international/src/main/java/org/jboss/seam/international/events/TimeZoneSelectedEvent.java	                        (rev 0)
+++ modules/trunk/international/src/main/java/org/jboss/seam/international/events/TimeZoneSelectedEvent.java	2009-04-28 02:43:30 UTC (rev 10663)
@@ -0,0 +1,21 @@
+package org.jboss.seam.international.events;
+
+/**
+ * This event is raised when a time zone is selected
+ * 
+ * @author Shane Bryzak
+ */
+public class TimeZoneSelectedEvent
+{
+   private String timeZoneId;
+   
+   public TimeZoneSelectedEvent(String timeZoneId)
+   {
+      this.timeZoneId = timeZoneId;
+   }
+   
+   public String getTimeZoneId()
+   {
+      return timeZoneId;
+   }
+}

Added: modules/trunk/international/src/main/java/org/jboss/seam/international/util/Resources.java
===================================================================
--- modules/trunk/international/src/main/java/org/jboss/seam/international/util/Resources.java	                        (rev 0)
+++ modules/trunk/international/src/main/java/org/jboss/seam/international/util/Resources.java	2009-04-28 02:43:30 UTC (rev 10663)
@@ -0,0 +1,177 @@
+package org.jboss.seam.international.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.servlet.ServletContext;
+
+import org.jboss.webbeans.log.LogProvider;
+import org.jboss.webbeans.log.Logging;
+
+public class Resources 
+{
+    private static final LogProvider log = Logging.getLogProvider(Resources.class);
+
+   public static InputStream getResourceAsStream(String resource, ServletContext servletContext) 
+   {
+      String stripped = resource.startsWith("/") ? 
+            resource.substring(1) : resource;
+   
+      InputStream stream = null; 
+
+      if (servletContext!=null) {
+         try {
+            stream = servletContext.getResourceAsStream(resource);
+            if (stream!=null) {
+                log.debug("Loaded resource from servlet context: " + resource);
+            }
+         } catch (Exception e) {       
+             //
+         }
+      }
+      
+      if (stream==null) {
+         stream = getResourceAsStream(resource, stripped);
+      }
+      
+      return stream;
+   }
+
+   public static URL getResource(String resource, ServletContext servletContext) 
+   {
+      if (!resource.startsWith("/"))
+      {
+         resource = "/" + resource;
+      }
+      
+      String stripped = resource.startsWith("/") ? 
+            resource.substring(1) : resource;
+   
+      URL url  = null; 
+
+      if (servletContext!=null)
+      {
+         try {
+            url = servletContext.getResource(resource);
+            log.debug("Loaded resource from servlet context: " + url);
+         } catch (Exception e) {
+             //
+         }
+      }
+      
+      if (url==null)
+      {
+        url = getResource(resource, stripped);
+      }
+      
+      return url;
+   }
+   
+   static InputStream getResourceAsStream(String resource, String stripped)
+   {
+      ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+      InputStream stream = null;
+      if (classLoader!=null) {
+         stream = classLoader.getResourceAsStream(stripped);
+         if (stream !=null) {
+             log.debug("Loaded resource from context classloader: " + stripped);
+         }
+      }
+      
+      if (stream == null) {
+         stream = Resources.class.getResourceAsStream(resource);
+         if (stream !=null) {
+             log.debug("Loaded resource from Seam classloader: " + resource);
+         }
+      }
+      
+      if (stream == null) {
+         stream = Resources.class.getClassLoader().getResourceAsStream(stripped);
+         if (stream!=null) {
+             log.debug("Loaded resource from Seam classloader: " + stripped);
+         }
+      }
+      
+      return stream;
+   }
+   
+   static URL getResource(String resource, String stripped)
+   {
+       ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+       URL url = null;
+       if (classLoader!=null) {
+           url = classLoader.getResource(stripped);
+           if (url!=null) {
+               log.debug("Loaded resource from context classloader: " + url);
+           }
+       }
+
+       if (url == null) {
+           url = Resources.class.getResource(resource);
+           if (url!=null) {
+               log.debug("Loaded resource from Seam classloader: " + url);
+           }
+       }
+
+       if (url == null) {
+           url = Resources.class.getClassLoader().getResource(stripped);
+           if (url!=null) {
+               log.debug("Loaded resource from Seam classloader: " + url);
+           }           
+       }
+       
+       return url;
+   }
+
+   public static void closeStream(InputStream inputStream) {
+       if (inputStream == null) {
+           return;
+       }
+       
+       try {
+           inputStream.close();
+       } catch (IOException e) {
+          // 
+       }       
+   }
+   
+   public static File getRealFile(ServletContext servletContext, String path)
+   {
+      String realPath = servletContext.getRealPath(path);
+      if (realPath==null) //WebLogic!
+      {
+         try 
+         {
+            URL resourcePath = servletContext.getResource(path);
+            if ((resourcePath != null) && (resourcePath.getProtocol().equals("file"))) 
+            {
+               realPath = resourcePath.getPath();
+            }
+            else
+            {
+               log.warn("Unable to determine real path from servlet context for \"" + path + "\" path does not exist.");
+            }
+         }
+         catch (MalformedURLException e) 
+         {
+            log.warn("Unable to determine real path from servlet context for : " + path);
+            log.debug("Caused by MalformedURLException", e);
+         }
+
+      }
+      
+      if (realPath != null)
+      {
+         File file = new File(realPath);
+         if (file.exists())
+         {
+            return file;
+         }
+      }
+      return null;
+   }
+
+}
\ No newline at end of file




More information about the seam-commits mailing list