blob: ebefc58583644750f4de8ad4ff6c16cfeb20d2ae [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cocoon.faces.taglib;
import org.apache.cocoon.taglib.TagSupport;
import org.apache.cocoon.util.ClassUtils;
import org.apache.cocoon.faces.FacesUtils;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import javax.faces.FacesException;
import javax.faces.context.FacesContext;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
/**
* @version CVS $Id$
*/
public class LoadBundleTag extends TagSupport {
private String basename;
private String var;
public void setBasename(String basename) {
this.basename = basename;
}
public void setVar(String var) {
this.var = var;
}
public int doStartTag(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
final FacesContext context = FacesUtils.getFacesContext(this, objectModel);
final String basename = (String) FacesUtils.evaluate(context, this.basename);
final ResourceBundle bundle = ResourceBundle.getBundle(basename,
context.getViewRoot().getLocale(),
ClassUtils.getClassLoader());
if (bundle == null) {
throw new FacesException("Tag <" + getClass().getName() + "> " +
"could not find ResourceBundle for <" + basename + ">");
}
context.getExternalContext().getRequestMap().put(this.var, new BundleMap(bundle));
return SKIP_BODY;
}
public void recycle() {
super.recycle();
this.basename = null;
this.var = null;
}
}
class BundleMap implements Map {
private ResourceBundle bundle;
public BundleMap (ResourceBundle bundle) {
this.bundle = bundle;
}
public void clear() {
throw new UnsupportedOperationException("BundleMap does not support clear()");
}
public boolean containsKey(Object key) {
if (key == null) {
return false;
}
try {
this.bundle.getObject(key.toString());
return true;
} catch (Exception e) {
return false;
}
}
public boolean containsValue(Object value) {
if (value == null) {
return false;
}
for (Enumeration i = this.bundle.getKeys(); i.hasMoreElements();) {
Object obj = bundle.getObject((String) i.nextElement());
if (value == obj || value.equals(obj)) {
return true;
}
}
return false;
}
public Set entrySet() {
final HashMap entries = new HashMap();
for (Enumeration i = this.bundle.getKeys(); i.hasMoreElements();) {
String key = (String) i.nextElement();
entries.put(key, this.bundle.getObject(key));
}
return entries.entrySet();
}
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Map)) {
return false;
}
return entrySet().equals(((Map) obj).entrySet());
}
public Object get(Object key) {
if (key == null) {
return null;
}
return bundle.getObject(key.toString());
}
public int hashCode() {
return this.bundle.hashCode();
}
public boolean isEmpty() {
return !this.bundle.getKeys().hasMoreElements();
}
public Set keySet() {
final Set keys = new HashSet();
for (Enumeration i = this.bundle.getKeys(); i.hasMoreElements();) {
keys.add(i.nextElement());
}
return keys;
}
public Object put(Object k, Object v) {
throw new UnsupportedOperationException("BundleMap does not support put()");
}
public void putAll(Map t) {
throw new UnsupportedOperationException("BundleMap does not support putAll()");
}
public Object remove(Object k) {
throw new UnsupportedOperationException("BundleMap does not support remove()");
}
public int size() {
int result = 0;
for (Enumeration i = this.bundle.getKeys(); i.hasMoreElements();) {
i.nextElement();
result ++;
}
return result;
}
public Collection values() {
ArrayList values = new ArrayList();
for (Enumeration i = this.bundle.getKeys(); i.hasMoreElements();) {
values.add(this.bundle.getObject((String) i.nextElement()));
}
return values;
}
}