Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

Jira Event Listener for Jira 7+

Hauke Hörhold
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
May 18, 2018

Hello,

I wanted to create a Jira Event Listener with this Tutorial (https://developer.atlassian.com/server/jira/platform/writing-jira-event-listeners-with-the-atlassian-event-library/), but it is outdated and the listener won't work.

I found some posts with the same topic, but nothing helps me to get the listener working. I always create some errors, because there's nowhere a step by step instruction how to do it.

Could you please help me in saying what I have to change from the above linked tutorial to get it working in Jira 7+? Or do you have a downloadable source that I can use and that is working?

I know that all component-tags must disappear in the "atlassian-plugin.xml".

But how should the "IssueCreatedResolvedListener.java" file look like? And all the files beneath that. The pom.xml and stuff?

My last try with the "IssueCreatedResolvedListener.java" was this one:

package com.example.tutorial.plugins;

import com.atlassian.event.api.EventListener;
import com.atlassian.event.api.EventPublisher;
import com.atlassian.jira.event.issue.IssueEvent;
import com.atlassian.jira.event.type.EventType;
import com.atlassian.jira.issue.Issue;
//import com.atlassian.plugin.spring.scanner.annotation.export.ExportAsService;
import com.atlassian.sal.api.lifecycle.LifecycleAware;

//import javax.inject.Named;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

/**
 * Simple JIRA listener using the atlassian-event library and demonstrating
 * plugin lifecycle integration.
 */
//@ExportAsService
@Component
//@Named("IssueCreatedResolvedListener")
public class IssueCreatedResolvedListener implements InitializingBean, DisposableBean, LifecycleAware {

    private static final Logger log = LoggerFactory.getLogger(IssueCreatedResolvedListener.class);

    private final EventPublisher eventPublisher;

    /**
     * Constructor.
     * @param eventPublisher injected {@code EventPublisher} implementation.
     */
    public IssueCreatedResolvedListener(EventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    /**
     * Called when the plugin has been enabled.
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        // register ourselves with the EventPublisher
        eventPublisher.register(this);
    }

    /**
     * Called when the plugin is being disabled or removed.
     * @throws Exception
     */
    @Override
    public void destroy() throws Exception {
        // unregister ourselves with the EventPublisher
        eventPublisher.unregister(this);
    }

    /**
     * Receives any {@code IssueEvent}s sent by JIRA.
     * @param issueEvent the IssueEvent passed to us
     */
    @EventListener
    public void onIssueEvent(IssueEvent issueEvent) {
        Long eventTypeId = issueEvent.getEventTypeId();
        Issue issue = issueEvent.getIssue();
        // if it's an event we're interested in, log it
        if (eventTypeId.equals(EventType.ISSUE_CREATED_ID)) {
            log.info("Issue {} has been created at {}.", issue.getKey(), issue.getCreated());
        } else if (eventTypeId.equals(EventType.ISSUE_RESOLVED_ID)) {
            log.info("Issue {} has been resolved at {}.", issue.getKey(), issue.getResolutionDate());
        } else if (eventTypeId.equals(EventType.ISSUE_CLOSED_ID)) {
            log.info("Issue {} has been closed at {}.", issue.getKey(), issue.getUpdated());
        }
    }

    @Override
    public void onStart() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void onStop() {
        // TODO Auto-generated method stub
        
    }
}

But it is not working.

Thank you very much. I hope that you can help me out a bit. I'm totally confused what to do here...

Best regards,

Hauke

2 answers

0 votes
karim -Atlassway-
Banned
July 29, 2019

hello @Hauke Hörhold 

Please tell me if you find a solution ; or a clear instructions.

 

Regards

Hauke Hörhold
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
July 31, 2019

I don't know exactly if this is working, because it is 1 year ago and I stopped using a listener for my needs, now I override the CreateWorklog Class.

But I think this was working Listener code:

XXXIssueEventListener:

package com.example.tutorial.plugins;

//import com.atlassian.event.api.EventPublisher;
import com.atlassian.jira.event.issue.IssueEvent;
import com.atlassian.jira.event.type.EventType;
import com.atlassian.jira.issue.Issue;
//import com.atlassian.plugin.spring.scanner.annotation.imports.JiraImport;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.DisposableBean;
//import org.springframework.beans.factory.InitializingBean;
//import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.atlassian.jira.event.issue.IssueEventListener;

@Component
public class XXXIssueEventListener implements IssueEventListener {

private static Logger log;

public XXXIssueEventListener() {
log = LoggerFactory.getLogger(XXXIssueEventListener.class);
}




@Override
public String[] getAcceptedParams() {
// TODO Auto-generated method stub
return null;
}

@Override
public String getDescription() {
// TODO Auto-generated method stub
return null;
}

@Override
public void init(Map<String, String> arg0) {
// TODO Auto-generated method stub

}

@Override
public boolean isInternal() {
// TODO Auto-generated method stub
return false;
}

@Override
public boolean isUnique() {
// TODO Auto-generated method stub
return false;
}

@Override
public void customEvent(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);

}

@Override
public void issueAssigned(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueClosed(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueCommented(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueCreated(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueDeleted(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueGenericEvent(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueMoved(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueReopened(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueResolved(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueStarted(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueStopped(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueUpdated(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void issueWorkLogged(IssueEvent arg0) {
// TODO Auto-generated method stub
this.workflowEvent(arg0);
}

@Override
public void workflowEvent(IssueEvent issueEvent) {

if (issueEvent.getEventTypeId() == EventType.ISSUE_WORKLOGGED_ID) {
Issue issue = issueEvent.getIssue();

System.out.println(issueEvent.getWorklog().getTimeSpent() / 60 );
System.out.println("Working hours updated!");
System.out.println("Issue: " + issue.getKey());
System.out.println("Bearbeitet von: " + issue.getReporter());
System.out.println("Datum: " + issue.getUpdated());
System.out.println("Stunden: " + issue.getTimeSpent());

log.info("Issue {} has been updated at {}.", issue.getKey(), issue.getCreated());
}

}

}

 

IssueCreatedResolvedListener:

package com.example.tutorial.plugins;

import com.atlassian.event.api.EventListener;
import com.atlassian.event.api.EventPublisher;
import com.atlassian.jira.event.issue.IssueEvent;
import com.atlassian.jira.event.type.EventType;
import com.atlassian.jira.issue.Issue;
import com.atlassian.plugin.spring.scanner.annotation.imports.JiraImport;

//import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
//import com.atlassian.jira.event.issue.IssueEventListener;

@Component
public class IssueCreatedResolvedListener implements InitializingBean, DisposableBean {
private static final Logger log = LoggerFactory.getLogger(IssueCreatedResolvedListener.class);

@JiraImport
private final EventPublisher eventPublisher;

@Autowired
public IssueCreatedResolvedListener(EventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}

/**
* Called when the plugin has been enabled.
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
log.info("Enabling plugin");
eventPublisher.register(this);
}

/**
* Called when the plugin is being disabled or removed.
* @throws Exception
*/
@Override
public void destroy() throws Exception {
log.info("Disabling plugin");
eventPublisher.unregister(this);
}

@EventListener
public void onIssueEvent(IssueEvent issueEvent) {
Long eventTypeId = issueEvent.getEventTypeId();
Issue issue = issueEvent.getIssue();

if (eventTypeId.equals(EventType.ISSUE_CREATED_ID)) {
System.out.println("TEST created");
log.info("Issue {} has been created at {}.", issue.getKey(), issue.getCreated());
} else if (eventTypeId.equals(EventType.ISSUE_RESOLVED_ID)) {
System.out.println("TEST ISSUE_RESOLVED_ID");
log.info("Issue {} has been resolved at {}.", issue.getKey(), issue.getResolutionDate());
} else if (eventTypeId.equals(EventType.ISSUE_CLOSED_ID)) {
System.out.println("TEST created");
log.info("Issue {} has been closed at {}.", issue.getKey(), issue.getUpdated());
} else if (eventTypeId.equals(EventType.ISSUE_UPDATED_ID)) {
System.out.println("TEST created");
log.info("Issue {} has been closed at {}.", issue.getKey(), issue.getUpdated());
}
}

}

 

And this is the pom.xml:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.tutorial.plugins</groupId>
<artifactId>new-listener-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<organization>
<name>XXX</name>
<url>http://XXX.XXX/</url>
</organization>
<name>new-listener-plugin</name>
<description>This should listen...</description>
<packaging>atlassian-plugin</packaging>
<dependencies>
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>jira-api</artifactId>
<version>${jira.version}</version>
<scope>provided</scope>
</dependency>
<!-- Add dependency on jira-core if you want access to JIRA implementation classes as well as the sanctioned API. -->
<!-- This is not normally recommended, but may be required eg when migrating a plugin originally developed against JIRA 4.x -->
<!--
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>jira-core</artifactId>
<version>${jira.version}</version>
<scope>provided</scope>
</dependency>
-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.atlassian.plugin</groupId>
<artifactId>atlassian-spring-scanner-annotation</artifactId>
<version>${atlassian.spring.scanner.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.atlassian.plugin</groupId>
<artifactId>atlassian-spring-scanner-runtime</artifactId>
<version>${atlassian.spring.scanner.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
<scope>provided</scope>
</dependency>
<!-- WIRED TEST RUNNER DEPENDENCIES -->
<dependency>
<groupId>com.atlassian.plugins</groupId>
<artifactId>atlassian-plugins-osgi-testrunner</artifactId>
<version>${plugin.testrunner.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.2-atlassian-1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.6.RELEASE</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.5</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.atlassian.maven.plugins</groupId>
<artifactId>maven-jira-plugin</artifactId>
<version>${amps.version}</version>
<extensions>true</extensions>
<configuration>
<log4jProperties>src/aps/log4j.properties</log4jProperties>
<applications>
<application>
<applicationKey>jira-software</applicationKey>
<version>${jira.version}</version>
</application>
</applications>
<productVersion>${jira.version}</productVersion>
<productDataVersion>${jira.version}</productDataVersion>
<!-- Uncomment to install TestKit backdoor in JIRA. -->
<!--
<pluginArtifacts>
<pluginArtifact>
<groupId>com.atlassian.jira.tests</groupId>
<artifactId>jira-testkit-plugin</artifactId>
<version>${testkit.version}</version>
</pluginArtifact>
</pluginArtifacts>
-->
<enableQuickReload>true</enableQuickReload>
<enableFastdev>false</enableFastdev>


<!-- OWN -->
<!-- make AMPS faster -->
<enableDevToolbox>false</enableDevToolbox>
<enablePde>false</enablePde>
<skipRestDocGeneration>true</skipRestDocGeneration>
<allowGoogleTracking>false</allowGoogleTracking>
<skipManifestValidation>true</skipManifestValidation>
<extractDependencies>false</extractDependencies>


<!-- OWN -->
<pluginArtifact>
<groupId>com.atlassian.labs.plugins</groupId>
<artifactId>quickreload</artifactId>
<version>${quick.reload.version}</version>
</pluginArtifact>



<!-- See here for an explanation of default instructions: -->
<!-- https://developer.atlassian.com/docs/advanced-topics/configuration-of-instructions-in-atlassian-plugins -->
<instructions>
<Atlassian-Plugin-Key>${atlassian.plugin.key}</Atlassian-Plugin-Key>
<!-- Add package to export here -->
<Export-Package>com.example.tutorial.plugins.api,</Export-Package>
<!-- Add package import here -->
<Import-Package>org.springframework.osgi.*;resolution:="optional", org.eclipse.gemini.blueprint.*;resolution:="optional", *</Import-Package>
<!-- Ensure plugin is spring powered -->
<Spring-Context>*</Spring-Context>
</instructions>

<atlassian.dev.mode>true</atlassian.dev.mode>

</configuration>
</plugin>
<plugin>
<groupId>com.atlassian.plugin</groupId>
<artifactId>atlassian-spring-scanner-maven-plugin</artifactId>
<version>${atlassian.spring.scanner.version}</version>
<executions>
<execution>
<goals>
<goal>atlassian-spring-scanner</goal>
</goals>
<phase>process-classes</phase>
</execution>
</executions>
<configuration>
<scannedDependencies>
<dependency>
<groupId>com.atlassian.plugin</groupId>
<artifactId>atlassian-spring-scanner-external-jar</artifactId>
</dependency>
</scannedDependencies>
<verbose>false</verbose>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<jira.version>7.7.1</jira.version>
<amps.version>6.3.15</amps.version>
<plugin.testrunner.version>1.2.3</plugin.testrunner.version>
<atlassian.spring.scanner.version>1.2.13</atlassian.spring.scanner.version>
<!-- This key is used to keep the consistency between the key in atlassian-plugin.xml and the key to generate bundle. -->
<atlassian.plugin.key>${project.groupId}.${project.artifactId}</atlassian.plugin.key>
<!-- TestKit version 6.x for JIRA 6.x -->
<testkit.version>6.3.11</testkit.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project

 

In atlassian-plugin.xml there was nothing special needed I think.

I don't know if this helps, but good luck :)

Hauke Hörhold
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
July 31, 2019

I just found another version of IssueEventListener, it should be it bit newer. Good luck with it:

XXXIssueEventListener.java:

package com.XXX.jira;

import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.event.issue.IssueEvent;
import com.atlassian.jira.event.type.EventType;
import com.atlassian.jira.issue.Issue;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.atlassian.jira.event.issue.IssueEventListener;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;

@Component
public class XXXIssueEventListener implements IssueEventListener {
private static Logger log;
private final CustomFieldManager customFieldManager;

public XXXIssueEventListener() {
log = LoggerFactory.getLogger(XXXIssueEventListener.class);
this.customFieldManager = ComponentAccessor.getCustomFieldManager();
}

@Override
public void workflowEvent(IssueEvent issueEvent) {

if (issueEvent.getEventTypeId() == EventType.ISSUE_WORKLOGGED_ID) {
Issue issue = issueEvent.getIssue();
CustomField customField = customFieldManager.getCustomFieldObject("customfield_10000");
// "customfield_10000" = "PSP-Element", siehe http://localhost:2990/jira/rest/api/2/field
Object customFieldValue = customField.getValue(issue);

System.out.println();
System.out.println("Working hours updated!");
System.out.println("Issue Name: " + issue);
System.out.println("Issue ID: " + issue.getId());
System.out.println("Bearbeitet von: " + issueEvent.getWorklog().getUpdateAuthorObject());
System.out.println("Datum: " + issueEvent.getWorklog().getUpdated());
System.out.println("Gebuchte Zeit (min): " + issueEvent.getWorklog().getTimeSpent() / 60);
System.out.println("Kommentar: " + issueEvent.getWorklog().getComment());
System.out.println("Custom Field: " + customFieldValue);

log.info("Issue {} has been updated at {}.", issue.getKey(), issue.getCreated());
}

}

@Override
public String[] getAcceptedParams() {
return null;
}
@Override
public String getDescription() {
return null;
}
@Override
public void init(Map<String, String> arg0) {
}
@Override
public boolean isInternal() {
return false;
}
@Override
public boolean isUnique() {
return false;
}
@Override
public void customEvent(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueAssigned(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueClosed(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueCommented(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueCreated(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueDeleted(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueGenericEvent(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueMoved(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueReopened(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueResolved(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueStarted(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueStopped(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueUpdated(IssueEvent arg0) {
this.workflowEvent(arg0);
}
@Override
public void issueWorkLogged(IssueEvent arg0) {
this.workflowEvent(arg0);
}

}

 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.XXX.jira</groupId>
<artifactId>listenerPlugin</artifactId>
<version>1.0</version>

<organization>
<name>XXX</name>
<url>http://www.XXX.com/</url>
</organization>

<name>listenerPlugin</name>
<description>This is the com.XXX.jira:listenerPlugin plugin for Atlassian JIRA.</description>
<packaging>atlassian-plugin</packaging>

<dependencies>
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>jira-api</artifactId>
<version>${jira.version}</version>
<scope>provided</scope>
</dependency>
<!-- Add dependency on jira-core if you want access to JIRA implementation classes as well as the sanctioned API. -->
<!-- This is not normally recommended, but may be required eg when migrating a plugin originally developed against JIRA 4.x -->
<!--
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>jira-core</artifactId>
<version>${jira.version}</version>
<scope>provided</scope>
</dependency>
-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.atlassian.plugin</groupId>
<artifactId>atlassian-spring-scanner-annotation</artifactId>
<version>${atlassian.spring.scanner.version}</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>com.atlassian.plugin</groupId>
<artifactId>atlassian-spring-scanner-runtime</artifactId>
<version>${atlassian.spring.scanner.version}</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
<scope>provided</scope>
</dependency>

<!-- WIRED TEST RUNNER DEPENDENCIES -->
<dependency>
<groupId>com.atlassian.plugins</groupId>
<artifactId>atlassian-plugins-osgi-testrunner</artifactId>
<version>${plugin.testrunner.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.2-atlassian-1</version>
</dependency>

<!-- Uncomment to use TestKit in your project. Details at https://bitbucket.org/atlassian/jira-testkit -->
<!-- You can read more about TestKit at https://developer.atlassian.com/display/JIRADEV/Plugin+Tutorial+-+Smarter+integration+testing+with+TestKit -->
<!--
<dependency>
<groupId>com.atlassian.jira.tests</groupId>
<artifactId>jira-testkit-client</artifactId>
<version>${testkit.version}</version>
<scope>test</scope>
</dependency>
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>2.5.6.SEC02</version>
<type>jar</type>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.0.5.RELEASE</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>com.atlassian.labs.plugins</groupId>
<artifactId>quickreload</artifactId>
<version>2.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>atlassian-jira-webapp</artifactId>
<version>7.7.1</version>
<type>war</type>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>com.atlassian.maven.plugins</groupId>
<artifactId>maven-jira-plugin</artifactId>
<version>${amps.version}</version>
<extensions>true</extensions>
<configuration>
<productVersion>${jira.version}</productVersion>
<productDataVersion>${jira.version}</productDataVersion>
<!-- Uncomment to install TestKit backdoor in JIRA. -->
<!--
<pluginArtifacts>
<pluginArtifact>
<groupId>com.atlassian.jira.tests</groupId>
<artifactId>jira-testkit-plugin</artifactId>
<version>${testkit.version}</version>
</pluginArtifact>
</pluginArtifacts>
-->
<enableQuickReload>true</enableQuickReload>
<enableFastdev>false</enableFastdev>

<!-- make AMPS faster -->
<enableFastdev>false</enableFastdev>
<enableDevToolbox>false</enableDevToolbox>
<enablePde>false</enablePde>
<skipRestDocGeneration>true</skipRestDocGeneration>
<allowGoogleTracking>false</allowGoogleTracking>
<skipManifestValidation>true</skipManifestValidation>
<extractDependencies>false</extractDependencies>

<pluginArtifact>
<groupId>com.atlassian.labs.plugins</groupId>
<artifactId>quickreload</artifactId>
<!--<version>${quick.reload.version}</version>-->
<version>2.0.1</version>
</pluginArtifact>

<!-- See here for an explanation of default instructions: -->
<!-- https://developer.atlassian.com/docs/advanced-topics/configuration-of-instructions-in-atlassian-plugins -->
<instructions>
<Atlassian-Plugin-Key>${atlassian.plugin.key}</Atlassian-Plugin-Key>

<!-- Add package to export here -->
<Export-Package>
com.XXX.jira.api,
</Export-Package>

<!-- Add package import here -->
<Import-Package>
org.springframework.osgi.*;resolution:="optional",
org.eclipse.gemini.blueprint.*;resolution:="optional",
*;version="0";resolution:=optional
</Import-Package>

<!-- Ensure plugin is spring powered -->
<Spring-Context>*</Spring-Context>
</instructions>
</configuration>
</plugin>

<plugin>
<groupId>com.atlassian.plugin</groupId>
<artifactId>atlassian-spring-scanner-maven-plugin</artifactId>
<version>${atlassian.spring.scanner.version}</version>
<executions>
<execution>
<goals>
<goal>atlassian-spring-scanner</goal>
</goals>
<phase>process-classes</phase>
</execution>
</executions>
<configuration>
<scannedDependencies>
<dependency>
<groupId>com.atlassian.plugin</groupId>
<artifactId>atlassian-spring-scanner-external-jar</artifactId>
</dependency>
</scannedDependencies>
<verbose>false</verbose>
</configuration>
</plugin>
</plugins>
</build>

<repositories>
<repository>
<id>atlassian</id>
<name>Atlassian Repository</name>
<url>https://maven.atlassian.com/content/groups/public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>

<pluginRepositories>
<pluginRepository>
<id>atlassian-public</id>
<url>https://m2proxy.atlassian.com/repository/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>

<properties>
<jira.version>7.7.1</jira.version>
<amps.version>6.3.15</amps.version>
<plugin.testrunner.version>1.2.3</plugin.testrunner.version>
<atlassian.spring.scanner.version>1.2.13</atlassian.spring.scanner.version>
<!-- This key is used to keep the consistency between the key in atlassian-plugin.xml and the key to generate bundle. -->
<atlassian.plugin.key>${project.groupId}.${project.artifactId}</atlassian.plugin.key>
<!-- TestKit version 6.x for JIRA 6.x -->
<testkit.version>6.3.11</testkit.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

<maven.local.repo>C:\Applications\Atlassian\atlassian-plugin-sdk-6.3.10\repository</maven.local.repo>
<confluence.version>3.3</confluence.version>
<confluence.data.version>3.1</confluence.data.version>

<quick.reload.version>2.0.1</quick.reload.version>
</properties>

</project>
karim -Atlassway-
Banned
July 31, 2019

hello @Hauke Hörhold 

Thank you very much.

 

Regards

0 votes
Hauke Hörhold
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
May 25, 2018

I tried it with this instructions using SAL: https://community.developer.atlassian.com/t/how-to-find-out-org-springframework-version-used-by-upm/1907/2

Now my Java File looks like this:

package com.mytest.listenerPlugin;

import com.atlassian.event.api.EventListener;
import com.atlassian.event.api.EventPublisher;
import com.atlassian.jira.event.issue.IssueEvent;
import com.atlassian.jira.event.type.EventType;
import com.atlassian.jira.issue.Issue;
import com.atlassian.sal.api.lifecycle.LifecycleAware;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class IssueCreatedResolvedListener implements LifecycleAware
{
        private final EventPublisher eventPublisher;
        
        private static final Logger log = LoggerFactory.getLogger(IssueCreatedResolvedListener.class);
          
        public IssueCreatedResolvedListener(final EventPublisher eventPublisher)
        {
            this.eventPublisher = eventPublisher;
        }
        
        @Override
        public void onStart()
        {
            eventPublisher.register(this);

        }

        @Override
        public void onStop()
        {
            eventPublisher.unregister(this);
        }

        @EventListener
        public void someEventFunction(IssueEvent event)
        {
            Long eventTypeId = event.getEventTypeId();
            Issue issue = event.getIssue();

            if (eventTypeId.equals(EventType.ISSUE_CREATED_ID)) {
                log.info("Issue {} has been created at {}.", issue.getKey(), issue.getCreated());
                System.out.println("iiiiiiiiiiiiiiiiiinfo: ISSUE CREATED");
            } else if (eventTypeId.equals(EventType.ISSUE_RESOLVED_ID)) {
                log.info("Issue {} has been resolved at {}.", issue.getKey(), issue.getResolutionDate());
                System.out.println("iiiiiiiiiiiiiiiiiinfo: ISSUE RESOLVED");
            } else if (eventTypeId.equals(EventType.ISSUE_CLOSED_ID)) {
                log.info("Issue {} has been closed at {}.", issue.getKey(), issue.getUpdated());
                System.out.println("iiiiiiiiiiiiiiiiiinfo: ISSUE CLOSED");
            }
        }
}

 But nothing happens here...

I've done nothing in my atlassian-plugin.xml file. Do I have to do something there?

And in my pom.xml, all I did was adding this:

         <dependency>
            <groupId>com.atlassian.sal</groupId>
            <artifactId>sal-api</artifactId>
            <version>3.0.0</version>
            <scope>provided</scope>
        </dependency>

Suggest an answer

Log in or Sign up to answer
TAGS
AUG Leaders

Atlassian Community Events