You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@aries.apache.org by "Raymond Augé (Jira)" <ji...@apache.org> on 2020/10/05 13:19:00 UTC
[jira] [Commented] (ARIES-1924) Provider bundle service url
tracking with bundle wiring instead of custom urls
[ https://issues.apache.org/jira/browse/ARIES-1924?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17208075#comment-17208075 ]
Raymond Augé commented on ARIES-1924:
-------------------------------------
Hi [~tuomas_kiviaho], unfortunately this patch doesn't work correctly. The issue is that it does not find all the resources in the Bundle-ClassPath. This is because the classloader approach masks similar resources. When I apply the patch several tests for this use case fail.
If you could make another attempt where the tests pass that would be great.
> 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
> Priority: Major
>
> 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.4#803005)