Skip to content

Commit df3c116

Browse files
nburnwal09noopur2507
authored andcommitted
Quick fix to add available version for Imported packages
1 parent 12fa5d0 commit df3c116

11 files changed

Lines changed: 149 additions & 26 deletions

File tree

ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/builders/BundleErrorReporter.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1517,7 +1517,11 @@ private void validateImportPackageVersion(IHeader header, ManifestElement elemen
15171517
String version = element.getAttribute(Constants.VERSION_ATTRIBUTE);
15181518
int severity = CompilerFlags.getFlag(fProject, CompilerFlags.P_MISSING_VERSION_IMP_PKG);
15191519
if (severity != CompilerFlags.IGNORE && version == null) {
1520-
VirtualMarker marker = report(NLS.bind(PDECoreMessages.BundleErrorReporter_MissingVersion, element.getValue()), getPackageLine(header, element), severity, PDEMarkerFactory.CAT_OTHER);
1520+
VirtualMarker marker = report(
1521+
NLS.bind(PDECoreMessages.BundleErrorReporter_MissingVersion, element.getValue()),
1522+
getPackageLine(header, element), severity, PDEMarkerFactory.M_MISSINGVERSION_IMPORT_PACKAGE,
1523+
PDEMarkerFactory.CAT_OTHER);
1524+
marker.setAttribute("pkgName", element.getValue()); //$NON-NLS-1$
15211525
addMarkerAttribute(marker,PDEMarkerFactory.compilerKey, CompilerFlags.P_MISSING_VERSION_IMP_PKG);
15221526
}
15231527
validateVersionAttribute(header, element, true);

ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/builders/PDEMarkerFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ public class PDEMarkerFactory {
8080
public static final int M_SINGLETON_DIR_CHANGE = 0x1033; // other problem
8181
public static final int M_MISSINGVERSION_REQ_BUNDLE = 0x1034; // other
8282
// problem
83+
public static final int M_MISSINGVERSION_IMPORT_PACKAGE = 0x1035; // other
84+
// problem
8385

8486
// build properties fixes
8587
public static final int B_APPEND_SLASH_FOLDER_ENTRY = 0x2001;

ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/util/ManifestUtils.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import java.util.List;
2929
import java.util.Map;
3030
import java.util.Map.Entry;
31-
import java.util.Optional;
3231
import java.util.function.Consumer;
3332
import java.util.jar.Attributes;
3433
import java.util.jar.JarFile;
@@ -67,8 +66,6 @@
6766
import org.osgi.framework.Filter;
6867
import org.osgi.framework.FrameworkUtil;
6968
import org.osgi.framework.InvalidSyntaxException;
70-
import org.osgi.framework.Version;
71-
import org.osgi.framework.VersionRange;
7269
import org.osgi.framework.namespace.ExecutionEnvironmentNamespace;
7370
import org.osgi.resource.Namespace;
7471
import org.osgi.resource.Requirement;
@@ -399,16 +396,6 @@ public static void parseRequiredEEsFromFilter(String eeFilter, Consumer<String>
399396
}
400397
}
401398

402-
public static Optional<VersionRange> createConsumerRequirementRange(Version version) {
403-
if (version != null && !Version.emptyVersion.equals(version)) {
404-
return Optional.ofNullable(new VersionRange(VersionRange.LEFT_CLOSED, //
405-
new Version(version.getMajor(), version.getMinor(), 0), //
406-
new Version(version.getMajor() + 1, 0, 0), //
407-
VersionRange.RIGHT_OPEN));
408-
}
409-
return Optional.empty();
410-
}
411-
412399
/**
413400
* Return the value of "Eclipse-SourceReferences" in MANIFEST.MF from the
414401
* given bundle.

ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/util/VersionUtil.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package org.eclipse.pde.internal.core.util;
1616

1717
import java.util.Comparator;
18+
import java.util.Optional;
1819

1920
import org.eclipse.core.runtime.IStatus;
2021
import org.eclipse.core.runtime.Status;
@@ -120,4 +121,14 @@ public static String computeInitialPluginVersion(String version) {
120121
return version;
121122
}
122123

124+
public static Optional<VersionRange> createConsumerRequirementRange(Version version) {
125+
if (version != null && !Version.emptyVersion.equals(version)) {
126+
return Optional.ofNullable(new VersionRange(VersionRange.LEFT_CLOSED, //
127+
new Version(version.getMajor(), version.getMinor(), 0), //
128+
new Version(version.getMajor() + 1, 0, 0), //
129+
VersionRange.RIGHT_OPEN));
130+
}
131+
return Optional.empty();
132+
}
133+
123134
}

ui/org.eclipse.pde.core/text/org/eclipse/pde/internal/core/text/bundle/ImportPackageObject.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import org.eclipse.pde.internal.core.PDEState;
2525
import org.eclipse.pde.internal.core.bundle.BundlePluginBase;
2626
import org.eclipse.pde.internal.core.ibundle.IBundleModel;
27-
import org.eclipse.pde.internal.core.util.ManifestUtils;
27+
import org.eclipse.pde.internal.core.util.VersionUtil;
2828
import org.osgi.framework.Constants;
2929
import org.osgi.framework.VersionRange;
3030

@@ -33,7 +33,7 @@ public class ImportPackageObject extends PackageObject {
3333
private static final long serialVersionUID = 1L;
3434

3535
private static String getVersion(ExportPackageDescription desc) {
36-
return ManifestUtils.createConsumerRequirementRange(desc.getVersion()).map(VersionRange::toString).orElse(null);
36+
return VersionUtil.createConsumerRequirementRange(desc.getVersion()).map(VersionRange::toString).orElse(null);
3737
}
3838

3939
public ImportPackageObject(ManifestHeader header, ManifestElement element, String versionAttribute) {

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3453,6 +3453,7 @@ public class PDEUIMessages extends NLS {
34533453
public static String ProjectUpdateChange_convert_build_to_bnd;
34543454
public static String ProjectUpdateChange_set_pde_preference;
34553455

3456-
public static String AddMatchingVersion_RequireBundle;
3456+
public static String AddMatchingVersion;
3457+
public static String AddMatchingVersionDescription;
34573458

34583459
}

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/correction/ResolutionGenerator.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,13 @@ public IMarkerResolution[] getNonConfigSevResolutions(IMarker marker) {
154154
new UpdateCorrectHeaderName(AbstractPDEMarkerResolution.RENAME_TYPE, marker) };
155155
case PDEMarkerFactory.M_MISSINGVERSION_REQ_BUNDLE:
156156
return new IMarkerResolution[] {
157-
new VersionMatchResolution(AbstractPDEMarkerResolution.CREATE_TYPE, marker) };
157+
new VersionMatchRequireBundleResolution(AbstractPDEMarkerResolution.CREATE_TYPE, marker) };
158158
case PDEMarkerFactory.M_NO_SPACE_AFTER_COLON:
159159
return new IMarkerResolution[] {
160160
new AddSpaceBeforeValue(AbstractPDEMarkerResolution.CREATE_TYPE, marker) };
161+
case PDEMarkerFactory.M_MISSINGVERSION_IMPORT_PACKAGE:
162+
return new IMarkerResolution[] {
163+
new VersionMatchImportPackageResolution(AbstractPDEMarkerResolution.CREATE_TYPE, marker) };
161164
}
162165
return NO_RESOLUTIONS;
163166
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025, 2025 IBM Corporation and others.
3+
*
4+
* This program and the accompanying materials
5+
* are made available under the terms of the Eclipse Public License 2.0
6+
* which accompanies this distribution, and is available at
7+
* https://www.eclipse.org/legal/epl-2.0/
8+
*
9+
* SPDX-License-Identifier: EPL-2.0
10+
*
11+
* Contributors:
12+
* IBM Corporation - initial API and implementation
13+
*******************************************************************************/
14+
15+
package org.eclipse.pde.internal.ui.correction;
16+
17+
import java.util.Objects;
18+
import java.util.Optional;
19+
20+
import org.eclipse.core.resources.IMarker;
21+
import org.eclipse.osgi.service.resolver.BundleDescription;
22+
import org.eclipse.osgi.service.resolver.ExportPackageDescription;
23+
import org.eclipse.pde.core.plugin.IPluginModelBase;
24+
import org.eclipse.pde.core.plugin.PluginRegistry;
25+
import org.eclipse.pde.internal.core.text.bundle.Bundle;
26+
import org.eclipse.pde.internal.core.text.bundle.BundleModel;
27+
import org.eclipse.pde.internal.core.text.bundle.ImportPackageHeader;
28+
import org.eclipse.pde.internal.core.text.bundle.ImportPackageObject;
29+
import org.eclipse.pde.internal.core.util.VersionUtil;
30+
import org.eclipse.pde.internal.ui.PDEUIMessages;
31+
import org.osgi.framework.Constants;
32+
import org.osgi.framework.Version;
33+
import org.osgi.framework.VersionRange;
34+
35+
/**
36+
* Resolution to add available matching version for Imported package in MANIFEST
37+
*/
38+
public class VersionMatchImportPackageResolution extends AbstractManifestMarkerResolution {
39+
40+
public VersionMatchImportPackageResolution(int type, IMarker marker) {
41+
super(type, marker);
42+
}
43+
44+
public Version getVersion(Object inputElement) {
45+
IPluginModelBase[] models = PluginRegistry.getActiveModels();
46+
Version highest = null;
47+
for (IPluginModelBase pluginModel : models) {
48+
BundleDescription desc = pluginModel.getBundleDescription();
49+
50+
String id = desc == null ? null : desc.getSymbolicName();
51+
if (id == null) {
52+
continue;
53+
}
54+
ExportPackageDescription[] exported = desc.getExportPackages();
55+
for (ExportPackageDescription exportedPackage : exported) {
56+
String name = exportedPackage.getName();
57+
if (("java".equals(name) || name.startsWith("java."))) { //$NON-NLS-1$ //$NON-NLS-2$
58+
// $NON-NLS-2$
59+
continue;
60+
}
61+
if (name.equals(inputElement.toString())) {
62+
Version ver = exportedPackage.getVersion();
63+
if (ver != null) {
64+
if (highest == null || ver.compareTo(highest) > 0) {
65+
highest = ver;
66+
}
67+
}
68+
}
69+
}
70+
}
71+
return highest;
72+
}
73+
74+
@Override
75+
protected void createChange(BundleModel model) {
76+
String pkgName = Objects.requireNonNull(marker.getAttribute("pkgName", (String) null)); //$NON-NLS-1$
77+
Bundle bundle = (Bundle) model.getBundle();
78+
ImportPackageHeader header = (ImportPackageHeader) bundle.getManifestHeader(Constants.IMPORT_PACKAGE);
79+
if (header != null) {
80+
for (ImportPackageObject importPackage : header.getPackages()) {
81+
if (pkgName.equals(importPackage.getName())) {
82+
Version version = getVersion(pkgName);
83+
if (version == null) {
84+
return;
85+
}
86+
// Sanitize version: Remove a potential qualifier
87+
Optional<VersionRange> versionRange = VersionUtil.createConsumerRequirementRange(version);
88+
importPackage.setVersion(versionRange.map(VersionRange::toString).orElse(null));
89+
}
90+
}
91+
}
92+
}
93+
94+
@Override
95+
public String getLabel() {
96+
return PDEUIMessages.AddMatchingVersion;
97+
}
98+
99+
@Override
100+
public String getDescription() {
101+
return PDEUIMessages.AddMatchingVersionDescription;
102+
}
103+
104+
105+
}

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/correction/VersionMatchResolution.java renamed to ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/correction/VersionMatchRequireBundleResolution.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package org.eclipse.pde.internal.ui.correction;
1616

1717
import java.util.Objects;
18+
import java.util.Optional;
1819

1920
import org.eclipse.core.resources.IMarker;
2021
import org.eclipse.pde.core.plugin.IPluginModelBase;
@@ -26,12 +27,14 @@
2627
import org.eclipse.pde.internal.core.util.VersionUtil;
2728
import org.eclipse.pde.internal.ui.PDEUIMessages;
2829
import org.osgi.framework.Constants;
30+
import org.osgi.framework.Version;
31+
import org.osgi.framework.VersionRange;
2932

3033
/**
3134
* Resolution to add available matching version for Required bundles in MANIFEST
3235
*/
33-
public class VersionMatchResolution extends AbstractManifestMarkerResolution {
34-
public VersionMatchResolution(int type, IMarker marker) {
36+
public class VersionMatchRequireBundleResolution extends AbstractManifestMarkerResolution {
37+
public VersionMatchRequireBundleResolution(int type, IMarker marker) {
3538
super(type, marker);
3639
}
3740

@@ -47,8 +50,9 @@ protected void createChange(BundleModel model) {
4750
if (modelBase != null) {
4851
String version = modelBase.getPluginBase().getVersion();
4952
// Sanitize version: Remove a potential qualifier
50-
version = VersionUtil.computeInitialPluginVersion(version);
51-
requiredBundle.setVersion(version);
53+
Optional<VersionRange> versionRange = VersionUtil
54+
.createConsumerRequirementRange(new Version(version));
55+
requiredBundle.setVersion(versionRange.map(VersionRange::toString).orElse(null));
5256
}
5357
}
5458
}
@@ -57,7 +61,12 @@ protected void createChange(BundleModel model) {
5761

5862
@Override
5963
public String getLabel() {
60-
return PDEUIMessages.AddMatchingVersion_RequireBundle;
64+
return PDEUIMessages.AddMatchingVersion;
65+
}
66+
67+
@Override
68+
public String getDescription() {
69+
return PDEUIMessages.AddMatchingVersionDescription;
6170
}
6271

6372
}

ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/correction/java/JavaResolutionFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
import org.eclipse.pde.internal.core.text.bundle.ExportPackageObject;
5252
import org.eclipse.pde.internal.core.text.bundle.ImportPackageHeader;
5353
import org.eclipse.pde.internal.core.text.bundle.ImportPackageObject;
54-
import org.eclipse.pde.internal.core.util.ManifestUtils;
54+
import org.eclipse.pde.internal.core.util.VersionUtil;
5555
import org.eclipse.pde.internal.ui.PDEPlugin;
5656
import org.eclipse.pde.internal.ui.PDEPluginImages;
5757
import org.eclipse.pde.internal.ui.PDEUIMessages;
@@ -195,7 +195,7 @@ protected void modifyModel(IBaseModel model, IProgressMonitor monitor) throws Co
195195
}
196196
BundleDescription requiredBundle = getChangeObject();
197197
String pluginId = requiredBundle.getSymbolicName();
198-
VersionRange versionRange = ManifestUtils
198+
VersionRange versionRange = VersionUtil
199199
.createConsumerRequirementRange(requiredBundle.getVersion()).orElse(null);
200200
IPluginImport[] imports = base.getPluginBase().getImports();
201201
if (!isUndo()) {

0 commit comments

Comments
 (0)