我的问题类似于“使用问题导航器显示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] 删除。
我来说两句