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/09/03 18:02:36 UTC

svn commit: r1701058 - in /aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core: capabilityset/ internal/

Author: jwross
Date: Thu Sep  3 16:02:36 2015
New Revision: 1701058

URL: http://svn.apache.org/r1701058
Log:
Cache the region context bundle and use RegionDigraph.getRegion(Bundle), which has constant time performance, when getting the subsystem region. Using RegionDigraph.getRegion(String) has, at best, linear time performance.

Local repository now uses capability set.

Use existing SubsystemResource content sets rather than the content header in order to identify content.

Content repository now uses capability set.

Remove compiler warnings from bundle event hook.

FileResource should return all capabilities when the namespace is null.

On the content repository, the findProviders method must return a map having each provided requirement as a key and an empty collection of capabilities if none were found for that requirement.

Modified:
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/CapabilitySetRepository.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BasicSubsystem.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleEventHook.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ContentRepository.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/FileResource.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LocalRepository.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RegionContextBundleHelper.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java
    aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/CapabilitySetRepository.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/CapabilitySetRepository.java?rev=1701058&r1=1701057&r2=1701058&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/CapabilitySetRepository.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/capabilityset/CapabilitySetRepository.java Thu Sep  3 16:02:36 2015
@@ -104,6 +104,9 @@ public class CapabilitySetRepository imp
                                 || HostNamespace.HOST_NAMESPACE.equals(namespace));
                 result.put(requirement, capabilities);
             }
+            else {
+                result.put(requirement, Collections.<Capability>emptyList());
+            }
         }
         return result;
     }

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BasicSubsystem.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BasicSubsystem.java?rev=1701058&r1=1701057&r2=1701058&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BasicSubsystem.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BasicSubsystem.java Thu Sep  3 16:02:36 2015
@@ -43,6 +43,8 @@ import org.apache.aries.subsystem.core.a
 import org.apache.aries.util.filesystem.FileSystem;
 import org.apache.aries.util.filesystem.IDirectory;
 import org.apache.aries.util.io.IOUtils;
+import org.eclipse.equinox.region.Region;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.InvalidSyntaxException;
@@ -70,7 +72,9 @@ public class BasicSubsystem implements R
 			+ ROOT_SYMBOLIC_NAME + '&' + SubsystemConstants.SUBSYSTEM_VERSION
 			+ '=' + ROOT_VERSION;
 	
-	private DeploymentManifest deploymentManifest;
+	private volatile Bundle regionContextBundle;
+	
+	private DeploymentManifest deploymentManifest;    
 	private SubsystemResource resource;
 	private SubsystemManifest subsystemManifest;
 	
@@ -356,8 +360,15 @@ public class BasicSubsystem implements R
 		}
 	}
 	
-	org.eclipse.equinox.region.Region getRegion() {
-		return Activator.getInstance().getRegionDigraph().getRegion(getRegionName());
+	Region getRegion() {
+	    Bundle bundle = regionContextBundle; // volatile variable
+	    if (bundle == null) {
+	        // At best, RegionDigraph.getRegion(String) is linear time.
+	        // Continue to call this when necessary, however, as a fail safe.
+	        return Activator.getInstance().getRegionDigraph().getRegion(getRegionName());
+	    }
+	    // RegionDigraph.getRegion(Bundle) is constant time.
+	    return Activator.getInstance().getRegionDigraph().getRegion(bundle);
 	}
 	
 	String getRegionName() {
@@ -568,6 +579,10 @@ public class BasicSubsystem implements R
 		}
 	}
 	
