[maven] [IDEA-376310] add xmlns:xsi attribute on quickfix

GitOrigin-RevId: 07b9e826a1b5d1a737305b972c8782a478966c2c
This commit is contained in:
Alexander Bubenchikov
2025-07-31 10:51:28 +00:00
committed by intellij-monorepo-bot
parent cf4be5bdc3
commit 625a719b35
3 changed files with 69 additions and 6 deletions
@@ -12,7 +12,7 @@ import org.jetbrains.idea.maven.model.MavenConstants.MAVEN_4_XLMNS
import org.jetbrains.idea.maven.model.MavenConstants.MAVEN_4_XSD
import org.jetbrains.idea.maven.project.MavenProjectBundle
internal class UpdateXmlsTo410 : LocalQuickFix {
class UpdateXmlsTo410 : LocalQuickFix {
override fun getName(): String {
return MavenProjectBundle.message("maven.project.updating.model.command.name", "modelVersion")
}
@@ -24,7 +24,11 @@ internal class UpdateXmlsTo410 : LocalQuickFix {
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
val rootTag = findProjectTag(descriptor) ?: return
val xmlnsXsi = rootTag.getAttribute("xmlns:xsi")
rootTag.setAttribute("xmlns", MAVEN_4_XLMNS)
if (xmlnsXsi == null) {
rootTag.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
}
rootTag.setAttribute("xsi:schemaLocation", "$MAVEN_4_XLMNS $MAVEN_4_XSD")
val modelVersion = rootTag.findSubTags("modelVersion")
if (modelVersion.isNotEmpty()) {
@@ -13,7 +13,6 @@ import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.readAction
import com.intellij.openapi.application.writeAction
import com.intellij.openapi.command.executeCommand
import com.intellij.openapi.components.service
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.progress.Cancellation.checkCancelled
import com.intellij.openapi.progress.runBlockingMaybeCancellable
@@ -44,7 +43,6 @@ import org.jetbrains.idea.maven.project.MavenProject
import org.jetbrains.idea.maven.project.MavenProjectBundle
import org.jetbrains.idea.maven.project.MavenProjectsManager
import org.jetbrains.idea.maven.utils.MavenCoroutineScopeProvider
import org.jetbrains.idea.maven.utils.MavenLog
import java.nio.file.Path
import java.util.concurrent.CompletableFuture
import java.util.function.Consumer
@@ -211,9 +209,12 @@ class UpdateVersionQuickFix(val path: Path) : BuildIssueQuickFix {
if (modelVersion.exists()) {
modelVersion.stringValue = MavenConstants.MODEL_VERSION_4_1_0
}
val rootTag = psiFile.document?.rootTag
rootTag?.setAttribute("xmlns", NEW_XMLNS)
rootTag?.setAttribute("xsi:schemaLocation", NEW_SCHEMA_LOCATION)
val rootTag = psiFile.document?.rootTag ?: return@executeCommand
if (rootTag.getAttribute("xmlns:xsi") == null) {
rootTag.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
}
rootTag.setAttribute("xmlns", NEW_XMLNS)
rootTag.setAttribute("xsi:schemaLocation", NEW_SCHEMA_LOCATION)
}
documentManager.doPostponedOperationsAndUnblockDocument(document)
@@ -0,0 +1,58 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.idea.maven.quickfixes
import com.intellij.codeInspection.ProblemDescriptor
import com.intellij.openapi.application.readAction
import com.intellij.openapi.command.writeCommandAction
import com.intellij.psi.xml.XmlFile
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase
import kotlinx.coroutines.runBlocking
import org.jetbrains.idea.maven.buildtool.quickfix.UpdateXmlsTo410
import org.jetbrains.idea.maven.model.MavenConstants
import org.jetbrains.idea.maven.model.MavenConstants.MAVEN_4_XLMNS
import org.jetbrains.idea.maven.model.MavenConstants.MAVEN_4_XSD
import org.mockito.Mockito.mock
import org.mockito.Mockito.`when`
class UpdateXmlsTo410Test : LightJavaCodeInsightFixtureTestCase() {
private lateinit var quickFix: UpdateXmlsTo410
override fun setUp() {
super.setUp()
quickFix = UpdateXmlsTo410()
}
override fun runInDispatchThread(): Boolean {
return false
}
fun testUpdateMavenXmlTo410() = runBlocking {
val xmlContent = """
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
</project>
""".trimIndent()
val xmlFile = myFixture.configureByText("pom.xml", xmlContent) as XmlFile
val projectTag = readAction { xmlFile.document?.rootTag }
val descriptor = mock(ProblemDescriptor::class.java)
`when`(descriptor.psiElement).thenReturn(projectTag)
writeCommandAction(project, quickFix.name) {
quickFix.applyFix(project, descriptor)
}
readAction {
val updatedProjectTag = xmlFile.document?.rootTag
assertEquals(MavenConstants.MAVEN_4_XLMNS, updatedProjectTag?.getAttribute("xmlns")?.value)
assertEquals("http://www.w3.org/2001/XMLSchema-instance", updatedProjectTag?.getAttribute("xmlns:xsi")?.value)
assertEquals("$MAVEN_4_XLMNS $MAVEN_4_XSD", updatedProjectTag?.getAttribute("xsi:schemaLocation")?.value)
assertEquals(MavenConstants.MODEL_VERSION_4_1_0,
updatedProjectTag?.findFirstSubTag("modelVersion")?.value?.text)
}
}
}