pagecontextelresolver.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 272 行

JAVA
272
字号
/* * Copyright (c) 1998-2008 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 as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * 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.jsp.el;import com.caucho.el.AbstractVariableResolver;import com.caucho.jsp.PageContextImpl;import javax.el.*;import javax.servlet.jsp.el.ImplicitObjectELResolver;import javax.servlet.jsp.el.ScopedAttributeELResolver;import java.beans.FeatureDescriptor;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.PropertyResourceBundle;/** * Variable resolution for JSP variables */public class PageContextELResolver extends AbstractVariableResolver {  private final PageContextImpl _pageContext;  private final ELResolver []_customResolvers;    private final ImplicitObjectELResolver _implicitResolver    = new ImplicitObjectELResolver();  private final ScopedAttributeELResolver _attrResolver    = new ScopedAttributeELResolver();    private final MapELResolver _mapResolver = new MapELResolver();  private final ListELResolver _listResolver = new ListELResolver();  private final ArrayELResolver _arrayResolver = new ArrayELResolver();  private final ResourceBundleELResolver _bundleResolver    = new ResourceBundleELResolver();  private final BeanELResolver _beanResolver = new BeanELResolver();  public PageContextELResolver(PageContextImpl pageContext,			       ELResolver []customResolvers)  {    _customResolvers = customResolvers;    _pageContext = pageContext;  }  public ELResolver []getCustomResolvers()  {    return _customResolvers;  }  @Override  public Class<?> getCommonPropertyType(ELContext env,					Object base)  {    Class common = null;    if (base == null)      common = String.class;    for (int i = 0; i < _customResolvers.length; i++) {      common = common(common,		      _customResolvers[i].getCommonPropertyType(env, base));    }    common = common(common, _mapResolver.getCommonPropertyType(env, base));    common = common(common, _listResolver.getCommonPropertyType(env, base));    common = common(common, _arrayResolver.getCommonPropertyType(env, base));    common = common(common, _beanResolver.getCommonPropertyType(env, base));    common = common(common, _bundleResolver.getCommonPropertyType(env, base));    return common;  }  private static Class common(Class a, Class b)  {    if (a == null)      return b;    else if (b == null)      return a;    else if (a.isAssignableFrom(b))      return a;    else if (b.isAssignableFrom(a))      return b;    else // XXX:      return Object.class;  }  @Override  public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext env,							   Object base)  {    ArrayList<FeatureDescriptor> descriptors      = new ArrayList<FeatureDescriptor>();    for (int i = 0; i < _customResolvers.length; i++) {      addDescriptors(descriptors,		     _customResolvers[i].getFeatureDescriptors(env, base));    }    addDescriptors(descriptors, _mapResolver.getFeatureDescriptors(env, base));    addDescriptors(descriptors,		   _beanResolver.getFeatureDescriptors(env, base));    addDescriptors(descriptors,		   _bundleResolver.getFeatureDescriptors(env, base));    addDescriptors(descriptors,		   _implicitResolver.getFeatureDescriptors(env, base));    addDescriptors(descriptors,		   _attrResolver.getFeatureDescriptors(env, base));    return descriptors.iterator();  }  private void addDescriptors(ArrayList<FeatureDescriptor> descriptors,			      Iterator<FeatureDescriptor> iter)  {    if (iter == null)      return;    while (iter.hasNext()) {      FeatureDescriptor desc = iter.next();      descriptors.add(desc);    }  }    @Override  public Object getValue(ELContext env, Object base, Object property)  {    env.setPropertyResolved(false);    for (int i = 0; i < _customResolvers.length; i++) {      Object value = _customResolvers[i].getValue(env, base, property);      if (env.isPropertyResolved())	return value;    }        if (base != null) {      if (base instanceof Map)	return _mapResolver.getValue(env, base, property);      else if (base instanceof List)	return _listResolver.getValue(env, base, property);      else if (base.getClass().isArray())	return _arrayResolver.getValue(env, base, property);      else if (base instanceof PropertyResourceBundle)      	return _bundleResolver.getValue(env, base, property);      else	return _beanResolver.getValue(env, base, property);    }    else if (property instanceof String) {      env.setPropertyResolved(true);	      return _pageContext.findAttribute(property.toString());    }    else      return null;  }    @Override  public Class getType(ELContext env, Object base, Object property)  {    env.setPropertyResolved(false);    for (int i = 0; i < _customResolvers.length; i++) {      Class value = _customResolvers[i].getType(env, base, property);      if (env.isPropertyResolved())	return value;    }        if (base != null) {      if (base instanceof Map)	return _mapResolver.getType(env, base, property);      else if (base instanceof List)	return _listResolver.getType(env, base, property);      else if (base.getClass().isArray())	return _arrayResolver.getType(env, base, property);      else if (base instanceof PropertyResourceBundle)      	return _bundleResolver.getType(env, base, property);      else	return _beanResolver.getType(env, base, property);    }    else if (base == null && property instanceof String) {      env.setPropertyResolved(true);      Object value = _pageContext.findAttribute(property.toString());      if (value != null)	return value.getClass();      else	return null;    }    else      return null;  }    @Override  public boolean isReadOnly(ELContext env, Object base, Object property)  {    env.setPropertyResolved(false);    for (int i = 0; i < _customResolvers.length; i++) {      boolean value = _customResolvers[i].isReadOnly(env, base, property);      if (env.isPropertyResolved())	return value;    }    env.setPropertyResolved(true);    return false;  }      public void setValue(ELContext env,		       Object base,		       Object property,		       Object value)  {    env.setPropertyResolved(false);        if (base != null) {      if (base instanceof Map)	_mapResolver.setValue(env, base, property, value);      else if (base instanceof List)	_listResolver.setValue(env, base, property, value);      else if (base.getClass().isArray())	_arrayResolver.setValue(env, base, property, value);      else	_beanResolver.setValue(env, base, property, value);    }    else if (property instanceof String) {      for (int i = 0; i < _customResolvers.length; i++) {	_customResolvers[i].setValue(env, base, property, value);	if (env.isPropertyResolved())	  return;      }            env.setPropertyResolved(true);	      _pageContext.setAttribute(property.toString(), value);    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?