[Gradle] on mvn dependency paste into build.gradle it is converted to gradle one

This commit is contained in:
Yaroslav Lepenkin
2016-08-12 15:28:39 +03:00
parent 67322aee63
commit 830875a43b
3 changed files with 240 additions and 0 deletions
+2
View File
@@ -155,6 +155,8 @@
key="multiple.repository.urls" groupKey="group.names.probable.bugs" groupBundle="messages.InspectionsBundle" enabledByDefault="true" level="WARNING"
implementationClass="org.jetbrains.plugins.gradle.codeInspection.MultipleRepositoryUrlsInspection"/>
<copyPastePreProcessor implementation="org.jetbrains.plugins.gradle.action.PasteMvnDependencyPreProcessor"/>
</extensions>
<extensions defaultExtensionNs="org.intellij.groovy">
@@ -0,0 +1,127 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.plugins.gradle.action;
import com.intellij.codeInsight.editorActions.CopyPastePreProcessor;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.RawText;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import org.apache.tools.ant.filters.StringInputStream;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
public class PasteMvnDependencyPreProcessor implements CopyPastePreProcessor {
@Nullable
@Override
public String preprocessOnCopy(PsiFile file, int[] startOffsets, int[] endOffsets, String text) {
return null;
}
@NotNull
@Override
public String preprocessOnPaste(Project project, PsiFile file, Editor editor, String text, RawText rawText) {
if ("build.gradle".equals(file.getName()) && isMvnDependency(text)) {
return toGradleDependency(text);
}
return text;
}
private static String toGradleDependency(final String mavenDependency) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
try {
DocumentBuilder builder = factory.newDocumentBuilder();
try {
Document document = builder.parse(new StringInputStream(mavenDependency));
String gradleDependency = extractGradleDependency(document);
return gradleDependency != null ? gradleDependency : mavenDependency;
}
catch (SAXException | IOException e) {
}
}
catch (ParserConfigurationException e) {
}
return mavenDependency;
}
@Nullable
private static String extractGradleDependency(Document document) {
String groupId = getGroupId(document);
String artifactId = getArtifactId(document);
String version = getVersion(document);
String scope = getScope(document);
if (groupId.isEmpty() || artifactId.isEmpty() || version.isEmpty()) {
return null;
}
return scope + "'" + groupId + ":" + artifactId + ":" + version + "'";
}
private static String getScope(@NotNull Document document) {
String scope = firstOrEmpty(document.getElementsByTagName("scope"));
switch (scope) {
case "test":
scope = "testCompile ";
break;
case "compile":
case "runtime":
scope += " ";
break;
default:
scope = "";
}
return scope;
}
private static String getVersion(@NotNull Document document) {
return firstOrEmpty(document.getElementsByTagName("version"));
}
private static String getArtifactId(@NotNull Document document) {
return firstOrEmpty(document.getElementsByTagName("artifactId"));
}
private static String getGroupId(@NotNull Document document) {
return firstOrEmpty(document.getElementsByTagName("groupId"));
}
private static String firstOrEmpty(@NotNull NodeList list) {
Node first = list.item(0);
return first != null ? first.getTextContent() : "";
}
private static boolean isMvnDependency(String text) {
String trimmed = text.trim();
if (trimmed.startsWith("<dependency>") && trimmed.endsWith("</dependency>")) {
return true;
}
return false;
}
}
@@ -0,0 +1,111 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.plugins.gradle.codeInsight.actions;
import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.IdeActions;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.openapi.editor.actionSystem.EditorActionManager;
import com.intellij.testFramework.LightCodeInsightTestCase;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class MvnDependencyPasteTest extends LightCodeInsightTestCase {
public void testPastedGradleDependency() throws Exception {
configureFromFileText("pom.xml", getDependency("group", "artifact", "1.0", "runtime", null));
selectWholeFile();
performCut();
configureGradleFile();
performPaste();
checkResultByText("dependencies {\n" +
" runtime 'group:artifact:1.0'\n" +
"}");
}
public void test_DoNotConvertIfCoordinatesNotClear() throws Exception {
String noArtifact = getDependency("group", null, "1.0", "runtime", null);
configureFromFileText("pom.xml", noArtifact);
selectWholeFile();
performCut();
configureGradleFile();
performPaste();
checkResultByText("dependencies {\n" +
" <dependency>\n" +
" <groupId>group</groupId>\n" +
" <version>1.0</version>\n" +
" <scope>runtime</scope>\n" +
"</dependency>\n" +
"}");
}
@NotNull
private static String getDependency(@Nullable String groupId,
@Nullable String artifactId,
@Nullable String version,
@Nullable String scope,
@Nullable String type) {
String dependency = "<dependency>\n";
if (groupId != null) {
dependency += " <groupId>" + groupId + "</groupId>\n";
}
if (artifactId != null) {
dependency += " <artifactId>" + artifactId + "</artifactId>\n";
}
if (version != null) {
dependency += " <version>" + version + "</version>\n";
}
if (scope != null) {
dependency += " <scope>" + scope + "</scope>\n";
}
if (type != null) {
dependency += " <type>" + type + "</type>\n";
}
dependency += "</dependency>";
return dependency;
}
private static void configureGradleFile() {
configureFromFileText("build.gradle",
"dependencies {\n" +
" <caret>\n" +
"}");
}
private static void selectWholeFile() {
Document document = getEditor().getDocument();
getEditor().getSelectionModel().setSelection(0, document.getTextLength());
}
private static void performCut() {
EditorActionManager actionManager = EditorActionManager.getInstance();
EditorActionHandler actionHandler = actionManager.getActionHandler(IdeActions.ACTION_EDITOR_CUT);
actionHandler.execute(getEditor(), null, DataManager.getInstance().getDataContextFromFocus().getResultSync());
}
private static void performPaste() {
EditorActionManager actionManager = EditorActionManager.getInstance();
EditorActionHandler actionHandler = actionManager.getActionHandler(IdeActions.ACTION_EDITOR_PASTE);
actionHandler.execute(getEditor(), null, DataManager.getInstance().getDataContextFromFocus().getResultSync());
}
}