Skip to content

Commit 3c9a3c5

Browse files
author
Pawel Badenski
committed
Filter unique method references
Previously List was used to store found method references. This caused the algorithm to perform reduntant search. Changing List to HashSet can improve performance significantly on a larger project.
1 parent ec2f5b0 commit 3c9a3c5

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

src/main/java/org/axonframework/intellij/ide/plugin/publisher/DefaultEventPublisherProvider.java

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.axonframework.intellij.ide.plugin.publisher;
22

3+
import com.intellij.openapi.fileTypes.StdFileTypes;
34
import com.intellij.openapi.project.Project;
45
import com.intellij.openapi.util.Condition;
56
import com.intellij.psi.JavaPsiFacade;
@@ -18,29 +19,35 @@
1819
import com.intellij.psi.util.PsiTreeUtil;
1920
import com.intellij.util.Processor;
2021
import com.intellij.util.Query;
21-
import com.intellij.util.containers.ConcurrentMultiMap;
22-
import com.intellij.util.containers.MultiMap;
2322

2423
import java.util.Collections;
25-
import java.util.List;
24+
import java.util.HashSet;
25+
import java.util.Map;
26+
import java.util.Set;
27+
import java.util.concurrent.ConcurrentHashMap;
2628

2729
import static java.util.Arrays.asList;
2830

2931
class DefaultEventPublisherProvider implements EventPublisherProvider {
3032

31-
private final MultiMap<Project, PsiMethod> publisherMethodsPerProject = new ConcurrentMultiMap<Project, PsiMethod>();
33+
private final Map<Project, Set<PsiMethod>> publisherMethodsPerProject = new ConcurrentHashMap<Project, Set<PsiMethod>>();
3234

3335
@Override
3436
public void scanPublishers(final Project project, GlobalSearchScope scope, final Registrar registrar) {
3537
cleanClosedProjects();
36-
publisherMethodsPerProject.putValues(project, findMethods(project, GlobalSearchScope.allScope(project),
38+
Set<PsiMethod> psiMethods = publisherMethodsPerProject.get(project);
39+
if (psiMethods == null) {
40+
psiMethods = new HashSet<PsiMethod>();
41+
publisherMethodsPerProject.put(project, psiMethods);
42+
}
43+
psiMethods.addAll(findMethods(project, GlobalSearchScope.allScope(project),
3744
"org.axonframework.eventsourcing.AbstractEventSourcedAggregateRoot", "apply"));
38-
publisherMethodsPerProject.putValues(project, findMethods(project, GlobalSearchScope.allScope(project),
45+
psiMethods.addAll(findMethods(project, GlobalSearchScope.allScope(project),
3946
"org.axonframework.domain.AbstractAggregateRoot", "registerEvent"));
40-
publisherMethodsPerProject.putValues(project, findMethods(project, GlobalSearchScope.allScope(project),
47+
psiMethods.addAll(findMethods(project, GlobalSearchScope.allScope(project),
4148
"org.axonframework.eventsourcing.AbstractEventSourcedEntity", "apply"));
4249

43-
scanEventPublishers(scope, registrar);
50+
scanEventPublishers(project, scope, registrar);
4451
scanCommandPublishers(project, scope, registrar);
4552
}
4653

@@ -116,8 +123,8 @@ private PsiClass findCommandHandlersAnnotation(Project project) {
116123
GlobalSearchScope.allScope(project));
117124
}
118125

119-
private void scanEventPublishers(GlobalSearchScope scope, final Registrar registrar) {
120-
for (PsiMethod method : publisherMethodsPerProject.values()) {
126+
private void scanEventPublishers(Project project, GlobalSearchScope scope, final Registrar registrar) {
127+
for (final PsiMethod method : publisherMethodsPerProject.get(project)) {
121128
Query<PsiReference> invocations = ReferencesSearch.search(method, scope);
122129
invocations.forEachAsync(new Processor<PsiReference>() {
123130
@Override
@@ -155,13 +162,13 @@ private void cleanClosedProjects() {
155162
}
156163
}
157164

158-
private List<PsiMethod> findMethods(Project project, GlobalSearchScope allScope, String className,
159-
String methodName) {
165+
private Set<PsiMethod> findMethods(Project project, GlobalSearchScope allScope, String className,
166+
String methodName) {
160167
PsiClass aggregateClass = JavaPsiFacade.getInstance(project).findClass(className, allScope);
161168
if (aggregateClass != null) {
162-
return asList(aggregateClass.findMethodsByName(methodName, true));
169+
return new HashSet<PsiMethod>(asList(aggregateClass.findMethodsByName(methodName, true)));
163170
}
164-
return Collections.emptyList();
171+
return Collections.emptySet();
165172
}
166173

167174
@Override

0 commit comments

Comments
 (0)