Как перемещаться или создавать класс по веб-ссылке с помощью JetBrains Toolbox - PullRequest
1 голос
/ 06 марта 2020

Я работаю над интеграцией TestRail и IntelliJ IDEA с помощью моего Chrome расширения для автоматизации тестирования в моей компании.

Теперь у меня есть возможность переходить от тестового примера (TestRail) к класс (IntelliJ IDEA) следующим образом:

jetbrains://idea/navigate/reference?project=automation&fqn=ru.company.qa.project.S125.C579

Но я не могу создать класс, если он не существует.

Может ли JetBrains Toolbox сделать это по ссылке?

БЫСТРОЕ РЕШЕНИЕ

Добавьте класс:

package ru.qa.summer.scene.plugin.navigation;

import com.intellij.ide.util.PsiNavigationSupport;
import com.intellij.openapi.application.JBProtocolCommand;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import ru.qa.summer.scene.plugin.util.SceneUtil;
import ru.qa.summer.support.data.FileAccessObject;
import ru.qa.summer.support.exceptions.AccessException;

import java.io.File;
import java.util.Map;

import static com.intellij.ide.impl.ProjectUtil.getOpenProjects;
import static com.intellij.openapi.vfs.VfsUtil.findFileByIoFile;
import static java.lang.Integer.parseInt;
import static java.lang.String.join;

public class JBProtocolNavigateOrCreateSceneCommand extends JBProtocolCommand {
    private static final String TARGET_NAME = "reference";
    private static final String PROJECT_NAME_KEY = "project";
    private static final String PATH_TO_SRC_NAME_KEY = "path-to-src";
    private static final String FILE_EXTENSION_NAME_KEY = "file-extension";
    private static final String FQN_NAME_KEY = "fqn";
    private static final String TOLERANCE_NAME_KEY = "tolerance";

    public JBProtocolNavigateOrCreateSceneCommand() {
        super("navigate-or-create-scene");
    }

    @Override
    public void perform(String target, @NotNull Map<String, String> parameters) {
        if (!target.equals(TARGET_NAME)) {
            return;
        }
        if (!parameters.containsKey(PROJECT_NAME_KEY) || !parameters.containsKey(PATH_TO_SRC_NAME_KEY)
                || !parameters.containsKey(FQN_NAME_KEY) || !parameters.containsKey(FILE_EXTENSION_NAME_KEY)) {
            return;
        }
        String projectName = parameters.get(PROJECT_NAME_KEY);
        for (Project project : getOpenProjects()) {
            if (project.getName().equals(projectName)) {
                performForProject(project, parameters);
                return;
            }
        }
    }

    private void performForProject(Project project, Map<String, String> parameters) {
        String path = parameters.get(PATH_TO_SRC_NAME_KEY);
        String fqn = parameters.get(FQN_NAME_KEY);
        String fileExtension = parameters.get(FILE_EXTENSION_NAME_KEY);
        int tolerance = parameters.containsKey(TOLERANCE_NAME_KEY) ? parseInt(parameters.get(TOLERANCE_NAME_KEY)) : 0;
        File ioFile = buildIoFile(project, path, fqn, fileExtension);
        if (ioFile.exists() && ioFile.isFile()) {
            navigate(project, findFileByIoFile(ioFile, true));
        } else {
            navigate(project, createFile(ioFile, fqn, tolerance));
        }
    }

    private File buildIoFile(Project project, String path, String fqn, String fileExtension) {
        String[] toClass = fqn.split("\\.");
        toClass[toClass.length - 1] += "." + fileExtension;
        return new File(new File(project.getBasePath(), path).getAbsolutePath(), join("/", toClass));
    }

    private VirtualFile createFile(File ioFile, String fqn, int tolerance) {
        int i = tolerance + 1;
        File ioFileCursor = ioFile.getParentFile();
        do {
            if (ioFileCursor == null) {
                break;
            }
            if (ioFileCursor.exists() && ioFileCursor.isDirectory()) {
                try {
                    new FileAccessObject(ioFile).save(SceneUtil.createSceneClassTemplate(fqn));
                    return findFileByIoFile(ioFile, true);
                } catch (AccessException e) {
                    return null;
                }
            }
            ioFileCursor = ioFileCursor.getParentFile();
            i -= 1;
        } while (i > 0);
        return null;
    }

    private void navigate(Project project, VirtualFile file) {
        if (file != null && file.isValid()) {
            PsiNavigationSupport.getInstance().createNavigatable(project, file, 0).navigate(true);
        }
    }
}

Добавьте расширение к вашему плагину:

<extensions defaultExtensionNs="com.intellij">
        <jbProtocolCommand implementation="ru.qa.summer.scene.plugin.navigation.JBProtocolNavigateOrCreateSceneCommand"/>
</extensions>

Это решение позволяет перемещаться или создайте файл как:

jetbrains://idea/navigate-or-create-scene/reference?project=automation&path-to-src=project/src/test/java&fqn=ru.company.qa.project.S269.C1289&file-extension=java&tolerance=1

1 Ответ

1 голос
/ 06 марта 2020

Проверьте этот ответ для деталей реализации этой функции.

В настоящее время нет реализации JBProtocolCommand, которая создала бы файл класса. Можно расширить его с помощью плагина. Если вы хотите создать такой плагин и у вас есть вопросы, пожалуйста, опубликуйте их здесь .

...