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);
+}