diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/driver/DriverDependencies.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/driver/DriverDependencies.java index 62fa9d54d5f28c7f349c51d2d8f2417cb2b927d1..c27f6e04306a33771e83e1cf7466aee44db7053e 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/driver/DriverDependencies.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/driver/DriverDependencies.java @@ -30,59 +30,89 @@ import java.util.*; */ public class DriverDependencies implements DBPDriverDependencies { + final List rootNodes = new ArrayList<>(); + final List libraryList = new ArrayList<>(); + public DriverDependencies() { } void resolveDependencies(DBRProgressMonitor monitor, Collection rootLibraries) throws DBException { try { - // Dependency map. Key is artifact version (exact) - final Map> depMap = new LinkedHashMap<>(); - for (DBPDriverLibrary library : rootLibraries) { - resolveDependencies(monitor, library, null, depMap); - } + { + rootNodes.clear(); -/* - // Replace multiple versions of the same artifact with the first found one - Map flatDependencies = new LinkedHashMap<>(); - List nodes = new ArrayList<>(); - for (Map.Entry> entry : depMap.entrySet()) { + final Map libMap = new LinkedHashMap<>(); + for (DBPDriverLibrary library : rootLibraries) { + DependencyNode node = new DependencyNode(null, library); + resolveDependencies(monitor, node, libMap); + rootNodes.add(node); + } + libraryList.clear(); + libraryList.addAll(libMap.values()); - } -*/ + { + StringBuilder sb = new StringBuilder(); + Set ns = new TreeSet<>(); + for (String lib : libMap.keySet()) { + String newName = lib.replaceAll(".+\\:", ""); + if (ns.contains(newName)) { + System.out.println(123); + } + ns.add(newName); + } + for (String lib : ns) { + sb.append(lib).append("\n"); + } + System.out.println(sb.toString()); + System.out.println("---------------------------"); + for (DependencyNode node : rootNodes) { + dumpNode(node, 0); + } + } + } } catch (IOException e) { throw new DBException("IO error while resolving dependencies", e); } } - private void resolveDependencies(DBRProgressMonitor monitor, DBPDriverLibrary library, DBPDriverLibrary ownerLibrary, Map> depMap) throws IOException { - String libraryPath = library.getPath(); - List deps = depMap.get(libraryPath); - if (deps != null) { + private void dumpNode(DependencyNode node, int level) { + if (node.duplicate) { return; } + for (int i = 0; i < level; i++) System.out.print("\t"); + System.out.println(node.library.getId() + ":" + node.library.getVersion()); + for (DependencyNode child : node.dependencies) { + dumpNode(child, level + 1); + } + } - deps = new ArrayList<>(); - depMap.put(libraryPath, deps); - - Collection dependencies = library.getDependencies(monitor, ownerLibrary); + private void resolveDependencies(DBRProgressMonitor monitor, DependencyNode ownerNode, Map libMap) throws IOException { + Collection dependencies = ownerNode.library.getDependencies(monitor, ownerNode.owner == null? null : ownerNode.owner.library); if (dependencies != null && !dependencies.isEmpty()) { for (DBPDriverLibrary dep : dependencies) { - deps.add(dep); - resolveDependencies(monitor, dep, library, depMap); + DependencyNode node = new DependencyNode(ownerNode, dep); + + node.duplicate = libMap.containsKey(node.library.getId()); + if (!node.duplicate) { + libMap.put(node.library.getId(), node.library); + } + ownerNode.dependencies.add(node); + } + for (DependencyNode node : ownerNode.dependencies) { + resolveDependencies(monitor, node, libMap); } } } - @Override public List getLibraryList() { - return null; + return libraryList; } @Override public List getLibraryMap() { - return null; + return rootNodes; } }