/* * Validate if all imports for a feature are being matched with exports */ private void validateImportsExports(Feature feature) throws Exception { Map<Clause, String> imports = new HashMap<Clause, String>(); Set<Clause> exports = new HashSet<Clause>(); for (Dependency dependency : feature.getDependencies()) { if (featureExports.containsKey(dependency.getName())) { exports.addAll(featureExports.get(dependency.getName())); } else { validateImportsExports(features.get(dependency.getName(), dependency.getVersion())); } } for (String bundle : getBundleLocations(feature)) { Manifest meta = manifests.get(bundles.get(bundle)); exports.addAll(getExports(meta)); for (Clause clause : getMandatoryImports(meta)) { imports.put(clause, bundle); } } // setting up the set of required imports Set<Clause> requirements = new HashSet<Clause>(); requirements.addAll(imports.keySet()); // now, let's remove requirements whenever we find a matching export for them for (Clause element : imports.keySet()) { if (systemExports.contains(element.getName())) { debug("%s is resolved by a system bundle export or provided bundle", element); requirements.remove(element); continue; } for (Clause export : exports) { if (matches(element, export)) { debug("%s is resolved by export %s", element, export); requirements.remove(element); continue; } debug("%s is not resolved by export %s", element, export); } } // if there are any more requirements left here, there's a problem with the feature if (!requirements.isEmpty()) { warn("Failed to validate feature %s", feature.getName()); for (Clause entry : requirements) { warn("No export found to match %s (imported by %s)", entry, imports.get(entry)); } throw new Exception( String.format( "%d unresolved imports in feature %s", requirements.size(), feature.getName())); } info(" OK: imports resolved for %s", feature.getName()); featureExports.put(feature.getName(), exports); }