FELIX-4430 Provide bundles using exported packages along with the version at which the exports are imported
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1570134 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/webconsole-plugins/packageadmin/pom.xml b/webconsole-plugins/packageadmin/pom.xml
index 443db19..fcb4e95 100644
--- a/webconsole-plugins/packageadmin/pom.xml
+++ b/webconsole-plugins/packageadmin/pom.xml
@@ -96,6 +96,9 @@
<Private-Package>
org.apache.felix.webconsole.plugins.packageadmin.*
</Private-Package>
+ <Embed-Dependency>
+ org.apache.felix.utils;inline=org/apache/felix/utils/manifest/*
+ </Embed-Dependency>
<Bundle-Activator>
org.apache.felix.webconsole.plugins.packageadmin.internal.Activator
</Bundle-Activator>
@@ -121,7 +124,7 @@
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
- <version>4.0.0</version>
+ <version>4.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -131,6 +134,12 @@
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.utils</artifactId>
+ <version>1.4.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.3</version>
diff --git a/webconsole-plugins/packageadmin/src/main/java/org/apache/felix/webconsole/plugins/packageadmin/internal/WebConsolePlugin.java b/webconsole-plugins/packageadmin/src/main/java/org/apache/felix/webconsole/plugins/packageadmin/internal/WebConsolePlugin.java
index d6af0d6..5a96333 100644
--- a/webconsole-plugins/packageadmin/src/main/java/org/apache/felix/webconsole/plugins/packageadmin/internal/WebConsolePlugin.java
+++ b/webconsole-plugins/packageadmin/src/main/java/org/apache/felix/webconsole/plugins/packageadmin/internal/WebConsolePlugin.java
@@ -39,6 +39,8 @@
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
+import org.apache.felix.utils.manifest.Clause;
+import org.apache.felix.utils.manifest.Parser;
import org.apache.felix.webconsole.SimpleWebConsolePlugin;
import org.apache.felix.webconsole.WebConsoleUtil;
import org.json.JSONArray;
@@ -46,6 +48,7 @@
import org.json.JSONObject;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
import org.osgi.service.packageadmin.ExportedPackage;
import org.osgi.service.packageadmin.PackageAdmin;
@@ -80,13 +83,13 @@
TEMPLATE = readTemplateFile("/res/plugin.html"); //$NON-NLS-1$
}
-
+
public String getCategory()
{
return CATEGORY;
}
-
+
/**
* @see org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(HttpServletRequest, HttpServletResponse)
*/
@@ -205,11 +208,6 @@
{
ExportedPackage exportedPackage = (ExportedPackage) packageIter.next();
final JSONObject json = toJSON(exportedPackage);
- Bundle[] importers = exportedPackage.getImportingBundles();
- for (int j = 0; importers != null && j < importers.length; j++)
- {
- json.append("importers", toJSON(importers[j], new JSONObject())); //$NON-NLS-1$
- }
container//
.put("name", exportedPackage.getName()) //$NON-NLS-1$
.append("entries", json); //$NON-NLS-1$
@@ -227,12 +225,38 @@
return json;
}
+ private static final JSONObject toJSON(final String pkgName, final Bundle[] importers, final JSONObject json)
+ throws JSONException
+ {
+ for (int i = 0; i < importers.length; i++)
+ {
+ Bundle bundle = importers[i];
+ final JSONObject usingJson = new JSONObject();
+ toJSON(bundle, usingJson);
+ final String ip = (String) bundle.getHeaders().get(Constants.IMPORT_PACKAGE);
+ final Clause[] clauses = Parser.parseHeader(ip);
+ for (int j = 0; j < clauses.length; j++)
+ {
+ Clause clause = clauses[j];
+ if (pkgName.equals(clause.getName()))
+ {
+ usingJson.put("ver", clause.getAttribute(Constants.VERSION_ATTRIBUTE));
+ break;
+ }
+ }
+ json.append("importers", usingJson); //$NON-NLS-1$
+ }
+ return json;
+ }
+
private static final JSONObject toJSON(final ExportedPackage pkg)
throws JSONException
{
final JSONObject ret = new JSONObject();
ret.put("version", pkg.getVersion()); //$NON-NLS-1$
- return toJSON(pkg.getExportingBundle(), ret);
+ toJSON(pkg.getExportingBundle(), ret);
+ toJSON(pkg.getName(), pkg.getImportingBundles(), ret);
+ return ret;
}
private static final JSONObject getPackageInfo(String packageName, PackageAdmin pa,
@@ -304,7 +328,7 @@
{
result.add(part);
}
- }
+ }
else
{
result.add(part);
diff --git a/webconsole-plugins/packageadmin/src/main/resources/OSGI-INF/l10n/bundle.properties b/webconsole-plugins/packageadmin/src/main/resources/OSGI-INF/l10n/bundle.properties
index 91c4163..d555ac5 100644
--- a/webconsole-plugins/packageadmin/src/main/resources/OSGI-INF/l10n/bundle.properties
+++ b/webconsole-plugins/packageadmin/src/main/resources/OSGI-INF/l10n/bundle.properties
@@ -36,6 +36,7 @@
header.exporting.bundle=Exported by
header.maven.deps=Maven Dependency
no.exporters.found=No exporting bundle(s) found
+no.uses.found=No importing bundle(s) found
no.maven.found=No maven information available
status.initial=Please enter a list of package or class names and click the find button
status.find={0} result(s) found
diff --git a/webconsole-plugins/packageadmin/src/main/resources/OSGI-INF/l10n/bundle_de.properties b/webconsole-plugins/packageadmin/src/main/resources/OSGI-INF/l10n/bundle_de.properties
index b81e554..4532c73 100644
--- a/webconsole-plugins/packageadmin/src/main/resources/OSGI-INF/l10n/bundle_de.properties
+++ b/webconsole-plugins/packageadmin/src/main/resources/OSGI-INF/l10n/bundle_de.properties
@@ -1,4 +1,4 @@
-#Licensed to the Apache Software Foundation (ASF) under one or more
+#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
@@ -34,9 +34,10 @@
header.package.name=Pakete
header.package.ver=Version
header.exporting.bundle=Exportiert von
-header.maven.deps=Maven Abhängigkeit
+header.maven.deps=Maven Abhängigkeit
no.exporters.found=Keine exportierenden Bundle(s) gefunden
-no.maven.found=Keine Maven-Informationen verfügbar
+no.uses.found=Keine importierenden Bundle(s) gefunden
+no.maven.found=Keine Maven-Informationen verfügbar
status.initial=Bitte geben Sie eine Liste von Paket- oder Klassen-Namen und klicken Sie auf die Suche-Taste.
status.find={0} Ergebnis(se) gefunden
diff --git a/webconsole-plugins/packageadmin/src/main/resources/res/plugin.html b/webconsole-plugins/packageadmin/src/main/resources/res/plugin.html
index d4fbae3..918c6f1 100644
--- a/webconsole-plugins/packageadmin/src/main/resources/res/plugin.html
+++ b/webconsole-plugins/packageadmin/src/main/resources/res/plugin.html
@@ -28,6 +28,7 @@
<th>${header.package.name}</th>
<th>${header.package.ver}</th>
<th>${header.exporting.bundle}</th>
+ <th>${header.importing.bundle}</th>
<th>${header.maven.deps}</th>
</tr>
</thead>
@@ -36,6 +37,7 @@
<td class="pkg"> </td>
<td class="ver">-</td>
<td class="bnd">${no.exporters.found}</td>
+ <td class="use">${no.uses.found}</td>
<td class="mvn">${no.maven.found}</td>
</tr>
</tbody>
diff --git a/webconsole-plugins/packageadmin/src/main/resources/res/plugin.js b/webconsole-plugins/packageadmin/src/main/resources/res/plugin.js
index 8468103..43589ee 100644
--- a/webconsole-plugins/packageadmin/src/main/resources/res/plugin.js
+++ b/webconsole-plugins/packageadmin/src/main/resources/res/plugin.js
@@ -25,7 +25,26 @@
var dupsTableTemplate = false;
var statline = false;
-function linkBundle(bnd) { return '<a href="{0}/bundles/{1}">{2} ({3})</a>'.msgFormat(appRoot, bnd.bid, bnd.bsn, bnd.bid) }
+function linkBundle(bnd) { return '<a href="{0}/bundles/{1}">{2} ({3})</a>'.msgFormat(appRoot, bnd.bid, bnd.bsn, bnd.bid) }
+function uses(uses) {
+ var result = "";
+ if (uses) {
+ resul = "<table>";
+ for(var i in uses) {
+ result += "<tr><td>";
+ result += linkBundle(uses[i]);
+ result += "</td><td>";
+ if (uses[i].ver) {
+ result += uses[i].ver;
+ } else {
+ result += "—";
+ }
+ result += "</td></tr>";
+ }
+ result += "</table>";
+ }
+ return result;
+}
$(function() {
findField = $('#findField');
@@ -63,7 +82,8 @@
var tr = findTableTemplate.clone()
.find('td.pkg').text(pkg.name).end()
.find('td.ver').text(exp.version).end()
- .find('td.bnd').html(linkBundle(exp)).end()
+ .find('td.bnd').html(linkBundle(exp)).end()
+ .find('td.use').html(uses(exp.importers)).end()
.appendTo(findTableBody);
if (response.maven && response.maven[exp.bid]) {
var mvn = response.maven[exp.bid];
@@ -100,8 +120,7 @@
.find('td.ver').text(exp.version).end()
.find('td.exp').html(linkBundle(exp)).end();
if (exp.importers) {
- var txt = ''; for(var j in exp.importers) txt += linkBundle(exp.importers[j]) + '<br/>';
- td.find('td.imp').html( txt );
+ td.find('td.imp').html(uses(exp.importers));
}
if (i==0) {
td.find('td.pkg').attr('rowspan', pkg.entries.length);