Giter Site home page Giter Site logo

ideaplugin's Introduction

Axon Framework

Maven Central Build Status SonarCloud Status

Axon Framework is a framework for building evolutionary, event-driven microservice systems based on the principles of Domain-Driven Design (DDD), Command-Query Responsibility Separation (CQRS), and Event Sourcing.

Axon Framework provides you with the necessary building blocks to follow these principles. Examples of building blocks are aggregate design handles, aggregate repositories, command buses, saga design handles, event stores, query buses, and more. The framework provides sensible defaults for all of these components out of the box.

The messaging support for commands, events, and queries is at the core of these building blocks. It is the messaging basics that enable an evolutionary approach towards microservices through the location transparency they provide.

Axon will also assist in distributing applications to support scalability or fault tolerance, for example. The most accessible and quick road forward would be to use Axon Server to seamlessly adjust message buses to distributed implementations. Axon Server provides a distributed command bus, event bus, query bus, and an efficient event store implementation for scalable event sourcing. Additionally, the Axon Framework organization has several extensions that can help in this space.

All this helps to create a well-structured application without worrying about the infrastructure. Hence, your focus can shift from non-functional requirements to your business functionality.

For more information on anything Axon, please visit our website, http://axoniq.io.

Getting started

Numerous resources can help you on your journey in using Axon Framework. A good starting point is AxonIQ Developer Portal, which provides links to resources like blogs, videos, and descriptions.

Furthermore, below are several other helpful resources:

  • The quickstart page of the documentation provides a simplified entry point into the framework with the quickstart project.
  • We have our very own academy! The introductory courses are free, followed by more in-depth (paid) courses.
  • When ready, you can quickly and easily start your very own Axon Framework based application at https://start.axoniq.io/. Note that this solution is only feasible if you want to stick to the Spring ecosphere.
  • The reference guide explains all of the components maintained within Axon Framework's products.
  • If the guide doesn't help, our forum provides a place to ask questions you have during development.
  • The hotel demo shows a fleshed-out example of using Axon Framework.
  • The code samples repository contains more in-depth samples you can benefit from.

Receiving help

Are you having trouble using any of our libraries or products? Know that we want to help you out the best we can! There are a couple of things to consider when you're traversing anything Axon:

  • Checking the reference guide should be your first stop.
  • When the reference guide does not cover your predicament, we would greatly appreciate it if you could file an issue for it.
  • Our forum provides a space to communicate with the Axon community to help you out. AxonIQ developers will help you out on a best-effort basis. And if you know how to help someone else, we greatly appreciate your contributions!
  • We also monitor Stack Overflow for any question tagged with axon. Similarly to the forum, AxonIQ developers help out on a best-effort basis.

Feature requests and issue reporting

We use GitHub's issue tracking system) for new feature requests, framework enhancements, and bugs. Before filing an issue, please verify that it's not already reported by someone else. Furthermore, make sure you are adding the issue to the correct repository!

When filing bugs:

  • A description of your setup and what's happening helps us figure out what the issue might be.
  • Do not forget to provide the versions of the Axon products you're using, as well as the language and version.
  • If possible, share a stack trace. Please use Markdown semantics by starting and ending the trace with three backticks (```).

When filing a feature or enhancement:

  • Please provide a description of the feature or enhancement at hand. Adding why you think this would be beneficial is also a great help to us.
  • (Pseudo-)Code snippets showing what it might look like will help us understand your suggestion better. Similarly as with bugs, please use Markdown semantics for code snippets, starting and ending with three backticks (```).
  • If you have any thoughts on where to plug this into the framework, that would be very helpful too.
  • Lastly, we value contributions to the framework highly. So please provide a Pull Request as well!

ideaplugin's People

Contributors

abuijze avatar andye2004 avatar codedrivenmitch avatar dependabot[bot] avatar gradle-update-robot avatar lfgcampos avatar maartenn avatar rinokadijk avatar smcvb avatar spelbergit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ideaplugin's Issues

StackOverflowError in IDEA

Basic information

  • JDK version: 17
  • Kotlin 1.9.21
  • IDEA 2023.2.5

Steps to reproduce

If Axon plugin is enabled in IDEA, the following exception shows up regularly as IDE internal error:

