This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 7.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 9ed78bcc80565292cd9a343f4e6d0c2db305494e
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Mon Jan 27 11:14:15 2020 +0000

    Fix BZ 64097 Use ServiceLoader to load EL implementation
    
    https://bz.apache.org/bugzilla/show_bug.cgi?id=64097
---
 java/javax/el/ExpressionFactory.java | 55 ++++++++----------------------------
 webapps/docs/changelog.xml           |  9 ++++++
 2 files changed, 20 insertions(+), 44 deletions(-)

diff --git a/java/javax/el/ExpressionFactory.java 
b/java/javax/el/ExpressionFactory.java
index f8853d5..5ef8976 100644
--- a/java/javax/el/ExpressionFactory.java
+++ b/java/javax/el/ExpressionFactory.java
@@ -14,23 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package javax.el;
 
-import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.UnsupportedEncodingException;
 import java.lang.ref.WeakReference;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.util.Iterator;
 import java.util.Properties;
+import java.util.ServiceLoader;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.locks.Lock;
@@ -46,9 +44,6 @@ public abstract class ExpressionFactory {
     private static final boolean IS_SECURITY_ENABLED =
         (System.getSecurityManager() != null);
 
-    private static final String SERVICE_RESOURCE_NAME =
-        "META-INF/services/javax.el.ExpressionFactory";
-
     private static final String PROPERTY_NAME = "javax.el.ExpressionFactory";
 
     private static final String PROPERTY_FILE;
@@ -359,48 +354,20 @@ public abstract class ExpressionFactory {
     }
 
     private static String getClassNameServices(ClassLoader tccl) {
-        InputStream is = null;
 
-        if (tccl == null) {
-            is = ClassLoader.getSystemResourceAsStream(SERVICE_RESOURCE_NAME);
-        } else {
-            is = tccl.getResourceAsStream(SERVICE_RESOURCE_NAME);
+        ExpressionFactory result = null;
+
+        ServiceLoader<ExpressionFactory> serviceLoader = 
ServiceLoader.load(ExpressionFactory.class, tccl);
+        Iterator<ExpressionFactory> iter = serviceLoader.iterator();
+        while (result == null && iter.hasNext()) {
+            result = iter.next();
         }
 
-        if (is != null) {
-            String line = null;
-            BufferedReader br = null;
-            InputStreamReader isr = null;
-            try {
-                isr = new InputStreamReader(is, "UTF-8");
-                br = new BufferedReader(isr);
-                line = br.readLine();
-                if (line != null && line.trim().length() > 0) {
-                    return line.trim();
-                }
-            } catch (UnsupportedEncodingException e) {
-                // Should never happen with UTF-8
-                // If it does - ignore & return null
-            } catch (IOException e) {
-                throw new ELException(Util.message(null, 
"expressionFactory.readFailed", SERVICE_RESOURCE_NAME), e);
-            } finally {
-                try {
-                    if (br != null) {
-                        br.close();
-                    }
-                } catch (IOException ioe) {/*Ignore*/}
-                try {
-                    if (isr != null) {
-                        isr.close();
-                    }
-                } catch (IOException ioe) {/*Ignore*/}
-                try {
-                    is.close();
-                } catch (IOException ioe) {/*Ignore*/}
-            }
+        if (result == null) {
+            return null;
         }
 
-        return null;
+        return result.getClass().getName();
     }
 
     private static String getClassNameJreDir() {
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index e479550..7e3a17d 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -124,6 +124,15 @@
       </add>
     </changelog>
   </subsection>
+  <subsection name="Jasper">
+    <changelog>
+      <fix>
+        <bug>64097</bug>: Replace the faulty custom services lookup used for
+        <code>ExpressionFactory</code> implementations with
+        <code>ServiceLoader</code>. (markt)
+      </fix>
+    </changelog>
+  </subsection>
   <subsection name="Cluster">
     <changelog>
       <fix>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to