使用问题导航器显示许多Jira问题

用户名

我的问题类似于“使用问题导航器显示Jira问题”,但我担心的是,有时我的问题列表很长,并且仅当我的链接短于URL的最大长度时,才能向用户提供指向问题导航器的链接。

还有另一种方法吗?饼干?发布数据?也许可以通过编程方式动态创建和共享过滤器,并返回指向使用该过滤器的问题导航器的链接?(但是在某些时候,我想删除这些过滤器,这样我周围就不会有那么多东西了。)

我确实有JQL查询来获取相同的问题列表,但是运行需要非常(非常)长时间,并且我的代码已经完成了寻找结果的工作-我不希望用户等待两次以等待同一件事(一次,当我生成我的时髦图形servlet视图时,一次,当他们希望在问题导航器中看到相同的结果时)。

斯科特·达德利

实现此目的的最简单方法是确保将问题列表缓存在您的应用程序组件之一中的某个位置。每个单独的问题列表都应使用magicKey您自己定义的唯一ID(以下称为ID 进行标识

然后,您将编写自己的JQL函数,该函数通过该魔术键查找预先计算的问题列表,然后将问题列表转换为“问题导航器”所需的格式。

buildUriEncodedJqlQuery()方法可用于动态创建这样的示例JQL查询。例如,如果魔术键是1234,它将产生以下JQL查询:issue in myJqlFunction(1234)

然后,您将向用户提供一个类似于以下内容的URL:

String url = "/secure/IssueNavigator.jspa?mode=hide&reset=true&jqlQuery=" + MyJqlFunction.buildUriEncodedJqlQuery(magicKey);

最终结果是,该用户将被放置在“问题导航器”中,准确查看您的代码已提供的问题列表。

该代码还专门防止用户将JQL函数保存为已保存的过滤器的一部分,因为它假定应用程序中的问题缓存不会是永久的。如果那是不正确的,您将需要清空sanitiseOperand部分。

在atlassian-plugins.xml中:

<jql-function key="myJqlFunction" name="My JQL Function" 
              class="com.mycompany.MyJqlFunction">
</jql-function>

JQL功能:

import com.atlassian.crowd.embedded.api.User;
import com.atlassian.jira.JiraDataType;
import com.atlassian.jira.JiraDataTypes;
import com.atlassian.jira.jql.operand.QueryLiteral;
import com.atlassian.jira.jql.query.QueryCreationContext;
import com.atlassian.jira.plugin.jql.function.ClauseSanitisingJqlFunction;
import com.atlassian.jira.plugin.jql.function.JqlFunction;
import com.atlassian.jira.plugin.jql.function.JqlFunctionModuleDescriptor;
import com.atlassian.jira.util.MessageSet;
import com.atlassian.jira.util.MessageSetImpl;
import com.atlassian.jira.util.NotNull;
import com.atlassian.query.clause.TerminalClause;
import com.atlassian.query.operand.FunctionOperand;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MyJqlFunction implements JqlFunction, ClauseSanitisingJqlFunction
{
    private static final String JQL_FUNCTION_NAME = "myJqlFunctionName";
    private static final int JQL_FUNCTION_MIN_ARG_COUNT = 1;
    private static final int JQL_FUNCTION_MAGIC_KEY_INDEX = 0;

    public MyJqlFunction()
    {
        // inject your app's other components here
    }

    @Override
    public void init(@NotNull JqlFunctionModuleDescriptor moduleDescriptor)
    {
    }

    @Override
    public JiraDataType getDataType()
    {
        return JiraDataTypes.ISSUE;
    }

    @Override
    public String getFunctionName()
    {
        return JQL_FUNCTION_NAME;
    }

    @Override
    public int getMinimumNumberOfExpectedArguments()
    {
        return JQL_FUNCTION_MIN_ARG_COUNT;
    }

    @Override
    public boolean isList()
    {
        return true;
    }

    /**
     * This function generates a URL-escaped JQL query that corresponds to the supplied magic key.
     * 
     * @param magicKey
     * @return
     */
    public static String buildUriEncodedJqlQuery(String magicKey)
    {
        return "issue%20in%20" + JQL_FUNCTION_NAME + "(%22"
                + magicKey + "%22%)";
    }

    @Override
    public List<QueryLiteral> getValues(@NotNull QueryCreationContext queryCreationContext,
                                        @NotNull FunctionOperand operand,
                                        @NotNull TerminalClause terminalClause)
    {
        User searchUser = queryCreationContext.getUser();

        MessageSet messages = new MessageSetImpl();

        List<QueryLiteral> values = internalGetValues(searchUser,
                operand,
                terminalClause,
                messages,
                !queryCreationContext.isSecurityOverriden());

        return values;
    }


    private List<QueryLiteral> internalGetValues(@NotNull User searchUser,
                                                 @NotNull FunctionOperand operand,
                                                 @NotNull TerminalClause terminalClause,
                                                 @NotNull MessageSet messages,
                                                 @NotNull Boolean checkSecurity)
    {
        List<QueryLiteral> result = new ArrayList<QueryLiteral>();

        if (searchUser==null)
        {
            // handle anon user
        }

        List<String> args = operand.getArgs();

        if (wasSanitised(args))
        {
            messages.addErrorMessage("this function can't be used as part of a saved filter etc");
            return result;
        }

        if (args.size() < getMinimumNumberOfExpectedArguments())
        {
            messages.addErrorMessage("too few arguments, etc");
            return result;
        }

        final String magicKey = args.get(JQL_FUNCTION_MAGIC_KEY_INDEX);


        // You need to implement this part yourself! This is where you use the supplied
        // magicKey to fetch a list of issues from your own internal data source.

        List<String> myIssueKeys = myCache.get(magicKey);

        for (String id : myIssueKeys)
        {
            result.add(new QueryLiteral(operand, id));
        }

        return result;
    }

    @Override
    public MessageSet validate(User searcher, @NotNull FunctionOperand operand, @NotNull TerminalClause terminalClause)
    {
        MessageSet messages = new MessageSetImpl();
        internalGetValues(searcher, operand, terminalClause, messages, true);
        return messages;
    }

    @Override
    public FunctionOperand sanitiseOperand(User paramUser, @NotNull FunctionOperand operand)
    {
        // prevent the user from saving this as a filter, since the results are presumed to be dynamic

        return new FunctionOperand(operand.getName(), Arrays.asList(""));
    }

    private boolean wasSanitised(List<String> args)
    {
        return (args.size() == 0 || args.get(JQL_FUNCTION_MAGIC_KEY_INDEX).isEmpty());
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

导航器IOS问题

来自分类Dev

使用导航器问题在页面之间导航

来自分类Dev

堆栈导航器导航选项对齐问题

来自分类Dev

测试在Xcode的问题导航器中消失

来自分类Dev

使用Jira创建问题

来自分类Dev

正确显示导航的问题

来自分类Dev

如何使用Vaadin导航器显示CustomComponent?

来自分类Dev

Xcode:如何从问题导航器临时隐藏黄色警告

来自分类Dev

我的导航器在类组件中出现问题

来自分类Dev

Xcode 无法单击问题导航器中的错误

来自分类Dev

如何在Xcode问题导航器中折叠所有问题

来自分类Dev

有没有一种方法可以在运行应用程序时不自动显示问题导航器?

来自分类Dev

无法使用REST API更新jira问题

来自分类Dev

使用Python从Jira获取链接问题

来自分类Dev

使用Java删除JIRA中的问题

来自分类Dev

使用JRJC搜索获取JIRA问题属性

来自分类Dev

如何使用 jira-python 创建问题

来自分类Dev

导航问题

来自分类Dev

导航按钮问题中显示的模式视图

来自分类Dev

Geb在空的导航器上使用导航器方法

来自分类Dev

在本机中使用抽屉导航器和堆栈导航器

来自分类Dev

重命名JIRA问题

来自分类Dev

SQL查询JIRA问题

来自分类Dev

与 JIRA python 连接的问题

来自分类Dev

highcharts xaxis导航器未显示

来自分类Dev

使用导航栏时的IQKeyboardManager问题

来自分类Dev

使用jQuery创建导航栏:背景问题

来自分类Dev

使用浮点图显示问题

来自分类Dev

使用显示的问题:内联块