Expanding your use of EL (Part 2)
Wed Jul 24 12:37:12 EDT 2013
- Expanding your use of EL (Part 1)
- Expanding your use of EL (Part 2)
Last time, I said that my next post would delve into operations and comparisons in EL, but I figured first it would be good to have a real-use example of what I talked about last time.
In several of my apps lately, I've taken to using properties files to store app configuration, primarily the server and file paths for the databases that store the actual data. The standard way of doing this is to use the platform's built-in bundle-handling abilities. However, that'd leave me stuck with either putting the bundle reference in the XSP markup somewhere or in a theme - the former would muddy things up and the latter is not available at page-load time. So instead, I wrote a quick class to use as an application-scoped bean, making it available everywhere via EL and Java:
package config; import java.io.IOException; import java.io.Serializable; import java.util.Locale; import java.util.ResourceBundle; import javax.faces.context.FacesContext; import com.ibm.xsp.application.ApplicationEx; import com.ibm.xsp.model.DataObject; public class AppConfig implements Serializable, DataObject { private static final long serialVersionUID = -5125445506949601097L; private transient ResourceBundle config; public Class<?> getType(final Object keyObject) { return String.class; } public Object getValue(final Object keyObject) { if(!(keyObject instanceof String)) { throw new IllegalArgumentException(); } return getConfig().getString((String)keyObject); } public boolean isReadOnly(final Object keyObject) { return true; } public void setValue(final Object keyObject, final Object value) { } private ResourceBundle getConfig() { if (config == null) { try { ApplicationEx app = (ApplicationEx) FacesContext.getCurrentInstance().getApplication(); config = app.getResourceBundle("config", Locale.getDefault()); } catch (IOException ioe) { ioe.printStackTrace(); } } return config; } }
This is an example of a simple read-only DataObject implementation. There are only four methods to implement: getType
, which returns the class of the value for the key; getValue
, which returns the actual value; isReadOnly
, which determines whether a given key is settable (always false here); and setValue
, which would set the value for the key if I wasn't making it read-only.
It's pretty straightforward to take this idea and apply it to any of your Map-like objects to ease their use in EL without having to implement or stub-out the dozen or so methods demanded by the actual Map interface.