ASF Bugzilla – Attachment 29431 Details for
Bug 53896
Optimized Jasper ELResolver
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Optimized Jasper EL resolver
bug53896.patch (text/plain), 7.36 KB, created by
Jarek Gawor
on 2012-10-02 01:48:22 UTC
(
hide
)
Description:
Optimized Jasper EL resolver
Filename:
MIME Type:
Creator:
Jarek Gawor
Created:
2012-10-02 01:48:22 UTC
Size:
7.36 KB
patch
obsolete
>Index: java/org/apache/jasper/runtime/JspApplicationContextImpl.java >=================================================================== >--- java/org/apache/jasper/runtime/JspApplicationContextImpl.java (revision 1387458) >+++ java/org/apache/jasper/runtime/JspApplicationContextImpl.java (working copy) >@@ -19,27 +19,20 @@ > import java.security.AccessController; > import java.security.PrivilegedAction; > import java.util.ArrayList; >-import java.util.Iterator; > import java.util.List; > >-import javax.el.ArrayELResolver; >-import javax.el.BeanELResolver; > import javax.el.CompositeELResolver; > import javax.el.ELContextEvent; > import javax.el.ELContextListener; > import javax.el.ELResolver; > import javax.el.ExpressionFactory; >-import javax.el.ListELResolver; >-import javax.el.MapELResolver; >-import javax.el.ResourceBundleELResolver; > import javax.servlet.ServletContext; > import javax.servlet.jsp.JspApplicationContext; > import javax.servlet.jsp.JspContext; >-import javax.servlet.jsp.el.ImplicitObjectELResolver; >-import javax.servlet.jsp.el.ScopedAttributeELResolver; > > import org.apache.jasper.Constants; > import org.apache.jasper.el.ELContextImpl; >+import org.apache.jasper.el.JasperELResolver; > > /** > * Implementation of JspApplicationContext >@@ -119,18 +112,7 @@ > private ELResolver createELResolver() { > this.instantiated = true; > if (this.resolver == null) { >- CompositeELResolver r = new CompositeELResolver(); >- r.add(new ImplicitObjectELResolver()); >- for (Iterator<ELResolver> itr = this.resolvers.iterator(); >- itr.hasNext();) { >- r.add(itr.next()); >- } >- r.add(new MapELResolver()); >- r.add(new ResourceBundleELResolver()); >- r.add(new ListELResolver()); >- r.add(new ArrayELResolver()); >- r.add(new BeanELResolver()); >- r.add(new ScopedAttributeELResolver()); >+ CompositeELResolver r = new JasperELResolver(this.resolvers); > this.resolver = r; > } > return this.resolver; >Index: java/org/apache/jasper/el/JasperELResolver.java >=================================================================== >--- java/org/apache/jasper/el/JasperELResolver.java (revision 0) >+++ java/org/apache/jasper/el/JasperELResolver.java (revision 0) >@@ -0,0 +1,142 @@ >+/* >+ * 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.jasper.el; >+ >+import java.util.List; >+ >+import javax.el.ArrayELResolver; >+import javax.el.BeanELResolver; >+import javax.el.CompositeELResolver; >+import javax.el.ELContext; >+import javax.el.ELException; >+import javax.el.ELResolver; >+import javax.el.ListELResolver; >+import javax.el.MapELResolver; >+import javax.el.PropertyNotFoundException; >+import javax.el.ResourceBundleELResolver; >+import javax.servlet.jsp.el.ImplicitObjectELResolver; >+import javax.servlet.jsp.el.ScopedAttributeELResolver; >+ >+import org.apache.el.lang.ELSupport; >+ >+/* >+ * Jasper-specific CompositeELResolver that optimizes certain functions to avoid unnecessary resolver calls. >+ */ >+public class JasperELResolver extends CompositeELResolver { >+ >+ private int size; >+ private ELResolver[] resolvers; >+ private int appResolversSize; >+ >+ public JasperELResolver(List<ELResolver> appResolvers) { >+ appResolversSize = appResolvers.size(); >+ resolvers = new ELResolver[0]; >+ size = resolvers.length; >+ >+ add(new ImplicitObjectELResolver()); >+ for (ELResolver appResolver : appResolvers) { >+ add(appResolver); >+ } >+ add(new MapELResolver()); >+ add(new ResourceBundleELResolver()); >+ add(new ListELResolver()); >+ add(new ArrayELResolver()); >+ add(new BeanELResolver()); >+ add(new ScopedAttributeELResolver()); >+ } >+ >+ @Override >+ public synchronized void add(ELResolver elResolver) { >+ super.add(elResolver); >+ >+ ELResolver[] nr = new ELResolver[size + 1]; >+ System.arraycopy(resolvers, 0, nr, 0, size); >+ nr[size] = elResolver; >+ >+ resolvers = nr; >+ size ++; >+ } >+ >+ @Override >+ public Object getValue(ELContext context, Object base, Object property) >+ throws NullPointerException, PropertyNotFoundException, ELException { >+ context.setPropertyResolved(false); >+ >+ int start; >+ Object result = null; >+ >+ if (base == null) { >+ // call implicit and app resolvers >+ int index = 1 /* implicit */ + appResolversSize; >+ for (int i = 0; i < index; i++) { >+ result = resolvers[i].getValue(context, base, property); >+ if (context.isPropertyResolved()) { >+ return result; >+ } >+ } >+ // skip collection-based resolvers (map, resource, list, array, and bean) >+ start = index + 5; >+ } else { >+ // skip implicit resolver only >+ start = 1; >+ } >+ >+ for (int i = start; i < size; i++) { >+ result = resolvers[i].getValue(context, base, property); >+ if (context.isPropertyResolved()) { >+ return result; >+ } >+ } >+ >+ return null; >+ } >+ >+ @Override >+ public Object invoke(ELContext context, Object base, Object method, Class<?>[] paramTypes, Object[] params) { >+ String targetMethod = ELSupport.coerceToString(method); >+ if (targetMethod.length() == 0) { >+ throw new ELException(new NoSuchMethodException()); >+ } >+ >+ context.setPropertyResolved(false); >+ >+ Object result = null; >+ >+ // skip implicit and call app resolvers >+ int index = 1 /* implicit */ + appResolversSize; >+ for (int i = 1; i < index; i++) { >+ result = resolvers[i].invoke(context, base, targetMethod, paramTypes, params); >+ if (context.isPropertyResolved()) { >+ return result; >+ } >+ } >+ >+ // skip map, resource, list, and array resolvers >+ index += 4; >+ // call bean and the rest of resolvers >+ for (int i = index; i < size; i++) { >+ result = resolvers[i].invoke(context, base, targetMethod, paramTypes, params); >+ if (context.isPropertyResolved()) { >+ return result; >+ } >+ } >+ >+ return null; >+ } >+ >+} > >Property changes on: java/org/apache/jasper/el/JasperELResolver.java >___________________________________________________________________ >Added: svn:mime-type > + text/plain >Added: svn:keywords > + Date Revision >Added: svn:eol-style > + native >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 53896
:
29397
| 29431