SLING-11864 Remove config serializer console (#4)

Now part of sling-installer-factory-configuration
diff --git a/pom.xml b/pom.xml
index 0c4778c..acbb738 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.apache.sling</groupId>
         <artifactId>sling-bundle-parent</artifactId>
-        <version>38</version>
+        <version>49</version>
         <relativePath />
     </parent>
 
@@ -66,6 +66,7 @@
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
diff --git a/src/main/java/org/apache/sling/installer/core/impl/console/ConfigurationSerializerWebConsolePlugin.java b/src/main/java/org/apache/sling/installer/core/impl/console/ConfigurationSerializerWebConsolePlugin.java
deleted file mode 100644
index 5ff745c..0000000
--- a/src/main/java/org/apache/sling/installer/core/impl/console/ConfigurationSerializerWebConsolePlugin.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * 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.sling.installer.core.impl.console;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.nio.charset.StandardCharsets;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Set;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import org.apache.sling.installer.api.serializer.ConfigurationSerializerFactory;
-import org.apache.sling.installer.api.serializer.ConfigurationSerializerFactory.Format;
-import org.osgi.framework.Constants;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Reference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Component(service=javax.servlet.Servlet.class,
-    property = {
-        Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
-        Constants.SERVICE_DESCRIPTION + "=Apache Sling OSGi Installer Configuration Serializer Web Console Plugin",
-        "felix.webconsole.label=" + ConfigurationSerializerWebConsolePlugin.LABEL,
-        "felix.webconsole.title=OSGi Installer Configuration Printer",
-        "felix.webconsole.category=OSGi"
-    })
-@SuppressWarnings("serial")
-public class ConfigurationSerializerWebConsolePlugin extends AbstractWebConsolePlugin {
-
-    public static final String LABEL = "osgi-installer-config-printer";
-    private static final String RES_LOC = LABEL + "/res/ui/";
-    private static final String PARAMETER_PID = "pid";
-    private static final String PARAMETER_FORMAT = "format";
-
-    // copied from org.apache.sling.installer.factories.configuration.impl.ConfigUtil
-    /**
-     * This property has been used in older versions to keep track where the
-     * configuration has been installed from.
-     */
-    private static final String CONFIG_PATH_KEY = "org.apache.sling.installer.osgi.path";
-
-    /**
-     * This property has been used in older versions to keep track of factory
-     * configurations.
-     */
-    private static final String ALIAS_KEY = "org.apache.sling.installer.osgi.factoryaliaspid";
-
-    /** Configuration properties to ignore when printing */
-    private static final Set<String> IGNORED_PROPERTIES = new HashSet<>();
-    static {
-        IGNORED_PROPERTIES.add(Constants.SERVICE_PID);
-        IGNORED_PROPERTIES.add(CONFIG_PATH_KEY);
-        IGNORED_PROPERTIES.add(ALIAS_KEY);
-        IGNORED_PROPERTIES.add(ConfigurationAdmin.SERVICE_FACTORYPID);
-    }
-    
-    /** The logger */
-    private final Logger LOGGER =  LoggerFactory.getLogger(ConfigurationSerializerWebConsolePlugin.class);
-
-    @Reference
-    ConfigurationAdmin configurationAdmin;
-
-    @Override
-    public void service(final ServletRequest request, final ServletResponse response)
-            throws IOException {
-        
-        final String pid = request.getParameter(PARAMETER_PID);
-        final String format = request.getParameter(PARAMETER_FORMAT);
-        ConfigurationSerializerFactory.Format serializationFormat = Format.JSON;
-        if (format != null && !format.trim().isEmpty()) {
-            try {
-                serializationFormat = ConfigurationSerializerFactory.Format.valueOf(format);
-            } catch (IllegalArgumentException e) {
-                LOGGER.warn("Illegal parameter 'format' given, falling back to default '{}'", serializationFormat, e);
-            }
-        }
-        final PrintWriter pw = response.getWriter();
-
-        pw.println("<script type=\"text/javascript\" src=\"" + RES_LOC + "clipboard.js\"></script>");
-        pw.print("<form method='get'>");
-        pw.println("<table class='content' cellpadding='0' cellspacing='0' width='100%'>");
-
-        titleHtml(
-                pw,
-                "OSGi Installer Configuration Printer",
-                "To emit the configuration properties just enter the configuration PID, select a <a href='https://sling.apache.org/documentation/bundles/configuration-installer-factory.html'>serialization format</a> and click 'Print'");
-
-        tr(pw);
-        tdLabel(pw, "PID");
-        tdContent(pw);
-
-        pw.print("<input type='text' name='");
-        pw.print(PARAMETER_PID);
-        pw.print("' value='");
-        if ( pid != null ) {
-            pw.print(escapeXml(pid));
-        }
-        
-        pw.println("' class='input' size='120'>");
-        closeTd(pw);
-        closeTr(pw);
-        closeTr(pw);
-
-        tr(pw);
-        tdLabel(pw, "Serialization Format");
-        tdContent(pw);
-        pw.print("<select name='");
-        pw.print(PARAMETER_FORMAT);
-        pw.println("'>");
-        option(pw, "JSON", "OSGi Configurator JSON", format);
-        option(pw, "CONFIG", "Apache Felix Config", format);
-        option(pw, "PROPERTIES", "Java Properties", format);
-        option(pw, "PROPERTIES_XML", "Java Properties (XML)", format);
-        pw.println("</select>");
-
-        pw.println("&nbsp;&nbsp;<input type='submit' value='Print' class='submit'>");
-
-        closeTd(pw);
-        closeTr(pw);
-
-        if (pid != null && !pid.trim().isEmpty()) {
-            tr(pw);
-            tdLabel(pw, "Serialized Configuration Properties");
-            tdContent(pw);
-            
-            Configuration configuration = configurationAdmin.getConfiguration(pid, null);
-            Dictionary<String, Object> properties = configuration.getProperties();
-            if (properties == null) {
-                pw.print("<p class='ui-state-error-text'>");
-                pw.print("No configuration properties for pid '" + escapeXml(pid) + "' found!");
-                pw.println("</p>");
-            } else {
-                properties = cleanConfiguration(properties);
-                try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
-                    ConfigurationSerializerFactory.create(serializationFormat).serialize(properties, baos);
-                    pw.println("<textarea rows=\"20\" cols=\"120\" id=\"output\" readonly>");
-                    pw.print(new String(baos.toByteArray(), StandardCharsets.UTF_8));
-                    pw.println("</textarea>");
-                    pw.println("<button type='button' id='copy'>Copy to Clipboard</a>");
-                } catch (Throwable e) {
-                    pw.print("<p class='ui-state-error-text'>");
-                    pw.print("Error serializing pid '" + escapeXml(pid) + "': " + e.getMessage());
-                    pw.println("</p>");
-                    LOGGER.warn("Error serializing pid '{}'", pid, e);
-                }
-            }
-            closeTd(pw);
-            closeTr(pw);
-        }
-
-        pw.println("</table>");
-        pw.print("</form>");
-    }
-
-    // copied from org.apache.sling.installer.factories.configuration.impl.ConfigUtil
-    /**
-     * Remove all ignored properties
-     */
-    public static Dictionary<String, Object> cleanConfiguration(final Dictionary<String, Object> config) {
-        final Dictionary<String, Object> cleanedConfig = new Hashtable<>();
-        final Enumeration<String> e = config.keys();
-        while(e.hasMoreElements()) {
-            final String key = e.nextElement();
-            if ( !IGNORED_PROPERTIES.contains(key) ) {
-                cleanedConfig.put(key, config.get(key));
-            }
-        }
-
-        return cleanedConfig;
-    }
-
-    private void tdContent(final PrintWriter pw) {
-        pw.print("<td class='content' colspan='2'>");
-    }
-
-    private void closeTd(final PrintWriter pw) {
-        pw.print("</td>");
-    }
-
-    private void closeTr(final PrintWriter pw) {
-        pw.println("</tr>");
-    }
-
-    private void tdLabel(final PrintWriter pw, final String label) {
-        pw.print("<td class='content'>");
-        pw.print(label);
-        pw.println("</td>");
-    }
-
-    private void tr(final PrintWriter pw) {
-        pw.println("<tr class='content'>");
-    }
-
-    private void option(final PrintWriter pw, String value, String label, String selectedValue) {
-        pw.print("<option value='");
-        pw.print(value);
-        pw.print("'");
-        if (value.equals(selectedValue)) {
-            pw.print(" selected");
-        }
-        pw.print(">");
-        pw.print(label);
-        pw.println("</option>");
-    }
-
-    private void titleHtml(final PrintWriter pw, final String title, final String description) {
-        tr(pw);
-        pw.print("<th colspan='3' class='content container'>");
-        pw.print(escapeXml(title));
-        pw.println("</th>");
-        closeTr(pw);
-
-        if (description != null) {
-            tr(pw);
-            pw.print("<td colspan='3' class='content'>");
-            pw.print(description);
-            pw.println("</th>");
-            closeTr(pw);
-        }
-    }
-
-    @Override
-    String getRelativeResourcePrefix() {
-        return RES_LOC;
-    }
-
-}
diff --git a/src/main/resources/res/ui/clipboard.js b/src/main/resources/res/ui/clipboard.js
deleted file mode 100644
index 197f933..0000000
--- a/src/main/resources/res/ui/clipboard.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * 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.
- */
-function copyToClipboard(inputElement) {
-  inputElement.select();
-  document.execCommand("copy");
-}
-
-window.onload = function() {
-  button = document.querySelector("#copy");
-  if (button != null) {
-    button.addEventListener("click", function() {
-      copyToClipboard(document.querySelector("#output"));
-    });
-  }
-}