大家好!在本文中,我们将继续讨论为SIL开发我们自己的功能。上一篇文章可以在这里阅读。SIL的主要优点之一是,用SIL编写的代码将可在所有Jira版本上使用,因此我们需要使自定义函数也能正常工作。从sil-extension-archetype创建一个插件
克隆原型:git clone https://alex1mmm@bitbucket.org/alex1mmm/sil-extension-archetype.git --branch v1 --single-branch
将原型安装在本地存储库中,然后从该原型创建一个插件。有关如何执行此操作的更多详细信息,请参见此处。添加SIL服务
为了使我们的功能在不同版本的Jira之间可移植,我们将使用SIL提供的服务。那些。我们将通过SIL Java Api将调用代理到Jira Java API。但是您如何知道SIL提供哪些服务?我们将安装SIL并转到以下地址:localhost:2990 / jira / plugins / servlet / upm / osgi您将在Jira中看到有关所有插件的OSGI信息:
我们将在KATL Commons列表中找到该插件并打开已注册的服务:
JMUserServices,JMProjectServices是导出的服务锡现在我们知道可以使用哪些SIL服务,通过服务的名称,我们可以猜测其目的。让我们看看创建的插件中的代码
现在我们知道向我们提供哪些服务。让我们在插件中使用它们。BeanService.java
@Named
public class BeanService {
@Getter
private final KIssueService kIssueService;
@Getter
private final ClassLoaderService classLoaderService;
@Getter
private final CurrentUserHelper currentUserHelper;
@Getter
private final JMIssueSearchServices jmIssueSearchServices;
@Getter
private final UserHelper userHelper;
@Getter
private final JMIssueServices jmIssueServices;
@Inject
public BeanService(@ComponentImport KIssueService kIssueService,
@ComponentImport CurrentUserHelper currentUserHelper,
@ComponentImport JMIssueSearchServices jmIssueSearchServices,
@ComponentImport UserHelper userHelper,
@ComponentImport JMIssueServices jmIssueServices,
ClassLoaderService classLoaderService) {
this.kIssueService = kIssueService;
this.classLoaderService = classLoaderService;
this.currentUserHelper = currentUserHelper;
this.jmIssueSearchServices = jmIssueSearchServices;
this.userHelper = userHelper;
this.jmIssueServices = jmIssueServices;
}
}
此类包含我们将用于功能的所有服务。我创建了一个单独的此类,以免在每个函数中重复对服务的调用。让我们看一下这些行:@Getter
private final KIssueService kIssueService;
吸气剂这是一个Lombok批注,它为kIssueService属性创建了一个get方法。我们为使用的每个服务创建类属性。接下来,我们通过构造函数获取这些服务。 public BeanService(@ComponentImport KIssueService kIssueService,
@ComponentImport CurrentUserHelper currentUserHelper,
@ComponentImport JMIssueSearchServices jmIssueSearchServices,
@ComponentImport UserHelper userHelper,
@ComponentImport JMIssueServices jmIssueServices,
ClassLoaderService classLoaderService) {
this.kIssueService = kIssueService;
this.classLoaderService = classLoaderService;
this.currentUserHelper = currentUserHelper;
this.jmIssueSearchServices = jmIssueSearchServices;
this.userHelper = userHelper;
this.jmIssueServices = jmIssueServices;
}
做完了将BeanService Bean添加到ESLauncher类,并将该Bean传递给我们的函数:
private final BeanService beanService;
@Inject
public ESLauncher(@ComponentImport EventPublisher eventPublisher,
PluginInfoService pluginInfoService,
@ComponentImport CommonPluginConfigurationService commonPluginConfigurationService,
@ComponentImport HostConfigurationProvider hostConfigurationProvider,
@ClasspathComponent PluginConfigurationServiceImpl pluginConfigurationService,
BeanService beanService)
{
super(eventPublisher, pluginInfoService, hostConfigurationProvider, pluginConfigurationService);
log.error("eslauncher constructor");
this.beanService = beanService;
}
@Override
public void doAtLaunch() {
super.doAtLaunch();
log.error("eslauncher doatlaunch");
RoutineRegistry.register(new SayHello( beanService,"SayHello"));
RoutineRegistry.register(new SayHello2( beanService,"SayHello2"));
RoutineRegistry.register(new SayHello3( beanService,"SayHello3"));
}
现在,我们可以在函数中使用BeanService了。SayHello.java
在SayHello.java中,我们将创建一个函数,该函数将接受用户的电子邮件地址,检查运行管理员脚本的用户,删除该用户使用传输的电子邮件地址创建的所有票证。当然,我们可以在不编写自己的函数的情况下执行此逻辑。SIL代码如下所示:function deleteIssueForUser(string userEmail) {
if (isUserInGroup("jira-administrators", currentUserKey())) {
string[] issues = selectIssues("reporter = " + currentUserKey());
for (string issue in issues) {
deleteIssue(issue);
}
}
}
deleteIssueForUser("user@email.com");
但是我想举一个小例子,说明工作的基本原理。这是课程文本:@Slf4j
public class SayHello extends AbstractSILRoutine<MutableString> {
private static final SILType[][] types = {{ TypeInst.STRING }};
private final BeanService beanService;
public SayHello(BeanService beanService, String name) {
super(beanService.getClassLoaderService().getPluginClassLoader(), name, types);
this.beanService = beanService;
}
@Override
public SILType<MutableString> getReturnType() {
return TypeInst.STRING;
}
@Override
protected SILValue<MutableString> runRoutine(SILContext silContext, List<SILValue<?>> list) {
SILValue param = list.get(0);
String userEmail = param.toStringValue();
KIssueService kIssueService = beanService.getKIssueService();
CurrentUserHelper currentUserHelper = beanService.getCurrentUserHelper();
JMIssueSearchServices jmIssueSearchServices = beanService.getJmIssueSearchServices();
UserHelper userHelper = beanService.getUserHelper();
JMIssueServices jmIssueServices = beanService.getJmIssueServices();
ApplicationUser requestedUser = userHelper.getUserByEmail(userEmail);
if (currentUserHelper.isUserAdministrator()) {
SearchService.ParseResult parseResult = jmIssueSearchServices.getSearchService().parseQuery(requestedUser, "reporter = " + requestedUser.getKey());
List<Issue> issues = (List<Issue>) kIssueService.searchIssues(requestedUser, parseResult.getQuery());
issues.stream().forEach(issue -> kIssueService.deindexIssue(jmIssueServices.getIssueManager().getIssueByCurrentKey(issue.getKey())));
}
return SILValueFactory.string( "issues deleted");
}
@Override
public String getParams() {
return "(userEmail)";
}
}
我们在runRoutine方法中实现逻辑: @Override
protected SILValue<MutableString> runRoutine(SILContext silContext, List<SILValue<?>> list) {
SILValue param = list.get(0);
String userEmail = param.toStringValue();
KIssueService kIssueService = beanService.getKIssueService();
CurrentUserHelper currentUserHelper = beanService.getCurrentUserHelper();
JMIssueSearchServices jmIssueSearchServices = beanService.getJmIssueSearchServices();
UserHelper userHelper = beanService.getUserHelper();
JMIssueServices jmIssueServices = beanService.getJmIssueServices();
ApplicationUser requestedUser = userHelper.getUserByEmail(userEmail);
if (currentUserHelper.isUserAdministrator()) {
SearchService.ParseResult parseResult = jmIssueSearchServices.getSearchService().parseQuery(requestedUser, "reporter = " + requestedUser.getKey());
List<Issue> issues = (List<Issue>) kIssueService.searchIssues(requestedUser, parseResult.getQuery());
issues.stream().forEach(issue -> kIssueService.deindexIssue(jmIssueServices.getIssueManager().getIssueByCurrentKey(issue.getKey())));
}
return SILValueFactory.string( "issues deleted");
}
我对代码发表了评论。KIssueFieldsService服务
我想单独谈谈这项服务。在SIL中,在您要传输自定义字段的所有方法中,我们都可以以customfield_NNNNN格式或字段别名传输字段名称或字段标识符。如果我们不使用SIL服务,那么我们将不得不自己实现此逻辑。但是,使用KIssueFieldsService服务时,我们仅需一行即可使用此功能:CustomField customField= this.kIssueFieldsService.getCustomField(customFieldName);
现在,您知道如何创建可在Jira版本之间移植的SIL函数。