aries-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tuomas Kiviaho (Jira)" <j...@apache.org>
Subject [jira] [Created] (ARIES-1924) Provider bundle service url tracking with bundle wiring instead of custom urls
Date Tue, 03 Sep 2019 12:03:00 GMT
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)

Mime
View raw message