[KARAF-3576] Optimize GuardProxyCatalog#getServiceInvocationRoles
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/b728335e Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/b728335e Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/b728335e Branch: refs/heads/karaf-2.x Commit: b728335e0ec79d16904194d112ad9cb8146578fa Parents: 93f2c46 Author: Guillaume Nodet <[email protected]> Authored: Sat Feb 28 13:59:58 2015 +0100 Committer: Guillaume Nodet <[email protected]> Committed: Mon Mar 2 09:12:51 2015 +0100 ---------------------------------------------------------------------- .../service/guard/impl/GuardProxyCatalog.java | 30 +++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/b728335e/service/guard/src/main/java/org/apache/karaf/service/guard/impl/GuardProxyCatalog.java ---------------------------------------------------------------------- diff --git a/service/guard/src/main/java/org/apache/karaf/service/guard/impl/GuardProxyCatalog.java b/service/guard/src/main/java/org/apache/karaf/service/guard/impl/GuardProxyCatalog.java index 92e0ec6..396a768 100644 --- a/service/guard/src/main/java/org/apache/karaf/service/guard/impl/GuardProxyCatalog.java +++ b/service/guard/src/main/java/org/apache/karaf/service/guard/impl/GuardProxyCatalog.java @@ -22,16 +22,7 @@ import java.lang.reflect.Modifier; import java.security.AccessControlContext; import java.security.AccessController; import java.security.Principal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Dictionary; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.TreeMap; +import java.util.*; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -77,6 +68,7 @@ public class GuardProxyCatalog implements ServiceListener { private static final String ROLE_WILDCARD = "*"; private final BundleContext myBundleContext; + private final Map<String, Filter> filters = new ConcurrentHashMap<String, Filter>(); final ServiceTracker<ConfigurationAdmin, ConfigurationAdmin> configAdminTracker; final ServiceTracker<ProxyManager, ProxyManager> proxyManagerTracker; @@ -304,12 +296,13 @@ public class GuardProxyCatalog implements ServiceListener { // This can probably be optimized. Maybe we can cache the config object relevant instead of // walking through all of the ones that have 'service.guard'. for (Configuration config : getServiceGuardConfigs()) { - Object guardFilter = config.getProperties().get(SERVICE_GUARD_KEY); + Dictionary<String, Object> properties = config.getProperties(); + Object guardFilter = properties.get(SERVICE_GUARD_KEY); if (guardFilter instanceof String) { - Filter filter = myBundleContext.createFilter((String) guardFilter); + Filter filter = getFilter((String) guardFilter); if (filter.match(serviceReference)) { definitionFound = true; - for (Enumeration<String> e = config.getProperties().keys(); e.hasMoreElements(); ) { + for (Enumeration<String> e = properties.keys(); e.hasMoreElements(); ) { String key = e.nextElement(); String bareKey = key; int idx = bareKey.indexOf('('); @@ -327,7 +320,7 @@ public class GuardProxyCatalog implements ServiceListener { if (!isValidMethodName(bareKey)) { continue; } - Object value = config.getProperties().get(key); + Object value = properties.get(key); if (value instanceof String) { allRoles.addAll(ACLConfigurationParser.parseRoles((String) value)); } @@ -338,6 +331,15 @@ public class GuardProxyCatalog implements ServiceListener { return definitionFound ? allRoles : null; } + private Filter getFilter(String string) throws InvalidSyntaxException { + Filter filter = filters.get(string); + if (filter == null) { + filter = myBundleContext.createFilter(string); + filters.put(string, filter); + } + return filter; + } + // Ensures that it never returns null private Configuration[] getServiceGuardConfigs() throws IOException, InvalidSyntaxException { ConfigurationAdmin ca = null;
