Modified: felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/prototype/ProtoResolver.java URL: http://svn.apache.org/viewvc/felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/prototype/ProtoResolver.java?rev=886175&r1=886174&r2=886175&view=diff ============================================================================== --- felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/prototype/ProtoResolver.java (original) +++ felix/sandbox/rickhall/resolver/src/main/java/org/apache/felix/resolver/prototype/ProtoResolver.java Wed Dec 2 15:34:56 2009 @@ -40,8 +40,8 @@ new HashMap<Module, Map<String, Blame>>(); private final Map<Module, Map<String, Blame>> m_resolvingConstraintCache = new HashMap<Module, Map<String, Blame>>(); - private final Map<ExportedPackage, Map<String, Blame>> m_resolvedConstraintCache = - new HashMap<ExportedPackage, Map<String, Blame>>(); + private final Map<CapabilityImpl, Map<String, Blame>> m_resolvedConstraintCache = + new HashMap<CapabilityImpl, Map<String, Blame>>(); private Map<Module, Map<String, Object>> m_verifyCache = new HashMap<Module, Map<String, Object>>(); @@ -58,7 +58,7 @@ m_pkgCapSet = new CapabilitySet(indices); for (int modIdx = 0; modIdx < m_moduleList.size(); modIdx++) { - List<ExportedPackage> exports = m_moduleList.get(modIdx).getExports(); + List<CapabilityImpl> exports = m_moduleList.get(modIdx).getExports(); for (int expIdx = 0; expIdx < exports.size(); expIdx++) { m_pkgCapSet.addCapability(exports.get(expIdx)); @@ -82,8 +82,8 @@ } private Module m_rootModule = null; - private List<Map<ImportedPackage, Set<Capability>>> m_candidatePermutations - = new ArrayList<Map<ImportedPackage, Set<Capability>>>(); + private List<Map<RequirementImpl, Set<Capability>>> m_candidatePermutations + = new ArrayList<Map<RequirementImpl, Set<Capability>>>(); public Map<Module, List<Wire>> resolve(Module module) { @@ -92,11 +92,11 @@ m_resolvingConstraintCache.clear(); m_resolvedConstraintCache.clear(); m_verifyCache.clear(); - Map<ImportedPackage, Set<Capability>> candidateMap = resolve( + Map<RequirementImpl, Set<Capability>> candidateMap = resolve( module, null, module, - new HashMap<ImportedPackage, Set<Capability>>(), + new HashMap<RequirementImpl, Set<Capability>>(), new HashMap<String, Blame>(), new HashMap<Module, Boolean>()); @@ -107,9 +107,9 @@ return populateWireMap(module, candidateMap, new HashMap<Module, List<Wire>>()); } - private Map<ImportedPackage, Set<Capability>> resolve( - Module module, ExportedPackage epGoal, Module blameModule, - Map<ImportedPackage, Set<Capability>> candidateMap, + private Map<RequirementImpl, Set<Capability>> resolve( + Module module, CapabilityImpl epGoal, Module blameModule, + Map<RequirementImpl, Set<Capability>> candidateMap, Map<String, Blame> existingConstrains, Map<Module, Boolean> cycleMap) { @@ -167,8 +167,8 @@ } // Find candidates for all imports for the target module. - List<ImportedPackage> imports = module.getImports(); - for (ImportedPackage ip : imports) + List<RequirementImpl> imports = module.getImports(); + for (RequirementImpl ip : imports) { // If we are using a permutated candidate map, then the target // module's candidates may have already been calculated, so use @@ -202,7 +202,7 @@ repeat = false; // Loop through all of the target module's imports and v - for (ImportedPackage ip : imports) + for (RequirementImpl ip : imports) { // Get the current candidate capability for the current import. Set<Capability> exporters = candidateMap.get(ip); @@ -217,14 +217,15 @@ { mergeResolvedConstraints( module, candidateMap, currentConstraintsCopy, - (ExportedPackage) cap); + (CapabilityImpl) cap); } // If current candidate is the same as the module being // resolved, then just directly add it as a constraint. else if (cap.getModule().equals(module)) { currentConstraintsCopy.put( - cap.getName(), new Blame((ExportedPackage) cap, blameModule)); + (String) cap.getAttribute(Capability.PACKAGE_ATTR).getValue(), + new Blame((CapabilityImpl) cap, blameModule)); } // If the current candidate is not resolved, then try to resolve // it, which will also merge packages while verify constraints. @@ -232,7 +233,7 @@ { resolve( cap.getModule(), - (ExportedPackage) cap, + (CapabilityImpl) cap, module, candidateMap, currentConstraintsCopy, @@ -343,7 +344,7 @@ return constraintsCopy; } - private Set<Capability> findExporters(ImportedPackage ip) + private Set<Capability> findExporters(RequirementImpl ip) { if (m_isInvokeCount) { @@ -356,17 +357,18 @@ Set<Capability> result = new TreeSet(new Comparator() { public int compare(Object arg1, Object arg2) { - ExportedPackage ep1 = (ExportedPackage) arg1; - ExportedPackage ep2 = (ExportedPackage) arg2; - int c = ep1.getName().compareTo(ep2.getName()); + CapabilityImpl ep1 = (CapabilityImpl) arg1; + CapabilityImpl ep2 = (CapabilityImpl) arg2; + int c = ep1.getAttribute(Capability.PACKAGE_ATTR).getValue().compareTo( + ep2.getAttribute(Capability.PACKAGE_ATTR).getValue()); if (c == 0) { - Version v1 = (ep1.getAttribute("version") == null) + Version v1 = (ep1.getAttribute(Capability.VERSION_ATTR) == null) ? Version.emptyVersion - : (Version) ep1.getAttribute("version").getValue(); - Version v2 = (ep1.getAttribute("version") == null) + : (Version) ep1.getAttribute(Capability.VERSION_ATTR).getValue(); + Version v2 = (ep1.getAttribute(Capability.VERSION_ATTR) == null) ? Version.emptyVersion - : (Version) ep1.getAttribute("version").getValue(); + : (Version) ep1.getAttribute(Capability.VERSION_ATTR).getValue(); // Compare these in reverse order, since we want // highest version to have priority. c = v2.compareTo(v1); @@ -400,14 +402,16 @@ { constraints = new HashMap<String, Blame>(); - List<ExportedPackage> exports = module.getExports(); + List<CapabilityImpl> exports = module.getExports(); for (int i = 0; i < exports.size(); i++) { // TODO: PROTO RESOLVER - Assume if a module imports the same package it // exports that the import will overlap the export. if (!hasOverlappingImport(module, exports.get(i))) { - constraints.put(exports.get(i).getName(), new Blame(exports.get(i), blameModule)); + constraints.put( + (String) exports.get(i).getAttribute(Capability.PACKAGE_ATTR).getValue(), + new Blame(exports.get(i), blameModule)); } } @@ -432,7 +436,7 @@ return constraints; } - private boolean hasOverlappingImport(Module module, ExportedPackage ep) + private boolean hasOverlappingImport(Module module, CapabilityImpl ep) { if (m_isInvokeCount) { @@ -442,7 +446,7 @@ m_invokeCounts.put(methodName, count); } - List<ImportedPackage> imports = module.getImports(); + List<RequirementImpl> imports = module.getImports(); for (int i = 0; i < imports.size(); i++) { if (m_pkgCapSet.matches(ep, imports.get(i).getFilter())) @@ -454,8 +458,8 @@ } private void mergeResolvedConstraints( - Module blameModule, Map<ImportedPackage, Set<Capability>> candidateMap, - Map<String, Blame> currentConstraints, ExportedPackage epTarget) + Module blameModule, Map<RequirementImpl, Set<Capability>> candidateMap, + Map<String, Blame> currentConstraints, CapabilityImpl epTarget) { if (m_isInvokeCount) { @@ -466,7 +470,7 @@ } Map<String, Blame> actualConstraints = calculateResolvedConstraints(blameModule, epTarget); - verifyUses(blameModule, epTarget.getName(), + verifyUses(blameModule, (String) epTarget.getAttribute(Capability.PACKAGE_ATTR).getValue(), candidateMap, currentConstraints, actualConstraints, new HashMap<String, List<Module>>()); //System.out.println("+++ ACTUAL FOR " + epTarget + " = " + actualConstraints); @@ -481,7 +485,8 @@ { throw new ResolveConflictException("Unable to resolve " + blameModule + ": constraint conflict with '" - + current.m_exportedPackage.getName() + "' between " + current + " and " + + current.m_exportedPackage.getAttribute(Capability.PACKAGE_ATTR).getValue() + + "' between " + current + " and " + entry.getValue()); } else if (current == null) @@ -492,7 +497,7 @@ } private Map<String, Blame> calculateResolvedConstraints( - Module blameModule, ExportedPackage epTarget) + Module blameModule, CapabilityImpl epTarget) { if (m_isInvokeCount) { @@ -511,13 +516,14 @@ constraints = new HashMap<String, Blame>(); // The capability itself is a constraint, so add it. - constraints.put(epTarget.getName(), new Blame(epTarget, blameModule)); + constraints.put((String) epTarget.getAttribute(Capability.PACKAGE_ATTR).getValue(), + new Blame(epTarget, blameModule)); // Calculate implied constraints. calculateResolvedUsesConstraints( epTarget, constraints, - new HashMap<ExportedPackage, ExportedPackage>()); + new HashMap<CapabilityImpl, CapabilityImpl>()); // Cache answer. m_resolvedConstraintCache.put(epTarget, constraints); @@ -548,8 +554,8 @@ } private void calculateResolvedUsesConstraints( - ExportedPackage epTarget, Map<String, Blame> constraints, - Map<ExportedPackage, ExportedPackage> cycleMap) + CapabilityImpl epTarget, Map<String, Blame> constraints, + Map<CapabilityImpl, CapabilityImpl> cycleMap) { if (m_isInvokeCount) { @@ -570,7 +576,7 @@ { // We need to find the source of the package name for the current target. // It can either be from an importer or an exporter. - ExportedPackage epSource = null; + CapabilityImpl epSource = null; // Search the target module's wires for the package. for (int wireIdx = 0; @@ -578,7 +584,8 @@ wireIdx++) { if (epTarget.getModule().getWires().get(wireIdx) - .getExportedPackage().getName().equals(uses.get(usesIdx))) + .getExportedPackage().getAttribute(Capability.PACKAGE_ATTR).getValue() + .equals(uses.get(usesIdx))) { epSource = epTarget.getModule().getWires().get(wireIdx).getExportedPackage(); } @@ -590,7 +597,8 @@ (epSource == null) && (expIdx < epTarget.getModule().getExports().size()); expIdx++) { - if (epTarget.getModule().getExports().get(expIdx).getName().equals(uses.get(usesIdx))) + if (epTarget.getModule().getExports().get(expIdx) + .getAttribute(Capability.PACKAGE_ATTR).getValue().equals(uses.get(usesIdx))) { epSource = epTarget.getModule().getExports().get(expIdx); } @@ -605,7 +613,7 @@ } private void checkConsistency( - Module targetModule, ExportedPackage epGoal, Map<ImportedPackage, + Module targetModule, CapabilityImpl epGoal, Map<RequirementImpl, Set<Capability>> candidateMap, Map<String, Blame> existingConstraints, Map<String, Blame> currentConstraints) @@ -626,7 +634,9 @@ // Find matching providing for requirement. if (epGoal != null) { - verifyUses(targetModule, epGoal.getName(), + verifyUses( + targetModule, + (String) epGoal.getAttribute(Capability.PACKAGE_ATTR).getValue(), candidateMap, existingConstraints, currentConstraints, new HashMap<String, List<Module>>()); } @@ -646,7 +656,7 @@ } private void verifyUses(Module targetModule, String pkgName, - Map<ImportedPackage, Set<Capability>> candidateMap, + Map<RequirementImpl, Set<Capability>> candidateMap, Map<String, Blame> existingConstraints, Map<String, Blame> currentConstraints, Map<String, List<Module>> cycleMap) { @@ -696,7 +706,7 @@ { //System.out.println("Conflict: " + existing.m_exportedPackage + " WITH " + current.m_exportedPackage); //System.out.println("Blame: " + existing.m_blameModules + " AND " + current.m_blameModules); - Map<ImportedPackage, Set<Capability>> candidateMapCopy = copyCandidateMap(candidateMap); + Map<RequirementImpl, Set<Capability>> candidateMapCopy = copyCandidateMap(candidateMap); boolean modified = false; boolean invalid = false; for (int blameIdx = 0; blameIdx < existing.m_blameModules.size(); blameIdx++) @@ -706,7 +716,7 @@ // to them. if (!existing.m_blameModules.get(blameIdx).isResolved()) { - List<ImportedPackage> blameImports = + List<RequirementImpl> blameImports = existing.m_blameModules.get(blameIdx).getImports(); for (int impIdx = 0; impIdx < blameImports.size(); impIdx++) { @@ -793,8 +803,8 @@ answers.put(pkgName, Boolean.TRUE); } - private static Map<ImportedPackage, Set<Capability>> copyCandidateMap( - Map<ImportedPackage, Set<Capability>> candidateMap) + private static Map<RequirementImpl, Set<Capability>> copyCandidateMap( + Map<RequirementImpl, Set<Capability>> candidateMap) { if (m_isInvokeCount) { @@ -804,18 +814,18 @@ m_invokeCounts.put(methodName, count); } - Map<ImportedPackage, Set<Capability>> copy = new HashMap<ImportedPackage, Set<Capability>>(); - for (Iterator<Entry<ImportedPackage, Set<Capability>>> it = candidateMap.entrySet().iterator(); + Map<RequirementImpl, Set<Capability>> copy = new HashMap<RequirementImpl, Set<Capability>>(); + for (Iterator<Entry<RequirementImpl, Set<Capability>>> it = candidateMap.entrySet().iterator(); it.hasNext(); ) { - Entry<ImportedPackage, Set<Capability>> entry = it.next(); + Entry<RequirementImpl, Set<Capability>> entry = it.next(); copy.put(entry.getKey(), new HashSet(entry.getValue())); } return copy; } private static Map<Module, List<Wire>> populateWireMap( - Module module, Map<ImportedPackage, Set<Capability>> candidateMap, + Module module, Map<RequirementImpl, Set<Capability>> candidateMap, Map<Module, List<Wire>> wireMap) { if (m_isInvokeCount) @@ -831,7 +841,7 @@ List<Wire> moduleWires = new ArrayList<Wire>(); wireMap.put(module, moduleWires); - List<ImportedPackage> imports = module.getImports(); + List<RequirementImpl> imports = module.getImports(); for (int i = 0; i < imports.size(); i++) { Capability cap = candidateMap.get(imports.get(i)).iterator().next(); @@ -847,7 +857,7 @@ new Wire(module, imports.get(i), cap.getModule(), - (ExportedPackage) cap)); + (CapabilityImpl) cap)); } } } @@ -856,9 +866,9 @@ public static class Blame { - public final ExportedPackage m_exportedPackage; + public final CapabilityImpl m_exportedPackage; public final List<Module> m_blameModules; - public Blame(ExportedPackage exportedPackage, Module blameModule) + public Blame(CapabilityImpl exportedPackage, Module blameModule) { m_exportedPackage = exportedPackage; m_blameModules = new ArrayList<Module>();
