FELIX-4202 : Allow to filter services using ldap filter in webconsole services tab . Apply patch from Alexander Klimetschek
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1517092 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java
index 60f45f6..8f5cb95 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java
@@ -110,6 +110,9 @@
private static final String TITLE = "%services.pluginTitle"; //$NON-NLS-1$
private static final String CSS[] = null;
+ // an LDAP filter, that is used to search services
+ private static final String FILTER_PARAM = "filter";
+
private final String TEMPLATE;
/** Default constructor */
@@ -165,11 +168,15 @@
}
- private final ServiceReference[] getServices()
+ private final ServiceReference[] getServices(String filter)
{
+ // empty filter string will return nothing, must set it to null to return all services
+ if (filter != null && filter.trim().length() == 0) {
+ filter = null;
+ }
try
{
- final ServiceReference[] refs = getBundleContext().getAllServiceReferences( null, null );
+ final ServiceReference[] refs = getBundleContext().getAllServiceReferences( null, filter );
if ( refs != null )
{
return refs;
@@ -212,7 +219,7 @@
response.setCharacterEncoding( "UTF-8" );
final PrintWriter pw = response.getWriter();
- writeJSON( pw, service, locale );
+ writeJSON( pw, service, locale, null);
}
@@ -306,16 +313,16 @@
}
- private void writeJSON( final Writer pw, final ServiceReference service, final Locale locale ) throws IOException
+ private void writeJSON(final Writer pw, final ServiceReference service, final Locale locale, final String filter) throws IOException
{
- writeJSON( pw, service, false, locale );
+ writeJSON( pw, service, false, locale, filter );
}
- private void writeJSON( final Writer pw, final ServiceReference service, final boolean fullDetails, final Locale locale )
+ private void writeJSON( final Writer pw, final ServiceReference service, final boolean fullDetails, final Locale locale, final String filter )
throws IOException
{
- final ServiceReference[] allServices = this.getServices();
+ final ServiceReference[] allServices = this.getServices(filter);
final String statusLine = getStatusLine( allServices );
final ServiceReference[] services = ( service != null ) ? new ServiceReference[]
@@ -392,13 +399,15 @@
final String appRoot = ( String ) request.getAttribute( WebConsoleConstants.ATTR_APP_ROOT );
StringWriter w = new StringWriter();
- writeJSON(w, reqInfo.service, request.getLocale());
+ final String filter = request.getParameter(FILTER_PARAM);
+ writeJSON(w, reqInfo.service, request.getLocale(), filter);
// prepare variables
DefaultVariableResolver vars = ( ( DefaultVariableResolver ) WebConsoleUtil.getVariableResolver( request ) );
vars.put( "bundlePath", appRoot + "/" + BundlesServlet.NAME + "/" );
vars.put( "drawDetails", String.valueOf(reqInfo.serviceRequested));
vars.put( "__data__", w.toString() );
+ vars.put( "filter", filter == null ? "" : filter);
response.getWriter().print( TEMPLATE );
}
diff --git a/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties b/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties
index 786c373..f99802a 100644
--- a/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties
+++ b/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties
@@ -81,6 +81,8 @@
services.info.name=Used Services
services.info.descr=This is a OSGi service that is used by the current bundle. Click to see more details in 'Services' plugin.
services.info.key=Service #{0} of type(s) {1}
+services.filter.help=An LDAP filter string to match against service properties.
+services.filter.apply=Apply Filter
# Log plugin
logs.pluginTitle=Log Service
diff --git a/webconsole/src/main/resources/res/ui/bundles.css b/webconsole/src/main/resources/res/ui/bundles.css
index b5352f0..794c781 100644
--- a/webconsole/src/main/resources/res/ui/bundles.css
+++ b/webconsole/src/main/resources/res/ui/bundles.css
@@ -24,7 +24,6 @@
th.col_Version,
th.col_Status { width: 7em }
th.col_Actions { width: 121px }
-.filterBox { float: left; margin-left: 1em }
.symName { font-style: italic }
.symName:before { content: " (" }
.symName:after { content: ")" }
diff --git a/webconsole/src/main/resources/res/ui/webconsole.css b/webconsole/src/main/resources/res/ui/webconsole.css
index b8d24c8..0ddc954 100644
--- a/webconsole/src/main/resources/res/ui/webconsole.css
+++ b/webconsole/src/main/resources/res/ui/webconsole.css
@@ -191,3 +191,8 @@
/* language selection element */
#langSelect { position: absolute; top: 5px; right: 5px }
#langSelect img { display: block; padding: 2px 0 }
+
+.filterBox { float: left; margin-left: 1em }
+.servicesFilter { width: 400px; }
+.servicesFilterApply { width: 85px; }
+
diff --git a/webconsole/src/main/resources/templates/services.html b/webconsole/src/main/resources/templates/services.html
index bc717e8..0e70c58 100644
--- a/webconsole/src/main/resources/templates/services.html
+++ b/webconsole/src/main/resources/templates/services.html
@@ -19,7 +19,18 @@
<p class="statline"> </p>
-<div class="ui-widget-header ui-corner-top buttonGroup">${services.caption}</div>
+<form method="get" action="" class="filterForm">
+ <div class="ui-widget-header ui-corner-top buttonGroup">
+ <div class="filterBox">
+ <label>
+ Filter:
+ <input class="servicesFilter" name="filter" value="${filter}" title="${services.filter.help}"/>
+ </label>
+ <input type="submit" value="${services.filter.apply}" class="servicesFilterApply"/>
+ </div>
+ <span>${services.caption}</span>
+ </div>
+</form>
<table id="plugin_table" class="tablesorter nicetable noauto">
<thead>