java.lang.StackOverflowError
	at com.intellij.psi.SingleRootFileViewProvider.getPsiInner(SingleRootFileViewProvider.java:96)
	at com.intellij.psi.AbstractFileViewProvider.getPsi(AbstractFileViewProvider.java:185)
	at com.intellij.psi.impl.file.impl.FileManagerImpl.findFile(FileManagerImpl.java:359)
	at com.intellij.psi.impl.PsiManagerImpl.findFile(PsiManagerImpl.java:156)
	at com.intellij.javascript.testFramework.JsTestFileIndexingHandler.lambda$isTestFile$0(JsTestFileIndexingHandler.java:105)
	at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:923)
	at com.intellij.openapi.application.ReadAction.compute(ReadAction.java:76)
	at com.intellij.javascript.testFramework.JsTestFileIndexingHandler.isTestFile(JsTestFileIndexingHandler.java:105)
	at com.intellij.javascript.testing.JsTestSourcesFilter.isTestSource(JsTestSourcesFilter.java:12)
	at com.intellij.openapi.roots.TestSourcesFilter.isTestSources(TestSourcesFilter.java:31)
	at com.intellij.psi.search.GlobalSearchScopesCore$ProductionScopeFilter.contains(GlobalSearchScopesCore.java:143)
	at com.intellij.psi.search.DelegatingGlobalSearchScope.contains(DelegatingGlobalSearchScope.java:46)
	at com.intellij.psi.search.GlobalSearchScope$FileTypeRestrictionScope.contains(GlobalSearchScope.java:713)
	at com.intellij.psi.search.DelegatingGlobalSearchScope.contains(DelegatingGlobalSearchScope.java:46)
	at org.jetbrains.kotlin.idea.base.projectStructure.scope.KotlinSourceFilterScope.contains(KotlinSourceFilterScope.kt:46)
	at com.intellij.util.indexing.FileBasedIndexEx.filesInScopeWithBranches(FileBasedIndexEx.java:750)
	at com.intellij.psi.stubs.StubIndexEx.processElements(StubIndexEx.java:196)
	at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:102)
	at com.intellij.psi.stubs.StubIndex.getElements(StubIndex.java:90)
	at org.jetbrains.kotlin.idea.stubindex.KotlinStringStubIndexHelper.get(KotlinStringStubIndexHelper.kt:28)
	at org.jetbrains.kotlin.idea.caches.resolve.IDEKotlinAsJavaSupport$findClassOrObjectDeclarations$1.invoke(IDEKotlinAsJavaSupport.kt:52)
	at org.jetbrains.kotlin.idea.caches.resolve.IDEKotlinAsJavaSupport$findClassOrObjectDeclarations$1.invoke(IDEKotlinAsJavaSupport.kt:51)
	at org.jetbrains.kotlin.idea.base.util.DumbModeUtils.runReadActionInSmartMode(DumbModeUtils.kt:18)
	at org.jetbrains.kotlin.idea.caches.resolve.IDEKotlinAsJavaSupport.findClassOrObjectDeclarations(IDEKotlinAsJavaSupport.kt:51)
	at org.jetbrains.kotlin.asJava.finder.JavaElementFinder.findClassesAndObjects(JavaElementFinder.kt:61)
	at org.jetbrains.kotlin.asJava.finder.JavaElementFinder.findClasses(JavaElementFinder.kt:46)
	at org.jetbrains.kotlin.asJava.finder.JavaElementFinder.findClass(JavaElementFinder.kt:35)
	at com.intellij.psi.impl.JavaPsiFacadeImpl.doFindClass(JavaPsiFacadeImpl.java:94)
	at com.intellij.psi.impl.JavaPsiFacadeImpl.findClass(JavaPsiFacadeImpl.java:72)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.inspect(AggregateStructureResolver.kt:113)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.inspect(AggregateStructureResolver.kt:115)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.inspect(AggregateStructureResolver.kt:115)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.inspect(AggregateStructureResolver.kt:115)

<snip>

The error disappears if disabling the Axon plugin.

Expected behaviour

Axon plugin should work as expected.

Actual behaviour

Plugin cannot be used in our projects anymore. It worked fine for months before.

Update to IntellIJ 2023.3

I am pretty happy with this plugin, but now it does not work, after i've update to the latest intelliJ 2023.3

Could you update the plugin, please?

thanks

PsiInvalidElementAccessException during annotation search

Expected behaviour

No exceptions during the computation of Axon annotation values.

Actual behaviour

If we take a good look at Sentry issues (AXONIQ-1R, AXONIQ-1P, AXONIQ-1Q, AXONIQ-1C, AXONIQ-1B) and analyze the stackstrace, it seems that during the computation of annotations the PsiClass has become invalid.

The annotation resolver has two caches; one on allScope, and one on the smaller axonScope. To find library annotations, the allScope is used. This computation becomes invalidates when the vcs modules change (this means libraries have been adjusted).

However, in the stacktrace we see invalid classes being used. There seems to be a race condition between the secondary computation (based on the first one) and the invalidation of the first cache.

Probable solution

Explicitly check whether all PsiClasses in the first cache are valid when retrieving the cache in the secondary computation. Note: We currently do not have a good reproducible test case and it only seems to happen for very few users.

Wrong Icon shown for Command sent by Saga

In the following example we can see that the Saga is "handling" a command, according to the Icon.

image

It is true that the SagaEventHandler is a handler, and the icon is technically correct. But it may be confusing, since it's a producer.

Report missing RoutingKey annotations

As a user of the Axon Framework plugin I want to be warned when my command messages are missing a routing key.

This is only applicable if the target is an Aggregate class, and there is no custom RoutingStrategy set.

Plugin not working with Axon 4

I have installed the plugin to work with Intelij IDEA 2019.1.2. I can't see if it is working because the icons on the left (called gutter icons) do not appear.

@AggregateIdentifier warning when annotation is placed on method

JDK: 11
IntelliJ: 2022.1.2
Plugin Version: 0.7.1

This is pretty much the same issue as #80 except relates to method level annotations. Given an @Aggregate annotated class when the @AggregateIdentifier is placed on a method then warning below is shown:-

Annotated class example:

@Aggregate
@NoArgsConstructor
public class Example {
    private String part1;
    private String part2;
    
    //...

    @AggregateIdentifier
    public String aggregateIdentifier() {
        return part1 + ":" + part2;
    }
    
    //...
}

Results in:-

aggregate_warning

Add support for `@MessageHandlerInterceptor`

