You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by st...@apache.org on 2019/05/06 11:56:05 UTC
svn commit: r1858789 [1/18] - in /geronimo/specs/branches/jakarta:
geronimo-jakarta-el_spec/src/main/java/jakarta/el/
geronimo-jakarta-el_spec/src/main/resources/jakarta/
geronimo-jakarta-el_spec/src/main/resources/jakarta/el/
geronimo-jakarta-el_spec/...
Author: struberg
Date: Mon May 6 11:56:04 2019
New Revision: 1858789
URL: http://svn.apache.org/viewvc?rev=1858789&view=rev
Log:
more jakarta migration
Added:
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameELResolver.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameResolver.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELClass.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELManager.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELProcessor.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/EvaluationListener.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ImportHandler.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/LambdaExpression.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StandardELContext.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StaticFieldELResolver.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/TypeConverter.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/Util.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/jakarta/
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/jakarta/el/
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/jakarta/el/LocalStrings.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/jakarta/el/LocalStrings_cs.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/jakarta/el/LocalStrings_de.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/jakarta/el/LocalStrings_es.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/jakarta/el/LocalStrings_fr.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/jakarta/el/LocalStrings_ja.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/jakarta/el/LocalStrings_ko.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/jakarta/el/LocalStrings_pt_BR.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/jakarta/el/LocalStrings_zh_CN.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-jta_spec/src/main/java/javax/
geronimo/specs/branches/jakarta/geronimo-jakarta-jta_spec/src/main/java/javax/transaction/
geronimo/specs/branches/jakarta/geronimo-jakarta-jta_spec/src/main/java/javax/transaction/xa/
geronimo/specs/branches/jakarta/geronimo-jakarta-jta_spec/src/main/java/javax/transaction/xa/XAException.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-jta_spec/src/main/java/javax/transaction/xa/XAResource.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-jta_spec/src/main/java/javax/transaction/xa/Xid.java (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/LocalStrings.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/LocalStrings_cs.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/LocalStrings_de.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/LocalStrings_es.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/LocalStrings_fr.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/LocalStrings_ja.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/LocalStrings_ko.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/LocalStrings_zh_CN.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/http/
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/http/LocalStrings.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/http/LocalStrings_de.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/http/LocalStrings_es.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/http/LocalStrings_fr.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/http/LocalStrings_ja.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/http/LocalStrings_ko.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/http/LocalStrings_zh_CN.properties (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/XMLSchema.dtd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/datatypes.dtd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/j2ee_1_4.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/j2ee_web_services_1_1.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/j2ee_web_services_client_1_1.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/javaee_5.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/javaee_6.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/javaee_7.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/javaee_8.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/javaee_web_services_1_2.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/javaee_web_services_1_3.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/javaee_web_services_1_4.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/javaee_web_services_client_1_2.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/javaee_web_services_client_1_3.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/javaee_web_services_client_1_4.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/jsp_2_0.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/jsp_2_1.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/jsp_2_2.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/jsp_2_3.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-app_2_2.dtd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-app_2_3.dtd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-app_2_4.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-app_2_5.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-app_3_0.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-app_3_1.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-app_4_0.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-common_3_0.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-common_3_1.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-common_4_0.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-fragment_3_0.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-fragment_3_1.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-fragment_4_0.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-jsptaglibrary_1_1.dtd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-jsptaglibrary_1_2.dtd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-jsptaglibrary_2_0.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/web-jsptaglibrary_2_1.xsd (with props)
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/jakarta/servlet/resources/xml.xsd (with props)
Removed:
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELUtils.java
geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/resources/javax/
geronimo/specs/branches/jakarta/geronimo-jakarta-servlet_spec/src/main/resources/javax/
Added: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameELResolver.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameELResolver.java?rev=1858789&view=auto
==============================================================================
--- geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameELResolver.java (added)
+++ geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameELResolver.java Mon May 6 11:56:04 2019
@@ -0,0 +1,155 @@
+/*
+ * 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 jakarta.el;
+
+import java.beans.FeatureDescriptor;
+import java.util.Iterator;
+import java.util.Objects;
+
+/**
+ * @since EL 3.0
+ */
+public class BeanNameELResolver extends ELResolver {
+
+ private final BeanNameResolver beanNameResolver;
+
+ public BeanNameELResolver(BeanNameResolver beanNameResolver) {
+ this.beanNameResolver = beanNameResolver;
+ }
+
+ @Override
+ public Object getValue(ELContext context, Object base, Object property) {
+ Objects.requireNonNull(context);
+ if (base != null || !(property instanceof String)) {
+ return null;
+ }
+
+ String beanName = (String) property;
+
+ if (beanNameResolver.isNameResolved(beanName)) {
+ try {
+ Object result = beanNameResolver.getBean(beanName);
+ context.setPropertyResolved(base, property);
+ return result;
+ } catch (Throwable t) {
+ Util.handleThrowable(t);
+ throw new ELException(t);
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void setValue(ELContext context, Object base, Object property,
+ Object value) {
+ Objects.requireNonNull(context);
+ if (base != null || !(property instanceof String)) {
+ return;
+ }
+
+ String beanName = (String) property;
+
+ boolean isResolved = context.isPropertyResolved();
+
+ boolean isReadOnly;
+ try {
+ isReadOnly = isReadOnly(context, base, property);
+ } catch (Throwable t) {
+ Util.handleThrowable(t);
+ throw new ELException(t);
+ } finally {
+ context.setPropertyResolved(isResolved);
+ }
+
+ if (isReadOnly) {
+ throw new PropertyNotWritableException(Util.message(context,
+ "beanNameELResolver.beanReadOnly", beanName));
+ }
+
+ if (beanNameResolver.isNameResolved(beanName) ||
+ beanNameResolver.canCreateBean(beanName)) {
+ try {
+ beanNameResolver.setBeanValue(beanName, value);
+ context.setPropertyResolved(base, property);
+ } catch (Throwable t) {
+ Util.handleThrowable(t);
+ throw new ELException(t);
+ }
+ }
+ }
+
+ @Override
+ public Class<?> getType(ELContext context, Object base, Object property) {
+ Objects.requireNonNull(context);
+ if (base != null || !(property instanceof String)) {
+ return null;
+ }
+
+ String beanName = (String) property;
+
+ try {
+ if (beanNameResolver.isNameResolved(beanName)) {
+ Class<?> result = beanNameResolver.getBean(beanName).getClass();
+ context.setPropertyResolved(base, property);
+ return result;
+ }
+ } catch (Throwable t) {
+ Util.handleThrowable(t);
+ throw new ELException(t);
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean isReadOnly(ELContext context, Object base, Object property) {
+ Objects.requireNonNull(context);
+ if (base != null || !(property instanceof String)) {
+ // Return value undefined
+ return false;
+ }
+
+ String beanName = (String) property;
+
+ if (beanNameResolver.isNameResolved(beanName)) {
+ boolean result;
+ try {
+ result = beanNameResolver.isReadOnly(beanName);
+ } catch (Throwable t) {
+ Util.handleThrowable(t);
+ throw new ELException(t);
+ }
+ context.setPropertyResolved(base, property);
+ return result;
+ }
+
+ // Return value undefined
+ return false;
+ }
+
+ @Override
+ public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context,
+ Object base) {
+ return null;
+ }
+
+ @Override
+ public Class<?> getCommonPropertyType(ELContext context, Object base) {
+ return String.class;
+ }
+}
Propchange: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameELResolver.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameResolver.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameResolver.java?rev=1858789&view=auto
==============================================================================
--- geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameResolver.java (added)
+++ geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameResolver.java Mon May 6 11:56:04 2019
@@ -0,0 +1,91 @@
+/*
+ * 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 jakarta.el;
+
+/**
+ * Base implementation that provides a minimal default implementation that is
+ * intended to be extended by application developers.
+ *
+ * @since EL 3.0
+ */
+public abstract class BeanNameResolver {
+
+ /**
+ * Can this resolver resolve the given bean name?
+ *
+ * @param beanName The bean name to resolve
+ *
+ * @return This default implementation always returns <code>false</code>
+ */
+ public boolean isNameResolved(String beanName) {
+ return false;
+ }
+
+
+ /**
+ * Returns the named bean.
+ *
+ * @param beanName The bean name to return
+ *
+ * @return This default implementation always returns <code>null</code>
+ */
+ public Object getBean(String beanName) {
+ return null;
+ }
+
+
+ /**
+ * Sets a value of a bean of the given name. If the named bean does not
+ * exist and {@link #canCreateBean} returns <code>true</code> then a bean
+ * is created with the given value.
+ *
+ * @param beanName The name of the bean to be set/create
+ * @param value The value of the bean to set/create
+ *
+ * @throws PropertyNotWritableException if the bean is read only
+ */
+ public void setBeanValue(String beanName, Object value)
+ throws PropertyNotWritableException {
+ throw new PropertyNotWritableException();
+ }
+
+
+ /**
+ * Is the named bean read-only?
+ *
+ * @param beanName The name of the bean of interest
+ *
+ * @return <code>true</code> if the bean is read only, otherwise
+ * <code>false</code>
+ */
+ public boolean isReadOnly(String beanName) {
+ return true;
+ }
+
+
+ /**
+ * Is it permitted to create a bean of the given name?
+ *
+ * @param beanName The name of the bean of interest
+ *
+ * @return <code>true</code> if the bean may be created, otherwise
+ * <code>false</code>
+ */
+ public boolean canCreateBean(String beanName) {
+ return false;
+ }
+}
Propchange: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/BeanNameResolver.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELClass.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELClass.java?rev=1858789&view=auto
==============================================================================
--- geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELClass.java (added)
+++ geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELClass.java Mon May 6 11:56:04 2019
@@ -0,0 +1,33 @@
+/*
+ * 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 jakarta.el;
+
+/**
+ * @since EL 3.0
+ */
+public class ELClass {
+
+ private final Class<?> clazz;
+
+ public ELClass(Class<?> clazz) {
+ this.clazz = clazz;
+ }
+
+ public Class<?> getKlass() {
+ return clazz;
+ }
+}
Propchange: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELClass.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELManager.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELManager.java?rev=1858789&view=auto
==============================================================================
--- geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELManager.java (added)
+++ geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELManager.java Mon May 6 11:56:04 2019
@@ -0,0 +1,90 @@
+/*
+ * 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 jakarta.el;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * @since EL 3.0
+ */
+public class ELManager {
+
+ private StandardELContext context = null;
+
+ public static ExpressionFactory getExpressionFactory() {
+ return Util.getExpressionFactory();
+ }
+
+ public StandardELContext getELContext() {
+ if (context == null) {
+ context = new StandardELContext(getExpressionFactory());
+ }
+
+ return context;
+ }
+
+ public ELContext setELContext(ELContext context) {
+ StandardELContext oldContext = this.context;
+ this.context = new StandardELContext(context);
+ return oldContext;
+ }
+
+ public void addBeanNameResolver(BeanNameResolver beanNameResolver) {
+ getELContext().addELResolver(new BeanNameELResolver(beanNameResolver));
+ }
+
+ public void addELResolver(ELResolver resolver) {
+ getELContext().addELResolver(resolver);
+ }
+
+ public void mapFunction(String prefix, String function, Method method) {
+ getELContext().getFunctionMapper().mapFunction(
+ prefix, function, method);
+ }
+
+ public void setVariable(String variable, ValueExpression expression) {
+ getELContext().getVariableMapper().setVariable(variable, expression);
+ }
+
+ public void importStatic(String staticMemberName)
+ throws jakarta.el.ELException {
+ getELContext().getImportHandler().importStatic(staticMemberName);
+ }
+
+ public void importClass(String className) throws jakarta.el.ELException {
+ getELContext().getImportHandler().importClass(className);
+ }
+
+ public void importPackage(String packageName) {
+ getELContext().getImportHandler().importPackage(packageName);
+ }
+
+ public Object defineBean(String name, Object bean) {
+ Map<String,Object> localBeans = getELContext().getLocalBeans();
+
+ if (bean == null) {
+ return localBeans.remove(name);
+ } else {
+ return localBeans.put(name, bean);
+ }
+ }
+
+ public void addEvaluationListener(EvaluationListener listener) {
+ getELContext().addEvaluationListener(listener);
+ }
+}
Propchange: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELProcessor.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELProcessor.java?rev=1858789&view=auto
==============================================================================
--- geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELProcessor.java (added)
+++ geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELProcessor.java Mon May 6 11:56:04 2019
@@ -0,0 +1,355 @@
+/*
+ * 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 jakarta.el;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @since EL 3.0
+ */
+public class ELProcessor {
+
+ private static final Set<String> PRIMITIVES = new HashSet<>();
+ static {
+ PRIMITIVES.add("boolean");
+ PRIMITIVES.add("byte");
+ PRIMITIVES.add("char");
+ PRIMITIVES.add("double");
+ PRIMITIVES.add("float");
+ PRIMITIVES.add("int");
+ PRIMITIVES.add("long");
+ PRIMITIVES.add("short");
+ }
+
+ private static final String[] EMPTY_STRING_ARRAY = new String[0];
+
+ private final ELManager manager = new ELManager();
+ private final ELContext context = manager.getELContext();
+ private final ExpressionFactory factory = ELManager.getExpressionFactory();
+
+
+ public ELManager getELManager() {
+ return manager;
+ }
+
+
+ public Object eval(String expression) {
+ return getValue(expression, Object.class);
+ }
+
+
+ public Object getValue(String expression, Class<?> expectedType) {
+ ValueExpression ve = factory.createValueExpression(
+ context, bracket(expression), expectedType);
+ return ve.getValue(context);
+ }
+
+
+ public void setValue(String expression, Object value) {
+ ValueExpression ve = factory.createValueExpression(
+ context, bracket(expression), Object.class);
+ ve.setValue(context, value);
+ }
+
+
+ public void setVariable(String variable, String expression) {
+ if (expression == null) {
+ manager.setVariable(variable, null);
+ } else {
+ ValueExpression ve = factory.createValueExpression(
+ context, bracket(expression), Object.class);
+ manager.setVariable(variable, ve);
+ }
+ }
+
+
+ public void defineFunction(String prefix, String function, String className,
+ String methodName) throws ClassNotFoundException,
+ NoSuchMethodException {
+
+ if (prefix == null || function == null || className == null ||
+ methodName == null) {
+ throw new NullPointerException(Util.message(
+ context, "elProcessor.defineFunctionNullParams"));
+ }
+
+ // Check the imports
+ Class<?> clazz = context.getImportHandler().resolveClass(className);
+
+ if (clazz == null) {
+ clazz = Class.forName(className, true, Util.getContextClassLoader());
+ }
+
+ if (!Modifier.isPublic(clazz.getModifiers())) {
+ throw new ClassNotFoundException(Util.message(context,
+ "elProcessor.defineFunctionInvalidClass", className));
+ }
+
+ MethodSignature sig =
+ new MethodSignature(context, methodName, className);
+
+ if (function.length() == 0) {
+ function = sig.getName();
+ }
+
+ Method methods[] = clazz.getMethods();
+ for (Method method : methods) {
+ if (!Modifier.isStatic(method.getModifiers())) {
+ continue;
+ }
+ if (method.getName().equals(sig.getName())) {
+ if (sig.getParamTypeNames() == null) {
+ // Only a name provided, no signature so map the first
+ // method declared
+ manager.mapFunction(prefix, function, method);
+ return;
+ }
+ if (sig.getParamTypeNames().length != method.getParameterTypes().length) {
+ continue;
+ }
+ if (sig.getParamTypeNames().length == 0) {
+ manager.mapFunction(prefix, function, method);
+ return;
+ } else {
+ Class<?>[] types = method.getParameterTypes();
+ String[] typeNames = sig.getParamTypeNames();
+ if (types.length == typeNames.length) {
+ boolean match = true;
+ for (int i = 0; i < types.length; i++) {
+ if (i == types.length -1 && method.isVarArgs()) {
+ String typeName = typeNames[i];
+ if (typeName.endsWith("...")) {
+ typeName = typeName.substring(0, typeName.length() - 3);
+ if (!typeName.equals(types[i].getName())) {
+ match = false;
+ }
+ } else {
+ match = false;
+ }
+ } else if (!types[i].getName().equals(typeNames[i])) {
+ match = false;
+ break;
+ }
+ }
+ if (match) {
+ manager.mapFunction(prefix, function, method);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ throw new NoSuchMethodException(Util.message(context,
+ "elProcessor.defineFunctionNoMethod", methodName, className));
+ }
+
+
+ /**
+ * Map a method to a function name.
+ *
+ * @param prefix Function prefix
+ * @param function Function name
+ * @param method Method
+ *
+ * @throws NullPointerException
+ * If any of the arguments are null
+ * @throws NoSuchMethodException
+ * If the method is not static
+ */
+ public void defineFunction(String prefix, String function, Method method)
+ throws java.lang.NoSuchMethodException {
+
+ if (prefix == null || function == null || method == null) {
+ throw new NullPointerException(Util.message(
+ context, "elProcessor.defineFunctionNullParams"));
+ }
+
+ int modifiers = method.getModifiers();
+
+ // Check for public method as well as being static
+ if (!Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
+ throw new NoSuchMethodException(Util.message(context,
+ "elProcessor.defineFunctionInvalidMethod", method.getName(),
+ method.getDeclaringClass().getName()));
+ }
+
+ manager.mapFunction(prefix, function, method);
+ }
+
+
+ public void defineBean(String name, Object bean) {
+ manager.defineBean(name, bean);
+ }
+
+
+ private static String bracket(String expression) {
+ return "${" + expression + "}";
+ }
+
+ private static class MethodSignature {
+
+ private final String name;
+ private final String[] parameterTypeNames;
+
+ public MethodSignature(ELContext context, String methodName,
+ String className) throws NoSuchMethodException {
+
+ int paramIndex = methodName.indexOf('(');
+
+ if (paramIndex == -1) {
+ name = methodName.trim();
+ parameterTypeNames = null;
+ } else {
+ String returnTypeAndName = methodName.substring(0, paramIndex).trim();
+ // Assume that the return type and the name are separated by
+ // whitespace. Given the use of trim() above, there should only
+ // be one sequence of whitespace characters.
+ int wsPos = -1;
+ for (int i = 0; i < returnTypeAndName.length(); i++) {
+ if (Character.isWhitespace(returnTypeAndName.charAt(i))) {
+ wsPos = i;
+ break;
+ }
+ }
+ if (wsPos == -1) {
+ throw new NoSuchMethodException();
+ }
+ name = returnTypeAndName.substring(wsPos).trim();
+
+ String paramString = methodName.substring(paramIndex).trim();
+ // We know the params start with '(', check they end with ')'
+ if (!paramString.endsWith(")")) {
+ throw new NoSuchMethodException(Util.message(context,
+ "elProcessor.defineFunctionInvalidParameterList",
+ paramString, methodName, className));
+ }
+ // Trim '(' and ')'
+ paramString = paramString.substring(1, paramString.length() - 1).trim();
+ if (paramString.length() == 0) {
+ parameterTypeNames = EMPTY_STRING_ARRAY;
+ } else {
+ parameterTypeNames = paramString.split(",");
+ ImportHandler importHandler = context.getImportHandler();
+ for (int i = 0; i < parameterTypeNames.length; i++) {
+ String parameterTypeName = parameterTypeNames[i].trim();
+ int dimension = 0;
+ int bracketPos = parameterTypeName.indexOf('[');
+ if (bracketPos > -1) {
+ String parameterTypeNameOnly =
+ parameterTypeName.substring(0, bracketPos).trim();
+ while (bracketPos > -1) {
+ dimension++;
+ bracketPos = parameterTypeName.indexOf('[', bracketPos+ 1);
+ }
+ parameterTypeName = parameterTypeNameOnly;
+ }
+ boolean varArgs = false;
+ if (parameterTypeName.endsWith("...")) {
+ varArgs = true;
+ dimension = 1;
+ parameterTypeName = parameterTypeName.substring(
+ 0, parameterTypeName.length() -3).trim();
+ }
+ boolean isPrimitive = PRIMITIVES.contains(parameterTypeName);
+ if (isPrimitive && dimension > 0) {
+ // When in an array, class name changes for primitive
+ switch(parameterTypeName)
+ {
+ case "boolean":
+ parameterTypeName = "Z";
+ break;
+ case "byte":
+ parameterTypeName = "B";
+ break;
+ case "char":
+ parameterTypeName = "C";
+ break;
+ case "double":
+ parameterTypeName = "D";
+ break;
+ case "float":
+ parameterTypeName = "F";
+ break;
+ case "int":
+ parameterTypeName = "I";
+ break;
+ case "long":
+ parameterTypeName = "J";
+ break;
+ case "short":
+ parameterTypeName = "S";
+ break;
+ default:
+ // Should never happen
+ break;
+ }
+ } else if (!isPrimitive &&
+ !parameterTypeName.contains(".")) {
+ Class<?> clazz = importHandler.resolveClass(
+ parameterTypeName);
+ if (clazz == null) {
+ throw new NoSuchMethodException(Util.message(
+ context,
+ "elProcessor.defineFunctionInvalidParameterTypeName",
+ parameterTypeNames[i], methodName,
+ className));
+ }
+ parameterTypeName = clazz.getName();
+ }
+ if (dimension > 0) {
+ // Convert to array form of class name
+ StringBuilder sb = new StringBuilder();
+ for (int j = 0; j < dimension; j++) {
+ sb.append('[');
+ }
+ if (!isPrimitive) {
+ sb.append('L');
+ }
+ sb.append(parameterTypeName);
+ if (!isPrimitive) {
+ sb.append(';');
+ }
+ parameterTypeName = sb.toString();
+ }
+ if (varArgs) {
+ parameterTypeName += "...";
+ }
+ parameterTypeNames[i] = parameterTypeName;
+ }
+ }
+ }
+
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return <code>null</code> if just the method name was specified, an
+ * empty List if an empty parameter list was specified - i.e. ()
+ * - otherwise an ordered list of parameter type names
+ */
+ public String[] getParamTypeNames() {
+ return parameterTypeNames;
+ }
+ }
+}
Propchange: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ELProcessor.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/EvaluationListener.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/EvaluationListener.java?rev=1858789&view=auto
==============================================================================
--- geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/EvaluationListener.java (added)
+++ geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/EvaluationListener.java Mon May 6 11:56:04 2019
@@ -0,0 +1,55 @@
+/*
+ * 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 jakarta.el;
+
+/**
+ * @since EL 3.0
+ */
+public abstract class EvaluationListener {
+
+ /**
+ * Fired before the evaluation of the expression.
+ *
+ * @param context The EL context in which the expression will be
+ * evaluated
+ * @param expression The expression that will be evaluated
+ */
+ public void beforeEvaluation(ELContext context, String expression) {
+ // NO-OP
+ }
+
+ /**
+ * Fired after the evaluation of the expression.
+ *
+ * @param context The EL context in which the expression was evaluated
+ * @param expression The expression that was evaluated
+ */
+ public void afterEvaluation(ELContext context, String expression) {
+ // NO-OP
+ }
+
+ /**
+ * Fired after a property has been resolved.
+ *
+ * @param context The EL context in which the property was resolved
+ * @param base The base object on which the property was resolved
+ * @param property The property that was resolved
+ */
+ public void propertyResolved(ELContext context, Object base, Object property) {
+ // NO-OP
+ }
+}
Propchange: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/EvaluationListener.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ImportHandler.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ImportHandler.java?rev=1858789&view=auto
==============================================================================
--- geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ImportHandler.java (added)
+++ geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ImportHandler.java Mon May 6 11:56:04 2019
@@ -0,0 +1,489 @@
+/*
+ * 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 jakarta.el;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @since EL 3.0
+ */
+public class ImportHandler {
+
+ private static final Map<String,Set<String>> standardPackages = new HashMap<>();
+
+ static {
+ // Servlet 4.0
+ Set<String> servletClassNames = new HashSet<>();
+ // Interfaces
+ servletClassNames.add("AsyncContext");
+ servletClassNames.add("AsyncListener");
+ servletClassNames.add("Filter");
+ servletClassNames.add("FilterChain");
+ servletClassNames.add("FilterConfig");
+ servletClassNames.add("FilterRegistration");
+ servletClassNames.add("FilterRegistration.Dynamic");
+ servletClassNames.add("ReadListener");
+ servletClassNames.add("Registration");
+ servletClassNames.add("Registration.Dynamic");
+ servletClassNames.add("RequestDispatcher");
+ servletClassNames.add("Servlet");
+ servletClassNames.add("ServletConfig");
+ servletClassNames.add("ServletContainerInitializer");
+ servletClassNames.add("ServletContext");
+ servletClassNames.add("ServletContextAttributeListener");
+ servletClassNames.add("ServletContextListener");
+ servletClassNames.add("ServletRegistration");
+ servletClassNames.add("ServletRegistration.Dynamic");
+ servletClassNames.add("ServletRequest");
+ servletClassNames.add("ServletRequestAttributeListener");
+ servletClassNames.add("ServletRequestListener");
+ servletClassNames.add("ServletResponse");
+ servletClassNames.add("SessionCookieConfig");
+ servletClassNames.add("SingleThreadModel");
+ servletClassNames.add("WriteListener");
+ // Classes
+ servletClassNames.add("AsyncEvent");
+ servletClassNames.add("GenericFilter");
+ servletClassNames.add("GenericServlet");
+ servletClassNames.add("HttpConstraintElement");
+ servletClassNames.add("HttpMethodConstraintElement");
+ servletClassNames.add("MultipartConfigElement");
+ servletClassNames.add("ServletContextAttributeEvent");
+ servletClassNames.add("ServletContextEvent");
+ servletClassNames.add("ServletInputStream");
+ servletClassNames.add("ServletOutputStream");
+ servletClassNames.add("ServletRequestAttributeEvent");
+ servletClassNames.add("ServletRequestEvent");
+ servletClassNames.add("ServletRequestWrapper");
+ servletClassNames.add("ServletResponseWrapper");
+ servletClassNames.add("ServletSecurityElement");
+ // Enums
+ servletClassNames.add("DispatcherType");
+ servletClassNames.add("SessionTrackingMode");
+ // Exceptions
+ servletClassNames.add("ServletException");
+ servletClassNames.add("UnavailableException");
+ standardPackages.put("jakarta.servlet", servletClassNames);
+
+ // Servlet 4.0
+ Set<String> servletHttpClassNames = new HashSet<>();
+ // Interfaces
+ servletHttpClassNames.add("HttpServletMapping");
+ servletHttpClassNames.add("HttpServletRequest");
+ servletHttpClassNames.add("HttpServletResponse");
+ servletHttpClassNames.add("HttpSession");
+ servletHttpClassNames.add("HttpSessionActivationListener");
+ servletHttpClassNames.add("HttpSessionAttributeListener");
+ servletHttpClassNames.add("HttpSessionBindingListener");
+ servletHttpClassNames.add("HttpSessionContext");
+ servletHttpClassNames.add("HttpSessionIdListener");
+ servletHttpClassNames.add("HttpSessionListener");
+ servletHttpClassNames.add("HttpUpgradeHandler");
+ servletHttpClassNames.add("Part");
+ servletHttpClassNames.add("PushBuilder");
+ servletHttpClassNames.add("WebConnection");
+ // Classes
+ servletHttpClassNames.add("Cookie");
+ servletHttpClassNames.add("HttpFilter");
+ servletHttpClassNames.add("HttpServlet");
+ servletHttpClassNames.add("HttpServletRequestWrapper");
+ servletHttpClassNames.add("HttpServletResponseWrapper");
+ servletHttpClassNames.add("HttpSessionBindingEvent");
+ servletHttpClassNames.add("HttpSessionEvent");
+ servletHttpClassNames.add("HttpUtils");
+ // Enums
+ servletHttpClassNames.add("MappingMatch");
+ standardPackages.put("jakarta.servlet.http", servletHttpClassNames);
+
+ // JSP 2.3
+ Set<String> servletJspClassNames = new HashSet<>();
+ //Interfaces
+ servletJspClassNames.add("HttpJspPage");
+ servletJspClassNames.add("JspApplicationContext");
+ servletJspClassNames.add("JspPage");
+ // Classes
+ servletJspClassNames.add("ErrorData");
+ servletJspClassNames.add("JspContext");
+ servletJspClassNames.add("JspEngineInfo");
+ servletJspClassNames.add("JspFactory");
+ servletJspClassNames.add("JspWriter");
+ servletJspClassNames.add("PageContext");
+ servletJspClassNames.add("Exceptions");
+ servletJspClassNames.add("JspException");
+ servletJspClassNames.add("JspTagException");
+ servletJspClassNames.add("SkipPageException");
+ standardPackages.put("jakarta.servlet.jsp", servletJspClassNames);
+
+ Set<String> javaLangClassNames = new HashSet<>();
+ // Taken from Java 11 EA18 Javadoc
+ // Interfaces
+ javaLangClassNames.add("Appendable");
+ javaLangClassNames.add("AutoCloseable");
+ javaLangClassNames.add("CharSequence");
+ javaLangClassNames.add("Cloneable");
+ javaLangClassNames.add("Comparable");
+ javaLangClassNames.add("Iterable");
+ javaLangClassNames.add("ProcessHandle");
+ javaLangClassNames.add("ProcessHandle.Info");
+ javaLangClassNames.add("Readable");
+ javaLangClassNames.add("Runnable");
+ javaLangClassNames.add("StackWalker.StackFrame");
+ javaLangClassNames.add("System.Logger");
+ javaLangClassNames.add("Thread.UncaughtExceptionHandler");
+ //Classes
+ javaLangClassNames.add("Boolean");
+ javaLangClassNames.add("Byte");
+ javaLangClassNames.add("Character");
+ javaLangClassNames.add("Character.Subset");
+ javaLangClassNames.add("Character.UnicodeBlock");
+ javaLangClassNames.add("Class");
+ javaLangClassNames.add("ClassLoader");
+ javaLangClassNames.add("ClassValue");
+ javaLangClassNames.add("Compiler");
+ javaLangClassNames.add("Double");
+ javaLangClassNames.add("Enum");
+ javaLangClassNames.add("Enum.EnumDesc");
+ javaLangClassNames.add("Float");
+ javaLangClassNames.add("InheritableThreadLocal");
+ javaLangClassNames.add("Integer");
+ javaLangClassNames.add("Long");
+ javaLangClassNames.add("Math");
+ javaLangClassNames.add("Module");
+ javaLangClassNames.add("ModuleLayer");
+ javaLangClassNames.add("ModuleLayer.Controller");
+ javaLangClassNames.add("Number");
+ javaLangClassNames.add("Object");
+ javaLangClassNames.add("Package");
+ javaLangClassNames.add("Process");
+ javaLangClassNames.add("ProcessBuilder");
+ javaLangClassNames.add("ProcessBuilder.Redirect");
+ javaLangClassNames.add("Runtime");
+ javaLangClassNames.add("Runtime.Version");
+ javaLangClassNames.add("RuntimePermission");
+ javaLangClassNames.add("SecurityManager");
+ javaLangClassNames.add("Short");
+ javaLangClassNames.add("StackTraceElement");
+ javaLangClassNames.add("StackWalker");
+ javaLangClassNames.add("StrictMath");
+ javaLangClassNames.add("String");
+ javaLangClassNames.add("StringBuffer");
+ javaLangClassNames.add("StringBuilder");
+ javaLangClassNames.add("System");
+ javaLangClassNames.add("System.LoggerFinder");
+ javaLangClassNames.add("Thread");
+ javaLangClassNames.add("ThreadGroup");
+ javaLangClassNames.add("ThreadLocal");
+ javaLangClassNames.add("Throwable");
+ javaLangClassNames.add("Void");
+ //Enums
+ javaLangClassNames.add("Character.UnicodeScript");
+ javaLangClassNames.add("ProcessBuilder.Redirect.Type");
+ javaLangClassNames.add("StackWalker.Option");
+ javaLangClassNames.add("System.Logger.Level");
+ javaLangClassNames.add("Thread.State");
+ //Exceptions
+ javaLangClassNames.add("ArithmeticException");
+ javaLangClassNames.add("ArrayIndexOutOfBoundsException");
+ javaLangClassNames.add("ArrayStoreException");
+ javaLangClassNames.add("ClassCastException");
+ javaLangClassNames.add("ClassNotFoundException");
+ javaLangClassNames.add("CloneNotSupportedException");
+ javaLangClassNames.add("EnumConstantNotPresentException");
+ javaLangClassNames.add("Exception");
+ javaLangClassNames.add("IllegalAccessException");
+ javaLangClassNames.add("IllegalArgumentException");
+ javaLangClassNames.add("IllegalCallerException");
+ javaLangClassNames.add("IllegalMonitorStateException");
+ javaLangClassNames.add("IllegalStateException");
+ javaLangClassNames.add("IllegalThreadStateException");
+ javaLangClassNames.add("IndexOutOfBoundsException");
+ javaLangClassNames.add("InstantiationException");
+ javaLangClassNames.add("InterruptedException");
+ javaLangClassNames.add("LayerInstantiationException");
+ javaLangClassNames.add("NegativeArraySizeException");
+ javaLangClassNames.add("NoSuchFieldException");
+ javaLangClassNames.add("NoSuchMethodException");
+ javaLangClassNames.add("NullPointerException");
+ javaLangClassNames.add("NumberFormatException");
+ javaLangClassNames.add("ReflectiveOperationException");
+ javaLangClassNames.add("RuntimeException");
+ javaLangClassNames.add("SecurityException");
+ javaLangClassNames.add("StringIndexOutOfBoundsException");
+ javaLangClassNames.add("TypeNotPresentException");
+ javaLangClassNames.add("UnsupportedOperationException");
+ //Errors
+ javaLangClassNames.add("AbstractMethodError");
+ javaLangClassNames.add("AssertionError");
+ javaLangClassNames.add("BootstrapMethodError");
+ javaLangClassNames.add("ClassCircularityError");
+ javaLangClassNames.add("ClassFormatError");
+ javaLangClassNames.add("Error");
+ javaLangClassNames.add("ExceptionInInitializerError");
+ javaLangClassNames.add("IllegalAccessError");
+ javaLangClassNames.add("IncompatibleClassChangeError");
+ javaLangClassNames.add("InstantiationError");
+ javaLangClassNames.add("InternalError");
+ javaLangClassNames.add("LinkageError");
+ javaLangClassNames.add("NoClassDefFoundError");
+ javaLangClassNames.add("NoSuchFieldError");
+ javaLangClassNames.add("NoSuchMethodError");
+ javaLangClassNames.add("OutOfMemoryError");
+ javaLangClassNames.add("StackOverflowError");
+ javaLangClassNames.add("ThreadDeath");
+ javaLangClassNames.add("UnknownError");
+ javaLangClassNames.add("UnsatisfiedLinkError");
+ javaLangClassNames.add("UnsupportedClassVersionError");
+ javaLangClassNames.add("VerifyError");
+ javaLangClassNames.add("VirtualMachineError");
+ //Annotation Types
+ javaLangClassNames.add("Deprecated");
+ javaLangClassNames.add("FunctionalInterface");
+ javaLangClassNames.add("Override");
+ javaLangClassNames.add("SafeVarargs");
+ javaLangClassNames.add("SuppressWarnings");
+ standardPackages.put("java.lang", javaLangClassNames);
+
+ }
+
+ private Map<String,Set<String>> packageNames = new ConcurrentHashMap<>();
+ private Map<String,String> classNames = new ConcurrentHashMap<>();
+ private Map<String,Class<?>> clazzes = new ConcurrentHashMap<>();
+ private Map<String,Class<?>> statics = new ConcurrentHashMap<>();
+
+
+ public ImportHandler() {
+ importPackage("java.lang");
+ }
+
+
+ public void importStatic(String name) throws jakarta.el.ELException {
+ int lastPeriod = name.lastIndexOf('.');
+
+ if (lastPeriod < 0) {
+ throw new ELException(Util.message(
+ null, "importHandler.invalidStaticName", name));
+ }
+
+ String className = name.substring(0, lastPeriod);
+ String fieldOrMethodName = name.substring(lastPeriod + 1);
+
+ Class<?> clazz = findClass(className, true);
+
+ if (clazz == null) {
+ throw new ELException(Util.message(
+ null, "importHandler.invalidClassNameForStatic",
+ className, name));
+ }
+
+ boolean found = false;
+
+ for (Field field : clazz.getFields()) {
+ if (field.getName().equals(fieldOrMethodName)) {
+ int modifiers = field.getModifiers();
+ if (Modifier.isStatic(modifiers) &&
+ Modifier.isPublic(modifiers)) {
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if (!found) {
+ for (Method method : clazz.getMethods()) {
+ if (method.getName().equals(fieldOrMethodName)) {
+ int modifiers = method.getModifiers();
+ if (Modifier.isStatic(modifiers) &&
+ Modifier.isPublic(modifiers)) {
+ found = true;
+ break;
+ }
+ }
+ }
+ }
+
+ if (!found) {
+ throw new ELException(Util.message(null,
+ "importHandler.staticNotFound", fieldOrMethodName,
+ className, name));
+ }
+
+ Class<?> conflict = statics.get(fieldOrMethodName);
+ if (conflict != null) {
+ throw new ELException(Util.message(null,
+ "importHandler.ambiguousStaticImport", name,
+ conflict.getName() + '.' + fieldOrMethodName));
+ }
+
+ statics.put(fieldOrMethodName, clazz);
+ }
+
+
+ public void importClass(String name) throws jakarta.el.ELException {
+ int lastPeriodIndex = name.lastIndexOf('.');
+
+ if (lastPeriodIndex < 0) {
+ throw new ELException(Util.message(
+ null, "importHandler.invalidClassName", name));
+ }
+
+ String unqualifiedName = name.substring(lastPeriodIndex + 1);
+ String currentName = classNames.putIfAbsent(unqualifiedName, name);
+
+ if (currentName != null && !currentName.equals(name)) {
+ // Conflict. Same unqualifiedName, different fully qualified names
+ throw new ELException(Util.message(null,
+ "importHandler.ambiguousImport", name, currentName));
+ }
+ }
+
+
+ public void importPackage(String name) {
+ // Import ambiguity is handled at resolution, not at import
+ // Whether the package exists is not checked,
+ // a) for sake of performance when used in JSPs (BZ 57142),
+ // b) java.lang.Package.getPackage(name) is not reliable (BZ 57574),
+ // c) such check is not required by specification.
+ Set<String> preloaded = standardPackages.get(name);
+ if (preloaded == null) {
+ packageNames.put(name, Collections.emptySet());
+ } else {
+ packageNames.put(name, preloaded);
+ }
+ }
+
+
+ public java.lang.Class<?> resolveClass(String name) {
+ if (name == null || name.contains(".")) {
+ return null;
+ }
+
+ // Has it been previously resolved?
+ Class<?> result = clazzes.get(name);
+
+ if (result != null) {
+ if (NotFound.class.equals(result)) {
+ return null;
+ } else {
+ return result;
+ }
+ }
+
+ // Search the class imports
+ String className = classNames.get(name);
+ if (className != null) {
+ Class<?> clazz = findClass(className, true);
+ if (clazz != null) {
+ clazzes.put(name, clazz);
+ return clazz;
+ }
+ }
+
+ // Search the package imports - note there may be multiple matches
+ // (which correctly triggers an error)
+ for (Map.Entry<String,Set<String>> entry : packageNames.entrySet()) {
+ if (!entry.getValue().isEmpty()) {
+ // Standard package where we know all the class names
+ if (!entry.getValue().contains(name)) {
+ // Requested name isn't in the list so it isn't in this
+ // package so move on to next package. This allows the
+ // class loader look-up to be skipped.
+ continue;
+ }
+ }
+ className = entry.getKey() + '.' + name;
+ Class<?> clazz = findClass(className, false);
+ if (clazz != null) {
+ if (result != null) {
+ throw new ELException(Util.message(null,
+ "importHandler.ambiguousImport", className,
+ result.getName()));
+ }
+ result = clazz;
+ }
+ }
+ if (result == null) {
+ // Cache NotFound results to save repeated calls to findClass()
+ // which is relatively slow
+ clazzes.put(name, NotFound.class);
+ } else {
+ clazzes.put(name, result);
+ }
+
+ return result;
+ }
+
+
+ public java.lang.Class<?> resolveStatic(String name) {
+ return statics.get(name);
+ }
+
+
+ private Class<?> findClass(String name, boolean throwException) {
+ Class<?> clazz;
+ ClassLoader cl = Util.getContextClassLoader();
+ String path = name.replace('.', '/') + ".class";
+ try {
+ /* Given that findClass() has to be called for every imported
+ * package and that getResource() is a lot faster then loadClass()
+ * for resources that don't exist, the overhead of the getResource()
+ * for the case where the class does exist is a lot less than the
+ * overhead we save by not calling loadClass().
+ */
+ if (cl.getResource(path) == null) {
+ return null;
+ }
+ } catch (ClassCircularityError cce) {
+ // May happen under a security manager. Ignore it and try loading
+ // the class normally.
+ }
+ try {
+ clazz = cl.loadClass(name);
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+
+ // Class must be public, non-abstract and not an interface
+ int modifiers = clazz.getModifiers();
+ if (!Modifier.isPublic(modifiers) || Modifier.isAbstract(modifiers) ||
+ Modifier.isInterface(modifiers)) {
+ if (throwException) {
+ throw new ELException(Util.message(
+ null, "importHandler.invalidClass", name));
+ } else {
+ return null;
+ }
+ }
+
+ return clazz;
+ }
+
+
+ /*
+ * Marker class used because null values are not permitted in a
+ * ConcurrentHashMap.
+ */
+ private static class NotFound {
+ }
+}
Propchange: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/ImportHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/LambdaExpression.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/LambdaExpression.java?rev=1858789&view=auto
==============================================================================
--- geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/LambdaExpression.java (added)
+++ geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/LambdaExpression.java Mon May 6 11:56:04 2019
@@ -0,0 +1,93 @@
+/*
+ * 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 jakarta.el;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+public class LambdaExpression {
+
+ private final List<String> formalParameters;
+ private final ValueExpression expression;
+ private final Map<String,Object> nestedArguments = new HashMap<>();
+ private ELContext context = null;
+
+ public LambdaExpression(List<String> formalParameters,
+ ValueExpression expression) {
+ this.formalParameters = formalParameters;
+ this.expression = expression;
+
+ }
+
+ public void setELContext(ELContext context) {
+ this.context = context;
+ }
+
+ @SuppressWarnings("null") // args[i] can't be null due to earlier checks
+ public Object invoke(ELContext context, Object... args)
+ throws ELException {
+
+ Objects.requireNonNull(context);
+
+ int formalParamCount = 0;
+ if (formalParameters != null) {
+ formalParamCount = formalParameters.size();
+ }
+
+ int argCount = 0;
+ if (args != null) {
+ argCount = args.length;
+ }
+
+ if (formalParamCount > argCount) {
+ throw new ELException(Util.message(context,
+ "lambdaExpression.tooFewArgs",
+ Integer.valueOf(argCount),
+ Integer.valueOf(formalParamCount)));
+ }
+
+ // Build the argument map
+ // Start with the arguments from any outer expressions so if there is
+ // any overlap the local arguments have priority
+ Map<String,Object> lambdaArguments = new HashMap<>();
+ lambdaArguments.putAll(nestedArguments);
+ for (int i = 0; i < formalParamCount; i++) {
+ lambdaArguments.put(formalParameters.get(i), args[i]);
+ }
+
+ context.enterLambdaScope(lambdaArguments);
+
+ try {
+ Object result = expression.getValue(context);
+ // Make arguments from this expression available to any nested
+ // expression
+ if (result instanceof LambdaExpression) {
+ ((LambdaExpression) result).nestedArguments.putAll(
+ lambdaArguments);
+ }
+ return result;
+ } finally {
+ context.exitLambdaScope();
+ }
+ }
+
+ public java.lang.Object invoke(Object... args) {
+ return invoke (context, args);
+ }
+}
Propchange: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/LambdaExpression.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StandardELContext.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StandardELContext.java?rev=1858789&view=auto
==============================================================================
--- geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StandardELContext.java (added)
+++ geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StandardELContext.java Mon May 6 11:56:04 2019
@@ -0,0 +1,210 @@
+/*
+ * 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 jakarta.el;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @since EL 3.0
+ */
+public class StandardELContext extends ELContext {
+
+ private final ELContext wrappedContext;
+ private final VariableMapper variableMapper;
+ private final FunctionMapper functionMapper;
+ private final CompositeELResolver standardResolver;
+ private final CompositeELResolver customResolvers;
+ private final Map<String,Object> localBeans = new HashMap<>();
+
+
+ public StandardELContext(ExpressionFactory factory) {
+ wrappedContext = null;
+ variableMapper = new StandardVariableMapper();
+ functionMapper =
+ new StandardFunctionMapper(factory.getInitFunctionMap());
+ standardResolver = new CompositeELResolver();
+ customResolvers = new CompositeELResolver();
+
+ ELResolver streamResolver = factory.getStreamELResolver();
+
+ // Add resolvers in order
+ standardResolver.add(new BeanNameELResolver(
+ new StandardBeanNameResolver(localBeans)));
+ standardResolver.add(customResolvers);
+ if (streamResolver != null) {
+ standardResolver.add(streamResolver);
+ }
+ standardResolver.add(new StaticFieldELResolver());
+ standardResolver.add(new MapELResolver());
+ standardResolver.add(new ResourceBundleELResolver());
+ standardResolver.add(new ListELResolver());
+ standardResolver.add(new ArrayELResolver());
+ standardResolver.add(new BeanELResolver());
+ }
+
+ public StandardELContext(ELContext context) {
+ wrappedContext = context;
+ variableMapper = context.getVariableMapper();
+ functionMapper = context.getFunctionMapper();
+ standardResolver = new CompositeELResolver();
+ customResolvers = new CompositeELResolver();
+
+ // Add resolvers in order
+ standardResolver.add(new BeanNameELResolver(
+ new StandardBeanNameResolver(localBeans)));
+ standardResolver.add(customResolvers);
+ // Use resolvers from context from this point on
+ standardResolver.add(context.getELResolver());
+ }
+
+ // Can't use Class<?> because API needs to match specification
+ @Override
+ public void putContext(@SuppressWarnings("rawtypes") Class key,
+ Object contextObject) {
+ if (wrappedContext == null) {
+ super.putContext(key, contextObject);
+ } else {
+ wrappedContext.putContext(key, contextObject);
+ }
+ }
+
+ @Override
+ public Object getContext(@SuppressWarnings("rawtypes") Class key) {
+ if (wrappedContext == null) {
+ return super.getContext(key);
+ } else {
+ return wrappedContext.getContext(key);
+ }
+ }
+
+ @Override
+ public ELResolver getELResolver() {
+ return standardResolver;
+ }
+
+ public void addELResolver(ELResolver resolver) {
+ customResolvers.add(resolver);
+ }
+
+ @Override
+ public FunctionMapper getFunctionMapper() {
+ return functionMapper;
+ }
+
+ @Override
+ public VariableMapper getVariableMapper() {
+ return variableMapper;
+ }
+
+
+ Map<String,Object> getLocalBeans() {
+ return localBeans;
+ }
+
+
+ private static class StandardVariableMapper extends VariableMapper {
+
+ private Map<String, ValueExpression> vars;
+
+ @Override
+ public ValueExpression resolveVariable(String variable) {
+ if (vars == null) {
+ return null;
+ }
+ return vars.get(variable);
+ }
+
+ @Override
+ public ValueExpression setVariable(String variable,
+ ValueExpression expression) {
+ if (vars == null)
+ vars = new HashMap<>();
+ if (expression == null) {
+ return vars.remove(variable);
+ } else {
+ return vars.put(variable, expression);
+ }
+ }
+ }
+
+
+ private static class StandardBeanNameResolver extends BeanNameResolver {
+
+ private final Map<String,Object> beans;
+
+ public StandardBeanNameResolver(Map<String,Object> beans) {
+ this.beans = beans;
+ }
+
+ @Override
+ public boolean isNameResolved(String beanName) {
+ return beans.containsKey(beanName);
+ }
+
+ @Override
+ public Object getBean(String beanName) {
+ return beans.get(beanName);
+ }
+
+ @Override
+ public void setBeanValue(String beanName, Object value)
+ throws PropertyNotWritableException {
+ beans.put(beanName, value);
+ }
+
+ @Override
+ public boolean isReadOnly(String beanName) {
+ return false;
+ }
+
+ @Override
+ public boolean canCreateBean(String beanName) {
+ return true;
+ }
+ }
+
+
+ private static class StandardFunctionMapper extends FunctionMapper {
+
+ private final Map<String,Method> methods = new HashMap<>();
+
+ public StandardFunctionMapper(Map<String,Method> initFunctionMap) {
+ if (initFunctionMap != null) {
+ methods.putAll(initFunctionMap);
+ }
+ }
+
+ @Override
+ public Method resolveFunction(String prefix, String localName) {
+ String key = prefix + ':' + localName;
+ return methods.get(key);
+ }
+
+ @Override
+ public void mapFunction(String prefix, String localName,
+ Method method) {
+ String key = prefix + ':' + localName;
+ if (method == null) {
+ methods.remove(key);
+ } else {
+ methods.put(key, method);
+ }
+ }
+ }
+}
Propchange: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StandardELContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StaticFieldELResolver.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StaticFieldELResolver.java?rev=1858789&view=auto
==============================================================================
--- geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StaticFieldELResolver.java (added)
+++ geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StaticFieldELResolver.java Mon May 6 11:56:04 2019
@@ -0,0 +1,203 @@
+/*
+ * 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 jakarta.el;
+
+import java.beans.FeatureDescriptor;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Iterator;
+import java.util.Objects;
+
+/**
+ * @since EL 3.0
+ */
+public class StaticFieldELResolver extends ELResolver {
+
+ @Override
+ public Object getValue(ELContext context, Object base, Object property) {
+ Objects.requireNonNull(context);
+
+ if (base instanceof ELClass && property instanceof String) {
+ context.setPropertyResolved(base, property);
+
+ Class<?> clazz = ((ELClass) base).getKlass();
+ String name = (String) property;
+ Exception exception = null;
+ try {
+ Field field = clazz.getField(name);
+ int modifiers = field.getModifiers();
+ if (Modifier.isStatic(modifiers) &&
+ Modifier.isPublic(modifiers)) {
+ return field.get(null);
+ }
+ } catch (IllegalArgumentException | IllegalAccessException |
+ NoSuchFieldException | SecurityException e) {
+ exception = e;
+ }
+ String msg = Util.message(context, "staticFieldELResolver.notFound",
+ name, clazz.getName());
+ if (exception == null) {
+ throw new PropertyNotFoundException(msg);
+ } else {
+ throw new PropertyNotFoundException(msg, exception);
+ }
+ }
+ return null;
+ }
+
+
+ @Override
+ public void setValue(ELContext context, Object base, Object property,
+ Object value) {
+ Objects.requireNonNull(context);
+
+ if (base instanceof ELClass && property instanceof String) {
+ Class<?> clazz = ((ELClass) base).getKlass();
+ String name = (String) property;
+
+ throw new PropertyNotWritableException(Util.message(context,
+ "staticFieldELResolver.notWriteable", name,
+ clazz.getName()));
+ }
+ }
+
+
+ @Override
+ public Object invoke(ELContext context, Object base, Object method,
+ Class<?>[] paramTypes, Object[] params) {
+ Objects.requireNonNull(context);
+
+ if (base instanceof ELClass && method instanceof String) {
+ context.setPropertyResolved(base, method);
+
+ Class<?> clazz = ((ELClass) base).getKlass();
+ String methodName = (String) method;
+
+ if ("<init>".equals(methodName)) {
+ Constructor<?> match =
+ Util.findConstructor(clazz, paramTypes, params);
+
+ Object[] parameters = Util.buildParameters(
+ match.getParameterTypes(), match.isVarArgs(), params);
+
+ Object result = null;
+
+ try {
+ result = match.newInstance(parameters);
+ } catch (InvocationTargetException e) {
+ Throwable cause = e.getCause();
+ Util.handleThrowable(cause);
+ throw new ELException(cause);
+ } catch (ReflectiveOperationException e) {
+ throw new ELException(e);
+ }
+ return result;
+
+ } else {
+ Method match =
+ Util.findMethod(clazz, methodName, paramTypes, params);
+
+ int modifiers = match.getModifiers();
+ if (!Modifier.isStatic(modifiers)) {
+ throw new MethodNotFoundException(Util.message(context,
+ "staticFieldELResolver.methodNotFound", methodName,
+ clazz.getName()));
+ }
+
+ Object[] parameters = Util.buildParameters(
+ match.getParameterTypes(), match.isVarArgs(), params);
+
+ Object result = null;
+ try {
+ result = match.invoke(null, parameters);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ throw new ELException(e);
+ } catch (InvocationTargetException e) {
+ Throwable cause = e.getCause();
+ Util.handleThrowable(cause);
+ throw new ELException(cause);
+ }
+ return result;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Class<?> getType(ELContext context, Object base, Object property) {
+ Objects.requireNonNull(context);
+
+ if (base instanceof ELClass && property instanceof String) {
+ context.setPropertyResolved(base, property);
+
+ Class<?> clazz = ((ELClass) base).getKlass();
+ String name = (String) property;
+ Exception exception = null;
+ try {
+ Field field = clazz.getField(name);
+ int modifiers = field.getModifiers();
+ if (Modifier.isStatic(modifiers) &&
+ Modifier.isPublic(modifiers)) {
+ return field.getType();
+ }
+ } catch (IllegalArgumentException | NoSuchFieldException |
+ SecurityException e) {
+ exception = e;
+ }
+ String msg = Util.message(context, "staticFieldELResolver.notFound",
+ name, clazz.getName());
+ if (exception == null) {
+ throw new PropertyNotFoundException(msg);
+ } else {
+ throw new PropertyNotFoundException(msg, exception);
+ }
+ }
+ return null;
+ }
+
+
+ @Override
+ public boolean isReadOnly(ELContext context, Object base, Object property) {
+ Objects.requireNonNull(context);
+
+ if (base instanceof ELClass && property instanceof String) {
+ context.setPropertyResolved(base, property);
+ }
+ return true;
+ }
+
+
+ /**
+ * Always returns <code>null</code>.
+ */
+ @Override
+ public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context,
+ Object base) {
+ return null;
+ }
+
+ /**
+ * Always returns <code>String.class</code>.
+ */
+ @Override
+ public Class<?> getCommonPropertyType(ELContext context, Object base) {
+ return String.class;
+ }
+}
Propchange: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/StaticFieldELResolver.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/TypeConverter.java
URL: http://svn.apache.org/viewvc/geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/TypeConverter.java?rev=1858789&view=auto
==============================================================================
--- geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/TypeConverter.java (added)
+++ geronimo/specs/branches/jakarta/geronimo-jakarta-el_spec/src/main/java/jakarta/el/TypeConverter.java Mon May 6 11:56:04 2019
@@ -0,0 +1,62 @@
+/*
+ * 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 jakarta.el;
+
+import java.beans.FeatureDescriptor;
+import java.util.Iterator;
+
+/**
+ * @since EL 3.0
+ */
+public abstract class TypeConverter extends ELResolver {
+
+ @Override
+ public Object getValue(ELContext context, Object base, Object property) {
+ return null;
+ }
+
+ @Override
+ public Class<?> getType(ELContext context, Object base, Object property) {
+ return null;
+ }
+
+ @Override
+ public void setValue(ELContext context, Object base, Object property,
+ Object value) {
+ // NO-OP
+ }
+
+ @Override
+ public boolean isReadOnly(ELContext context, Object base, Object property) {
+ return false;
+ }
+
+ @Override
+ public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context,
+ Object base) {
+ return null;
+ }
+
+ @Override
+ public Class<?> getCommonPropertyType(ELContext context, Object base) {
+ return null;
+ }
+
+ @Override
+ public abstract Object convertToType(ELContext context, Object obj,
+ Class<?> type);
+}