diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/quickfix/UpdateXmlsTo410.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/quickfix/UpdateXmlsTo410.kt index 2b71d5dde33e..12f455338e16 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/quickfix/UpdateXmlsTo410.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/quickfix/UpdateXmlsTo410.kt @@ -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()) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/externalSystemIntegration/output/quickfixes/Maven4ModelVersionErrorParser.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/externalSystemIntegration/output/quickfixes/Maven4ModelVersionErrorParser.kt index a7d21a25b2bd..37622d6492f5 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/externalSystemIntegration/output/quickfixes/Maven4ModelVersionErrorParser.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/externalSystemIntegration/output/quickfixes/Maven4ModelVersionErrorParser.kt @@ -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) diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/quickfixes/UpdateXmlTo410Test.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/quickfixes/UpdateXmlTo410Test.kt new file mode 100644 index 000000000000..daf0a169eb24 --- /dev/null +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/quickfixes/UpdateXmlTo410Test.kt @@ -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 = """ + + + 4.0.0 + + """.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) + } + + } +} \ No newline at end of file