Добавляем коробочное условие в веб айтем в плагине Jira Server/Data Center, который использует atlassian scanner

В этой статье я расскажу о том, как добавить коробочное условие в веб айтем в плагине для Jira Server/Data Center, который использует spring scanner.

Если Вы в своих плагинах не используйте spring scanner, проблем у Вас не будет.

Проблема

Я сделал плагин для Jira Server/Data Center.

Затем я добавил web-item в atlassian-plugin.xml

<web-item name="my-web-item" i18n-name-key="my--web--item.name" key="my--web--item" section="operations-operations" weight="1000">
    <description key="my--web--item.description">The my-web-item Plugin</description>  
    <label key="my--web--item.label"></label>
    <condition class="com.atlassian.jira.plugin.webfragment.conditions.IsAdminCondition"/>
    <link linkId="my--web--item-link">google.com</link> 
  </web-item>

Этот код позволяет мне добавить пункт меню my-web-item в меню More на экране просмотра тикета в Jira:

А также я добавил условине, которое позволяет видеть этот пункт меню только админам. Вот эта строчка в файле atlassian-plugin.xml file:

<condition class="com.atlassian.jira.plugin.webfragment.conditions.IsAdminCondition"/>

Вы можете посмотреть полный код для этой части вот здесь.

Запускаем приложение.

И оно не устанавливается вот с такой ошибкой:

Caused by: java.lang.ClassNotFoundException: com.atlassian.jira.plugin.webfragment.conditions.IsAdminCondition not found by ru.matveev.alexey.atlassian.jira.condition.tutorial.jira-springscanner-webitem-condition-tutorial [231]

Пофиксим.

Фиксим ClassNotFoundException

Для того, чтобы исправить эту ошибку нам нужно добавить com.atlassian.jira.plugin.webfragment.conditions в import-package в файле pom.xml.

Теперь import-package выглядит вот так:

<Import-Package>
com.atlassian.jira.plugin.webfragment.conditions,
org.springframework.osgi.*;resolution:="optional",
org.eclipse.gemini.blueprint.*;resolution:="optional",
*
</Import-Package>

Запустим снова.

Теперь другая ошибка:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.atlassian.jira.security.JiraAuthenticationContext' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

Это означает, что условие, добавленное в пункт меню, не смогло получить необходимые бины.

Чтобы пофиксить эту ошибку есть два способа: создать бин, который заинжектит эти бины, и использовать osgi:reference.

Метод 1: добавляем бин, который инжектит нужные бины

Нам нужно заинжектить вот такие бины: JiraAuthenticationContext и GlobalPermissionService.

Поэтому я создал вот такой файл src/main/java/ru/matveev/alexey/atlassian/jira/condition/tutorial/impl/BeanInjecter.java:

@Named
public class BeanInjecter {

    @Inject
    public BeanInjecter(@ComponentImport JiraAuthenticationContext jiraAuthenticationContext,
                        @ComponentImport GlobalPermissionManager globalPermissionManager) {
    }

}

Здесь мы просто инжектим необходимые бины.

Полный код для этой части можно взять здесь.

Запускаем приложение и оно работает.

Метод 2: osgi:reference

Другой метод это использовать osgi:reference в файле src/main/resources/META-INF/spring/plugin-context.xml.

Я удали файл BeanInjecter.java, который создал выше. Он нам больше не нужен.

Я добавил в import-package в pom.xml пакет com.atlassian.jira.security.

И внес изменения в файл src/main/resources/META-INF/spring/plugin-context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:osgi="http://www.springframework.org/schema/osgi"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:atlassian-scanner="http://www.atlassian.com/schema/atlassian-scanner/2"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.atlassian.com/schema/atlassian-scanner/2/
        http://www.atlassian.com/schema/atlassian-scanner/2/atlassian-scanner.xsd
        http://www.springframework.org/schema/osgi/spring-osgi.xsd">
    <atlassian-scanner:scan-indexes/>
    <osgi:reference id="globalPermissionManager"
                    interface="com.atlassian.jira.security.GlobalPermissionManager"/>

    <osgi:reference id="jiraAuthenticationContext"
                    interface="com.atlassian.jira.security.JiraAuthenticationContext"/>

</beans>

Что я там поменял?

Я добавил xmlns:osgi=”http://www.springframework.org/schema/osgi&#8221; и http://www.springframework.org/schema/osgi/spring-osgi.xsd, чтобы работать с osgi и затем импортнул два необходимых бина:

 <osgi:reference id="globalPermissionManager"
                    interface="com.atlassian.jira.security.GlobalPermissionManager"/>

    <osgi:reference id="jiraAuthenticationContext"
                    interface="com.atlassian.jira.security.JiraAuthenticationContext"/>

Вот и все.

Полный код для этой части вы можете найти здесь.

Запускаем приложение и все работает.

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Leave a Reply

%d bloggers like this:

Spelling error report

The following text will be sent to our editors: