You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 10:01:52 UTC

[sling-org-apache-sling-scripting-api] 03/31: Implement Service.providers method for the script engine factories to be available for microsling and allow setXXX methods to get null to initialize with an empty list.

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

rombert pushed a commit to annotated tag org.apache.sling.scripting.api-2.0.2-incubator
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-api.git

commit a34e96b5c55cfae5abc252931e6f19c2e7fb0153
Author: Felix Meschberger <fm...@apache.org>
AuthorDate: Mon Dec 17 15:24:31 2007 +0000

    Implement Service.providers method for the script engine factories
    to be available for microsling and allow setXXX methods to get null
    to initialize with an empty list.
    
    git-svn-id: https://svn.apache.org/repos/asf/incubator/sling/trunk/scripting/api@604896 13f79535-47bb-0310-9956-ffa450edef68
---
 .../scripting/api/AbstractScriptEngineFactory.java |  37 ++++++--
 src/main/java/sun/misc/Service.java                | 101 ++++++++++++++++++++-
 2 files changed, 127 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/apache/sling/scripting/api/AbstractScriptEngineFactory.java b/src/main/java/org/apache/sling/scripting/api/AbstractScriptEngineFactory.java
index 4ac89b3..d1cb3bd 100644
--- a/src/main/java/org/apache/sling/scripting/api/AbstractScriptEngineFactory.java
+++ b/src/main/java/org/apache/sling/scripting/api/AbstractScriptEngineFactory.java
@@ -21,6 +21,7 @@ package org.apache.sling.scripting.api;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.jar.Attributes;
 import java.util.jar.Manifest;
@@ -32,11 +33,15 @@ public abstract class AbstractScriptEngineFactory implements
         ScriptEngineFactory {
 
     private String engineName;
+
     private String engineVersion;
+
     private List<String> extensions;
+
     private List<String> mimeTypes;
+
     private List<String> names;
-    
+
     protected AbstractScriptEngineFactory() {
         String name = null;
         String version = null;
@@ -75,7 +80,7 @@ public abstract class AbstractScriptEngineFactory implements
         setEngineName(name);
         setEngineVersion(version);
     }
-    
+
     public String getEngineName() {
         return engineName;
     }
@@ -83,7 +88,7 @@ public abstract class AbstractScriptEngineFactory implements
     protected void setEngineName(String engineName) {
         this.engineName = engineName;
     }
-    
+
     public String getEngineVersion() {
         return engineVersion;
     }
@@ -91,31 +96,43 @@ public abstract class AbstractScriptEngineFactory implements
     protected void setEngineVersion(String engineVersion) {
         this.engineVersion = engineVersion;
     }
-    
+
     public List<String> getExtensions() {
         return extensions;
     }
 
     protected void setExtensions(String... extensions) {
-        this.extensions = Arrays.asList(extensions);
+        if (extensions == null) {
+            this.extensions = Collections.emptyList();
+        } else {
+            this.extensions = Arrays.asList(extensions);
+        }
     }
-    
+
     public List<String> getMimeTypes() {
         return mimeTypes;
     }
 
     protected void setMimeTypes(String... mimeTypes) {
-        this.mimeTypes = Arrays.asList(mimeTypes);
+        if (mimeTypes == null) {
+            this.mimeTypes = Collections.emptyList();
+        } else {
+            this.mimeTypes = Arrays.asList(mimeTypes);
+        }
     }
-    
+
     public List<String> getNames() {
         return names;
     }
 
     protected void setNames(String... names) {
-        this.names = Arrays.asList(names);
+        if (names == null) {
+            this.names = Collections.emptyList();
+        } else {
+            this.names = Arrays.asList(names);
+        }
     }
-    
+
     public String getMethodCallSyntax(String obj, String m, String[] args) {
         StringBuffer callSyntax = new StringBuffer();
         callSyntax.append(obj).append('.').append(m).append('(');
diff --git a/src/main/java/sun/misc/Service.java b/src/main/java/sun/misc/Service.java
index 4b292f6..f6748e8 100644
--- a/src/main/java/sun/misc/Service.java
+++ b/src/main/java/sun/misc/Service.java
@@ -18,8 +18,17 @@
  */
 package sun.misc;
 
+import java.awt.image.ImagingOpException;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Enumeration;
 import java.util.Iterator;
+import java.util.NoSuchElementException;
 
 /**
  * The <code>Service</code> class is a primitive stub of the original
@@ -36,9 +45,99 @@ import java.util.Iterator;
  */
 public class Service {
 
+    private static final String PREFIX = "META-INF/services/";
+    
     /** Returns an empty iterator */
-    public static Iterator<String> providers(Class<?> type, ClassLoader loader) {
+    public static Iterator<String> providers(Class<?> type, ClassLoader loader) throws IOException {
+        if (loader != null) {
+            try {
+                String name = PREFIX + type.getName();
+                Enumeration<?> files = loader.getResources(name);
+                return new NameIterator(files);
+            } catch (IOException ignore) {
+            }
+        }
+
         return Collections.<String> emptyList().iterator();
     }
 
+    private static class NameIterator implements Iterator<String> {
+        
+        private final Enumeration<?> files;
+
+        private Iterator<String> currentFile;
+        
+        private String nextName;
+        
+        public NameIterator(Enumeration<?> files) {
+            this.files = files;
+            seek();
+        }
+        
+        public boolean hasNext() {
+            return nextName != null;
+        }
+        
+        public String next() {
+            if (nextName == null) {
+                throw new NoSuchElementException();
+            }
+            
+            String result = nextName;
+            seek();
+            return result;
+        }
+        
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+        
+        private void seek() {
+            if (currentFile == null || !currentFile.hasNext()) {
+                currentFile = getNames();
+            }
+            
+            nextName = (currentFile != null && currentFile.hasNext())
+                    ? currentFile.next()
+                    : null;
+        }
+        
+        private Iterator<String> getNames() {
+            while (files.hasMoreElements()) {
+                URL fileUrl = (URL) files.nextElement();
+                InputStream ins = null;
+                try {
+                    ArrayList<String> names = new ArrayList<String>();
+                    ins = fileUrl.openStream();
+                    BufferedReader br = new BufferedReader(new InputStreamReader(ins));
+                    String name;
+                    while ( (name = br.readLine()) != null) {
+                        int hash = name.indexOf('#');
+                        if (hash >= 0) {
+                            name = name.substring(0, hash);
+                        }
+                        name = name.trim();
+                        
+                        if (name.length() > 0) {
+                            names.add(name);
+                        }
+                    }
+                    
+                    return names.iterator();
+                } catch (IOException ioe) {
+                    
+                } finally {
+                    if (ins != null) {
+                        try {
+                            ins.close();
+                        } catch (IOException ignore) {
+                        }
+                    }
+                }
+            }
+
+            // exhausted search
+            return null;
+        }
+    }
 }

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.