You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by jw...@apache.org on 2015/08/28 18:31:05 UTC

svn commit: r1698366 - /aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SystemRepository.java

Author: jwross
Date: Fri Aug 28 16:31:04 2015
New Revision: 1698366

URL: http://svn.apache.org/r1698366
Log:
ARIES-1359 Performance improvement on the findProviders method in the SystemRepository class

A narrow performance improvement targeted towards the system repository when there are many features with shared bundles. Resources whose capabiliies have already been examined are tracked and will not be examined again for the same requirement.

Modified:
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SystemRepository.java

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SystemRepository.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SystemRepository.java?rev=1698366&r1=1698365&r2=1698366&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SystemRepository.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SystemRepository.java Fri Aug 28 16:31:04 2015
@@ -17,6 +17,7 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.osgi.resource.Capability;
 import org.osgi.resource.Requirement;
@@ -30,8 +31,7 @@ public class SystemRepository implements
 	}
 
 	@Override
-	public Map<Requirement, Collection<Capability>> findProviders(
-			Collection<? extends Requirement> requirements) {
+	public Map<Requirement, Collection<Capability>> findProviders(Collection<? extends Requirement> requirements) {
 		Map<Requirement, Collection<Capability>> result = new HashMap<Requirement, Collection<Capability>>();
 		for (Requirement requirement : requirements)
 			result.put(requirement, findProviders(requirement));
@@ -40,24 +40,39 @@ public class SystemRepository implements
 	
 	public Collection<Capability> findProviders(Requirement requirement) {
 		Collection<Capability> result = new HashSet<Capability>();
-		findProviders(requirement, result, root);
+		findProviders(requirement, result, root, new HashSet<Resource>());
 		return result;
 	}
 	
-	private void findProviders(Requirement requirement, Collection<Capability> capabilities, BasicSubsystem subsystem) {
+	private void findProviders(
+	        Requirement requirement, 
+	        Collection<Capability> capabilities, 
+	        BasicSubsystem subsystem,
+	        Set<Resource> processedResources) {
 		// Need to examine capabilities offered by the subsystem itself.
 		// For example, the requirement might be an osgi.identity
 		// requirement for a preferred provider that's a subsystem.
-		for (Capability capability : subsystem.getCapabilities(requirement.getNamespace()))
-			if (ResourceHelper.matches(requirement, capability))
+		for (Capability capability : subsystem.getCapabilities(requirement.getNamespace())) {
+			if (ResourceHelper.matches(requirement, capability)) {
 				capabilities.add(capability);
+			}
+		}
 		for (Resource constituent : subsystem.getConstituents()) {
-			if (constituent instanceof BasicSubsystem)
-				findProviders(requirement, capabilities, (BasicSubsystem)constituent);
-			else
-				for (Capability capability : constituent.getCapabilities(requirement.getNamespace()))
-					if (ResourceHelper.matches(requirement, capability))
+		    if (processedResources.contains(constituent)) {
+		        continue;
+		    }
+		    processedResources.add(constituent);
+			if (constituent instanceof BasicSubsystem) {
+				findProviders(requirement, capabilities, (BasicSubsystem)constituent, processedResources);
+			}
+			else {
+				for (Capability capability : constituent.getCapabilities(requirement.getNamespace())) {
+					if (ResourceHelper.matches(requirement, capability)) {
 						capabilities.add(capability);
+					}
+				}
+				processedResources.add(constituent);
+			}
 		}
 	}
 }