+	void setRegionContextBundle(Bundle value) {
+	    regionContextBundle = value; // volatile variable
+	}
+	
 	synchronized void setSubsystemManifest(SubsystemManifest value) throws URISyntaxException, IOException {
 		File file = new File(getDirectory(), "OSGI-INF");
 		if (!file.exists())

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleEventHook.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleEventHook.java?rev=1701058&r1=1701057&r2=1701058&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleEventHook.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/BundleEventHook.java Thu Sep  3 16:02:36 2015
@@ -15,7 +15,6 @@ package org.apache.aries.subsystem.core.
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ContentRepository.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ContentRepository.java?rev=1701058&r1=1701057&r2=1701058&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ContentRepository.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ContentRepository.java Thu Sep  3 16:02:36 2015
@@ -13,66 +13,41 @@
  */
 package org.apache.aries.subsystem.core.internal;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
 
+import org.apache.aries.subsystem.core.capabilityset.CapabilitySetRepository;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
 
 public class ContentRepository implements org.apache.aries.subsystem.core.repository.Repository {
-	private static void findContent(Requirement requirement, Collection<Capability> capabilities, Collection<Resource> resources) {
-		for (Resource resource : resources)
-			for (Capability capability : resource.getCapabilities(requirement.getNamespace()))
-				if (ResourceHelper.matches(requirement, capability))
-					capabilities.add(capability);
-	}
-	
-	private final Collection<Resource> installableContent;
-	private final Collection<Resource> sharedContent;
+	private final CapabilitySetRepository installableContent;
+	private final CapabilitySetRepository sharedContent;
 	
 	public ContentRepository(Collection<Resource> installableContent, Collection<Resource> sharedContent) {
-		this.installableContent = new HashSet<Resource>(installableContent);
-		this.sharedContent = new HashSet<Resource>(sharedContent);
+	    this.installableContent = new CapabilitySetRepository();
+	    for (Resource resource : installableContent) {
+	        this.installableContent.addResource(resource);
+	    }
+	    this.sharedContent = new CapabilitySetRepository();
+	    for (Resource resource : sharedContent) {
+	        this.sharedContent.addResource(resource);
+	    }
 	}
 	
 	@Override
 	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));