Feature Description

Provide, for example, gutter icons for the @MessageHandlerInterceptor.
This currently is provided for the @CommandHandlerInterceptor.
I'd assume implementing a similar level of support for the more generic @MessageHandlerInterceptor wouldn't prove too difficult.

Current Behaviour

There is no support for the @MessageHandlerInterceptor.

Wanted Behaviour

That there's support for the @MessageHandlerInterceptor.

Possible Workarounds

None that I know off.

Colllect usage data

As developers of Axon Framework it would be great to know how the users are using the framework. We should collect data on this, if the user gives their consent.

We should collect the following data:

  • Dependencies + versions (whitelisted, list TBD)
  • Java version
  • Usage of (meta-)annotations or not
  • Performance statistics

Issue when switching projects with Axon plugin

Following stack trace occurs when the axon plugin is active

Already disposed: Already disposed
java.lang.AssertionError: Already disposed
at com.intellij.openapi.components.impl.ComponentManagerImpl.getPicoContainer(ComponentManagerImpl.java:263)
at com.intellij.openapi.components.impl.ComponentManagerImpl.getPicoContainer(ComponentManagerImpl.java:55)
at com.intellij.openapi.components.ServiceManager.getService(ServiceManager.java:40)
at com.intellij.psi.search.PsiSearchHelper$SERVICE.getInstance(PsiSearchHelper.java:41)
at com.intellij.psi.search.searches.ReferencesSearch$SearchParameters.getEffectiveSearchScope(ReferencesSearch.java:83)
at com.intellij.psi.impl.search.CachesBasedRefSearcher.processQuery(CachesBasedRefSearcher.java:50)
at com.intellij.psi.impl.search.CachesBasedRefSearcher.processQuery(CachesBasedRefSearcher.java:21)
at com.intellij.openapi.application.QueryExecutorBase$2.run(QueryExecutorBase.java:44)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:900)
at com.intellij.openapi.application.QueryExecutorBase.execute(QueryExecutorBase.java:42)
at com.intellij.util.ExecutorsQuery.processResults(ExecutorsQuery.java:43)
at com.intellij.util.AbstractQuery.processResultsAsync(AbstractQuery.java:103)
at com.intellij.util.AbstractQuery.forEachAsync(AbstractQuery.java:89)
at com.intellij.util.MergeQuery.processSubQueryAsync(MergeQuery.java:88)
at com.intellij.util.MergeQuery.forEachAsync(MergeQuery.java:64)
at com.intellij.util.UniqueResultsQuery.processAsync(UniqueResultsQuery.java:71)
at com.intellij.util.UniqueResultsQuery.forEachAsync(UniqueResultsQuery.java:62)
at org.axonframework.intellij.ide.plugin.publisher.DefaultEventPublisherProvider.scanPublishers(DefaultEventPublisherProvider.java:38)
at org.axonframework.intellij.ide.plugin.publisher.PublisherProviderManager.ensureInitialized(PublisherProviderManager.java:34)
at org.axonframework.intellij.ide.plugin.publisher.PublisherProviderManager.getInstance(PublisherProviderManager.java:19)
at org.axonframework.intellij.ide.plugin.annotator.AxonGutterAnnotator.annotate(AxonGutterAnnotator.java:34)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.a(DefaultHighlightVisitor.java:160)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.visit(DefaultHighlightVisitor.java:103)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass$5.run(GeneralHighlightingPass.java:312)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:397)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.access$300(GeneralHighlightingPass.java:64)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass$6.run(GeneralHighlightingPass.java:403)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.analyze(DefaultHighlightVisitor.java:87)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:400)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.access$300(GeneralHighlightingPass.java:64)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass$6.run(GeneralHighlightingPass.java:403)
at com.intellij.codeInsight.daemon.impl.RefCountHolder.analyze(RefCountHolder.java:318)
at com.intellij.codeInsight.daemon.impl.analysis.HighlightVisitorImpl.analyze(HighlightVisitorImpl.java:173)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:400)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:388)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.collectInformationWithProgress(GeneralHighlightingPass.java:230)
at com.intellij.codeInsight.daemon.impl.ProgressableTextEditorHighlightingPass.doCollectInformation(ProgressableTextEditorHighlightingPass.java:86)
at com.intellij.codeHighlighting.TextEditorHighlightingPass.collectInformation(TextEditorHighlightingPass.java:62)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1$1.run(PassExecutorService.java:380)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1154)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1.run(PassExecutorService.java:371)
at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.a(PassExecutorService.java:368)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.run(PassExecutorService.java:344)
at com.intellij.concurrency.JobLauncherImpl$VoidForkJoinTask.exec(JobLauncherImpl.java:193)
at jsr166e.ForkJoinTask.doExec(ForkJoinTask.java:260)
at jsr166e.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:858)
at jsr166e.ForkJoinPool.scan(ForkJoinPool.java:1687)
at jsr166e.ForkJoinPool.runWorker(ForkJoinPool.java:1642)
at jsr166e.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:109)

