Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

show versionless feature for config element quickfix #344

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 version less features for all versioned features in the sorted features
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());

// for each versionless features that has at least one matching platform to a specified platform in the document
for (String feature : possibleVersionlessFeatures) {
Set<String> allPlatforms = FeatureService.getInstance().getAllPlatformsForVersionLessFeature(feature, libertyVersion, libertyRuntime, requestDelay, document.getDocumentURI());
if (allPlatforms.stream().anyMatch(existingPlatforms::contains)) {
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)
);
}
}