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 2012/04/25 22:34:31 UTC
svn commit: r1330543 - in
/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal:
SubsystemResolveContext.java SystemRepository.java
Author: jwross
Date: Wed Apr 25 20:34:30 2012
New Revision: 1330543
URL: http://svn.apache.org/viewvc?rev=1330543&view=rev
Log:
ARIES-825: Factored out functionality from resolve context into new system repository.
Added:
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/SubsystemResolveContext.java
Modified: aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResolveContext.java
URL: http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResolveContext.java?rev=1330543&r1=1330542&r2=1330543&view=diff
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResolveContext.java (original)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SubsystemResolveContext.java Wed Apr 25 20:34:30 2012
@@ -28,7 +28,6 @@ import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
-import org.apache.aries.subsystem.core.ResourceHelper;
import org.apache.aries.subsystem.core.archive.PreferredProviderHeader;
import org.eclipse.equinox.region.Region;
import org.osgi.framework.Bundle;
@@ -142,9 +141,8 @@ public class SubsystemResolveContext ext
// Unscoped subsystems share content resources as well as transitive
// dependencies. Scoped subsystems share transitive dependencies as
// long as they're in the same region.
- if (subsystem.isFeature() || identity.isTransitiveDependency()) {
- findConstituentProviders(requirement, capabilities);
- }
+ if (subsystem.isFeature() || identity.isTransitiveDependency())
+ capabilities.addAll(new SystemRepository(subsystem).findProviders(requirement));
findArchiveProviders(capabilities, identity);
findRepositoryServiceProviders(capabilities, identity);
}
@@ -154,7 +152,7 @@ public class SubsystemResolveContext ext
findArchiveProviders(capabilities, requirement);
findRepositoryServiceProviders(capabilities, requirement);
// TODO The following is a quick fix to ensure this environment always returns capabilities provided by the system bundle. Needs some more thought.
- findConstituentProviders(requirement, capabilities);
+ capabilities.addAll(new SystemRepository(subsystem).findProviders(requirement));
}
logger.debug(LOG_EXIT, "findProviders", capabilities);
return new ArrayList<Capability>(capabilities);
@@ -222,67 +220,6 @@ public class SubsystemResolveContext ext
return true;
}
- private void findConstituentProviders(Requirement requirement, Collection<Capability> capabilities) {
- if (logger.isDebugEnabled())
- logger.debug(LOG_ENTRY, "findConstituentProviders", new Object[]{requirement, capabilities});
- AriesSubsystem subsystem = this.subsystem;
- if (requirement instanceof OsgiIdentityRequirement) {
- // We only want to return providers from the same region as the subsystem.
- // Find the one and only one scoped subsystem in the region, which
- // will be either the current subsystem or one of its parents.
- do {
- subsystem = (AriesSubsystem)subsystem.getParents().iterator().next();
- } while (!(subsystem.isApplication() || subsystem.isComposite()));
- // Now search the one and only one scoped parent within the same region
- // and all children that are also in the same region for a provider.
- findConstituentProviders(subsystem, requirement, capabilities);
- return;
- }
- logger.debug("Navigating up the parent hierarchy...");
- while (!subsystem.getParents().isEmpty()) {
- subsystem = (AriesSubsystem)subsystem.getParents().iterator().next();
- logger.debug("Next parent is: {}", subsystem);
- }
- findConstituentProviders(subsystem, requirement, capabilities);
- logger.debug(LOG_EXIT, "findConstituentProviders");
- }
-
- private void findConstituentProviders(AriesSubsystem subsystem, Requirement requirement, Collection<Capability> capabilities) {
- if (logger.isDebugEnabled())
- logger.debug(LOG_ENTRY, "findConstituentProviders", new Object[]{subsystem, requirement, capabilities});
- // Because constituent providers are already provisioned resources, the
- // sharing policy check must be between the requiring subsystem and the
- // offering subsystem, not the subsystem the resource would be
- // provisioned to as in the other methods.
- SharingPolicyValidator validator = new SharingPolicyValidator(subsystem.getRegion(), this.subsystem.getRegion());
- for (Resource resource : subsystem.getConstituents()) {
- logger.debug("Evaluating resource: {}", resource);
- for (Capability capability : resource.getCapabilities(requirement.getNamespace())) {
- logger.debug("Evaluating capability: {}", capability);
- // Filter out capabilities offered by dependencies that will be
- // or already are provisioned to an out of scope region. This
- // filtering does not apply to osgi.identity requirements within
- // the same region.
- if (!(requirement instanceof OsgiIdentityRequirement) && !validator.isValid(capability))
- continue;
- if (ResourceHelper.matches(requirement, capability)) {
- logger.debug("Adding capability: {}", capability);
- capabilities.add(capability);
- }
- }
- }
- for (Subsystem child : subsystem.getChildren()) {
- logger.debug("Evaluating child subsystem: {}", child);
- // If the requirement is osgi.identity and the child is not in the
- // same region as the parent, we do not want to search it.
- if (requirement instanceof OsgiIdentityRequirement
- && !subsystem.getRegion().equals(((AriesSubsystem)child).getRegion()))
- continue;
- findConstituentProviders((AriesSubsystem)child, requirement, capabilities);
- }
- logger.debug(LOG_EXIT, "findConstituentProviders");
- }
-
private void findArchiveProviders(Collection<Capability> capabilities, Requirement requirement) {
if (logger.isDebugEnabled())
logger.debug(LOG_ENTRY, "findArchiveProviders", new Object[]{capabilities, requirement});
Added: 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=1330543&view=auto
==============================================================================
--- aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SystemRepository.java (added)
+++ aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/SystemRepository.java Wed Apr 25 20:34:30 2012
@@ -0,0 +1,83 @@
+package org.apache.aries.subsystem.core.internal;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.apache.aries.subsystem.core.ResourceHelper;
+import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
+import org.osgi.resource.Resource;
+import org.osgi.service.repository.Repository;
+import org.osgi.service.subsystem.Subsystem;
+
+public class SystemRepository implements Repository {
+ private final AriesSubsystem subsystem;
+
+ public SystemRepository(AriesSubsystem subsystem) {
+ this.subsystem = subsystem;
+ }
+
+ @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) {
+ Collection<Capability> result = new HashSet<Capability>();
+ findProviders(requirement, result);
+ return result;
+ }
+
+ private void findProviders(Requirement requirement, Collection<Capability> capabilities) {
+ AriesSubsystem subsystem = this.subsystem;
+ if (requirement instanceof OsgiIdentityRequirement) {
+ // We only want to return providers from the same region as the subsystem.
+ // Find the one and only one scoped subsystem in the region, which
+ // will be either the current subsystem or one of its parents.
+ do {
+ subsystem = (AriesSubsystem)subsystem.getParents().iterator().next();
+ } while (!(subsystem.isApplication() || subsystem.isComposite()));
+ // Now search the one and only one scoped parent within the same region
+ // and all children that are also in the same region for a provider.
+ findProviders(subsystem, requirement, capabilities);
+ return;
+ }
+ while (!subsystem.getParents().isEmpty())
+ subsystem = (AriesSubsystem)subsystem.getParents().iterator().next();
+ findProviders(subsystem, requirement, capabilities);
+ }
+
+ private void findProviders(AriesSubsystem subsystem, Requirement requirement, Collection<Capability> capabilities) {
+ // Because constituent providers are already provisioned resources, the
+ // sharing policy check must be between the requiring subsystem and the
+ // offering subsystem, not the subsystem the resource would be
+ // provisioned to as in the other methods.
+ SharingPolicyValidator validator = new SharingPolicyValidator(subsystem.getRegion(), this.subsystem.getRegion());
+ for (Resource resource : subsystem.getConstituents()) {
+ for (Capability capability : resource.getCapabilities(requirement.getNamespace())) {
+ // Filter out capabilities offered by dependencies that will be
+ // or already are provisioned to an out of scope region. This
+ // filtering does not apply to osgi.identity requirements within
+ // the same region.
+ if (!(requirement instanceof OsgiIdentityRequirement) && !validator.isValid(capability))
+ continue;
+ if (ResourceHelper.matches(requirement, capability))
+ capabilities.add(capability);
+ }
+ }
+ for (Subsystem child : subsystem.getChildren()) {
+ // If the requirement is osgi.identity and the child is not in the
+ // same region as the parent, we do not want to search it.
+ if (requirement instanceof OsgiIdentityRequirement
+ && !subsystem.getRegion().equals(((AriesSubsystem)child).getRegion()))
+ continue;
+ findProviders((AriesSubsystem)child, requirement, capabilities);
+ }
+ }
+}