java.lang.AssertionError: Already disposed
at com.intellij.openapi.components.impl.ComponentManagerImpl.getPicoContainer(ComponentManagerImpl.java:263)
at com.intellij.openapi.components.impl.ComponentManagerImpl.getPicoContainer(ComponentManagerImpl.java:55)
at com.intellij.openapi.components.ServiceManager.getService(ServiceManager.java:40)
at com.intellij.psi.search.PsiSearchHelper$SERVICE.getInstance(PsiSearchHelper.java:41)
at com.intellij.psi.search.searches.ReferencesSearch$SearchParameters.getEffectiveSearchScope(ReferencesSearch.java:83)
at com.intellij.psi.impl.search.CachesBasedRefSearcher.processQuery(CachesBasedRefSearcher.java:50)
at com.intellij.psi.impl.search.CachesBasedRefSearcher.processQuery(CachesBasedRefSearcher.java:21)
at com.intellij.openapi.application.QueryExecutorBase$2.run(QueryExecutorBase.java:44)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:900)
at com.intellij.openapi.application.QueryExecutorBase.execute(QueryExecutorBase.java:42)
at com.intellij.util.ExecutorsQuery.processResults(ExecutorsQuery.java:43)
at com.intellij.util.AbstractQuery.processResultsAsync(AbstractQuery.java:103)
at com.intellij.util.AbstractQuery.forEachAsync(AbstractQuery.java:89)
at com.intellij.util.MergeQuery.processSubQueryAsync(MergeQuery.java:88)
at com.intellij.util.MergeQuery.forEachAsync(MergeQuery.java:64)
at com.intellij.util.UniqueResultsQuery.processAsync(UniqueResultsQuery.java:71)
at com.intellij.util.UniqueResultsQuery.forEachAsync(UniqueResultsQuery.java:62)
at org.axonframework.intellij.ide.plugin.publisher.DefaultEventPublisherProvider.scanPublishers(DefaultEventPublisherProvider.java:38)
at org.axonframework.intellij.ide.plugin.publisher.PublisherProviderManager.ensureInitialized(PublisherProviderManager.java:34)
at org.axonframework.intellij.ide.plugin.publisher.PublisherProviderManager.getInstance(PublisherProviderManager.java:19)
at org.axonframework.intellij.ide.plugin.annotator.AxonGutterAnnotator.annotate(AxonGutterAnnotator.java:34)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.a(DefaultHighlightVisitor.java:160)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.visit(DefaultHighlightVisitor.java:103)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass$5.run(GeneralHighlightingPass.java:312)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:397)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.access$300(GeneralHighlightingPass.java:64)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass$6.run(GeneralHighlightingPass.java:403)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.analyze(DefaultHighlightVisitor.java:87)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:400)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.access$300(GeneralHighlightingPass.java:64)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass$6.run(GeneralHighlightingPass.java:403)
at com.intellij.codeInsight.daemon.impl.RefCountHolder.analyze(RefCountHolder.java:318)
at com.intellij.codeInsight.daemon.impl.analysis.HighlightVisitorImpl.analyze(HighlightVisitorImpl.java:173)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:400)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:388)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.collectInformationWithProgress(GeneralHighlightingPass.java:230)
at com.intellij.codeInsight.daemon.impl.ProgressableTextEditorHighlightingPass.doCollectInformation(ProgressableTextEditorHighlightingPass.java:86)
at com.intellij.codeHighlighting.TextEditorHighlightingPass.collectInformation(TextEditorHighlightingPass.java:62)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1$1.run(PassExecutorService.java:380)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1154)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1.run(PassExecutorService.java:371)
at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.a(PassExecutorService.java:368)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.run(PassExecutorService.java:344)
at com.intellij.concurrency.JobLauncherImpl$VoidForkJoinTask.exec(JobLauncherImpl.java:193)
at jsr166e.ForkJoinTask.doExec(ForkJoinTask.java:260)
at jsr166e.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:858)
at jsr166e.ForkJoinPool.scan(ForkJoinPool.java:1687)
at jsr166e.ForkJoinPool.runWorker(ForkJoinPool.java:1642)
at jsr166e.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:109)

I am not completely sure when it occurs, but it seems to happen when I have multiple projects open in Intellij.

Deadline method line marker matches on arguments

When clicking a line marker of a deadline method reference, and it has a qualified reference, it first shows a popup to choose the element.

image

We should terminate the UCallExpression search for UQualifiedReferenceExpression as well.

Axon plugin 0.8.1 is not supported by IDEA 2023.2

Basic information

  • JDK version: 17.0.7+7-b1000.6 aarch64
Screenshot 2023-07-27 at 1 55 05 pm Screenshot 2023-07-27 at 1 55 30 pm

Steps to reproduce

Open IntelliJ IDEA 2023.2 (Ultimate Edition)
Axon Plugin 0.8.1 installed

Expected behaviour

Plugin works

Actual behaviour

Error:

Plugin 'Axon Framework' (version '0.8.1') is not compatible with the current version of the IDE, because it requires build 231.* or older but the current build is IU-232.8660.18

Links to message handlers that handle a specific message type, should also work when message is constructed using a builder pattern.

Feature request: Links to message handlers that handle a specific message type, should also work when message is constructed using a builder pattern.

Plugin Version 0.5.2

Using "new" operator works well:
Screen Shot 2022-03-15 at 1 02 41 PM

