Skip to content

Commit

Permalink
show versionless feature for config element quickfix
Browse files Browse the repository at this point in the history
Signed-off-by: Arun Venmany <[email protected]>
  • Loading branch information
arunvenmany-ibm committed Feb 5, 2025
1 parent 01ad3da commit cb4215b
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
import java.util.Set;
import java.util.logging.Logger;

import io.openliberty.tools.langserver.lemminx.data.LibertyRuntime;
import io.openliberty.tools.langserver.lemminx.services.SettingsService;
import io.openliberty.tools.langserver.lemminx.util.LibertyUtils;
import org.eclipse.lemminx.commons.BadLocationException;
import org.eclipse.lemminx.commons.CodeActionFactory;
import org.eclipse.lemminx.commons.TextDocument;
Expand Down Expand Up @@ -63,7 +66,10 @@ public void doCodeAction(ICodeActionRequest request, List<CodeAction> codeAction
Diagnostic diagnostic = request.getDiagnostic();
DOMDocument document = request.getDocument();
TextDocument textDocument = document.getTextDocument();

LibertyRuntime runtimeInfo = LibertyUtils.getLibertyRuntimeInfo(document);
String libertyVersion = runtimeInfo == null ? null : runtimeInfo.getRuntimeVersion();
String libertyRuntime = runtimeInfo == null ? null : runtimeInfo.getRuntimeType();
final int requestDelay = SettingsService.getInstance().getRequestDelay();
LibertyWorkspace ws = LibertyProjectsManager.getInstance().getWorkspaceFolder(document.getDocumentURI());
FeatureListGraph featureGraph = null;
if (ws == null) {
Expand All @@ -90,6 +96,12 @@ public void doCodeAction(ICodeActionRequest request, List<CodeAction> codeAction
ArrayList<String> sortedFeatures = new ArrayList<String>();
sortedFeatures.addAll(featureCandidates);
Collections.sort(sortedFeatures);
// get existing platforms from the document
List<String> existingPlatforms = FeatureService.getInstance()
.collectExistingPlatforms(document, "");
// find versionless features for all versioned features in the document
Set<String> possibleVersionlessFeatures = FeatureService.getInstance()
.getVersionLessFeaturesForVersioned(sortedFeatures, libertyRuntime, libertyVersion, requestDelay, document.getDocumentURI());

String insertText = "";
int referenceRangeStart = 0;
Expand Down Expand Up @@ -137,6 +149,16 @@ public void doCodeAction(ICodeActionRequest request, List<CodeAction> codeAction
}
insertText = IndentUtil.formatText(insertText, indent, referenceRange.getStart().getCharacter());

// adding version less feature
for (String feature : possibleVersionlessFeatures) {
Set<String> allPlatforms = FeatureService.getInstance().getAllPlatformsForVersionLessFeature(feature, libertyVersion, libertyRuntime, requestDelay, document.getDocumentURI());
if (allPlatforms.containsAll(existingPlatforms)) {
String title = "Add feature " + feature;
codeActions.add(CodeActionFactory.insert(
title, referenceRange.getEnd(),
String.format(insertText, feature), textDocument, diagnostic));
}
}
for (String feature : sortedFeatures) {
String title = "Add feature " + feature;
codeActions.add(CodeActionFactory.insert(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -755,4 +755,26 @@ public List<String> collectExistingPlatforms(DOMDocument document, String curren
}
return includedPlatforms;
}

/**
* get version less feature list for specified list of versioned features
* @param versionedFeatureNames list of versioned feature names
* @param libertyRuntime librty runtime
* @param libertyVersion runtime version
* @param requestDelay request delay
* @param documentURI server xml document uri
* @return version less feature list
*/
public Set<String> getVersionLessFeaturesForVersioned(List<String> versionedFeatureNames, String libertyRuntime, String libertyVersion,int requestDelay, String documentURI) {
FeaturesAndPlatforms featuresAndPlatforms = getFeaturesAndPlatforms( libertyVersion,libertyRuntime, requestDelay, documentURI);
Set<String> featureNames = featuresAndPlatforms.getPublicFeatures().stream()
.filter(feature -> feature.getWlpInformation() != null)
.map(feature -> feature.getWlpInformation().getShortName().toLowerCase())
.collect(Collectors.toSet());

return versionedFeatureNames.stream()
.map(LibertyUtils::stripVersion)
.filter(feature -> featureNames.contains(feature.toLowerCase()))
.collect(Collectors.toSet());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1082,6 +1082,61 @@ public void testConfigElementSameNameAsVersionlessFeatureNoDiagnostics() throws

@Test
public void testConfigElementSameNameAsVersionlessFeatureWithDiagnosticsAndCodeAction() throws BadLocationException {
String configElement = "<mpMetrics authentication=\"false\"></mpMetrics>";
String serverXML = String.join(newLine,
"<server description=\"Sample Liberty server\">",
" <featureManager>",
" <platform>javaee-7.0</platform>",
" </featureManager>",
configElement,
"</server>"
);
Diagnostic diagnostic = new Diagnostic();
diagnostic.setRange(r(4, 0, 4, 46));
diagnostic.setCode(LibertyDiagnosticParticipant.MISSING_CONFIGURED_FEATURE_CODE);
diagnostic.setMessage(LibertyDiagnosticParticipant.MISSING_CONFIGURED_FEATURE_MESSAGE);

XMLAssert.testDiagnosticsFor(serverXML, null, null, sampleserverXMLURI, diagnostic);
diagnostic.setSource("mpMetrics");

List<String> featuresToAdd = new ArrayList<>();
// here javaee-7.0 platform is specified , which is not valid for mpMetrics
// hence versionless feature is not shown
featuresToAdd.add("mpMetrics-1.0");
featuresToAdd.add("mpMetrics-1.1");
featuresToAdd.add("mpMetrics-2.0");
featuresToAdd.add("mpMetrics-2.2");
featuresToAdd.add("mpMetrics-2.3");
featuresToAdd.add("mpMetrics-3.0");
featuresToAdd.add("mpMetrics-4.0");
featuresToAdd.add("mpMetrics-5.0");
featuresToAdd.add("mpMetrics-5.1");

Collections.sort(featuresToAdd);

List<CodeAction> codeActions = new ArrayList<>();
for (String nextFeature: featuresToAdd) {
String addFeature = String.format("%s<feature>%s</feature>",System.lineSeparator(),nextFeature);
TextEdit texted = te(2, 39, 2, 39, addFeature);
CodeAction invalidCodeAction = ca(diagnostic, texted);

TextDocumentEdit textDoc = tde(sampleserverXMLURI, 0, texted);
WorkspaceEdit workspaceEdit = new WorkspaceEdit(Collections.singletonList(Either.forLeft(textDoc)));

invalidCodeAction.setEdit(workspaceEdit);
codeActions.add(invalidCodeAction);
}

// diagnostic with code action expected
XMLAssert.testCodeActionsFor(serverXML, sampleserverXMLURI, diagnostic, (String) null,
codeActions.get(0), codeActions.get(1), codeActions.get(2),
codeActions.get(3), codeActions.get(4), codeActions.get(5),
codeActions.get(6), codeActions.get(7), codeActions.get(8)
);
}

@Test
public void testConfigElementDiagnosticsAndCodeActionWithVersionless() throws BadLocationException {
String configElement = "<mpMetrics authentication=\"false\"></mpMetrics>";
String serverXML = String.join(newLine,
"<server description=\"Sample Liberty server\">",
Expand All @@ -1096,10 +1151,12 @@ public void testConfigElementSameNameAsVersionlessFeatureWithDiagnosticsAndCodeA
diagnostic.setCode(LibertyDiagnosticParticipant.MISSING_CONFIGURED_FEATURE_CODE);
diagnostic.setMessage(LibertyDiagnosticParticipant.MISSING_CONFIGURED_FEATURE_MESSAGE);

XMLAssert.testDiagnosticsFor(serverXML, null, null, sampleserverXMLURI,diagnostic);
XMLAssert.testDiagnosticsFor(serverXML, null, null, sampleserverXMLURI, diagnostic);
diagnostic.setSource("mpMetrics");

List<String> featuresToAdd = new ArrayList<String>();
// show version less feature name since microprofile platform is added
featuresToAdd.add("mpMetrics");
featuresToAdd.add("mpMetrics-1.0");
featuresToAdd.add("mpMetrics-1.1");
featuresToAdd.add("mpMetrics-2.0");
Expand Down Expand Up @@ -1129,7 +1186,7 @@ public void testConfigElementSameNameAsVersionlessFeatureWithDiagnosticsAndCodeA
XMLAssert.testCodeActionsFor(serverXML, sampleserverXMLURI, diagnostic, (String) null,
codeActions.get(0), codeActions.get(1), codeActions.get(2),
codeActions.get(3), codeActions.get(4), codeActions.get(5),
codeActions.get(6), codeActions.get(7), codeActions.get(8)
codeActions.get(6), codeActions.get(7), codeActions.get(8), codeActions.get(9)
);
}
}

0 comments on commit cb4215b

Please sign in to comment.