Fixed another NSE

Signed-off-by: Andreas Pieber <anpieber@gmail.com>

git-svn-id: https://svn.apache.org/repos/asf/karaf/sandbox/pieber/karaf-webconsole/trunk@1161375 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/details/DetailsPage.java b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/details/DetailsPage.java
index 212a1e8..a3d7c5f 100644
--- a/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/details/DetailsPage.java
+++ b/blueprint/src/main/java/org/apache/karaf/webconsole/blueprint/internal/details/DetailsPage.java
@@ -1,7 +1,9 @@
 package org.apache.karaf.webconsole.blueprint.internal.details;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 
 import org.apache.karaf.webconsole.core.BasePage;
@@ -9,6 +11,7 @@
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.LoadableDetachableModel;
 import org.ops4j.pax.wicket.api.PaxWicketBean;
 import org.ops4j.pax.wicket.api.PaxWicketMountPoint;
@@ -25,53 +28,94 @@
     private BundleContext context;
 
     public DetailsPage(PageParameters params) {
-        final Bundle bundle = context.getBundle(params.getLong("bundleId"));
-
-        ServiceReference[] references = bundle.getRegisteredServices();
-        ServiceReference reference = null;
-
-        for (ServiceReference ref : references) {
-            String[] classes = (String[]) ref.getProperty("objectClass");
-            for (String clazz : classes) {
-                if ("org.osgi.service.blueprint.container.BlueprintContainer".equals(clazz)) {
-                    reference = ref;
-                    break;
-                }
-            }
-        }
-
-        if (reference == null) {
-            add(new ListView("components") {
-                @Override
-                protected void populateItem(ListItem item) {
-                    // do nothing :)
-                }
-            });
+        IModel<List<MetadataWrappper>> model = new MetadataModel(params);
+        if (model.getObject() == null) {
+            fillEmptyListView();
             return;
         }
+        fillListViewWithMetaModel(model);
+    }
 
-        final BlueprintContainer container = (BlueprintContainer) context.getService(reference);
-
-        LoadableDetachableModel<List<ComponentMetadata>> model = new LoadableDetachableModel<List<ComponentMetadata>>() {
+    private void fillEmptyListView() {
+        add(new ListView("components") {
             @Override
-            protected List<ComponentMetadata> load() {
-                return new ArrayList<ComponentMetadata>(container.getMetadata(ComponentMetadata.class));
-            }
-        };
-
-        add(new ListView<ComponentMetadata>("components", model) {
-            @Override
-            protected void populateItem(ListItem<ComponentMetadata> item) {
-                ComponentMetadata metadata = item.getModelObject();
-
-                Class<?>[] interfaces = metadata.getClass().getInterfaces();
-
-                item.add(new Label("componentId", metadata.getId()));
-                item.add(new Label("type", Arrays.toString(interfaces)));
+            protected void populateItem(ListItem item) {
+                // do nothing :)
             }
         });
+    }
 
-        context.ungetService(reference);
+    private void fillListViewWithMetaModel(IModel<List<MetadataWrappper>> model) {
+        add(new ListView<MetadataWrappper>("components", model) {
+            @Override
+            protected void populateItem(ListItem<MetadataWrappper> item) {
+                MetadataWrappper metadata = item.getModelObject();
+                item.add(new Label("componentId", metadata.id));
+                item.add(new Label("type", metadata.interfaces));
+            }
+        });
+    }
+
+    private class MetadataModel extends LoadableDetachableModel<List<MetadataWrappper>> {
+
+        private PageParameters pageParams;
+
+        public MetadataModel(PageParameters pageParams) {
+            this.pageParams = pageParams;
+        }
+
+        @Override
+        protected List<MetadataWrappper> load() {
+            ServiceReference reference = null;
+            try {
+                reference = retrieveReference();
+                if (reference == null) {
+                    return null;
+                }
+                return extractMetadata(reference);
+            } finally {
+                if (reference != null) {
+                    context.ungetService(reference);
+                }
+            }
+        }
+
+        private List<MetadataWrappper> extractMetadata(ServiceReference reference) {
+            BlueprintContainer container = (BlueprintContainer) context.getService(reference);
+            List<MetadataWrappper> extractedMetadata = new ArrayList<DetailsPage.MetadataWrappper>();
+            Collection<ComponentMetadata> metadata = container.getMetadata(ComponentMetadata.class);
+            for (ComponentMetadata originalMetadata : metadata) {
+                extractedMetadata.add(new MetadataWrappper(originalMetadata));
+            }
+            return extractedMetadata;
+        }
+
+        private ServiceReference retrieveReference() {
+            ServiceReference reference = null;
+            Bundle bundle = context.getBundle(pageParams.getLong("bundleId"));
+            ServiceReference[] references = bundle.getRegisteredServices();
+            for (ServiceReference ref : references) {
+                String[] classes = (String[]) ref.getProperty("objectClass");
+                for (String clazz : classes) {
+                    if ("org.osgi.service.blueprint.container.BlueprintContainer".equals(clazz)) {
+                        reference = ref;
+                        break;
+                    }
+                }
+            }
+            return reference;
+        }
+    }
+
+    private static class MetadataWrappper implements Serializable {
+        private String id;
+        private String interfaces;
+
+        public MetadataWrappper(ComponentMetadata metadata) {
+            id = metadata.getId();
+            interfaces = Arrays.toString(metadata.getClass().getInterfaces());
+        }
+
     }
 
 }