Using builder pattern (in this case Lombok's builder annotation) the linkage is not being detected:
Screen Shot 2022-03-15 at 1 02 58 PM

Had some issues accessing the template link mentioned in the issue requestor template.
Not accessible link

Exceptions when using plugin

When I click on the icon near an apply in an aggregate I get exceptions (IntelliJ 13.1.4):

0: 0
java.lang.ArrayIndexOutOfBoundsException: 0
at org.axonframework.intellij.ide.plugin.publisher.ExtractEventPublisherMethodArgumentVisitor.visitMethodCallExpression(ExtractEventPublisherMethodArgumentVisitor.java:18)
at com.intellij.psi.impl.source.tree.java.PsiMethodCallExpressionImpl.accept(PsiMethodCallExpressionImpl.java:135)
at org.axonframework.intellij.ide.plugin.publisher.AxonEventPublisherProcessor.process(AxonEventPublisherProcessor.java:33)
at org.axonframework.intellij.ide.plugin.publisher.AxonEventPublisherProcessor.process(AxonEventPublisherProcessor.java:12)
at com.intellij.psi.impl.cache.impl.IndexCacheManagerImpl$2.processInReadAction(IndexCacheManagerImpl.java:114)
at com.intellij.psi.impl.cache.impl.IndexCacheManagerImpl$2.processInReadAction(IndexCacheManagerImpl.java:109)
at com.intellij.openapi.application.ReadActionProcessor$1.compute(ReadActionProcessor.java:31)
at com.intellij.openapi.application.ReadActionProcessor$1.compute(ReadActionProcessor.java:28)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:921)
at com.intellij.openapi.application.ReadActionProcessor.process(ReadActionProcessor.java:28)
at com.intellij.psi.impl.cache.impl.IndexCacheManagerImpl.processFilesWithWord(IndexCacheManagerImpl.java:128)
at com.intellij.psi.impl.search.PsiSearchHelperImpl.processAllFilesWithWord(PsiSearchHelperImpl.java:610)
at org.axonframework.intellij.ide.plugin.AxonGutterAnnotator.annotate(AxonGutterAnnotator.java:54)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.a(DefaultHighlightVisitor.java:160)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.visit(DefaultHighlightVisitor.java:103)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass$5.run(GeneralHighlightingPass.java:312)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:397)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.access$300(GeneralHighlightingPass.java:64)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass$6.run(GeneralHighlightingPass.java:403)
at com.intellij.codeInsight.daemon.impl.DefaultHighlightVisitor.analyze(DefaultHighlightVisitor.java:87)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:400)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.access$300(GeneralHighlightingPass.java:64)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass$6.run(GeneralHighlightingPass.java:403)
at com.intellij.codeInsight.daemon.impl.RefCountHolder.analyze(RefCountHolder.java:318)
at com.intellij.codeInsight.daemon.impl.analysis.HighlightVisitorImpl.analyze(HighlightVisitorImpl.java:173)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:400)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.a(GeneralHighlightingPass.java:388)
at com.intellij.codeInsight.daemon.impl.GeneralHighlightingPass.collectInformationWithProgress(GeneralHighlightingPass.java:230)
at com.intellij.codeInsight.daemon.impl.ProgressableTextEditorHighlightingPass.doCollectInformation(ProgressableTextEditorHighlightingPass.java:86)
at com.intellij.codeHighlighting.TextEditorHighlightingPass.collectInformation(TextEditorHighlightingPass.java:62)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1$1.run(PassExecutorService.java:380)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1154)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1.run(PassExecutorService.java:371)
at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.a(PassExecutorService.java:368)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.run(PassExecutorService.java:344)
at com.intellij.concurrency.JobLauncherImpl$VoidForkJoinTask.exec(JobLauncherImpl.java:193)
at jsr166e.ForkJoinTask.doExec(ForkJoinTask.java:260)
at jsr166e.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:858)
at jsr166e.ForkJoinPool.scan(ForkJoinPool.java:1687)
at jsr166e.ForkJoinPool.runWorker(ForkJoinPool.java:1642)
at jsr166e.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:109)

Support Deadline handlers

As a user of the Axon Framework plugin, I want to see a visualization of the relationship between creating a deadline and de DeadlineHandler that handles it.

Show hierarchy in model popup

The model popup on aggregates and its members works great, but might be improved by showing the class hierarchy in the list.
This can be done by indenting, or using hyphens. We should experiment what works best

Error when wrong annotation is used in wrong context (eg: @EventSourcingHandler)

Feature Description

Error when wrong annotation is used in wrong context (eg: @EventSourcingHandler).
For example:

  • EventSourcingHandler should only be added to classes that are aggregates.
  • SagaEventHandler for sagas

This is extra: annotating same method with EventSourcingHandler, SagaEventHandler, CommandHandler does not give error.

Talked about it in AxonFramework/AxonFramework#1755

Current Behaviour

No errors or warnings.
For SagaEventHandler annotation, the plugin will consider the method as a potential receiver of the payload but it should not.

Wanted Behaviour

Show an error when annotation is not put on correct context (methods, etc).

Possible Workarounds

Extra

Most devs uses Intellij IDEA but would be great if could also work on a Maven plugin with java agent or other (maybe also gradle but I prefer maven).
And with a plugin, there could be checks done in CI, etc.

Axon plugin 0.8.0 is not supported by IDEA 2023.1

Enhancement Description
Axon plugin 0.8.0 is not supported by IDEA 2023.1

Running:
IntelliJ IDEA 2022.3 (Ultimate Edition)
Build #IU-231.8109.175, built on March 28, 2023

