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;
 

Reply via email to