This is an automated email from the ASF dual-hosted git repository. cziegeler pushed a commit to branch issues/SLING-11741 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-base.git
The following commit(s) were added to refs/heads/issues/SLING-11741 by this push: new fe21eed Merge code into a single class fe21eed is described below commit fe21eed18618c0d809dec8adc321b613ae33b0a2 Author: Carsten Ziegeler <cziege...@apache.org> AuthorDate: Sun Jun 4 10:14:17 2023 +0200 Merge code into a single class --- .../jcr/base/internal/ConfigurationUpdater.java | 138 +++++++++++++-------- .../ConfigurationUpdaterEventListener.java | 73 ----------- .../internal/mount/ProxyJackrabbitSession.java | 1 - .../sling/jcr/base/RepositoryInitializersTest.java | 2 +- .../base/internal/ConfigurationUpdaterTest.java | 6 +- 5 files changed, 91 insertions(+), 129 deletions(-) diff --git a/src/main/java/org/apache/sling/jcr/base/internal/ConfigurationUpdater.java b/src/main/java/org/apache/sling/jcr/base/internal/ConfigurationUpdater.java index adae365..68b9156 100644 --- a/src/main/java/org/apache/sling/jcr/base/internal/ConfigurationUpdater.java +++ b/src/main/java/org/apache/sling/jcr/base/internal/ConfigurationUpdater.java @@ -19,9 +19,12 @@ package org.apache.sling.jcr.base.internal; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; import java.util.Dictionary; +import java.util.HashMap; import java.util.Hashtable; +import java.util.List; import java.util.Map; import org.osgi.framework.Constants; @@ -29,54 +32,95 @@ import org.osgi.framework.InvalidSyntaxException; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.cm.ConfigurationEvent; +import org.osgi.service.cm.ConfigurationListener; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class ConfigurationUpdater { +@Component(service = ConfigurationListener.class) +public class ConfigurationUpdater implements ConfigurationListener { + + static final String LOGIN_ADMIN_WHITELIST_PID = "org.apache.sling.jcr.base.internal.LoginAdminWhitelist"; + static final String LOGIN_ADMIN_ALLOWLIST_PID = "org.apache.sling.jcr.base.internal.LoginAdminAllowList"; + private static final Map<String, String> LOGIN_ADMIN_WHITELIST_PROPS_TO_REPLACE = new HashMap<>(); + static { + LOGIN_ADMIN_WHITELIST_PROPS_TO_REPLACE.put("whitelist.bypass", "allowlist.bypass"); + LOGIN_ADMIN_WHITELIST_PROPS_TO_REPLACE.put("whitelist.bundles.regexp", "allowlist.bundles.regexp"); + } + private static final String ALLOWLIST_FRAGMENT_PID = "org.apache.sling.jcr.base.internal.LoginAdminAllowList.fragment"; + private static final String WHITELIST_FRAGMENT_PID = "org.apache.sling.jcr.base.internal.LoginAdminWhitelist.fragment"; + private static final Map<String, String> FRAGMENT_PROPS_TO_REPLACE = new HashMap<>(); + + static { + FRAGMENT_PROPS_TO_REPLACE.put("whitelist.name", "allowlist.name"); + FRAGMENT_PROPS_TO_REPLACE.put("whitelist.bundles", "allowlist.bundles"); + } protected final Logger logger = LoggerFactory.getLogger(this.getClass()); - protected final String oldPid; - protected final String newPid; - protected final Map<String, String> propsToReplace; + private final List<Updater> configurationUpdaterList = new ArrayList<>(); - public ConfigurationUpdater(final String oldPid, final String newPid, final Map<String, String> propsToReplace) { - this.oldPid = oldPid; - this.newPid = newPid; - this.propsToReplace = propsToReplace; + private final ConfigurationAdmin configurationAdmin; + + @Activate + public ConfigurationUpdater(@Reference ConfigurationAdmin configurationAdmin) { + this.configurationAdmin = configurationAdmin; + configurationUpdaterList.add(new PidConfigurationUpdater(LOGIN_ADMIN_WHITELIST_PID, LOGIN_ADMIN_ALLOWLIST_PID, LOGIN_ADMIN_WHITELIST_PROPS_TO_REPLACE)); + configurationUpdaterList.add(new FactoryPidConfigurationUpdater(WHITELIST_FRAGMENT_PID, ALLOWLIST_FRAGMENT_PID, FRAGMENT_PROPS_TO_REPLACE)); + + configurationUpdaterList.forEach(configurationUpdater -> configurationUpdater.updateProps()); } - public static ConfigurationUpdater forPid(final String oldPid, final String newPid, final Map<String, String> propsToReplace) { - return new PidConfigurationUpdater(oldPid, newPid, propsToReplace); + @Override + public void configurationEvent(final ConfigurationEvent event) { + if ( event.getType() == ConfigurationEvent.CM_UPDATED ) { + configurationUpdaterList.forEach(configurationUpdater -> { + configurationUpdater.updateProps(event); + }); + } } - public static ConfigurationUpdater forFactoryPid(final String oldPid, final String newPid, final Map<String, String> propsToReplace) { - return new FactoryPidConfigurationUpdater(oldPid, newPid, propsToReplace); + /** + * Encode the value for the ldap filter: \, *, (, and ) should be escaped. + */ + private static String encode(final String value) { + return value.replace("\\", "\\\\") + .replace("*", "\\*") + .replace("(", "\\(") + .replace(")", "\\)"); } + + protected abstract class Updater { - public abstract void updateProps(ConfigurationAdmin configurationAdmin, ConfigurationEvent event); + protected final String oldPid; + protected final String newPid; + protected final Map<String, String> propsToReplace; - protected abstract void updateProps(ConfigurationAdmin configurationAdmin); + public Updater(final String oldPid, final String newPid, final Map<String, String> propsToReplace) { + this.oldPid = oldPid; + this.newPid = newPid; + this.propsToReplace = propsToReplace; + } + + protected abstract void updateProps(ConfigurationEvent event); - protected abstract Configuration createConfiguration(ConfigurationAdmin configurationAdmin, String oldPid) throws IOException; + protected abstract void updateProps(); - protected void updateProps(final Configuration sourceConfig, ConfigurationAdmin configurationAdmin) { - final Dictionary<String, Object> sourceProps = sourceConfig.getProperties(); - final Dictionary<String, Object> targetProps = new Hashtable<>(); - for(final String name : Collections.list(sourceProps.keys())) { - final Object value = sourceProps.get(name); - String newName = this.propsToReplace.get(name); - if (newName == null) { - newName = name; - } else { - logger.debug("Received configuration value: {} for old key: {}. Setting the new property {} to {}", - value, name, newName, value); + protected abstract Configuration createConfiguration(String oldPid) throws IOException; + + /** + * Update a configuration + */ + protected void updateProps(final Configuration sourceConfig, ConfigurationAdmin configurationAdmin) { + final Dictionary<String, Object> sourceProps = sourceConfig.getProperties(); + final Dictionary<String, Object> targetProps = new Hashtable<>(); + for(final String name : Collections.list(sourceProps.keys())) { + targetProps.put(this.propsToReplace.getOrDefault(name, name), sourceProps.get(name)); } - targetProps.put(newName, value); - } - if (!targetProps.isEmpty()) { try { - final Configuration cfg = this.createConfiguration(configurationAdmin, sourceConfig.getPid()); + final Configuration cfg = this.createConfiguration(sourceConfig.getPid()); if (cfg==null) return; logger.info("Creating new configuration with PID {} for source PID: {}", cfg.getPid(), sourceConfig.getPid()); cfg.update(targetProps); @@ -88,35 +132,26 @@ public abstract class ConfigurationUpdater { } } - /** - * Encode the value for the ldap filter: \, *, (, and ) should be escaped. - */ - private static String encode(final String value) { - return value.replace("\\", "\\\\") - .replace("*", "\\*") - .replace("(", "\\(") - .replace(")", "\\)"); - } - - private static class PidConfigurationUpdater extends ConfigurationUpdater { + private class PidConfigurationUpdater extends Updater { public PidConfigurationUpdater(final String oldPid, final String newPid, final Map<String, String> propsToReplace) { super(oldPid, newPid, propsToReplace); } @Override - public void updateProps(final ConfigurationAdmin configurationAdmin, final ConfigurationEvent event) { + protected void updateProps(final ConfigurationEvent event) { if (this.oldPid.equals(event.getPid())) { - this.updateProps(configurationAdmin); + this.updateProps(); } } - protected Configuration createConfiguration(final ConfigurationAdmin configurationAdmin, final String oldPid) throws IOException { + @Override + protected Configuration createConfiguration(final String oldPid) throws IOException { return configurationAdmin.getConfiguration(newPid, null); } @Override - protected void updateProps(final ConfigurationAdmin configurationAdmin) { + protected void updateProps() { final String filter = String.format("(%s=%s)", Constants.SERVICE_PID, encode(this.oldPid)); try { final Configuration[] configs = configurationAdmin.listConfigurations(filter); @@ -124,27 +159,27 @@ public abstract class ConfigurationUpdater { this.updateProps(configs[0], configurationAdmin); } } catch (final IOException | InvalidSyntaxException e) { - this.logger.error("Failed to retrieve configuration for PID: {}. Configuration is not updated to PID {}.", + logger.error("Failed to retrieve configuration for PID: {}. Configuration is not updated to PID {}.", oldPid, newPid, e); } } } - private static class FactoryPidConfigurationUpdater extends ConfigurationUpdater { + private class FactoryPidConfigurationUpdater extends Updater { public FactoryPidConfigurationUpdater(final String oldPid, final String newPid, final Map<String, String> propsToReplace) { super(oldPid, newPid, propsToReplace); } @Override - public void updateProps(final ConfigurationAdmin configurationAdmin, final ConfigurationEvent event) { + protected void updateProps(final ConfigurationEvent event) { if (this.oldPid.equals(event.getFactoryPid())) { - this.updateProps(configurationAdmin); + this.updateProps(); } } @Override - protected void updateProps(final ConfigurationAdmin configurationAdmin) { + protected void updateProps() { final String filter = String.format("(%s=%s)", ConfigurationAdmin.SERVICE_FACTORYPID, encode(this.oldPid)); try { final Configuration[] configs = configurationAdmin.listConfigurations(filter); @@ -158,7 +193,8 @@ public abstract class ConfigurationUpdater { } } - protected Configuration createConfiguration(final ConfigurationAdmin configurationAdmin, final String oldFullPid) throws IOException { + @Override + protected Configuration createConfiguration(final String oldFullPid) throws IOException { final String prefix = this.oldPid.concat("~"); if (oldFullPid.startsWith(prefix)) { return configurationAdmin.getFactoryConfiguration(newPid, oldFullPid.substring(prefix.length()), null); diff --git a/src/main/java/org/apache/sling/jcr/base/internal/ConfigurationUpdaterEventListener.java b/src/main/java/org/apache/sling/jcr/base/internal/ConfigurationUpdaterEventListener.java deleted file mode 100644 index c0b4387..0000000 --- a/src/main/java/org/apache/sling/jcr/base/internal/ConfigurationUpdaterEventListener.java +++ /dev/null @@ -1,73 +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.jcr.base.internal; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.osgi.service.cm.ConfigurationAdmin; -import org.osgi.service.cm.ConfigurationEvent; -import org.osgi.service.cm.ConfigurationListener; -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Reference; - -@Component(service = ConfigurationListener.class) -public class ConfigurationUpdaterEventListener implements ConfigurationListener { - - static final String LOGIN_ADMIN_WHITELIST_PID = "org.apache.sling.jcr.base.internal.LoginAdminWhitelist"; - static final String LOGIN_ADMIN_ALLOWLIST_PID = "org.apache.sling.jcr.base.internal.LoginAdminAllowList"; - private static final Map<String, String> LOGIN_ADMIN_WHITELIST_PROPS_TO_REPLACE = new HashMap<>(); - static { - LOGIN_ADMIN_WHITELIST_PROPS_TO_REPLACE.put("whitelist.bypass", "allowlist.bypass"); - LOGIN_ADMIN_WHITELIST_PROPS_TO_REPLACE.put("whitelist.bundles.regexp", "allowlist.bundles.regexp"); - } - private static final String ALLOWLIST_FRAGMENT_PID = "org.apache.sling.jcr.base.internal.LoginAdminAllowList.fragment"; - private static final String WHITELIST_FRAGMENT_PID = "org.apache.sling.jcr.base.internal.LoginAdminWhitelist.fragment"; - private static final Map<String, String> FRAGMENT_PROPS_TO_REPLACE = new HashMap<>(); - - static { - FRAGMENT_PROPS_TO_REPLACE.put("whitelist.name", "allowlist.name"); - FRAGMENT_PROPS_TO_REPLACE.put("whitelist.bundles", "allowlist.bundles"); - } - - private final List<ConfigurationUpdater> configurationUpdaterList; - - private final ConfigurationAdmin configurationAdmin; - - @Activate - public ConfigurationUpdaterEventListener(@Reference ConfigurationAdmin configurationAdmin) { - this.configurationAdmin = configurationAdmin; - configurationUpdaterList = new ArrayList<>(); - configurationUpdaterList.add(ConfigurationUpdater.forPid(LOGIN_ADMIN_WHITELIST_PID, LOGIN_ADMIN_ALLOWLIST_PID, LOGIN_ADMIN_WHITELIST_PROPS_TO_REPLACE)); - configurationUpdaterList.add(ConfigurationUpdater.forFactoryPid(WHITELIST_FRAGMENT_PID, ALLOWLIST_FRAGMENT_PID, FRAGMENT_PROPS_TO_REPLACE)); - - configurationUpdaterList.forEach(configurationUpdater -> configurationUpdater.updateProps(this.configurationAdmin)); - } - - @Override - public void configurationEvent(final ConfigurationEvent event) { - if ( event.getType() == ConfigurationEvent.CM_UPDATED ) { - configurationUpdaterList.forEach(configurationUpdater -> { - configurationUpdater.updateProps(configurationAdmin, event); - }); - } - } -} diff --git a/src/main/java/org/apache/sling/jcr/base/internal/mount/ProxyJackrabbitSession.java b/src/main/java/org/apache/sling/jcr/base/internal/mount/ProxyJackrabbitSession.java index 97ee586..ba529e7 100644 --- a/src/main/java/org/apache/sling/jcr/base/internal/mount/ProxyJackrabbitSession.java +++ b/src/main/java/org/apache/sling/jcr/base/internal/mount/ProxyJackrabbitSession.java @@ -18,7 +18,6 @@ */ package org.apache.sling.jcr.base.internal.mount; -import java.util.HashSet; import java.util.Set; import javax.jcr.AccessDeniedException; import javax.jcr.Item; diff --git a/src/test/java/org/apache/sling/jcr/base/RepositoryInitializersTest.java b/src/test/java/org/apache/sling/jcr/base/RepositoryInitializersTest.java index bb8bdc5..0163b1d 100644 --- a/src/test/java/org/apache/sling/jcr/base/RepositoryInitializersTest.java +++ b/src/test/java/org/apache/sling/jcr/base/RepositoryInitializersTest.java @@ -83,7 +83,7 @@ public class RepositoryInitializersTest { private void registerInitializer(String id, int serviceRanking) { final SlingRepositoryInitializer init = new TestInitializer(id); final Hashtable<String, Object> props = new Hashtable<String, Object>(); - props.put(Constants.SERVICE_RANKING, new Integer(serviceRanking)); + props.put(Constants.SERVICE_RANKING, serviceRanking); context.bundleContext().registerService(SlingRepositoryInitializer.class.getName(), init, props); } diff --git a/src/test/java/org/apache/sling/jcr/base/internal/ConfigurationUpdaterTest.java b/src/test/java/org/apache/sling/jcr/base/internal/ConfigurationUpdaterTest.java index e619e9d..7b78759 100644 --- a/src/test/java/org/apache/sling/jcr/base/internal/ConfigurationUpdaterTest.java +++ b/src/test/java/org/apache/sling/jcr/base/internal/ConfigurationUpdaterTest.java @@ -56,7 +56,7 @@ public class ConfigurationUpdaterTest { expectedProperties.put("allowlist.bundles.regexp", "whitelistBundleValue"); expectedProperties.put("prop", "value"); - new ConfigurationUpdaterEventListener(mockConfigurationAdmin); + new ConfigurationUpdater(mockConfigurationAdmin); verify(mockConfigurationAdmin).listConfigurations("(service.pid=org.apache.sling.jcr.base.internal.LoginAdminWhitelist)"); verify(mockConfigurationAdmin).getConfiguration("org.apache.sling.jcr.base.internal.LoginAdminAllowList", null); @@ -86,7 +86,7 @@ public class ConfigurationUpdaterTest { expectedProperties.put("allowlist.bundles", "whitelistBundleValue"); expectedProperties.put("prop", "value"); - new ConfigurationUpdaterEventListener(mockConfigurationAdmin); + new ConfigurationUpdater(mockConfigurationAdmin); verify(mockConfigurationAdmin).listConfigurations("(service.factoryPid=org.apache.sling.jcr.base.internal.LoginAdminWhitelist.fragment)"); verify(mockConfigurationAdmin).getFactoryConfiguration("org.apache.sling.jcr.base.internal.LoginAdminAllowList.fragment", "foo", null); @@ -116,7 +116,7 @@ public class ConfigurationUpdaterTest { expectedProperties.put("allowlist.bundles", "whitelistBundleValue"); expectedProperties.put("prop", "value"); - new ConfigurationUpdaterEventListener(mockConfigurationAdmin); + new ConfigurationUpdater(mockConfigurationAdmin); verify(mockConfigurationAdmin).listConfigurations("(service.factoryPid=org.apache.sling.jcr.base.internal.LoginAdminWhitelist.fragment)"); verify(mockConfigurationAdmin).createFactoryConfiguration("org.apache.sling.jcr.base.internal.LoginAdminAllowList.fragment", null);