Current Behaviour
Error:
Plugin 'Axon Framework' (version '0.8.0') is not compatible with the current version of the IDE, because it requires build 223.* or older but the current build is IU-231.8109.175

[Question] Is Groovy supported?

Basic information

Steps to reproduce

After installing the plugin, I'm not able to see any marker lines for Axon annotations.
Since my project uses Groovy, I'm wondering if the plugin supports Groovy.

In the project, you can find Axon annotations in the following modules and classes:
cargotracker/cargotracker-booking-domain-model-aggregate/src/main/groovy/org/klokwrk/cargotracker/booking/domain/model/aggregate/BookingOfferAggregate.groovy
cargotracker/cargotracker-booking-queryside-app/src/main/groovy/org/klokwrk/cargotracker/booking/queryside/feature/bookingoffer/adapter/out/persistence/BookingOfferSummaryQueryHandlerService.groovy

Use quick access arrow when applying previously defined event

User arrows to navigate usages on an AxonFramework event not only when applying new event, but when applying previosly defined event variable

Current Behaviour

Currently quick acces arrow appears only when applying new event
image

Wanted Behaviour

Quick acces arrow appears when applying an event defined previously

Possible Workarounds

image

Axon version detection did not work properly in v0.7.2

Basic information

  • JDK version:
java version "11.0.15" 2022-04-19 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.15+8-LTS-149)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.15+8-LTS-149, mixed mode)
  • Complete executable reproducer if available (e.g. GitHub Repo):
    Not available - the context is in a proprietary commercial development that I am not allowed to disclose the Intellectual Property.

Steps to reproduce

  1. Create a custom library code with the word axon in the package name somewhere, for example, com.abc.myutil.axoninfrastructure.SampleExtension.java -- the content of the sample code does not matter as far as I can tell.
  2. Package the library code into a jar, with the artifact name (that is, the jar name) containing the word axon. This can be done locally as a snapshot version. For example, the above library code can be packaged by Maven or Gradle into the local ~/.m2/repository/com/abc/myutil/axon-infrastructure/0.0.0-SNAPSHOT/axon-infrastructure-0.0.0-SNAPSHOT.jar
  3. Create another application code in a different project and make it depends on the Axon framework and the above custom library code.
  4. Install Axon Framework plug-in v0.7.2 and restart IntelliJ.

Expected behaviour

The Axon Framework plug-in should be enabled and working without problem.

Actual behaviour

The Axon Framework plug-in v0.7.2 disabled itself with an error notification. See the attached screenshot.
The plug-in versions before v0.7.2 worked without problem for the same code / context.

Plug-inDisabledNotification

cannot install in IntelliJ idea 13.1

[INFO] Building Axonframework IntelliJ Plugin 0.0.2-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-install-plugin:2.4:install-file (default-cli) @ axonframework.intellij.ide ---
[ERROR] The specified file 'C:\Program Files (x86)\Git\Applications\IntelliJ IDEA 12.app\lib\extensions.jar' not exists
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.438 s
[INFO] Finished at: 2014-03-20T09:39:48+08:00
[INFO] Final Memory: 6M/159M

No Creator Found: with kotlin/gradle + java/maven multi-module project

Basic information

  • JDK version: 20
  • Complete executable reproducer if available (e.g. GitHub Repo):

Steps to reproduce

I run IntelliJ IDEA 2023.2.4 (Ultimate Edition) and Axon Framework Plugin v0.8.3

I have a global message library that contains all our commands, events, queries and projections, previously written in Java as
Java Records then rewritten as Kotlin data classes.

This library is consumed by spring microservices that run with java 20, axon-starter 4.9.0 and spring-boot 3.1.5

When the Library was written in Java, the plugin could easily Identify and route all message types within the multimodule project. However, with kotlin nested data classes, the plugin errs with the message 'No creators of this Message Payload were found'

This happens with events, queries and commands.

I'm not entirely sure if it's the IDE since I'm running the latest version at the time of writing.

Writing large code-bases with the axon plugin malfunctioning is very difficult.

Thanks!

Expected behaviour

The plugin should route all message types and their handlers regardless of the implementation language so long as it is supported

Actual behaviour

The plugin errs with message :: No creators of this Message Payload were found for commands, events and queries with DTOs implemented as nested Kotlin Data Classes. Please describe the actual behaviour as discovered.

Odd behavior of event class navigation menu

Steps to reproduce

  • Use Kotlin
  • Have an abstract event class
  • Extend several classes using it
  • Have several handlers using the abstract event

Expected behaviour

On the superclass it should show:

  • All abstract handlers consuming this message
  • All producers of the message based on subclasses

On the subclass it should show:

  • All handlers of the specific class
  • All handlers of its superclasses
  • All producers of the specific class

This should follow the appropriate formatting used in other menu's

Actual behaviour

On superclasses:

  • Shows all inheritance methods of the subclasses
  • Shows handlers in invalid format

On subclasses:

  • Shows two menus, one on the class name and one on the inheritance, should be one
  • Its handlers in a wrong format
  • All other classes that inherit from its parent, shouldn't be there

Show class name for command handlers in the navigation pop-up

Enhancement Description

When I try navigating a command through the plugin's pop-up, it's not very clear what is what.
It would be great to show in the class name where the command is handled. Currently it seems it's only showing the command name itself (which we don't really care about as that's what we're clicking on).

