Fixed FELIX-3140 : Display link for component id within the bundle details and service details view
https://issues.apache.org/jira/browse/FELIX-3140

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1610409 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/webconsole-plugins/ds/pom.xml b/webconsole-plugins/ds/pom.xml
index 76ac481..75309ca 100644
--- a/webconsole-plugins/ds/pom.xml
+++ b/webconsole-plugins/ds/pom.xml
@@ -96,7 +96,7 @@
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.webconsole</artifactId>
-            <version>3.1.0</version>
+            <version>4.2.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/webconsole-plugins/ds/src/main/java/org/apache/felix/webconsole/plugins/ds/internal/Activator.java b/webconsole-plugins/ds/src/main/java/org/apache/felix/webconsole/plugins/ds/internal/Activator.java
index ae665c9..da31234 100644
--- a/webconsole-plugins/ds/src/main/java/org/apache/felix/webconsole/plugins/ds/internal/Activator.java
+++ b/webconsole-plugins/ds/src/main/java/org/apache/felix/webconsole/plugins/ds/internal/Activator.java
@@ -36,6 +36,7 @@
 

     private SimpleWebConsolePlugin plugin;

     private ServiceRegistration printerRegistration;

+    private ServiceRegistration infoRegistration;

 

     /**

      * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)

@@ -77,8 +78,10 @@
         if (plugin == null)

         {

             this.plugin = plugin = new WebConsolePlugin().register(context);

+            final Object service = context.getService(reference);

             printerRegistration = context.registerService(ConfigurationPrinter.SERVICE,

-                new ComponentConfigurationPrinter(context.getService(reference)), null);

+                new ComponentConfigurationPrinter(service), null);

+            infoRegistration = new InfoProvider(context.getBundle(), service).register(context);

         }

 

         return context.getService(reference);

@@ -104,6 +107,13 @@
                 reg.unregister();

                 printerRegistration = null;

             }

+            // unregister info provider too

+            reg = infoRegistration;

+            if (reg != null)

+            {

+                reg.unregister();

+                infoRegistration = null;

+            }

         }

 

     }

diff --git a/webconsole-plugins/ds/src/main/java/org/apache/felix/webconsole/plugins/ds/internal/InfoProvider.java b/webconsole-plugins/ds/src/main/java/org/apache/felix/webconsole/plugins/ds/internal/InfoProvider.java
new file mode 100644
index 0000000..c190fb7
--- /dev/null
+++ b/webconsole-plugins/ds/src/main/java/org/apache/felix/webconsole/plugins/ds/internal/InfoProvider.java
@@ -0,0 +1,98 @@
+/*

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ *   http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * KIND, either express or implied.  See the License for the

+ * specific language governing permissions and limitations

+ * under the License.

+ */

+package org.apache.felix.webconsole.plugins.ds.internal;

+

+import java.text.MessageFormat;

+import java.util.Locale;

+import java.util.ResourceBundle;

+

+import org.apache.felix.scr.Component;

+import org.apache.felix.scr.ScrService;

+import org.apache.felix.webconsole.bundleinfo.BundleInfo;

+import org.apache.felix.webconsole.bundleinfo.BundleInfoProvider;

+import org.apache.felix.webconsole.bundleinfo.BundleInfoType;

+import org.apache.felix.webconsole.i18n.LocalizationHelper;

+import org.osgi.framework.Bundle;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.ServiceRegistration;

+

+class InfoProvider implements BundleInfoProvider

+{

+

+    private final LocalizationHelper localization;

+

+    private final ScrService scrService;

+

+    InfoProvider(Bundle bundle, Object scrService)

+    {

+        this.scrService = (ScrService) scrService;

+        localization = new LocalizationHelper(bundle);

+    }

+

+    /**

+     * @see org.apache.felix.webconsole.bundleinfo.BundleInfoProvider#getName(java.util.Locale)

+     */

+    public String getName(Locale locale)

+    {

+        return localization.getResourceBundle(locale).getString("info.name"); //$NON-NLS-1$;;

+    }

+

+    /**

+    * @see org.apache.felix.webconsole.bundleinfo.BundleInfoProvider#getBundleInfo(org.osgi.framework.Bundle,

+    *      java.lang.String, java.util.Locale)

+    */

+    public BundleInfo[] getBundleInfo(Bundle bundle, String webConsoleRoot, Locale locale)

+    {

+

+        final Component[] components = scrService.getComponents(bundle);

+        if (null == components || components.length == 0)

+        {

+            return NO_INFO;

+        }

+

+        BundleInfo[] ret = new BundleInfo[components.length];

+        for (int i = 0; i < components.length; i++)

+        {

+            ret[i] = toInfo(components[i], webConsoleRoot, locale);

+        }

+        return ret;

+    }

+

+    private BundleInfo toInfo(Component component, String webConsoleRoot, Locale locale)

+    {

+        final ResourceBundle bundle = localization.getResourceBundle(locale);

+        final String state = ComponentConfigurationPrinter.toStateString(component.getState());

+        final String name = component.getName();

+        final String descr = bundle.getString("info.descr"); //$NON-NLS-1$;

+        String key = bundle.getString("info.key"); //$NON-NLS-1$;

+        // Component #{0} {1}, state {2}

+        key = MessageFormat.format(key, new Object[] { String.valueOf(component.getId()), //

+                name != null ? name : "", //$NON-NLS-1$

+                state, //

+        });

+        return new BundleInfo(key, webConsoleRoot + "/components/" + component.getId(), //$NON-NLS-1$

+            BundleInfoType.LINK, descr);

+    }

+

+    ServiceRegistration register(BundleContext context)

+    {

+        return context.registerService(BundleInfoProvider.class.getName(), this, null);

+    }

+

+}

diff --git a/webconsole-plugins/ds/src/main/resources/OSGI-INF/l10n/bundle.properties b/webconsole-plugins/ds/src/main/resources/OSGI-INF/l10n/bundle.properties
index d6518c6..3d6be1b 100644
--- a/webconsole-plugins/ds/src/main/resources/OSGI-INF/l10n/bundle.properties
+++ b/webconsole-plugins/ds/src/main/resources/OSGI-INF/l10n/bundle.properties
@@ -47,3 +47,6 @@
 scr.title.actions=Actions

 scr.title.status=Status

 scr.title.name=Name

+info.name=Declarative Service Components

+info.key=Component #{0} {1}, state {2}

+info.descr=This Declarative Service Component is provided by the bundle. Click to see more details in "Components" plugin.

diff --git a/webconsole-plugins/ds/src/main/resources/OSGI-INF/l10n/bundle_bg.properties b/webconsole-plugins/ds/src/main/resources/OSGI-INF/l10n/bundle_bg.properties
index 33732de..a4b9199 100644
--- a/webconsole-plugins/ds/src/main/resources/OSGI-INF/l10n/bundle_bg.properties
+++ b/webconsole-plugins/ds/src/main/resources/OSGI-INF/l10n/bundle_bg.properties
@@ -47,3 +47,6 @@
 scr.title.actions=Действия

 scr.title.status=Статус

 scr.title.name=Име

+info.name=Компоненти

+info.key=Компонент #{0} {1}, статус {2}

+info.descr=Този компонент се предоставя от текущият бъндъл. Кликнете за повече детайли в "Компоненти" плъгина.