/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.jsf.taglib;
import java.io.*;
import java.util.*;
import java.util.logging.*;
import javax.el.*;
import javax.faces.*;
import javax.faces.application.*;
import javax.faces.component.*;
import javax.faces.context.*;
import javax.faces.convert.*;
import javax.faces.webapp.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.jstl.fmt.LocalizationContext;
import javax.servlet.jsp.tagext.*;
import com.caucho.jsp.*;
import com.caucho.util.*;
public class LoadBundleTag extends TagSupport
{
private static final L10N L = new L10N(LoadBundleTag.class);
private static final Logger log
= Logger.getLogger(LoadBundleTag.class.getName());
private String _var;
private ValueExpression _basename;
public void setVar(String var)
{
_var = var;
}
public void setBasename(ValueExpression basename)
{
_basename = basename;
}
@Override
public int doStartTag()
throws JspException
{
FacesContext context = FacesContext.getCurrentInstance();
String basename = (String) _basename.getValue(context.getELContext());
Locale locale = context.getViewRoot().getLocale();
BundleManager bundleManager = BundleManager.create();
LocalizationContext lc = null;
if (locale != null)
lc = bundleManager.getBundle(basename, locale);
if (lc == null)
lc = bundleManager.getBundle(basename);
if (lc == null)
throw new JspException(L.l("'{0}' is an unknown ResourceBundle basename.",
basename));
ResourceBundle bundle = lc.getResourceBundle();
this.pageContext.getRequest().setAttribute(_var, new BundleMap(bundle));
return SKIP_BODY;
}
static class BundleMap extends AbstractMap<String,String> {
private ResourceBundle _bundle;
private BundleEntrySet _entrySet;
BundleMap(ResourceBundle bundle)
{
_bundle = bundle;
}
@Override
public String get(Object key)
{
try {
String value = _bundle.getString(String.valueOf(key));
if (value != null)
return value;
else
return "???" + key + "???";
} catch (MissingResourceException e) {
log.log(Level.FINER, e.toString(), e);
return "???" + key + "???";
}
}
public Set<Map.Entry<String,String>> entrySet()
{
if (_entrySet == null)
_entrySet = new BundleEntrySet(_bundle);
return _entrySet;
}
}
static class BundleEntrySet extends AbstractSet<Map.Entry<String,String>> {
private ResourceBundle _bundle;
private ArrayList<String> _keys = new ArrayList<String>();
BundleEntrySet(ResourceBundle bundle)
{
_bundle = bundle;
Enumeration<String> e = bundle.getKeys();
while (e.hasMoreElements())
_keys.add(e.nextElement());
}
public int size()
{
return _keys.size();
}
public Iterator<Map.Entry<String,String>> iterator()
{
return new EntryIterator(_bundle, _keys);
}
}
static class EntryIterator implements Iterator<Map.Entry<String,String>> {
private ResourceBundle _bundle;
private ArrayList<String> _keys;
private Entry _entry = new Entry();
private int _index;
EntryIterator(ResourceBundle bundle, ArrayList<String> keys)
{
_bundle = bundle;
_keys = keys;
}
public boolean hasNext()
{
return _index < _keys.size();
}
public Map.Entry<String,String> next()
{
if (_index < _keys.size()) {
_index++;
return _entry;
}
else
return null;
}
public void remove()
{
throw new UnsupportedOperationException();
}
class Entry implements Map.Entry<String,String> {
public String getKey()
{
return _keys.get(_index - 1);
}
public String setKey(String key)
{
throw new UnsupportedOperationException();
}
public String getValue()
{
return _bundle.getString(getKey());
}
public String setValue(String key)
{
throw new UnsupportedOperationException();
}
}
}
}