More globally I think you can greatly improve what is shown in this popup for a command. Currently a ctrl+click give much better details. Maybe it would be nice to show both the method name and the class name. Also I'm wondering in case of classic use of the on method name if you could fetch the first parameter class of that method to show it.

Here is an example

Class1 {
	void myMethodName(String str){
		send(MyCommand(str))
	}
}

Class2 {
	void on(SomeEvent evt) {
		send(MyCommand(evt.getStr()))
	}
}

Class3 {
	void handle(MyCommand cmd) {
		...
	}
}

would give something like that

> handle (Class3)
< myMethodName (Class1)
< on SomeEvent (Class2)

Do note that the behavior seems to be different when depending on where you trigger that pop-up. It seem data is missing when you trigger it from the command class itself.

Placement of navigation icon

Enhancement Description

If I create command class and send it to another method as a parameter, which in turn call the command gateway, navigation icon is shown in the place where command object is created and not where the send() method is called. It would be easier for the developer to navigate between command senders and handlers if the icon was shown where command is sent.

Here is an example:

public class CommandCreator {
        public void createCommand() {
            sendCommand(new TestCommand());
        }
        public void sendCommand(TestCommand command) {
            commandGateway.send(command);
        }
}

Current Behaviour

Navigation icon is shown next to the sendCommand(new TestCommand()); method.

Wanted Behaviour

Navigation icon should be shown next to the commandGateway.send(command); method.

Problem becomes more annoying when command creation is in one class and sending is in another.

Add inspection for missing routing key property in messages

Handlers in entities contained in a collection annotated with @AggregateMember require a property to be defined (or getter function) with the same name as defined on the @RoutingKey of the Entity.

Example

Consider the following code:

class MyAggregate {
  // Skipped parts
  @AggregateMember
  private final Map<String, MyEntity> entities = new HashMap<>();
}

class MyEntity {
  @Entity(routingKey  = "myRoutingKey")
  private String someRoutingKey;

  @CommandHandler
  public void handle(MyCommand command) {

  } 
}

In this case, the command requires a myRoutingKey to be defined. If not, we should show a warning on the handle method.

The same for @EventSourcingHandlers, but only when the forwardingMode of the @AggregateMember is set to ForwardMatchingInstances.class

Notes

  • Missing routingKey property will fall back to the property name
  • Not applicable if Entity is not part of a collection

Incorrect inspection: requires @AggregateIdentifier on subclass in polymorphic hierarchy when it is present in parent class

Basic information

When you have a polymorphic hierarchy where the subclass does not have a field marked with @AggregateIdentifier (but the root abstract class does) the plugin complains with an inspection warning.

image

Steps to reproduce

You can reproduce the bug with the repo here: https://github.com/idugalic/axon-polymorphism-demo

E.G.

image

Expected behaviour

To be able to see the root class has the @AggregateIdentifier annotation.

Actual behaviour

Inspection given by mistake.

IntelliJ Idea 2022.3 support

Enhancement Description

Axon plugin 0.7.3 is not supported by 2022.3 after upgrading the IntelliJ Idea

Running:
IntelliJ IDEA 2022.3 (Ultimate Edition)
Build #IU-223.7571.182, built on November 29, 2022

Current Behaviour

The error "Incompatible: requires IDE build 222. or earlier"* is displayed in the Plugins settings

Wanted Behaviour

Would be nice to have the plugin supported by IntelliJ IDEA 2022.3

Possible Workarounds

Rollback to the earlier IntelliJ Idea version or Disable the plugin temporarily

Exception thrown upon popup

The new IDEA version throws an error when the navigation popup is clicked: Do not use PsiElement for popup model. See PsiTargetNavigator

ProcessCanceledExceptions are caught

PsiProcessingUtil is catching ProcessCanceledExceptions. With how we are currently rethrowing it as IllegalArgumentException, it ends up in theExceptionSubmitter. However, it's a valid case. It should be propagated up the tree so IntelliJ can restart the action.

We should remove the try-catch statement.

ClassCastException during querying provider ClassLineMarkerProvider

IntelliJ IDEA build 213.7172.25

During querying provider org.axonframework.intellij.ide.plugin.markers.ClassLineMarkerProvider@e9cc35d (class org.axonframework.intellij.ide.plugin.markers.ClassLineMarkerProvider)

