karaf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jbono...@apache.org
Subject karaf-cellar git commit: [KARAF-3615] Cluster bundles now keep bundle ID, version and symbolic name
Date Tue, 17 Mar 2015 16:17:04 GMT
Repository: karaf-cellar
Updated Branches:
  refs/heads/cellar-3.0.x a843ad78a -> add697a37


[KARAF-3615] Cluster bundles now keep bundle ID, version and symbolic name


Project: http://git-wip-us.apache.org/repos/asf/karaf-cellar/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf-cellar/commit/add697a3
Tree: http://git-wip-us.apache.org/repos/asf/karaf-cellar/tree/add697a3
Diff: http://git-wip-us.apache.org/repos/asf/karaf-cellar/diff/add697a3

Branch: refs/heads/cellar-3.0.x
Commit: add697a371b6ce0f50d90bb97d346870408a7fbf
Parents: a843ad7
Author: Jean-Baptiste Onofré <jbonofre@apache.org>
Authored: Tue Mar 17 17:16:14 2015 +0100
Committer: Jean-Baptiste Onofré <jbonofre@apache.org>
Committed: Tue Mar 17 17:16:14 2015 +0100

----------------------------------------------------------------------
 .../apache/karaf/cellar/bundle/BundleState.java | 27 +++++++
 .../karaf/cellar/bundle/BundleSynchronizer.java | 15 ++--
 .../cellar/bundle/LocalBundleListener.java      |  3 +
 .../internal/CellarBundleMBeanImpl.java         | 81 ++++++++++----------
 .../bundle/shell/BundleCommandSupport.java      | 28 +++----
 .../bundle/shell/InstallBundleCommand.java      |  3 +
 .../cellar/bundle/shell/ListBundleCommand.java  | 52 ++++++-------
 7 files changed, 119 insertions(+), 90 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/add697a3/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleState.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleState.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleState.java
