Java tutorial
/* * (C) Copyright 2012 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed 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. * * Contributors: * Anahide Tchertchian */ package org.nuxeo.ecm.platform.ui.web.binding.alias; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.el.ELException; import javax.el.ValueExpression; import javax.el.VariableMapper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jboss.el.ValueExpressionLiteral; /** * @since 5.6 */ @SuppressWarnings({ "unchecked", "rawtypes" }) public class AliasVariableMapperWrapper extends VariableMapper { private static final Log log = LogFactory.getLog(AliasVariableMapperWrapper.class); protected final VariableMapper orig; protected final List<String> blockedPatterns; protected Map vars; public AliasVariableMapperWrapper(VariableMapper orig, List<String> blockedPatterns) { super(); this.orig = orig; this.blockedPatterns = blockedPatterns; } /** * First tries to resolve against the inner Map, then the wrapped ValueExpression, unless target is an * {@link AliasVariableMapper} that blocks this variable pattern. */ @Override public ValueExpression resolveVariable(String variable) { ValueExpression ve = null; try { if (vars != null) { ve = (ValueExpression) vars.get(variable); } if (ve == null) { // resolve to a value expression resolving to null if variable // is supposed to be blocked if (variable != null && blockedPatterns != null) { for (String blockedPattern : blockedPatterns) { if (blockedPattern == null) { continue; } boolean doBlock = false; if (blockedPattern.endsWith("*")) { String pattern = blockedPattern.substring(0, blockedPattern.length() - 1); if (variable.startsWith(pattern)) { doBlock = true; } } else if (blockedPattern.equals(variable)) { doBlock = true; } if (doBlock) { if (log.isDebugEnabled()) { log.debug("Blocked expression var='" + variable + "'"); } return getNullValueExpression(); } } } return orig.resolveVariable(variable); } return ve; } catch (StackOverflowError e) { throw new ELException("Could not Resolve Variable [Overflow]: " + variable, e); } } protected ValueExpression getNullValueExpression() { return new ValueExpressionLiteral(null, Object.class); } @Override public ValueExpression setVariable(String variable, ValueExpression expression) { if (vars == null) { vars = new HashMap(); } return (ValueExpression) vars.put(variable, expression); } }