You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ds...@apache.org on 2009/09/30 18:38:02 UTC
svn commit: r820341 -
/felix/trunk/sigil/common/core/src/org/apache/felix/sigil/core/repository/BundleResolver.java
Author: dsavage
Date: Wed Sep 30 16:38:02 2009
New Revision: 820341
URL: http://svn.apache.org/viewvc?rev=820341&view=rev
Log:
Search for requirements in resolution context first (FELIX-1665)
Modified:
felix/trunk/sigil/common/core/src/org/apache/felix/sigil/core/repository/BundleResolver.java
Modified: felix/trunk/sigil/common/core/src/org/apache/felix/sigil/core/repository/BundleResolver.java
URL: http://svn.apache.org/viewvc/felix/trunk/sigil/common/core/src/org/apache/felix/sigil/core/repository/BundleResolver.java?rev=820341&r1=820340&r2=820341&view=diff
==============================================================================
--- felix/trunk/sigil/common/core/src/org/apache/felix/sigil/core/repository/BundleResolver.java (original)
+++ felix/trunk/sigil/common/core/src/org/apache/felix/sigil/core/repository/BundleResolver.java Wed Sep 30 16:38:02 2009
@@ -468,51 +468,84 @@
try
{
- int[] priorities = repositoryManager.getPriorityLevels();
+ if ( !findInContext( requirement, ctx ) )
+ {
+ findInRepositories( requirement, ctx );
+ }
+ }
+ finally
+ {
+ ctx.endRequirement( requirement );
+ }
+ }
+ }
- outer: for ( int i = 0; i < priorities.length; i++ )
+
+ private boolean findInContext(final IRequirementModelElement requirement,
+ final ResolutionContext ctx)
+ {
+ for ( final ISigilBundle b : ctx.resolution.providees.keySet() )
+ {
+ b.visit( new IModelWalker()
+ {
+ public boolean visit(IModelElement element)
{
- List<ISigilBundle> providers = findProvidersAtPriority( priorities[i], requirement, ctx );
+ if ( requirement.accepts(element) ) {
+ ctx.resolution.addProvider( requirement, b );
+ return false;
+ }
+ return !ctx.monitor.isCanceled();
+ }
+
+ });
+ }
+
+ return ctx.resolution.getProvider(requirement) != null;
+ }
+
- if ( !providers.isEmpty() && !ctx.monitor.isCanceled() )
+ private void findInRepositories(IRequirementModelElement requirement,
+ ResolutionContext ctx) throws ResolutionException
+ {
+ int[] priorities = repositoryManager.getPriorityLevels();
+
+ outer: for ( int i = 0; i < priorities.length; i++ )
+ {
+ List<ISigilBundle> providers = findProvidersAtPriority( priorities[i], requirement, ctx );
+
+ if ( !providers.isEmpty() && !ctx.monitor.isCanceled() )
+ {
+ if ( providers.size() > 1 )
+ {
+ Collections.sort( providers, new BundleOrderComparator( requirement ) );
+ }
+
+ for ( ISigilBundle provider : providers )
+ {
+ // reset validity - if there's another provider it can still be solved
+ ctx.setValid( true );
+ if ( ctx.resolution.addProvider( requirement, provider ) )
{
- if ( providers.size() > 1 )
+ if ( ctx.config.isDependents() )
{
- Collections.sort( providers, new BundleOrderComparator( requirement ) );
+ resolveElement( provider, ctx );
}
- for ( ISigilBundle provider : providers )
+ if ( ctx.isValid() )
{
- // reset validity - if there's another provider it can still be solved
- ctx.setValid( true );
- if ( ctx.resolution.addProvider( requirement, provider ) )
- {
- if ( ctx.config.isDependents() )
- {
- resolveElement( provider, ctx );
- }
-
- if ( ctx.isValid() )
- {
- break outer;
- }
- else
- {
- ctx.resolution.removeProvider( requirement, provider );
- }
- }
- else
- {
- break outer;
- }
+ break outer;
}
+ else
+ {
+ ctx.resolution.removeProvider( requirement, provider );
+ }
+ }
+ else
+ {
+ break outer;
}
}
}
- finally
- {
- ctx.endRequirement( requirement );
- }
}
}