提交 3fc5530e 编写于 作者: J jurgen

Deps resolve (order & optional)

Former-commit-id: 76afc1ff
上级 01d30c1f
......@@ -32,7 +32,7 @@ public class DriverDependencies implements DBPDriverDependencies
{
final List<? extends DBPDriverLibrary> rootLibraries;
final List<DependencyNode> rootNodes = new ArrayList<>();
final List<DBPDriverLibrary> libraryList = new ArrayList<>();
final List<DependencyNode> libraryList = new ArrayList<>();
public DriverDependencies(List<? extends DBPDriverLibrary> rootLibraries) {
this.rootLibraries = rootLibraries;
......@@ -44,10 +44,10 @@ public class DriverDependencies implements DBPDriverDependencies
{
rootNodes.clear();
final Map<String, DBPDriverLibrary> libMap = new LinkedHashMap<>();
final Map<String, DependencyNode> libMap = new LinkedHashMap<>();
for (DBPDriverLibrary library : rootLibraries) {
DependencyNode node = new DependencyNode(null, library);
libMap.put(node.library.getId(), node.library);
libMap.put(node.library.getId(), node);
resolveDependencies(monitor, node, libMap);
rootNodes.add(node);
......@@ -91,16 +91,21 @@ public class DriverDependencies implements DBPDriverDependencies
}
}
private void resolveDependencies(DBRProgressMonitor monitor, DependencyNode ownerNode, Map<String, DBPDriverLibrary> libMap) throws IOException {
private void resolveDependencies(DBRProgressMonitor monitor, DependencyNode ownerNode, Map<String, DependencyNode> libMap) throws IOException {
ownerNode.library.resolve(monitor);
Collection<? extends DBPDriverLibrary> dependencies = ownerNode.library.getDependencies(monitor);
if (dependencies != null && !dependencies.isEmpty()) {
for (DBPDriverLibrary dep : dependencies) {
DependencyNode node = new DependencyNode(ownerNode, dep);
node.duplicate = libMap.containsKey(node.library.getId());
if (!node.duplicate) {
libMap.put(node.library.getId(), node.library);
DependencyNode prevNode = libMap.get(node.library.getId());
if (prevNode == null || prevNode.depth > node.depth) {
libMap.put(node.library.getId(), node);
if (prevNode != null) {
prevNode.duplicate = true;
}
} else {
node.duplicate = true;
}
ownerNode.dependencies.add(node);
}
......@@ -113,7 +118,7 @@ public class DriverDependencies implements DBPDriverDependencies
}
@Override
public List<DBPDriverLibrary> getLibraryList() {
public List<DependencyNode> getLibraryList() {
return libraryList;
}
......
......@@ -128,7 +128,7 @@ public class DriverLibraryMavenArtifact extends DriverLibraryAbstract
MavenArtifactVersion localVersion = resolveLocalVersion(monitor, false);
if (localVersion != null) {
List<MavenArtifactDependency> artifactDeps = localVersion.getDependencies(monitor);
List<MavenArtifactDependency> artifactDeps = localVersion.getDependencies();
if (!CommonUtils.isEmpty(artifactDeps)) {
for (MavenArtifactDependency dependency : artifactDeps) {
if (isDependencyExcluded(monitor, dependency)) {
......
......@@ -121,7 +121,7 @@ public class MavenArtifactVersion {
return profiles;
}
public List<MavenArtifactDependency> getDependencies(DBRProgressMonitor monitor) {
public List<MavenArtifactDependency> getDependencies() {
List<MavenArtifactDependency> dependencies = new ArrayList<>();
for (MavenProfile profile : profiles) {
if (profile.isActive() && !CommonUtils.isEmpty(profile.dependencies)) {
......@@ -129,7 +129,7 @@ public class MavenArtifactVersion {
}
}
if (parent != null) {
List<MavenArtifactDependency> parentDependencies = parent.getDependencies(monitor);
List<MavenArtifactDependency> parentDependencies = parent.getDependencies();
if (!CommonUtils.isEmpty(parentDependencies)) {
dependencies.addAll(parentDependencies);
}
......@@ -296,7 +296,7 @@ public class MavenArtifactVersion {
Element propElement = XMLUtils.getChildElement(activationElement, "property");
if (propElement != null) {
String propName = XMLUtils.getChildElementBody(propElement, "name");
String propValue = XMLUtils.getChildElementBody(propElement, "value");
//String propValue = XMLUtils.getChildElementBody(propElement, "value");
// TODO: implement real properties checks. Now enable all profiles with !prop
if (propName != null && propName.startsWith("!")) {
profile.active = true;
......@@ -364,13 +364,28 @@ public class MavenArtifactVersion {
log.warn("Broken dependency reference: " + groupId + ":" + artifactId);
continue;
}
MavenArtifactDependency.Scope scope = MavenArtifactDependency.Scope.COMPILE;
MavenArtifactDependency dmInfo = findDependencyManagement(groupId, artifactId);
// Resolve scope
MavenArtifactDependency.Scope scope = null;
String scopeName = XMLUtils.getChildElementBody(dep, "scope");
if (!CommonUtils.isEmpty(scopeName)) {
scope = MavenArtifactDependency.Scope.valueOf(scopeName.toUpperCase(Locale.ENGLISH));
}
boolean optional = CommonUtils.getBoolean(XMLUtils.getChildElementBody(dep, "optional"), false);
if (scope == null && dmInfo != null) {
scope = dmInfo.getScope();
}
if (scope == null) {
scope = MavenArtifactDependency.Scope.COMPILE;
}
String optionalString = XMLUtils.getChildElementBody(dep, "optional");
boolean optional = optionalString == null ?
(dmInfo != null && dmInfo.isOptional()) :
CommonUtils.getBoolean(optionalString);
// Resolve version
String version = evaluateString(XMLUtils.getChildElementBody(dep, "version"));
if (depManagement && scope == MavenArtifactDependency.Scope.IMPORT) {
......@@ -394,8 +409,8 @@ public class MavenArtifactVersion {
} else if (depManagement || (!optional && includesScope(scope))) {
// TODO: maybe we should include optional or PROVIDED
if (version == null) {
version = findDependencyVersion(monitor, groupId, artifactId);
if (version == null && dmInfo != null) {
version = dmInfo.getVersion();
}
if (version == null) {
log.error("Can't resolve artifact [" + groupId + ":" + artifactId + "] version. Skip.");
......@@ -437,13 +452,13 @@ public class MavenArtifactVersion {
scope == MavenArtifactDependency.Scope.PROVIDED*/;
}
private String findDependencyVersion(DBRProgressMonitor monitor, String groupId, String artifactId) {
private MavenArtifactDependency findDependencyManagement(String groupId, String artifactId) {
for (MavenProfile profile : profiles) {
if (profile.isActive() && profile.dependencyManagement != null) {
for (MavenArtifactDependency dmArtifact : profile.dependencyManagement) {
if (dmArtifact.getGroupId().equals(groupId) &&
dmArtifact.getArtifactId().equals(artifactId)) {
return dmArtifact.getVersion();
return dmArtifact;
}
}
}
......@@ -451,13 +466,13 @@ public class MavenArtifactVersion {
// Check in imported BOMs
if (imports != null) {
for (MavenArtifactVersion i : imports) {
String dependencyVersion = i.findDependencyVersion(monitor, groupId, artifactId);
if (dependencyVersion != null) {
return dependencyVersion;
MavenArtifactDependency dependencyManagement = i.findDependencyManagement(groupId, artifactId);
if (dependencyManagement != null) {
return dependencyManagement;
}
}
}
return parent == null ? null : parent.findDependencyVersion(monitor, groupId, artifactId);
return parent == null ? null : parent.findDependencyManagement(groupId, artifactId);
}
private String evaluateString(String value) {
......
......@@ -249,9 +249,9 @@ class DriverDownloadAutoPage extends DriverDownloadPage {
@Override
public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
List<DBPDriverLibrary> files = getWizard().getDependencies().getLibraryList();
for (int i = 0, filesSize = files.size(); i < filesSize; ) {
DBPDriverLibrary lib = files.get(i);
List<DBPDriverDependencies.DependencyNode> nodes = getWizard().getDependencies().getLibraryList();
for (int i = 0, filesSize = nodes.size(); i < filesSize; ) {
DBPDriverLibrary lib = nodes.get(i).library;
int result = IDialogConstants.OK_ID;
try {
lib.downloadLibraryFile(monitor, false, "Download " + (i + 1) + "/" + filesSize);
......
......@@ -33,11 +33,13 @@ public interface DBPDriverDependencies
public final DependencyNode owner;
public final DBPDriverLibrary library;
public final List<DependencyNode> dependencies = new ArrayList<>();
public final int depth;
public boolean duplicate;
public DependencyNode(DependencyNode owner, DBPDriverLibrary library) {
this.owner = owner;
this.library = library;
this.depth = owner == null ? 0 : owner.depth + 1;
}
@Override
......@@ -46,7 +48,7 @@ public interface DBPDriverDependencies
}
}
List<DBPDriverLibrary> getLibraryList();
List<DependencyNode> getLibraryList();
List<DependencyNode> getLibraryMap();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册