You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@aries.apache.org by "Tuomas Kiviaho (Jira)" <ji...@apache.org> on 2019/09/03 12:03:00 UTC

[jira] [Created] (ARIES-1924) Provider bundle service url tracking with bundle wiring instead of custom urls

Tuomas Kiviaho created ARIES-1924:
-------------------------------------

             Summary: Provider bundle service url tracking with bundle wiring instead of custom urls
                 Key: ARIES-1924
                 URL: https://issues.apache.org/jira/browse/ARIES-1924
             Project: Aries
          Issue Type: Improvement
          Components: SPI Fly
    Affects Versions: spifly-1.2.3
            Reporter: Tuomas Kiviaho


getMetaInfServiceURLsFromJar seems to be crafting custom urls and for some reason they fail in Eclipse PDE. I didn't look any deeper why this is (most likely due to entries containing urls from outside classpath) because I remembered that BundleWiring contains wildcard support for resource lookup nowadays and there is no need for custom embedded jar file handling that seems to leak outside of the appropriate resources.

java.nio.file.NoSuchFileException: ...\tmp\jar_cache931050380819344291.tmpjava.nio.file.NoSuchFileException: ...\tmp\jar_cache931050380819344291.tmp at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102) at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:230) at java.nio.file.Files.newByteChannel(Files.java:361) at java.nio.file.Files.createFile(Files.java:632) at java.nio.file.TempFileHelper.create(TempFileHelper.java:138) at java.nio.file.TempFileHelper.createTempFile(TempFileHelper.java:161) at java.nio.file.Files.createTempFile(Files.java:897) at sun.net.www.protocol.jar.URLJarFile$1.run(URLJarFile.java:218) at sun.net.www.protocol.jar.URLJarFile$1.run(URLJarFile.java:216) at java.security.AccessController.doPrivileged(Native Method) at sun.net.www.protocol.jar.URLJarFile.retrieve(URLJarFile.java:215) at sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:71) at sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:94) at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:122) at sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:152) at java.net.URL.openStream(URL.java:1045) at org.apache.aries.spifly.ProviderBundleTrackerCustomizer.addingBundle(ProviderBundleTrackerCustomizer.java:141)

Here's a patch that I'm using:

{code:patch|title=ProviderBundleTrackerCustomizer}
@@ -24,21 +24,20 @@
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Dictionary;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
+import java.util.Optional;
 import java.util.logging.Level;
+import java.util.stream.Collectors;
 
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleEvent;
-import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServicePermission;
 import org.osgi.framework.ServiceRegistration;
@@ -111,26 +110,13 @@
             activator.registerProviderBundle(svc, bundle, customAttributes);
         }
 
-        List<URL> serviceFileURLs = new ArrayList<URL>();
-
-        Enumeration<URL> entries = bundle.findEntries(METAINF_SERVICES, "*", false);
-        if (entries != null) {
-            serviceFileURLs.addAll(Collections.list(entries));
-        }
-
-        Object bcp = bundle.getHeaders().get(Constants.BUNDLE_CLASSPATH);
-        if (bcp instanceof String) {
-            for (String entry : ((String) bcp).split(",")) {
-                entry = entry.trim();
-                if (entry.equals("."))
-                    continue;
-
-                URL url = bundle.getResource(entry);
-                if (url != null) {
-                    serviceFileURLs.addAll(getMetaInfServiceURLsFromJar(url));
-                }
-            }
-        }
+        List<URL> serviceFileURLs = Optional.ofNullable(bundle.adapt(BundleWiring.class)).flatMap(bundleWiring -> {
+            Collection<String> resources = bundleWiring.listResources(METAINF_SERVICES, "*", BundleWiring.LISTRESOURCES_LOCAL);
+            return Optional.ofNullable(resources).map(Collection::stream).map(stream -> {
+                ClassLoader classLoader = bundleWiring.getClassLoader();
+                return stream.map(classLoader::getResource).collect(Collectors.toList());
+            });   
+        }).orElseGet(Collections::emptyList);
 
         final List<ServiceRegistration> registrations = new ArrayList<ServiceRegistration>();
         for (URL serviceFileURL : serviceFileURLs) {
@@ -326,31 +312,6 @@
         return null;
     }
 
-    private List<URL> getMetaInfServiceURLsFromJar(URL url) {
-        List<URL> urls = new ArrayList<URL>();
-        try {
-            JarInputStream jis = null;
-            try {
-                jis = new JarInputStream(url.openStream());
-
-                JarEntry je = null;
-                while((je = jis.getNextJarEntry()) != null) {
-                    if (je.getName().startsWith(METAINF_SERVICES) &&
-                        je.getName().length() > (METAINF_SERVICES.length() + 1)) {
-                        urls.add(new URL("jar:" + url + "!/" + je.getName()));
-                    }
-                }
-            } finally {
-                if (jis != null) {
-                    jis.close();
-                }
-            }
-        } catch (IOException e) {
-            log(Level.SEVERE, "Problem opening embedded jar file: " + url, e);
-        }
-        return urls;
-    }
-
     @Override
     public void modifiedBundle(Bundle bundle, BundleEvent event, Object registrations) {
         // should really be doing something here...

{code}



--
This message was sent by Atlassian Jira
(v8.3.2#803003)