package org.anodyneos.xpImpl.standalone; import java.util.Enumeration; import javax.servlet.jsp.el.ELException; import javax.servlet.jsp.el.VariableResolver; import org.anodyneos.xp.standalone.StandaloneXpContext; import org.apache.commons.el.EnumeratedMap; /** * @author jvas */ public class StandaloneVariableResolverImpl implements VariableResolver { StandaloneXpContext ctx; public StandaloneVariableResolverImpl(StandaloneXpContext ctx) { this.ctx = ctx; } /** * Implicit variables take precidence over defined variables. */ public Object resolveVariable(String pName) throws ELException { if (StandaloneXpContext.PAGE_SCOPE_STRING.equals(pName)) { return new PageScopeMap(ctx); } else if (StandaloneXpContext.APPLICATION_SCOPE_STRING.equals(pName)) { return new ApplicationScopeMap(ctx); } else { return ctx.findAttribute(pName); } } private class PageScopeMap extends EnumeratedMap { StandaloneXpContext psmCtx; public PageScopeMap(StandaloneXpContext ctx) { this.psmCtx = ctx; } public Enumeration enumerateKeys() { return psmCtx.getAttributeNamesInScope(StandaloneXpContext.PAGE_SCOPE); } public boolean isMutable() { return true; } public Object getValue(Object pKey) { if (pKey instanceof String) { return psmCtx.getAttribute((String) pKey, StandaloneXpContext.PAGE_SCOPE); } else { return null; } } } private class ApplicationScopeMap extends EnumeratedMap { StandaloneXpContext asmCtx; public ApplicationScopeMap(StandaloneXpContext ctx) { this.asmCtx = ctx; } public Enumeration enumerateKeys() { return asmCtx.getAttributeNamesInScope(StandaloneXpContext.APPLICATION_SCOPE); } public boolean isMutable() { return true; } public Object getValue(Object pKey) { if (pKey instanceof String) { return asmCtx.getAttribute((String) pKey, StandaloneXpContext.APPLICATION_SCOPE); } else { return null; } } } }