package org.jboss.seam.core;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.io.InputStream;
import java.net.URL;
import java.util.MissingResourceException;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.contexts.Contexts;
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 and resource bundles.
*
* @author Gavin King
*
*/
@Scope(ScopeType.STATELESS)
@BypassInterceptors
@Install(precedence=BUILT_IN)
@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.getCurrentServletContext() );
}
public URL getResource(String resource)
{
return Resources.getResource( resource, ServletLifecycle.getCurrentServletContext() );
}
/**
* 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()
);
// for getting bundle from page level message properties
if (bundle == null){
bundle = java.util.ResourceBundle.getBundle(
bundleName,
Locale.instance(),
ServletLifecycle.getCurrentServletContext().getClass().getClassLoader()
);
}
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()
{
if (!Contexts.isApplicationContextActive()) {
return new ResourceLoader();
} else {
return (ResourceLoader) Component.getInstance(ResourceLoader.class, ScopeType.STATELESS);
}
}
}