Skip to content

Commit 79b126c

Browse files
HannesWelllaeubi
authored andcommitted
[APITools] Handle multiple version correct when obtaining prerequisites
ApiBaseline.getPrerequisiteComponents() didn't consider multiple versions of a component. Besides fixing that, this also unifies and simplifies the handling of multiple versions.
1 parent c15a2f5 commit 79b126c

File tree

5 files changed

+56
-60
lines changed

5 files changed

+56
-60
lines changed

apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/ApiBaselineManager.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.util.ArrayList;
2424
import java.util.Arrays;
2525
import java.util.Collections;
26-
import java.util.HashSet;
2726
import java.util.List;
2827
import java.util.Map;
2928
import java.util.Map.Entry;
@@ -381,14 +380,14 @@ private Document getProfileXML(IApiBaseline baseline) throws CoreException {
381380
Element celement = null;
382381
IApiComponent[] components = baseline.getApiComponents();
383382
for (IApiComponent component : components) {
384-
Set<IApiComponent> allComponentSet = new HashSet<>();
383+
Set<IApiComponent> allComponentSet;
385384
// if the baseline has multiple versions, persist all versions
386385
Set<IApiComponent> multipleComponents = baseline.getAllApiComponents(component.getSymbolicName());
387386
if (multipleComponents.isEmpty()) {
388387
// no multiple version - add the current component
389-
allComponentSet.add(component);
388+
allComponentSet = Set.of(component);
390389
} else {
391-
allComponentSet.addAll(multipleComponents);
390+
allComponentSet = multipleComponents;
392391
}
393392
for (IApiComponent iApiComponent : allComponentSet) {
394393
if (!iApiComponent.isSystemComponent()) {
@@ -399,8 +398,6 @@ private Document getProfileXML(IApiBaseline baseline) throws CoreException {
399398
root.appendChild(celement);
400399
}
401400
}
402-
// clear the temporary hashset
403-
allComponentSet.clear();
404401
}
405402
return document;
406403
}

apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ApiAnalysisBuilder.java

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -895,22 +895,9 @@ void buildAll(IApiBaseline baseline, IApiBaseline wbaseline, IProgressMonitor mo
895895
localMonitor.subTask(NLS.bind(BuilderMessages.building_workspace_profile, currentproject.getName()));
896896
localMonitor.split(1);
897897
String id = currentModel.getBundleDescription().getSymbolicName();
898+
Version version = currentModel.getBundleDescription().getVersion();
898899
// Compatibility checks
899-
IApiComponent apiComponent = wbaseline.getApiComponent(id);
900-
Set<IApiComponent> apiComponentMultiple = wbaseline.getAllApiComponents(id);
901-
if (!apiComponentMultiple.isEmpty()) {
902-
// add the exact match
903-
for (IApiComponent iApiComponent : apiComponentMultiple) {
904-
Version workspaceBaselineVersion = new Version(iApiComponent.getVersion());// removes
905-
// qualifier
906-
Version currentProjectVersion = currentModel.getBundleDescription().getVersion();
907-
if (new Version(currentProjectVersion.getMajor(), currentProjectVersion.getMinor(),
908-
currentProjectVersion.getMicro()).compareTo(workspaceBaselineVersion) == 0) {
909-
apiComponent = iApiComponent;
910-
break;
911-
}
912-
}
913-
}
900+
IApiComponent apiComponent = wbaseline.getApiComponent(id, version);
914901
if (apiComponent != null) {
915902
if (getAnalyzer() instanceof BaseApiAnalyzer) {
916903
((BaseApiAnalyzer) getAnalyzer()).checkBaselineMismatch(baseline, wbaseline);

apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IncrementalApiBuilder.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -263,20 +263,8 @@ void build(final IProject project, final IApiBaseline baseline, final IApiBaseli
263263
IPluginModelBase currentModel = this.builder.getCurrentModel();
264264
if (currentModel != null) {
265265
String id = currentModel.getBundleDescription().getSymbolicName();
266-
IApiComponent comp = wbaseline.getApiComponent(id);
267-
Set<IApiComponent> apiComponentMultiple = wbaseline.getAllApiComponents(id);
268-
if (!apiComponentMultiple.isEmpty()) {
269-
// add the exact match
270-
for (IApiComponent iApiComponent : apiComponentMultiple) {
271-
Version workspaceBaselineVersion = new Version(iApiComponent.getVersion());// removes
272-
// qualifier
273-
Version currentProjectVersion = currentModel.getBundleDescription().getVersion();
274-
if (new Version(currentProjectVersion.getMajor(), currentProjectVersion.getMinor(), currentProjectVersion.getMicro()).compareTo(workspaceBaselineVersion) == 0) {
275-
comp = iApiComponent;
276-
break;
277-
}
278-
}
279-
}
266+
Version version = currentModel.getBundleDescription().getVersion();
267+
IApiComponent comp = wbaseline.getApiComponent(id, version);
280268
if (comp == null) {
281269
return;
282270
}

apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiBaseline.java

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -323,34 +323,27 @@ protected void addComponent(IApiComponent component) {
323323
return;
324324
}
325325

326-
IApiComponent comp = fComponentsById.get(component.getSymbolicName());
327-
326+
IApiComponent comp = fComponentsById.put(component.getSymbolicName(), component);
328327
// if more than 1 components, store all of them
329328
if (comp != null) {
330-
if (fAllComponentsById.containsKey(component.getSymbolicName())) {
331-
Set<IApiComponent> allComponents = fAllComponentsById.get(component.getSymbolicName());
332-
if (!allComponents.contains(component)) {
333-
allComponents.add(component);
334-
}
335-
} else {
336-
TreeSet<IApiComponent> allComponents = new TreeSet<>(
337-
(comp1, comp2) -> {
338-
if (comp2.getVersion().equals(comp1.getVersion())) {
339-
if (comp2.getVersion().contains("JavaSE")) { //$NON-NLS-1$
340-
ApiPlugin.logInfoMessage("Multiple locations for the same Java = " //$NON-NLS-1$
341-
+ comp1.getLocation() + comp2.getLocation());
329+
Set<IApiComponent> allComponents = fAllComponentsById.computeIfAbsent(component.getSymbolicName(),
330+
name -> new TreeSet<>((comp1, comp2) -> {
331+
String version2 = comp2.getVersion();
332+
String version1 = comp1.getVersion();
333+
if (version2.equals(version1)) {
334+
if (version2.contains("JavaSE")) { //$NON-NLS-1$
335+
ApiPlugin.logInfoMessage("Multiple locations for the same Java = " + comp1.getLocation() //$NON-NLS-1$
336+
+ comp2.getLocation());
337+
}
338+
return 0;
342339
}
343-
return 0;
344-
}
345-
return new Version(comp2.getVersion()).compareTo(new Version(comp1.getVersion()));
346-
});
340+
return new Version(version2).compareTo(new Version(version1));
341+
}));
342+
if (allComponents.isEmpty()) {
347343
allComponents.add(comp);
348-
allComponents.add(component);
349-
fAllComponentsById.put(component.getSymbolicName(), allComponents);
350344
}
345+
allComponents.add(component);
351346
}
352-
353-
fComponentsById.put(component.getSymbolicName(), component);
354347
if (component instanceof ProjectComponent projectApiComponent) {
355348
fComponentsByProjectNames.put(projectApiComponent.getJavaProject().getProject().getName(), component);
356349
}
@@ -670,6 +663,25 @@ public IApiComponent getApiComponent(String id) {
670663
return fComponentsById.get(id);
671664
}
672665

666+
@Override
667+
public IApiComponent getApiComponent(String id, Version version) {
668+
loadBaselineInfos();
669+
if (disposed) {
670+
return null;
671+
}
672+
IApiComponent component = fComponentsById.get(id);
673+
if (hasSameMMMVersion(version, component)) {
674+
return component;
675+
}
676+
Set<IApiComponent> allComponents = fAllComponentsById.get(id);
677+
return allComponents.stream().filter(c -> hasSameMMMVersion(version, c)).findFirst().orElse(null);
678+
}
679+
680+
private static boolean hasSameMMMVersion(Version ref, IApiComponent component) {
681+
Version v = new Version(component.getVersion());
682+
return ref.getMajor() == v.getMajor() && ref.getMinor() == v.getMinor() && ref.getMicro() == v.getMicro();
683+
}
684+
673685
@Override
674686
public Set<IApiComponent> getAllApiComponents(String id) {
675687
loadBaselineInfos();
@@ -859,9 +871,11 @@ public IApiComponent[] getPrerequisiteComponents(IApiComponent[] components) thr
859871
}
860872
}
861873
Collection<BundleDescription> dependencies = BuildDependencyCollector.collectBuildRelevantDependencies(bundles);
862-
return dependencies.stream().map(BundleDescription::getSymbolicName) //
863-
.map(id -> getApiComponent(id)).filter(Objects::nonNull) //
864-
.toArray(IApiComponent[]::new);
874+
return dependencies.stream().map(bundle -> {
875+
String id = bundle.getSymbolicName();
876+
Version version = bundle.getVersion();
877+
return getApiComponent(id, version);
878+
}).filter(Objects::nonNull).toArray(IApiComponent[]::new);
865879
}
866880

867881
/**

apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/model/IApiBaseline.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.eclipse.core.resources.IProject;
1919
import org.eclipse.core.runtime.CoreException;
2020
import org.eclipse.core.runtime.IStatus;
21+
import org.osgi.framework.Version;
2122

2223
/**
2324
* A collection of related API components that together make up an
@@ -78,6 +79,15 @@ public interface IApiBaseline extends IApiElement {
7879
*/
7980
public IApiComponent getApiComponent(String id);
8081

82+
/**
83+
* Returns the API component in this baseline with the given symbolic name and
84+
* version or <code>null</code> if none.
85+
*
86+
* @param id component symbolic name
87+
* @return API component or <code>null</code>
88+
*/
89+
public IApiComponent getApiComponent(String id, Version version);
90+
8191
/**
8292
* Returns all the API components in this baseline (sorted from higher to
8393
* lower version) with the given symbolic name or empty set if multiple

0 commit comments

Comments
 (0)