[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