-		return result;
-	}
-
-	public Collection<Capability> findProviders(Requirement requirement) {
-		ArrayList<Capability> result = new ArrayList<Capability>();
-		if (findSharedContent(requirement, result))
-			return result;
-		findInstallableContent(requirement, result);
-		result.trimToSize();
-		return result;
-	}
-	
-	public Collection<Resource> getInstallableContent() {
-		return Collections.unmodifiableCollection(installableContent);
-	}
-	
-	public Collection<Resource> getSharedContent() {
-		return Collections.unmodifiableCollection(sharedContent);
-	}
-	
-	private void findInstallableContent(Requirement requirement, Collection<Capability> capabilities) {
-		findContent(requirement, capabilities, installableContent);
-	}
-	
-	private boolean findSharedContent(Requirement requirement, Collection<Capability> capabilities) {
-		int size = capabilities.size();
-		findContent(requirement, capabilities, sharedContent);
-		return size < capabilities.size();
+	    Map<Requirement, Collection<Capability>> result = sharedContent.findProviders(requirements);
+	    for (Map.Entry<Requirement, Collection<Capability>> entry : result.entrySet()) {
+	        if (entry.getValue().isEmpty()) {
+	            entry.setValue(
+	                    installableContent.findProviders(
+	                            Collections.singletonList(entry.getKey())).get(entry.getKey()));
+	        }
+	    }
+	    return result;
 	}
 }

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/FileResource.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/FileResource.java?rev=1701058&r1=1701057&r2=1701058&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/FileResource.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/FileResource.java Thu Sep  3 16:02:36 2015
@@ -29,7 +29,7 @@ import org.osgi.service.repository.Repos
 
 public class FileResource implements Resource, RepositoryContent {
     private final IFile file;
-    private volatile Map<String, List<Capability>> capabilities;
+    private volatile Map<String, List<Capability>> capabilities       ;
 
     public FileResource(IFile file) {
         this.file = file;
@@ -37,9 +37,21 @@ public class FileResource implements Res
 
     @Override
     public List<Capability> getCapabilities(String namespace) {
-        List<Capability> caps = capabilities.get(namespace);
+        Map<String, List<Capability>> namespace2capabilities = capabilities;
+        if (namespace2capabilities == null) {
+            return Collections.emptyList();
+        }
+        List<Capability> caps;
+        if (namespace == null) {
+            caps = new ArrayList<Capability>();
+            for (List<Capability> l : capabilities.values()) {
+                caps.addAll(l);
+            }
+            return Collections.unmodifiableList(caps);
+        }
+        caps = namespace2capabilities.get(namespace);
         if (caps != null)
-            return caps;
+            return Collections.unmodifiableList(caps);
         else
             return Collections.emptyList();
     }

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LocalRepository.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LocalRepository.java?rev=1701058&r1=1701057&r2=1701058&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LocalRepository.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/LocalRepository.java Thu Sep  3 16:02:36 2015
@@ -13,38 +13,27 @@
  */
 package org.apache.aries.subsystem.core.internal;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.aries.subsystem.core.capabilityset.CapabilitySetRepository;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
 
 public class LocalRepository implements org.apache.aries.subsystem.core.repository.Repository {
-	private final Collection<Resource> resources;
+	private final CapabilitySetRepository repository;
 	
 	public LocalRepository(Collection<Resource> resources) {
-		this.resources = resources;
-	}
-	
-	public Collection<Capability> findProviders(Requirement requirement) {
-		ArrayList<Capability> result = new ArrayList<Capability>();
-		for (Resource resource : resources)
-			for (Capability capability : resource.getCapabilities(requirement.getNamespace()))
-				if (ResourceHelper.matches(requirement, capability))
-					result.add(capability);
-		result.trimToSize();
-		return result;
+		repository = new CapabilitySetRepository();
+		for (Resource resource : resources) {
+		    repository.addResource(resource);
+		}
 	}
 	
 	@Override
 	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));
-		return result;
+		return repository.findProviders(requirements);
 	}
 }

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RegionContextBundleHelper.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RegionContextBundleHelper.java?rev=1701058&r1=1701057&r2=1701058&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RegionContextBundleHelper.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/RegionContextBundleHelper.java Thu Sep  3 16:02:36 2015
@@ -46,6 +46,7 @@ public class RegionContextBundleHelper {
 		ResourceInstaller.newInstance(coordination, b.adapt(BundleRevision.class), subsystem).install();
 		// The region context bundle must be started persistently.
 		b.start();
+		subsystem.setRegionContextBundle(b);
 	}
 	
 	public static void uninstallRegionContextBundle(BasicSubsystem subsystem) {
@@ -62,6 +63,7 @@ public class RegionContextBundleHelper {
 			// TODO Should we really eat this? At least log it?
 		}
 		ResourceUninstaller.newInstance(revision, subsystem).uninstall();
+		subsystem.setRegionContextBundle(null);
 	}
 	
 	private static Manifest createManifest(String symbolicName) {

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java?rev=1701058&r1=1701057&r2=1701058&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java Thu Sep  3 16:02:36 2015
@@ -226,7 +226,7 @@ public class ResolveContext extends org.
 	}
 
 	private boolean isContent(Resource resource) {
-		return this.resource.getSubsystemManifest().getSubsystemContentHeader().contains(resource);
+		return this.resource.isContent(resource);
 	}
 
 	private boolean isInstallable(Resource resource) {

Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java?rev=1701058&r1=1701057&r2=1701058&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResource.java Thu Sep  3 16:02:36 2015
@@ -551,6 +551,10 @@ public class SubsystemResource implement
 		return SubsystemConstants.SUBSYSTEM_TYPE_COMPOSITE.equals(type);
 	}
 	
+	boolean isContent(Resource resource) {
+	   return installableContent.contains(resource) || sharedContent.contains(resource); 
+	}
+	
 	private boolean isInstallable(Resource resource) {
 		return !isShared(resource);
 	}