private List<CircularRefInfo> orderProviders(CapabilityProviders providers) throws ProvisioningException { if(!providers.isProvided()) { List<CircularRefInfo> firstLoop = null; if(!providers.specs.isEmpty()) { for(SpecFeatures specFeatures : providers.specs) { final List<CircularRefInfo> loop = orderFeaturesInSpec(specFeatures, !specFeatures.isFree()); if(providers.isProvided()) { return null; } if(firstLoop == null) { firstLoop = loop; } } } if (!providers.features.isEmpty()) { for (ResolvedFeature provider : providers.features) { final List<CircularRefInfo> loop = orderFeature(provider); if(providers.isProvided()) { return null; } if(firstLoop == null) { firstLoop = loop; } } } return firstLoop; } return null; }
void provided(ConfigFeatureBranch branch) { if(capProviders.isEmpty()) { return; } for(CapabilityProviders providers : capProviders) { providers.provided(branch); } } }
private List<CircularRefInfo> orderCapabilityProviders(ResolvedFeature feature, List<CircularRefInfo> circularRefs) throws ProvisioningException { for (CapabilitySpec capSpec : feature.spec.xmlSpec.getRequiredCapabilities()) { final List<String> resolvedCaps = capResolver.resolve(capSpec, feature); if (resolvedCaps.isEmpty()) { continue; } for (String resolvedCap : resolvedCaps) { final CapabilityProviders providers; try { providers = getProviders(resolvedCap, false); } catch (ProvisioningException e) { throw new ProvisioningException(Errors.noCapabilityProvider(feature, capSpec, resolvedCap)); } circularRefs = CollectionUtils.addAll(circularRefs, orderProviders(providers)); if(providers.isProvided()) { feature.addBranchDep(providers.branches.iterator().next(), false); //System.out.println("added branch dep on cap provider " + feature.getId() + " -> " + providers.branches); } else { providers.addBranchDependee(feature); } } } return circularRefs; }
private CapabilityProviders getProviders(String cap, boolean add) throws ProvisioningException { CapabilityProviders providers = capProviders.get(cap); if(providers != null) { return providers; } if(!add) { throw new ProvisioningException(Errors.noCapabilityProvider(cap)); } providers = new CapabilityProviders(); capProviders = CollectionUtils.put(capProviders, cap, providers); return providers; }
private void doOrder(ProvisioningRuntimeBuilder rt) throws ProvisioningException { for (SpecFeatures features : specFeatures.values()) { // resolve references features.spec.resolveRefMappings(rt); // resolve and register capability providers if(features.spec.xmlSpec.providesCapabilities()) { for(CapabilitySpec cap : features.spec.xmlSpec.getProvidedCapabilities()) { if(cap.isStatic()) { getProviders(cap.toString(), true).add(features); } else { for(ResolvedFeature feature : features.getFeatures()) { final List<String> resolvedCaps = capResolver.resolve(cap, feature); if(resolvedCaps.isEmpty()) { continue; } for(String resolvedCap : resolvedCaps) { getProviders(resolvedCap, true).add(feature); } } } } } } orderedFeatures = new ArrayList<>(features.size()); for(SpecFeatures features : specFeatures.values()) { orderFeaturesInSpec(features, false); } }
private CapabilityProviders getProviders(String cap, boolean add) throws ProvisioningException { CapabilityProviders providers = capProviders.get(cap); if(providers != null) { return providers; } if(!add) { throw new ProvisioningException(Errors.noCapabilityProvider(cap)); } providers = new CapabilityProviders(); capProviders = CollectionUtils.put(capProviders, cap, providers); return providers; }
private List<CircularRefInfo> orderProviders(CapabilityProviders providers) throws ProvisioningException { if(providers.isProvided()) { return Collections.emptyList(); } List<CircularRefInfo> firstLoop = null; if (!providers.specs.isEmpty()) { for (SpecFeatures specFeatures : providers.specs) { final List<CircularRefInfo> loop = orderFeaturesInSpec(specFeatures, !specFeatures.isFree()); if (providers.isProvided()) { return Collections.emptyList(); } if (firstLoop == null) { firstLoop = loop; } } } if (!providers.features.isEmpty()) { for (ResolvedFeature provider : providers.features) { final List<CircularRefInfo> loop = orderFeature(provider); if (providers.isProvided()) { return Collections.emptyList(); } if (firstLoop == null) { firstLoop = loop; } } } return firstLoop == null ? Collections.emptyList() : firstLoop; }