index 64f287f..df6154a 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleState.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleState.java
@@ -22,11 +22,22 @@ public class BundleState implements Serializable {
 
     private static final long serialVersionUID = 5933673686648413918L;
 
+    private long id;
     private String name;
+    private String symbolicName;
+    private String version;
     private String location;
     private int status;
     private byte[] data;
 
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
     public String getName() {
         return name;
     }
@@ -35,6 +46,22 @@ public class BundleState implements Serializable {
         this.name = name;
     }
 
+    public String getSymbolicName() {
+        return symbolicName;
+    }
+
+    public void setSymbolicName(String symbolicName) {
+        this.symbolicName = symbolicName;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
     public String getLocation() {
         return location;
     }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/add697a3/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
index 851ded0..b8278e2 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/BundleSynchronizer.java
@@ -146,6 +146,7 @@ public class BundleSynchronizer extends BundleSupport implements Synchronizer
{
 
                 bundles = bundleContext.getBundles();
                 for (Bundle bundle : bundles) {
+                    long bundleId = bundle.getBundleId();
                     String symbolicName = bundle.getSymbolicName();
                     String version = bundle.getVersion().toString();
                     String bundleLocation = bundle.getLocation();
@@ -159,10 +160,13 @@ public class BundleSynchronizer extends BundleSupport implements Synchronizer
{
                         // get the bundle name or location.
                         String name = (String) bundle.getHeaders().get(org.osgi.framework.Constants.BUNDLE_NAME);
                         // if there is no name, then default to symbolic name.
-                        name = (name == null) ? bundle.getSymbolicName() : name;
+                        name = (name == null) ? symbolicName : name;
                         // if there is no symbolic name, resort to location.
                         name = (name == null) ? bundle.getLocation() : name;
+                        bundleState.setId(bundleId);
                         bundleState.setName(name);
+                        bundleState.setSymbolicName(symbolicName);
+                        bundleState.setVersion(version);
                         bundleState.setLocation(bundleLocation);
 
                         if (status == Bundle.ACTIVE)
@@ -180,14 +184,7 @@ public class BundleSynchronizer extends BundleSupport implements Synchronizer
{
 
                         bundleState.setStatus(status);
 
-                        BundleState existingState = clusterBundles.get(id);
-
-                        if (existingState == null ||
-                                !existingState.getLocation().equals(bundleState.getLocation())
||
-                                existingState.getStatus() != bundleState.getStatus()) {
-                            // update the distributed map
-                            clusterBundles.put(id, bundleState);
-                        }
+                        clusterBundles.put(id, bundleState);
 
                     } else LOGGER.trace("CELLAR BUNDLE: bundle {} is marked BLOCKED OUTBOUND
for cluster group {}", bundleLocation, groupName);
                 }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/add697a3/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
b/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
index 59dd72b..c5473f9 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/LocalBundleListener.java
@@ -106,7 +106,10 @@ public class LocalBundleListener extends BundleSupport implements SynchronousBun
                                 if (state == null) {
                                     state = new BundleState();
                                 }
+                                state.setId(event.getBundle().getBundleId());
                                 state.setName(name);
+                                state.setVersion(version);
+                                state.setSymbolicName(symbolicName);
                                 state.setStatus(type);
                                 state.setLocation(bundleLocation);
                                 clusterBundles.put(symbolicName + "/" + version, state);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/add697a3/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
b/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
index f962995..225b99e 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/management/internal/CellarBundleMBeanImpl.java
@@ -32,10 +32,7 @@ import javax.management.NotCompliantMBeanException;
 import javax.management.StandardMBean;
 import javax.management.openmbean.*;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.jar.JarInputStream;
 import java.util.jar.Manifest;
 import java.util.regex.Matcher;
@@ -129,9 +126,10 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
         if (manifest == null) {
             throw new IllegalArgumentException("Bundle location " + location + " doesn't
seem correct");
         }
-        String name = manifest.getMainAttributes().getValue("Bundle-SymbolicName");
+        String name = manifest.getMainAttributes().getValue("Bundle-Name");
+        String symbolicName = manifest.getMainAttributes().getValue("Bundle-SymbolicName");
         if (name == null) {
-            name = manifest.getMainAttributes().getValue("Bundle-SymbolicName");
+            name = symbolicName;
         }
         if (name == null) {
             name = location;
@@ -146,6 +144,9 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
             Map<String, BundleState> clusterBundles = clusterManager.getMap(Constants.BUNDLE_MAP
+ Configurations.SEPARATOR + groupName);
             BundleState state = new BundleState();
             state.setName(name);
+            state.setSymbolicName(symbolicName);
+            state.setVersion(version);
+            state.setId(clusterBundles.size());
             state.setLocation(location);
             if (start) {
                 state.setStatus(BundleEvent.STARTED);
@@ -388,21 +389,14 @@ public class CellarBundleMBeanImpl extends StandardMBean implements
CellarBundle
         ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
         Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
         try {
-            Map<String, ExtendedBundleState> bundles = gatherBundles(groupName);
-            int id = 0;
-            for (String bundle : bundles.keySet()) {
-                String[] tokens = bundle.split("/");
-                String name = null;
-                String version = null;
-                if (tokens.length == 2) {
-                    name = tokens[0];
-                    version = tokens[1];
-                } else {
-                    name = bundle;
-                }
-                ExtendedBundleState state = bundles.get(bundle);
+            Map<String, ExtendedBundleState> allBundles = gatherBundles(groupName);
+
+            List<ExtendedBundleState> bundles = new ArrayList<ExtendedBundleState>(allBundles.values());
+            Collections.sort(bundles, new BundleStateComparator());
+
+            for (ExtendedBundleState bundle : bundles) {
                 String status;
-                switch (state.getStatus()) {
+                switch (bundle.getStatus()) {
                     case BundleEvent.INSTALLED:
                         status = "Installed";
                         break;
@@ -430,8 +424,8 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
                 }
 
                 String located = "";
-                boolean local = state.isLocal();
-                boolean cluster = state.isCluster();
+                boolean local = bundle.isLocal();
+                boolean cluster = bundle.isCluster();
                 if (local && cluster)
                     located = "cluster/local";
                 if (local && !cluster)
@@ -440,8 +434,8 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
                     located = "cluster";
 
                 String blocked = "";
-                boolean inbound = support.isAllowed(group, Constants.CATEGORY, state.getLocation(),
EventType.INBOUND);
-                boolean outbound = support.isAllowed(group, Constants.CATEGORY, state.getLocation(),
EventType.OUTBOUND);
+                boolean inbound = support.isAllowed(group, Constants.CATEGORY, bundle.getLocation(),
EventType.INBOUND);
+                boolean outbound = support.isAllowed(group, Constants.CATEGORY, bundle.getLocation(),
EventType.OUTBOUND);
                 if (!inbound && !outbound)
                     blocked = "in/out";
                 if (!inbound && outbound)
@@ -451,9 +445,8 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
 
                 CompositeData data = new CompositeDataSupport(compositeType,
                         new String[]{"id", "name", "version", "status", "location", "located",
"blocked"},
-                        new Object[]{id, name, version, status, state.getLocation(), located,
blocked});
+                        new Object[]{bundle.getId(), bundle.getName(), bundle.getVersion(),
status, bundle.getLocation(), located, blocked});
                 table.put(data);
-                id++;
             }
         } finally {
             Thread.currentThread().setContextClassLoader(originalClassLoader);
@@ -474,31 +467,29 @@ public class CellarBundleMBeanImpl extends StandardMBean implements
CellarBundle
         return bundles;
     }
 
-    protected void addMatchingBundles(String id, List<String> bundles, Map<String,
ExtendedBundleState> clusterBundles) {
+    protected void addMatchingBundles(String nameId, List<String> bundles, Map<String,
ExtendedBundleState> clusterBundles) {
 
         // id is a number
         Pattern pattern = Pattern.compile("^\\d+$");
-        Matcher matcher = pattern.matcher(id);
+        Matcher matcher = pattern.matcher(nameId);
         if (matcher.find()) {
-            int idInt = Integer.parseInt(id);
-            int index = 0;
+            int idInt = Integer.parseInt(nameId);
             for (String bundle : clusterBundles.keySet()) {
-                if (index == idInt) {
+                if (clusterBundles.get(bundle).getId() == idInt) {
                     bundles.add(bundle);
                     break;
                 }
-                index++;
             }
             return;
         }
 
         // id as a number range
         pattern = Pattern.compile("^(\\d+)-(\\d+)$");
-        matcher = pattern.matcher(id);
+        matcher = pattern.matcher(nameId);
         if (matcher.find()) {
-            int index = id.indexOf('-');
-            long startId = Long.parseLong(id.substring(0, index));
-            long endId = Long.parseLong(id.substring(index + 1));
+            int index = nameId.indexOf('-');
+            long startId = Long.parseLong(nameId.substring(0, index));
+            long endId = Long.parseLong(nameId.substring(index + 1));
             if (startId < endId) {
                 int bundleIndex = 0;
                 for (String bundle : clusterBundles.keySet()) {
@@ -511,10 +502,10 @@ public class CellarBundleMBeanImpl extends StandardMBean implements
CellarBundle
             return;
         }
 
-        int index = id.indexOf('/');
+        int index = nameId.indexOf('/');
         if (index != -1) {
             // id is name/version
-            String[] idSplit = id.split("/");
+            String[] idSplit = nameId.split("/");
             String name = idSplit[0];
             String version = idSplit[1];
             for (String bundle : clusterBundles.keySet()) {
@@ -549,7 +540,7 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
 
         // id is just name
         // regex support on the name
-        Pattern namePattern = Pattern.compile(id);
+        Pattern namePattern = Pattern.compile(nameId);
         // looking for bundle using only the name
         for (String bundle : clusterBundles.keySet()) {
             BundleState state = clusterBundles.get(bundle);
@@ -583,7 +574,10 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
         for (String key : clusterBundles.keySet()) {
             BundleState state = clusterBundles.get(key);
             ExtendedBundleState extendedState = new ExtendedBundleState();
+            extendedState.setId(state.getId());
             extendedState.setName(state.getName());
+            extendedState.setVersion(state.getVersion());
+            extendedState.setSymbolicName(state.getSymbolicName());
             extendedState.setStatus(state.getStatus());
             extendedState.setLocation(state.getLocation());
             extendedState.setData(state.getData());
@@ -607,7 +601,10 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
                 name = (name == null) ? bundle.getSymbolicName() : name;
                 // if there is no symbolic name, resort to location.
                 name = (name == null) ? bundle.getLocation() : name;
+                extendedState.setId(bundle.getBundleId());
                 extendedState.setName(name);
+                extendedState.setVersion(bundle.getVersion().toString());
+                extendedState.setSymbolicName(bundle.getSymbolicName());
                 extendedState.setLocation(bundle.getLocation());
                 int status = bundle.getState();
                 if (status == Bundle.ACTIVE)
@@ -654,4 +651,10 @@ public class CellarBundleMBeanImpl extends StandardMBean implements CellarBundle
         }
     }
 
+    class BundleStateComparator implements Comparator<BundleState> {
+        public int compare(BundleState b1, BundleState b2) {
+            return (int) (b1.getId() - b2.getId());
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/add697a3/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/BundleCommandSupport.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/BundleCommandSupport.java
b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/BundleCommandSupport.java
index 6e7f98e..ad3b0af 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/BundleCommandSupport.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/BundleCommandSupport.java
@@ -59,31 +59,29 @@ public abstract class BundleCommandSupport extends CellarCommandSupport
{
         return bundles;
     }
 
-    protected void addMatchingBundles(String id, List<String> bundles, Map<String,
ExtendedBundleState> clusterBundles) {
+    protected void addMatchingBundles(String nameId, List<String> bundles, Map<String,
ExtendedBundleState> clusterBundles) {
 
         // id is a number
         Pattern pattern = Pattern.compile("^\\d+$");
-        Matcher matcher = pattern.matcher(id);
+        Matcher matcher = pattern.matcher(nameId);
         if (matcher.find()) {
-            int idInt = Integer.parseInt(id);
-            int index = 0;
+            int id = Integer.parseInt(nameId);
             for (String bundle : clusterBundles.keySet()) {
-                if (index == idInt) {
+                if (clusterBundles.get(bundle).getId() == id) {
                     bundles.add(bundle);
                     break;
                 }
-                index++;
             }
             return;
         }
 
         // id as a number range
         pattern = Pattern.compile("^(\\d+)-(\\d+)$");
-        matcher = pattern.matcher(id);
+        matcher = pattern.matcher(nameId);
         if (matcher.find()) {
-            int index = id.indexOf('-');
-            long startId = Long.parseLong(id.substring(0, index));
-            long endId = Long.parseLong(id.substring(index + 1));
+            int index = nameId.indexOf('-');
+            long startId = Long.parseLong(nameId.substring(0, index));
+            long endId = Long.parseLong(nameId.substring(index + 1));
             if (startId < endId) {
                 int bundleIndex = 0;
                 for (String bundle : clusterBundles.keySet()) {
@@ -96,10 +94,10 @@ public abstract class BundleCommandSupport extends CellarCommandSupport
{
             return;
         }
 
-        int index = id.indexOf('/');
+        int index = nameId.indexOf('/');
         if (index != -1) {
             // id is name/version
-            String[] idSplit = id.split("/");
+            String[] idSplit = nameId.split("/");
             String name = idSplit[0];
             String version = idSplit[1];
             for (String bundle : clusterBundles.keySet()) {
@@ -134,7 +132,7 @@ public abstract class BundleCommandSupport extends CellarCommandSupport
{
 
         // id is just name
         // regex support on the name
-        Pattern namePattern = Pattern.compile(id);
+        Pattern namePattern = Pattern.compile(nameId);
         // looking for bundle using only the name
         for (String bundle : clusterBundles.keySet()) {
             BundleState state = clusterBundles.get(bundle);
@@ -168,9 +166,11 @@ public abstract class BundleCommandSupport extends CellarCommandSupport
{
         for (String key : clusterBundles.keySet()) {
             BundleState state = clusterBundles.get(key);
             ExtendedBundleState extendedState = new ExtendedBundleState();
+            extendedState.setId(state.getId());
             extendedState.setName(state.getName());
             extendedState.setStatus(state.getStatus());
             extendedState.setLocation(state.getLocation());
+            extendedState.setVersion(state.getVersion());
             // extendedState.setData(state.getData());
             extendedState.setCluster(true);
             extendedState.setLocal(false);
@@ -193,7 +193,9 @@ public abstract class BundleCommandSupport extends CellarCommandSupport
{
                 name = (name == null) ? bundle.getSymbolicName() : name;
                 // if there is no symbolic name, resort to location.
                 name = (name == null) ? bundle.getLocation() : name;
+                extendedState.setId(bundle.getBundleId());
                 extendedState.setName(name);
+                extendedState.setVersion(bundle.getVersion().toString());
                 extendedState.setLocation(bundle.getLocation());
                 int status = bundle.getState();
                 if (status == Bundle.ACTIVE)

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/add697a3/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/InstallBundleCommand.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/InstallBundleCommand.java
b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/InstallBundleCommand.java
index 64c594d..dfbc62b 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/InstallBundleCommand.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/InstallBundleCommand.java
@@ -98,6 +98,9 @@ public class InstallBundleCommand extends CellarCommandSupport {
                     Map<String, BundleState> clusterBundles = clusterManager.getMap(Constants.BUNDLE_MAP
+ Configurations.SEPARATOR + groupName);
                     BundleState state = new BundleState();
                     state.setName(name);
+                    state.setSymbolicName(symbolicName);
+                    state.setVersion(version);
+                    state.setId(clusterBundles.size());
                     state.setLocation(url);
                     if (start) {
                         state.setStatus(BundleEvent.STARTED);

http://git-wip-us.apache.org/repos/asf/karaf-cellar/blob/add697a3/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/ListBundleCommand.java
----------------------------------------------------------------------
diff --git a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/ListBundleCommand.java
b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/ListBundleCommand.java
index 7b4241d..165d5de 100644
--- a/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/ListBundleCommand.java
+++ b/bundle/src/main/java/org/apache/karaf/cellar/bundle/shell/ListBundleCommand.java
@@ -13,6 +13,7 @@
  */
 package org.apache.karaf.cellar.bundle.shell;
 
+import org.apache.karaf.cellar.bundle.BundleState;
 import org.apache.karaf.cellar.bundle.Constants;
 import org.apache.karaf.cellar.core.CellarSupport;
 import org.apache.karaf.cellar.core.Group;
@@ -22,10 +23,10 @@ import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.table.ShellTable;
 import org.osgi.framework.BundleEvent;
 
-import java.util.Map;
+import java.util.*;
 
 @Command(scope = "cluster", name = "bundle-list", description = "List the bundles in a cluster
group")
-public class ListBundleCommand extends  BundleCommandSupport {
+public class ListBundleCommand extends BundleCommandSupport {
 
     @Option(name = "-s", aliases = {}, description = "Shows the symbolic name", required
= false, multiValued = false)
     boolean showSymbolicName;
@@ -60,8 +61,8 @@ public class ListBundleCommand extends  BundleCommandSupport {
         Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
 
         try {
-            Map<String, ExtendedBundleState> bundles = gatherBundles();
-            if (bundles != null && !bundles.isEmpty()) {
+            Map<String, ExtendedBundleState> allBundles = gatherBundles();
+            if (allBundles != null && !allBundles.isEmpty()) {
                 System.out.println(String.format("Bundles in cluster group " + groupName));
 
                 ShellTable table = new ShellTable();
@@ -78,21 +79,12 @@ public class ListBundleCommand extends  BundleCommandSupport {
                     table.column("Name");
                 }
 
-                int id = 0;
-                for (String bundle : bundles.keySet()) {
-                    String[] tokens = bundle.split("/");
-                    String symbolicName = null;
-                    String version = null;
-                    if (tokens.length == 2) {
-                        symbolicName = tokens[0];
-                        version = tokens[1];
-                    } else {
-                        symbolicName = bundle;
-                        version = "";
-                    }
-                    ExtendedBundleState state = bundles.get(bundle);
+                List<ExtendedBundleState> bundles = new ArrayList<ExtendedBundleState>(allBundles.values());
+                Collections.sort(bundles, new BundleStateComparator());
+
+                for (ExtendedBundleState bundle : bundles) {
                     String status;
-                    switch (state.getStatus()) {
+                    switch (bundle.getStatus()) {
                         case BundleEvent.INSTALLED:
                             status = "Installed";
                             break;
@@ -120,30 +112,27 @@ public class ListBundleCommand extends  BundleCommandSupport {
                     }
 
                     String located = "";
-                    boolean cluster = state.isCluster();
-                    boolean local = state.isLocal();
+                    boolean cluster = bundle.isCluster();
+                    boolean local = bundle.isLocal();
                     if (cluster && local)
                         located = "cluster/local";
                     if (cluster && !local) {
                         located = "cluster";
                         if (onlyLocal) {
-                            id++;
                             continue;
                         }
                     }
                     if (local && !cluster) {
                         located = "local";
                         if (onlyCluster) {
-                            id++;
                             continue;
                         }
                     }
 
                     String blocked = "";
-                    boolean inbound = support.isAllowed(group, Constants.CATEGORY, state.getLocation(),
EventType.INBOUND);
-                    boolean outbound = support.isAllowed(group, Constants.CATEGORY, state.getLocation(),
EventType.OUTBOUND);
+                    boolean inbound = support.isAllowed(group, Constants.CATEGORY, bundle.getLocation(),
EventType.INBOUND);
+                    boolean outbound = support.isAllowed(group, Constants.CATEGORY, bundle.getLocation(),
EventType.OUTBOUND);
                     if (inbound && outbound && onlyBlocked) {
-                        id++;
                         continue;
                     }
                     if (!inbound && !outbound)
@@ -154,15 +143,14 @@ public class ListBundleCommand extends  BundleCommandSupport {
                         blocked = "out";
 
                     if (showLocation) {
-                        table.addRow().addContent(id, status, located, blocked, version,
state.getLocation());
+                        table.addRow().addContent(bundle.getId(), status, located, blocked,
bundle.getVersion(), bundle.getLocation());
                     } else {
                         if (showSymbolicName) {
-                            table.addRow().addContent(id, status, located, blocked, version,
symbolicName);
+                            table.addRow().addContent(bundle.getId(), status, located, blocked,
bundle.getVersion(), bundle.getSymbolicName());
                         } else {
-                            table.addRow().addContent(id, status, located, blocked, version,
state.getName());
+                            table.addRow().addContent(bundle.getId(), status, located, blocked,
bundle.getVersion(), bundle.getName());
                         }
                     }
-                    id++;
                 }
 
                 table.print(System.out);
@@ -176,4 +164,10 @@ public class ListBundleCommand extends  BundleCommandSupport {
         return null;
     }
 
+    class BundleStateComparator implements Comparator<BundleState> {
+        public int compare(BundleState b1, BundleState b2) {
+            return (int) (b1.getId() - b2.getId());
+        }
+    }
+
 }


Mime
View raw message