This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/felix-dev.git
The following commit(s) were added to refs/heads/master by this push:
new ef7f3aef9a FELIX-6500: Initial proposal. (#147)
ef7f3aef9a is described below
commit ef7f3aef9ac2438bcd2a55166f533a9a41c1e973
Author: mbaedke <[email protected]>
AuthorDate: Tue May 3 19:08:12 2022 +0200
FELIX-6500: Initial proposal. (#147)
Co-authored-by: Manfred Baedke <[email protected]>
---
.../internal/configuration/ConfigJsonSupport.java | 101 ++++++++++++++++++---
.../internal/configuration/ConfigManager.java | 6 +-
.../felix/webconsole/spi/ConfigurationHandler.java | 21 +++++
.../apache/felix/webconsole/spi/package-info.java | 2 +-
4 files changed, 114 insertions(+), 16 deletions(-)
diff --git
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupport.java
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupport.java
index 8cfc7c9dd9..f3453dba94 100644
---
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupport.java
+++
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigJsonSupport.java
@@ -20,12 +20,16 @@ package org.apache.felix.webconsole.internal.configuration;
import java.io.IOException;
+import java.io.InputStream;
import java.io.PrintWriter;
import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
+import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
@@ -36,6 +40,7 @@ import java.util.regex.Matcher;
import org.apache.felix.utils.json.JSONWriter;
import org.apache.felix.webconsole.internal.Util;
import org.apache.felix.webconsole.internal.misc.ServletSupport;
+import org.apache.felix.webconsole.spi.ConfigurationHandler;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
@@ -46,7 +51,9 @@ import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.cm.ManagedService;
import org.osgi.service.cm.ManagedServiceFactory;
+import org.osgi.service.metatype.AttributeDefinition;
import org.osgi.service.metatype.ObjectClassDefinition;
+import org.osgi.util.tracker.ServiceTracker;
class ConfigJsonSupport {
@@ -66,14 +73,14 @@ class ConfigJsonSupport {
}
public void printConfigurationJson( final PrintWriter pw, final String
pid, final Configuration config, final String pidFilter,
- final String locale ) {
+ final String locale, ServiceTracker<ConfigurationHandler,
ConfigurationHandler> serviceTracker) {
final JSONWriter result = new JSONWriter( pw );
if ( pid != null ) {
try{
result.object();
- this.configForm( result, pid, config, pidFilter, locale );
+ this.configForm( result, pid, config, pidFilter, locale,
serviceTracker );
result.endObject();
} catch ( final Exception e ) {
this.servletSupport.log( "Error reading configuration PID " +
pid, e );
@@ -82,7 +89,7 @@ class ConfigJsonSupport {
}
- void configForm( final JSONWriter json, final String pid, final
Configuration config, final String pidFilter, final String locale )
+ void configForm( final JSONWriter json, final String pid, final
Configuration config, final String pidFilter, final String locale,
ServiceTracker<ConfigurationHandler, ConfigurationHandler> serviceTracker )
throws IOException {
json.key( ConfigManager.PID );
json.value( pid );
@@ -93,9 +100,25 @@ class ConfigJsonSupport {
}
Dictionary<String, Object> props = null;
+ List<String> filteredKeys = Collections.emptyList();
if ( config != null ) {
props = config.getProperties();
+ if (props != null && serviceTracker != null) {
+ Object[] services = serviceTracker.getServices();
+ if (services != null) {
+ for(final Object o : services) {
+ ConfigurationHandler handler = (ConfigurationHandler)o;
+ List<String> allKeys = Collections.list(props.keys());
+ filteredKeys = handler.filterProperties(config,
allKeys);
+ allKeys.removeAll(filteredKeys);
+ for (String key : allKeys) {
+ props.remove(key);
+ }
+ }
+ }
+ }
}
+ final List<String> keys = filteredKeys;
if ( props == null ) {
props = new Hashtable<>();
}
@@ -109,8 +132,46 @@ class ConfigJsonSupport {
if ( ocd == null ) {
ocd = mtss.getObjectClassDefinition( pid, locale );
}
+ ObjectClassDefinition filteredOcd = ocd;
if ( ocd != null ) {
- mtss.mergeWithMetaType( props, ocd, json,
ConfigAdminSupport.CONFIG_PROPERTIES_HIDE );
+ final ObjectClassDefinition focd = ocd;
+ filteredOcd = new ObjectClassDefinition() {
+ @Override
+ public String getName() {
+ return focd.getName();
+ }
+
+ @Override
+ public String getID() {
+ return focd.getID();
+ }
+
+ @Override
+ public String getDescription() {
+ return focd.getDescription();
+ }
+
+ @Override
+ public AttributeDefinition[] getAttributeDefinitions(int
i) {
+ AttributeDefinition[] allDefinitions =
focd.getAttributeDefinitions(i);
+ if (allDefinitions != null) {
+ ArrayList<AttributeDefinition> filteredDefinitions
= new ArrayList<>();
+ for (AttributeDefinition def : allDefinitions) {
+ if (keys.contains(def.getID())) {
+ filteredDefinitions.add(def);
+ }
+ }
+ return filteredDefinitions.toArray(new
AttributeDefinition[0]);
+ }
+ return null;
+ }
+
+ @Override
+ public InputStream getIcon(int i) throws IOException {
+ return focd.getIcon(i);
+ }
+ };
+ mtss.mergeWithMetaType( props, filteredOcd, json,
ConfigAdminSupport.CONFIG_PROPERTIES_HIDE );
doSimpleMerge = false;
}
}
@@ -222,6 +283,10 @@ class ConfigJsonSupport {
}
final boolean listConfigurations( final JSONWriter jw, final String
pidFilter, final String locale, final Locale loc ) {
+ return listConfigurations( jw, pidFilter, locale, loc, null );
+ }
+
+ final boolean listConfigurations(final JSONWriter jw, final String
pidFilter, final String locale, final Locale loc , final
ServiceTracker<ConfigurationHandler, ConfigurationHandler> serviceTracker ) {
boolean hasConfigurations = false;
try {
// start with ManagedService instances
@@ -237,7 +302,6 @@ class ConfigJsonSupport {
Configuration[] cfgs =
this.configurationAdmin.listConfigurations(pidFilter);
for (int i = 0; cfgs != null && i < cfgs.length; i++)
{
-
// ignore configuration object if an entry already exists in
the map
// or if it is invalid
final String pid = cfgs[i].getPid();
@@ -279,12 +343,26 @@ class ConfigJsonSupport {
String id = ii.next();
Object name = optionsPlain.get( id );
- final Configuration config =
ConfigurationUtil.findConfiguration( this.configurationAdmin, id );
- jw.object();
- jw.key("id").value( id ); //$NON-NLS-1$
- jw.key( "name").value( name ); //$NON-NLS-1$
+ final Configuration c = ConfigurationUtil.findConfiguration(
this.configurationAdmin, id );
+ Configuration config = c;
+ if (serviceTracker != null) {
+ Object[] services = serviceTracker.getServices();
+ if (services != null) {
+ for(final Object o : services) {
+ ConfigurationHandler handler =
(ConfigurationHandler)o;
+ if (!handler.listConfiguration(config)) {
+ config = null;
+ break;
+ }
+ }
+ }
+ }
if ( null != config )
{
+ jw.object();
+ jw.key("id").value( id ); //$NON-NLS-1$
+ jw.key( "name").value( name ); //$NON-NLS-1$
+
// FELIX-3848
jw.key("has_config").value( true ); //$NON-NLS-1$
@@ -304,9 +382,8 @@ class ConfigJsonSupport {
jw.key( "bundle").value( bundle.getBundleId() );
//$NON-NLS-1$
jw.key( "bundle_name").value( Util.getName( bundle,
loc ) ); //$NON-NLS-1$
}
+ jw.endObject();
}
- jw.endObject();
-
}
jw.endArray();
} catch (final Exception e) {
@@ -319,7 +396,7 @@ class ConfigJsonSupport {
* Builds a "name hint" for factory configuration based on other property
* values of the config and a "name hint template" defined as hidden
* property in the service.
- * @param props Service properties.
+ * @param config The factory configuration.
* @return Name hint or null if none is defined.
*/
private final String getConfigurationFactoryNameHint(Configuration config)
{
diff --git
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
index 722fe79dd1..8882a368e2 100644
---
a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
+++
b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
@@ -198,7 +198,7 @@ public class ConfigManager extends SimpleWebConsolePlugin
implements OsgiManager
response.setCharacterEncoding( "UTF-8" ); //$NON-NLS-1$
final Locale loc = Util.getLocale( request );
final String locale = ( loc != null ) ? loc.toString() : null;
- cas.getJsonSupport().printConfigurationJson( response.getWriter(),
pid, config, pidFilter, locale );
+ cas.getJsonSupport().printConfigurationJson( response.getWriter(),
pid, config, pidFilter, locale, spiTracker );
}
@@ -305,7 +305,7 @@ public class ConfigManager extends SimpleWebConsolePlugin
implements OsgiManager
{
pw.print( ',' );
}
- ca.getJsonSupport().printConfigurationJson( pw,
config.getPid(), config, null, locale );
+ ca.getJsonSupport().printConfigurationJson( pw,
config.getPid(), config, null, locale, spiTracker);
printComma = true;
}
}
@@ -399,7 +399,7 @@ public class ConfigManager extends SimpleWebConsolePlugin
implements OsgiManager
boolean hasConfigs = true;
if ( cas != null )
{
- hasConfigs = cas.getJsonSupport().listConfigurations( jw,
pidFilter, locale, loc );
+ hasConfigs = cas.getJsonSupport().listConfigurations( jw,
pidFilter, locale, loc, spiTracker);
cas.getJsonSupport().listFactoryConfigurations( jw, pidFilter,
locale );
}
if ( !hasConfigs && !hasMetatype && cas != null ) {
diff --git
a/webconsole/src/main/java/org/apache/felix/webconsole/spi/ConfigurationHandler.java
b/webconsole/src/main/java/org/apache/felix/webconsole/spi/ConfigurationHandler.java
index 0e3232962c..fcb33ac83c 100644
---
a/webconsole/src/main/java/org/apache/felix/webconsole/spi/ConfigurationHandler.java
+++
b/webconsole/src/main/java/org/apache/felix/webconsole/spi/ConfigurationHandler.java
@@ -20,8 +20,10 @@ package org.apache.felix.webconsole.spi;
import java.io.IOException;
import java.util.Dictionary;
+import java.util.List;
import org.osgi.annotation.versioning.ConsumerType;
+import org.osgi.service.cm.Configuration;
/**
* A configuration handler allows to hook into the processing of
configurations for
@@ -68,4 +70,23 @@ public interface ConfigurationHandler {
* @throws ValidationException if updating is not allowed
*/
void updateConfiguration(String factoryPid, String pid, Dictionary<String,
Object> props) throws ValidationException, IOException;
+
+ /**
+ * @param cfg a configuration object
+ * @return true if the configuration may be listed
+ * @throws IOException For an error
+ */
+ default boolean listConfiguration(Configuration cfg) throws IOException {
+ return true;
+ }
+
+ /**
+ * @param cfg a configuration object
+ * @return the filtered list
+ * @throws IOException For an error
+ */
+ default List<String> filterProperties(Configuration cfg, List<String>
propertyNames) throws IOException {
+ return propertyNames;
+ }
+
}
\ No newline at end of file
diff --git
a/webconsole/src/main/java/org/apache/felix/webconsole/spi/package-info.java
b/webconsole/src/main/java/org/apache/felix/webconsole/spi/package-info.java
index c359a983c6..da3a407a37 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/spi/package-info.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/spi/package-info.java
@@ -16,6 +16,6 @@
* specific language governing permissions and limitations
* under the License.
*/
[email protected]("1.0.0")
[email protected]("1.1.0")
package org.apache.felix.webconsole.spi;