Don't use the info to get the bundle id but the bundle. Furthermore, add an index to get bundles by id. The reason is to speed up bundle lookup.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@647611 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java b/framework/src/main/java/org/apache/felix/framework/Felix.java
index 6a646f7..66ef74a 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -66,6 +66,7 @@
// Maps a bundle location to a bundle.
private HashMap m_installedBundleMap = new HashMap();
+ private SortedMap m_installedBundleIndex = new TreeMap();
// This lock must be acquired to modify m_installedBundleMap;
// to help avoid deadlock this lock as priority 2 and should
// be acquired before locks with lower priority.
@@ -745,6 +746,7 @@
// in 2 and need the stuff from 1.
m_installedBundleMap.put(
m_systemBundleInfo.getLocation(), this);
+ m_installedBundleIndex.put(new Long(0), this);
// Create system bundle activator.
m_systemBundleInfo.setActivator(new SystemBundleActivator());
@@ -1057,7 +1059,7 @@
{
return -1;
}
- else if (b1.getInfo().getBundleId() < b2.getInfo().getBundleId())
+ else if (b1.getBundleId() < b2.getBundleId())
{
return 1;
}
@@ -1083,7 +1085,7 @@
{
return -1;
}
- else if (b1.getInfo().getBundleId() > b2.getInfo().getBundleId())
+ else if (b1.getBundleId() > b2.getBundleId())
{
return 1;
}
@@ -2115,6 +2117,7 @@
synchronized (m_installedBundleLock_Priority2)
{
target = (FelixBundle) m_installedBundleMap.remove(info.getLocation());
+ m_installedBundleIndex.remove(new Long(target.getBundleId()));
}
// Finally, put the uninstalled bundle into the
@@ -2379,6 +2382,7 @@
synchronized (m_installedBundleLock_Priority2)
{
m_installedBundleMap.put(location, bundle);
+ m_installedBundleIndex.put(new Long(bundle.getBundleId()), bundle);
}
if (bundle.getInfo().isExtension())
@@ -2539,15 +2543,10 @@
{
synchronized (m_installedBundleLock_Priority2)
{
- FelixBundle bundle = null;
-
- for (Iterator i = m_installedBundleMap.values().iterator(); i.hasNext(); )
+ FelixBundle bundle = (FelixBundle) m_installedBundleIndex.get(new Long(id));
+ if (bundle != null)
{
- bundle = (FelixBundle) i.next();
- if (bundle.getInfo().getBundleId() == id)
- {
- return bundle;
- }
+ return bundle;
}
}
@@ -2557,7 +2556,7 @@
(m_uninstalledBundles != null) && (i < m_uninstalledBundles.length);
i++)
{
- if (m_uninstalledBundles[i].getInfo().getBundleId() == id)
+ if (m_uninstalledBundles[i].getBundleId() == id)
{
return m_uninstalledBundles[i];
}
@@ -2579,24 +2578,6 @@
**/
protected Bundle[] getBundles()
{
- if (m_comparator == null)
- {
- m_comparator = new Comparator() {
- public int compare(Object o1, Object o2)
- {
- Bundle b1 = (Bundle) o1;
- Bundle b2 = (Bundle) o2;
- if (b1.getBundleId() > b2.getBundleId())
- return 1;
- else if (b1.getBundleId() < b2.getBundleId())
- return -1;
- return 0;
- }
- };
- }
-
- Bundle[] bundles = null;
-
synchronized (m_installedBundleLock_Priority2)
{
if (m_installedBundleMap.size() == 0)
@@ -2604,17 +2585,9 @@
return null;
}
- bundles = new Bundle[m_installedBundleMap.size()];
- int counter = 0;
- for (Iterator i = m_installedBundleMap.values().iterator(); i.hasNext(); )
- {
- bundles[counter++] = (Bundle) i.next();
- }
+ return (Bundle[]) m_installedBundleIndex.values().toArray(
+ new Bundle[m_installedBundleIndex.size()]);
}
-
- Arrays.sort(bundles, m_comparator);
-
- return bundles;
}
protected void addBundleListener(Bundle bundle, BundleListener l)
@@ -2884,7 +2857,7 @@
}
return m_cache.getArchive(
- bundle.getInfo().getBundleId()).getDataFile(s);
+ bundle.getBundleId()).getDataFile(s);
}
catch (Exception ex)
{
@@ -3425,7 +3398,7 @@
Bundle[] bundles = getBundles();
for (int i = 0; (bundles != null) && (i < bundles.length); i++)
{
- long id = ((FelixBundle) bundles[i]).getInfo().getBundleId();
+ long id = ((FelixBundle) bundles[i]).getBundleId();
String sym = (String) ((FelixBundle) bundles[i])
.getInfo().getCurrentHeader().get(Constants.BUNDLE_SYMBOLICNAME);
Version ver = Version.parseVersion((String) ((FelixBundle) bundles[i])
@@ -3601,7 +3574,7 @@
}
// Remove the bundle from the cache.
- m_cache.remove(m_cache.getArchive(bundle.getInfo().getBundleId()));
+ m_cache.remove(m_cache.getArchive(bundle.getBundleId()));
}
//