Author: jwross
Date: Mon Feb  1 20:27:09 2016
New Revision: 1727999

URL: http://svn.apache.org/viewvc?rev=1727999&view=rev
Log:
[ARIES-1383] Provide option to disable the provisioning of dependencies at 
install time.

Fix CT failures. All three were related to not honoring the specified start 
order of content resources. The implemented start order rules are as follows.

(1) Dependencies are started first (-1).
(2) Followed by content with no specified start order (0).
(3) Followed by content whose start order was specified (>= 1).

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

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java?rev=1727999&r1=1727998&r2=1727999&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartAction.java
 Mon Feb  1 20:27:09 2016
@@ -141,35 +141,57 @@ public class StartAction extends Abstrac
            return coordination;
        }
        
-       private static LinkedHashSet<BasicSubsystem> 
computeAffectedSubsystems(BasicSubsystem target) {
-               LinkedHashSet<BasicSubsystem> result = new 
LinkedHashSet<BasicSubsystem>();
-               Subsystems subsystems = Activator.getInstance().getSubsystems();
-               for (Resource dep : 
subsystems.getResourcesReferencedBy(target)) {
-                       if (dep instanceof BasicSubsystem 
-                                       && 
!subsystems.getChildren(target).contains(dep)) {
-                               result.add((BasicSubsystem)dep);
-                       }
-                       else if (dep instanceof BundleRevision) {
-                               BundleConstituent constituent = new 
BundleConstituent(null, (BundleRevision)dep);
-                               if 
(!target.getConstituents().contains(constituent)) {
-                                       for (BasicSubsystem constituentOf : 
subsystems.getSubsystemsByConstituent(
-                                                       new 
BundleConstituent(null, (BundleRevision)dep))) {
-                                               result.add(constituentOf);
+       private static class AffectedResources {
+               private final List<Resource> resources;
+               private final Collection<BasicSubsystem> subsystemResources;
+               
+               AffectedResources(BasicSubsystem target) {
+                       LinkedHashSet<Resource> resources = new 
LinkedHashSet<Resource>();
+                       LinkedHashSet<BasicSubsystem> subsystemResources = new 
LinkedHashSet<BasicSubsystem>();
+                       Subsystems subsystems = 
Activator.getInstance().getSubsystems();
+                       for (Resource dep : 
subsystems.getResourcesReferencedBy(target)) {
+                               if (dep instanceof BasicSubsystem 
+                                               && 
!subsystems.getChildren(target).contains(dep)) {
+                                       
subsystemResources.add((BasicSubsystem)dep);
+                               }
+                               else if (dep instanceof BundleRevision) {
+                                       BundleConstituent constituent = new 
BundleConstituent(null, (BundleRevision)dep);
+                                       if 
(!target.getConstituents().contains(constituent)) {
+                                               for (BasicSubsystem 
constituentOf : subsystems.getSubsystemsByConstituent(
+                                                               new 
BundleConstituent(null, (BundleRevision)dep))) {
+                                                       
subsystemResources.add(constituentOf);
+                                               }
                                        }
                                }
+                               resources.add(dep);
+                       }
+                       for (Subsystem child : subsystems.getChildren(target)) {
+                               subsystemResources.add((BasicSubsystem)child);
+                               resources.add((BasicSubsystem)child);
+                       }
+                       for (Resource resource : 
target.getResource().getSharedContent()) {
+                               for (BasicSubsystem constituentOf : 
subsystems.getSubsystemsByConstituent(
+                                               resource instanceof 
BundleRevision ? new BundleConstituent(null, (BundleRevision)resource) : 
resource)) {
+                                       subsystemResources.add(constituentOf);
+                               }
+                               resources.add(resource);
                        }
+                       subsystemResources.add(target);
+                       this.resources = new ArrayList<Resource>(resources);
+                       this.subsystemResources = subsystemResources;
                }
-               for (Subsystem child : subsystems.getChildren(target)) {
-                       result.add((BasicSubsystem)child);
+               
+               List<Resource> resources() {
+                       return resources;
                }
-               for (Resource resource : 
target.getResource().getSharedContent()) {
-                       for (BasicSubsystem constituentOf : 
subsystems.getSubsystemsByConstituent(
-                                       resource instanceof BundleRevision ? 
new BundleConstituent(null, (BundleRevision)resource) : resource)) {
-                               result.add(constituentOf);
-                       }
+               
+               Collection<BasicSubsystem> subsystems() {
+                       return subsystemResources;
                }
-               result.add(target);
-               return result;
+       }
+       
+       private static AffectedResources 
computeAffectedResources(BasicSubsystem target) {
+               return new AffectedResources(target);
        }
 
        @Override
@@ -179,7 +201,7 @@ public class StartAction extends Abstrac
                        return null;
                }
                try {
-                       Collection<BasicSubsystem> subsystems;
+                       AffectedResources affectedResources;
                        // We are now protected against re-entry.
                        // If necessary, install the dependencies.
                if (State.INSTALLING.equals(target.getState()) && 
!Utils.isProvisionDependenciesInstall(target)) {
@@ -197,8 +219,8 @@ public class StartAction extends Abstrac
                                                // are installed because some 
of the dependencies may be 
                                                // subsystems. This is safe to 
do while only holding the read
                                                // lock since we know that 
nothing can be added or removed.
-                                               subsystems = 
computeAffectedSubsystems(target);
-                                               for (BasicSubsystem subsystem : 
subsystems) {
+                                       affectedResources = 
computeAffectedResources(target);
+                                               for (BasicSubsystem subsystem : 
affectedResources.subsystems()) {
                                                        if 
(State.INSTALLING.equals(subsystem.getState())
                                                                        && 
!Utils.isProvisionDependenciesInstall(subsystem)) {
                                                                
installDependencies(subsystem, c);
@@ -238,14 +260,14 @@ public class StartAction extends Abstrac
                        // were computed previously and more were subsequently 
added. 
                                // This is safe to do while only holding the 
read lock since we
                                // know that nothing can be added or removed.
-                               subsystems = computeAffectedSubsystems(target);
+                       affectedResources = computeAffectedResources(target);
                                // Acquire the global mutual exclusion lock 
while acquiring the
                                // state change locks of affected subsystems.
                                LockingStrategy.lock();
                                try {
                                        // We are now protected against cycles.
                                        // Acquire the state change locks of 
affected subsystems.
-                                       LockingStrategy.lock(subsystems);
+                                       
LockingStrategy.lock(affectedResources.subsystems());
                                }
                                finally {
                                        // Release the global mutual exclusion 
lock as soon as possible.
@@ -261,7 +283,7 @@ public class StartAction extends Abstrac
                                        
                                        // Resolve if necessary.
                                        if 
(State.INSTALLED.equals(target.getState()))
-                                               resolve(instigator, target, 
target, coordination, subsystems);
+                                               resolve(instigator, target, 
target, coordination, affectedResources.subsystems());
                                        if 
(Restriction.RESOLVE_ONLY.equals(restriction))
                                                return null;
                                        target.setState(State.STARTING);
@@ -277,16 +299,10 @@ public class StartAction extends Abstrac
                                                        
target.setState(State.RESOLVED);
                                                }
                                        });
-                                       for (BasicSubsystem subsystem : 
subsystems) {
-                                               if (!target.equals(subsystem)) {
-                                                       
startSubsystemResource(subsystem, coordination);
-                                               }
-                                       }
-                                       List<Resource> resources = new 
ArrayList<Resource>(Activator.getInstance().getSubsystems().getResourcesReferencedBy(target));
                                        SubsystemContentHeader header = 
target.getSubsystemManifest().getSubsystemContentHeader();
                                        if (header != null)
-                                               Collections.sort(resources, new 
StartResourceComparator(header));
-                                       for (Resource resource : resources)
+                                               
Collections.sort(affectedResources.resources(), new 
StartResourceComparator(header));
+                                       for (Resource resource : 
affectedResources.resources())
                                                startResource(resource, 
coordination);
                                        target.setState(State.ACTIVE);
                                        
@@ -307,7 +323,7 @@ public class StartAction extends Abstrac
                                        }
                                        finally {
                                                // Release the state change 
locks of affected subsystems.
-                                               
LockingStrategy.unlock(subsystems);
+                                               
LockingStrategy.unlock(affectedResources.subsystems());
                                        }
                                }
                }

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartResourceComparator.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartResourceComparator.java?rev=1727999&r1=1727998&r2=1727999&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartResourceComparator.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/StartResourceComparator.java
 Mon Feb  1 20:27:09 2016
@@ -34,7 +34,7 @@ public class StartResourceComparator imp
        private Integer getStartOrder(Resource r) {
                SubsystemContentHeader.Clause clause = header.getClause(r);
                if (clause == null)
-                       return 0;
+                       return -1;
                return clause.getStartOrder();
        }
 }


Reply via email to