Refactor a bit the local url conversions using methods and a wrapper enumeration for performance (FELIX-2645)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1022847 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java b/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
index 34ada2c..7e0a395 100644
--- a/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
@@ -1653,6 +1653,44 @@
return (parent == null) ? m_bootClassLoader : parent;
}
+ static Enumeration convertToLocalUrls(Enumeration urls) {
+ return new ToLocalUrlEnumeration(urls);
+ }
+
+ static URL convertToLocalUrl(URL url) {
+ if (url.getProtocol().equals("bundle"))
+ {
+ try
+ {
+ url = ((URLHandlersBundleURLConnection)
+ url.openConnection()).getLocalURL();
+ }
+ catch (IOException ex)
+ {
+ // Ignore and add original url.
+ }
+ }
+ return url;
+ }
+
+ static class ToLocalUrlEnumeration implements Enumeration
+ {
+ final Enumeration enumeration;
+
+ ToLocalUrlEnumeration(Enumeration enumeration) {
+ this.enumeration = enumeration;
+ }
+
+ public boolean hasMoreElements() {
+ return enumeration.hasMoreElements();
+ }
+
+ public Object nextElement() {
+ URL url = (URL) enumeration.nextElement();
+ return convertToLocalUrl(url);
+ }
+ }
+
private static final Constructor m_dexFileClassConstructor;
private static final Method m_dexFileClassLoadDex;
private static final Method m_dexFileClassLoadClass;
@@ -1711,32 +1749,14 @@
Enumeration urls = ModuleImpl.this.getResourcesByDelegation(name);
if (m_useLocalURLs)
{
- List<URL> localURLs = new ArrayList();
- while (urls.hasMoreElements())
- {
- URL url = (URL) urls.nextElement();
- if (url.getProtocol().equals("bundle"))
- {
- try
- {
- url = ((URLHandlersBundleURLConnection)
- url.openConnection()).getLocalURL();
- }
- catch (IOException ex)
- {
- // Ignore and add original url.
- }
- }
- localURLs.add(url);
- }
- urls = Collections.enumeration(localURLs);
+ urls = convertToLocalUrls(urls);
}
return urls;
}
protected Enumeration findResources(String name)
{
- return getResourcesLocal(name);
+ return ModuleImpl.this.getResourcesLocal(name);
}
}
@@ -2035,25 +2055,24 @@
URL url = ModuleImpl.this.getResourceByDelegation(name);
if (m_useLocalURLs)
{
- if (url.getProtocol().equals("bundle"))
- {
- try
- {
- url = ((URLHandlersBundleURLConnection)
- url.openConnection()).getLocalURL();
- }
- catch (IOException ex)
- {
- // Ignore and return original url.
- }
- }
+ url = convertToLocalUrl(url);
}
return url;
}
+ public Enumeration getResources(String name) throws IOException
+ {
+ Enumeration urls = super.getResources(name);
+ if (m_useLocalURLs)
+ {
+ urls = convertToLocalUrls(urls);
+ }
+ return urls;
+ }
+
protected URL findResource(String name)
{
- return getResourceLocal(name);
+ return ModuleImpl.this.getResourceLocal(name);
}
// The findResources() method should only look at the module itself, but
@@ -2063,30 +2082,7 @@
// can't. As a workaround, we make findResources() delegate instead.
protected Enumeration findResources(String name)
{
- Enumeration urls = ModuleImpl.this.getResourcesByDelegation(name);
- if (m_useLocalURLs)
- {
- List<URL> localURLs = new ArrayList();
- while (urls.hasMoreElements())
- {
- URL url = (URL) urls.nextElement();
- if (url.getProtocol().equals("bundle"))
- {
- try
- {
- url = ((URLHandlersBundleURLConnection)
- url.openConnection()).getLocalURL();
- }
- catch (IOException ex)
- {
- // Ignore and add original url.
- }
- }
- localURLs.add(url);
- }
- urls = Collections.enumeration(localURLs);
- }
- return urls;
+ return ModuleImpl.this.getResourcesByDelegation(name);
}
protected String findLibrary(String name)