java.lang.ClassCastException: class com.intellij.psi.PsiWildcardType cannot be cast to class com.intellij.psi.PsiClassType (com.intellij.psi.PsiWildcardType and com.intellij.psi.PsiClassType are in unnamed module of loader com.intellij.ide.plugins.cl.PluginClassLoader @2a0934a4)
	at org.axonframework.intellij.ide.plugin.util.PSiProcessingUtilsKt.toQualifiedName(PSiProcessingUtils.kt:56)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.isOfType(AggregateStructureResolver.kt:116)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.isMap(AggregateStructureResolver.kt:112)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.isCollection(AggregateStructureResolver.kt:111)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.inspect(AggregateStructureResolver.kt:80)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.access$inspect(AggregateStructureResolver.kt:40)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver$resolve$1.invoke(AggregateStructureResolver.kt:70)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver$resolve$1.invoke(AggregateStructureResolver.kt:67)
	at org.axonframework.intellij.ide.plugin.util.PerformanceRegistry.measure(PerformanceRegistry.kt:53)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.resolve(AggregateStructureResolver.kt:67)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.access$resolve(AggregateStructureResolver.kt:40)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver$cache$1.invoke(AggregateStructureResolver.kt:41)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver$cache$1.invoke(AggregateStructureResolver.kt:41)
	at org.axonframework.intellij.ide.plugin.util.CacheUtilsKt.createCachedValue$lambda-0(CacheUtils.kt:48)
	at com.intellij.psi.impl.PsiCachedValueImpl.doCompute(PsiCachedValueImpl.java:39)
	at com.intellij.util.CachedValueBase.lambda$getValueWithLock$3(CachedValueBase.java:227)
	at com.intellij.util.CachedValueBase.computeData(CachedValueBase.java:42)
	at com.intellij.util.CachedValueBase.lambda$getValueWithLock$4(CachedValueBase.java:227)
	at com.intellij.openapi.util.RecursionManager$1.computePreventingRecursion(RecursionManager.java:114)
	at com.intellij.openapi.util.RecursionGuard.doPreventingRecursion(RecursionGuard.java:44)
	at com.intellij.openapi.util.RecursionManager.doPreventingRecursion(RecursionManager.java:68)
	at com.intellij.util.CachedValueBase.getValueWithLock(CachedValueBase.java:228)
	at com.intellij.psi.impl.PsiCachedValueImpl.getValue(PsiCachedValueImpl.java:28)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.getModels(AggregateStructureResolver.kt:43)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.getFlattendedModelsAndEntities(AggregateStructureResolver.kt:45)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.getMemberForName(AggregateStructureResolver.kt:57)
	at org.axonframework.intellij.ide.plugin.resolving.AggregateStructureResolver.getAllModelsRelatedToName(AggregateStructureResolver.kt:48)
	at org.axonframework.intellij.ide.plugin.markers.ClassLineMarkerProvider.getLineMarkerInfo(ClassLineMarkerProvider.kt:62)
	at com.intellij.codeInsight.daemon.impl.LineMarkersPass.queryProviders(LineMarkersPass.java:165)
	at com.intellij.codeInsight.daemon.impl.LineMarkersPass.lambda$doCollectInformation$3(LineMarkersPass.java:98)
	at com.intellij.codeInsight.daemon.impl.Divider.divideInsideAndOutsideInOneRoot(Divider.java:115)
	at com.intellij.codeInsight.daemon.impl.LineMarkersPass.doCollectInformation(LineMarkersPass.java:85)
	at com.intellij.codeHighlighting.TextEditorHighlightingPass.collectInformation(TextEditorHighlightingPass.java:56)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$doRun$1(PassExecutorService.java:414)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1084)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$doRun$2(PassExecutorService.java:407)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$12(CoreProgressManager.java:624)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:698)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:646)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:623)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:66)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.doRun(PassExecutorService.java:406)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.lambda$run$0(PassExecutorService.java:382)
	at com.intellij.openapi.application.impl.ReadMostlyRWLock.executeByImpatientReader(ReadMostlyRWLock.java:174)
	at com.intellij.openapi.application.impl.ApplicationImpl.executeByImpatientReader(ApplicationImpl.java:181)
	at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.run(PassExecutorService.java:380)
	at com.intellij.concurrency.JobLauncherImpl$VoidForkJoinTask$1.exec(JobLauncherImpl.java:184)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)

Create ErrorReportSubmitter

Right now, users cannot send error reports.

It is necessary for a plugin to implement an ErrorReportSubmitter themselves.

Make the plugin work with snapshot versions

In ProjectUtils.kt file the following regex:-

val versionRegex = Regex("^4\\.\\d+\\.\\d+$")

prevents the plugin from working with snapshot versions, I'm unclear as to why you would want to restrict the plugin from working with snapshot versions, if there isn't a good reason for this can the regex be updated to make it compatible?

EDIT: On further investigation it's the processing to extract the version number for comparison with the above noted regex that is the source of the trouble.

Add support for `@ExceptionHandler`

Feature Description

Although "full" support for @ExceptionHandler annotated methods isn't feasible, perhaps there is some other benefit we can provide here.
At the very least, we could cover for IDE warnings stating those methods aren't invoked, as that's typically incorrect.

Current Behaviour

There is zero support for the @ExceptionHandler annotation.

Wanted Behaviour

Investigate if we can provide some support for the @ExceptionHandler annotation.

Possible Workarounds

None.

Add Live Templates for reoccurring patterns

Feature Description

It would be nice if the plugin contained Intellij's Live Templates.
By doing so, we could allow users macro's, like ch or cmdh, that could automatically construct a basic @CommandHandler annotated method.
The template can then guide the user through defining the command type too.
Added, we can provide AxonIQ's formatting recommendations through this too.

We can start by adding templates for all the message handler types we have.
Thus:

  • Command Handlers
  • Event Handlers
  • Query Handlers
  • Saga Event Handlers
  • Deadline Handlers
  • Reset Handlers
  • Command Handler Interceptors
  • Message Handler Interceptors
  • Exception Handlers

Later on, we may be able to expand this with basic formats of Aggregates, Sagas, Event Handling Components / Projectors, etc.

Current Behaviour

There are no built-in, Axon-specific, live templates present.

Wanted Behaviour

That the Axon Framework Intellij Plugin contains live templates for often used method and class formats.

Possible Workarounds

Users can define live templates relatively easy themselves.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.