Skip to content

Commit c251852

Browse files
committed
Improve logging by splitting refactorings on three groups and calculating features for them in advance.
1 parent e13c02d commit c251852

File tree

5 files changed

+94
-61
lines changed

5 files changed

+94
-61
lines changed
Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package org.jetbrains.research.groups.ml_methods.refactoring.logging;
22

3-
import com.sixrr.metrics.metricModel.MetricsRun;
43
import org.jetbrains.annotations.NotNull;
54
import org.jetbrains.research.groups.ml_methods.refactoring.MoveToClassRefactoring;
65

76
import java.util.ArrayList;
87
import java.util.List;
9-
import java.util.stream.Collectors;
108

119
/**
1210
* Objects of this class contain information about one user interaction with the plugin.
@@ -17,47 +15,47 @@
1715
* to log for further analysis.
1816
*/
1917
public final class RefactoringSessionInfo {
20-
private final @NotNull List<RefactoringFeatures> acceptedRefactoringsFeatures;
18+
private final @NotNull List<RefactoringFeatures> uncheckedRefactoringsFeatures;
2119

2220
private final @NotNull List<RefactoringFeatures> rejectedRefactoringsFeatures;
2321

22+
private final @NotNull List<RefactoringFeatures> appliedRefactoringsFeatures;
23+
2424
/**
2525
* Creates session info for given accepted and rejected refactorings.
2626
*
27-
* @param acceptedRefactorings refactorings that were accepted.
28-
* @param rejectedRefactorings refactorings that were rejected.
29-
* @param metricsRun a result of metrics calculations. Used to {@link RefactoringFeatures}
30-
* of a particular {@link MoveToClassRefactoring}.
27+
* @param uncheckedRefactoringsFeatures refactorings that were accepted.
28+
* @param rejectedRefactoringsFeatures refactorings that were rejected.
29+
* @param appliedRefactoringsFeatures refactorings that were applied.
3130
*/
3231
public RefactoringSessionInfo(
33-
final @NotNull List<MoveToClassRefactoring> acceptedRefactorings,
34-
final @NotNull List<MoveToClassRefactoring> rejectedRefactorings,
35-
final @NotNull MetricsRun metricsRun
32+
final @NotNull List<RefactoringFeatures> uncheckedRefactoringsFeatures,
33+
final @NotNull List<RefactoringFeatures> rejectedRefactoringsFeatures,
34+
final @NotNull List<RefactoringFeatures> appliedRefactoringsFeatures
3635
) {
37-
acceptedRefactoringsFeatures =
38-
acceptedRefactorings.stream()
39-
.map((it) -> RefactoringFeatures.extractFeatures(it, metricsRun))
40-
.collect(Collectors.toList());
41-
42-
rejectedRefactoringsFeatures =
43-
rejectedRefactorings.stream()
44-
.map((it) -> RefactoringFeatures.extractFeatures(it, metricsRun))
45-
.collect(Collectors.toList());
36+
this.uncheckedRefactoringsFeatures = uncheckedRefactoringsFeatures;
37+
this.rejectedRefactoringsFeatures = rejectedRefactoringsFeatures;
38+
this.appliedRefactoringsFeatures = appliedRefactoringsFeatures;
4639
}
4740

4841
/**
49-
* Returns features of all accepted refactorings.
42+
* Returns features of all unchecked refactorings.
5043
*/
51-
@NotNull
52-
public List<RefactoringFeatures> getAcceptedRefactoringsFeatures() {
53-
return new ArrayList<>(acceptedRefactoringsFeatures);
44+
public @NotNull List<RefactoringFeatures> getUncheckedRefactoringsFeatures() {
45+
return new ArrayList<>(uncheckedRefactoringsFeatures);
5446
}
5547

5648
/**
5749
* Returns features of all rejected refactorings.
5850
*/
59-
@NotNull
60-
public List<RefactoringFeatures> getRejectedRefactoringsFeatures() {
51+
public @NotNull List<RefactoringFeatures> getRejectedRefactoringsFeatures() {
6152
return new ArrayList<>(rejectedRefactoringsFeatures);
6253
}
54+
55+
/**
56+
* Returns features of all applied refactorings.
57+
*/
58+
public @NotNull List<RefactoringFeatures> getAppliedRefactoringsFeatures() {
59+
return new ArrayList<>(appliedRefactoringsFeatures);
60+
}
6361
}

src/main/java/org/jetbrains/research/groups/ml_methods/refactoring/logging/RefactoringSessionInfoRenderer.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,32 @@ public class RefactoringSessionInfoRenderer implements ObjectRenderer {
4141
StringBuilder builder = new StringBuilder();
4242
builder.append(lineSeparator);
4343

44-
builder.append("Accepted refactorings").append(lineSeparator);
45-
for (RefactoringFeatures features : info.getAcceptedRefactoringsFeatures()) {
44+
builder.append("Unchecked refactorings").append(lineSeparator);
45+
for (RefactoringFeatures features : info.getUncheckedRefactoringsFeatures()) {
4646
builder.append('[')
47-
.append(serializeFeatures(features, lineSeparator))
48-
.append(']')
49-
.append(lineSeparator);
47+
.append(serializeFeatures(features, lineSeparator))
48+
.append(']')
49+
.append(lineSeparator);
5050
}
5151

5252
builder.append(lineSeparator);
5353

5454
builder.append("Rejected refactorings").append(lineSeparator);
5555
for (RefactoringFeatures features : info.getRejectedRefactoringsFeatures()) {
5656
builder.append('[')
57-
.append(serializeFeatures(features, lineSeparator))
58-
.append(']')
59-
.append(lineSeparator);
57+
.append(serializeFeatures(features, lineSeparator))
58+
.append(']')
59+
.append(lineSeparator);
60+
}
61+
62+
builder.append(lineSeparator);
63+
64+
builder.append("Applied refactorings").append(lineSeparator);
65+
for (RefactoringFeatures features : info.getAppliedRefactoringsFeatures()) {
66+
builder.append('[')
67+
.append(serializeFeatures(features, lineSeparator))
68+
.append(']')
69+
.append(lineSeparator);
6070
}
6171

6272
return builder.toString();

src/main/java/org/jetbrains/research/groups/ml_methods/ui/ClassRefactoringPanel.java

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
import org.jetbrains.annotations.Nullable;
1616
import org.jetbrains.research.groups.ml_methods.refactoring.CalculatedRefactoring;
1717
import org.jetbrains.research.groups.ml_methods.refactoring.MoveToClassRefactoring;
18+
import org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringFeatures;
1819
import org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringReporter;
1920
import org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringSessionInfo;
21+
import org.jetbrains.research.groups.ml_methods.refactoring.logging.RefactoringSessionInfoRenderer;
2022
import org.jetbrains.research.groups.ml_methods.utils.ArchitectureReloadedBundle;
2123
import org.jetbrains.research.groups.ml_methods.utils.ExportResultsUtil;
2224
import org.jetbrains.research.groups.ml_methods.utils.RefactoringUtil;
@@ -27,10 +29,8 @@
2729
import java.awt.event.MouseEvent;
2830
import java.awt.event.MouseListener;
2931
import java.io.IOException;
30-
import java.util.ArrayList;
32+
import java.util.*;
3133
import java.util.List;
32-
import java.util.Map;
33-
import java.util.UUID;
3434
import java.util.function.Predicate;
3535
import java.util.stream.Collectors;
3636

@@ -62,14 +62,20 @@ class ClassRefactoringPanel extends JPanel {
6262
private final Map<CalculatedRefactoring, String> warnings;
6363
private boolean isFieldDisabled;
6464
private final List<CalculatedRefactoring> refactorings;
65-
private final UUID uuid = UUID.randomUUID();
65+
private final Map<MoveToClassRefactoring, RefactoringFeatures> refactoringFeatures;
6666

67-
private final @NotNull MetricsRun metricsRun;
67+
private final UUID uuid = UUID.randomUUID();
6868

6969
ClassRefactoringPanel(List<CalculatedRefactoring> refactorings, @NotNull AnalysisScope scope, @NotNull MetricsRun metricsRun) {
7070
this.scope = scope;
7171
this.refactorings = refactorings;
72-
this.metricsRun = metricsRun;
72+
73+
refactoringFeatures = refactorings.stream().collect(
74+
Collectors.toMap(
75+
CalculatedRefactoring::getRefactoring,
76+
it -> RefactoringFeatures.extractFeatures(it.getRefactoring(), metricsRun)
77+
)
78+
);
7379

7480
setLayout(new BorderLayout());
7581
model = new RefactoringsTableModel(RefactoringUtil.filter(refactorings));
@@ -173,16 +179,25 @@ private void refactorSelected() {
173179
doRefactorButton.setEnabled(false);
174180
selectAllButton.setEnabled(false);
175181
table.setEnabled(false);
176-
final List<MoveToClassRefactoring> selectedRefactorings = model.pullSelected().stream().map(CalculatedRefactoring::getRefactoring).collect(Collectors.toList());
177-
final List<MoveToClassRefactoring> rejectedRefactorings = new ArrayList<>();
178-
for (int index = 0; index < model.getRowCount(); ++index) {
179-
rejectedRefactorings.add(model.getRefactoring(index).getRefactoring());
180-
}
181-
rejectedRefactorings.removeAll(selectedRefactorings);
182182

183-
RefactoringSessionInfo info = new RefactoringSessionInfo(selectedRefactorings, rejectedRefactorings, metricsRun);
183+
final Set<MoveToClassRefactoring> selectableRefactorings = model.pullSelectable().stream().map(CalculatedRefactoring::getRefactoring).collect(Collectors.toSet());
184+
final Set<MoveToClassRefactoring> selectedRefactorings = model.pullSelected().stream().map(CalculatedRefactoring::getRefactoring).collect(Collectors.toSet());
185+
186+
Set<MoveToClassRefactoring> appliedRefactorings = RefactoringsApplier.moveRefactoring(new ArrayList<>(selectedRefactorings), scope, model);
187+
model.setAppliedRefactorings(appliedRefactorings.stream().map(m -> new CalculatedRefactoring(m, 0)).collect(Collectors.toSet()));
188+
189+
Set<MoveToClassRefactoring> uncheckedRefactorings = new HashSet<>(selectableRefactorings);
190+
uncheckedRefactorings.removeAll(selectedRefactorings);
191+
192+
Set<MoveToClassRefactoring> rejectedRefactorings = new HashSet<>(selectedRefactorings);
193+
rejectedRefactorings.removeAll(appliedRefactorings);
194+
195+
RefactoringSessionInfo info = new RefactoringSessionInfo(
196+
uncheckedRefactorings.stream().map(refactoringFeatures::get).collect(Collectors.toList()),
197+
rejectedRefactorings.stream().map(refactoringFeatures::get).collect(Collectors.toList()),
198+
appliedRefactorings.stream().map(refactoringFeatures::get).collect(Collectors.toList())
199+
);
184200
ClassRefactoringPanel.reporter.log(uuid, info);
185-
RefactoringsApplier.moveRefactoring(selectedRefactorings, scope, model);
186201

187202
table.setEnabled(true);
188203
doRefactorButton.setEnabled(true);

src/main/java/org/jetbrains/research/groups/ml_methods/ui/RefactoringsApplier.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,20 @@ static Map<CalculatedRefactoring, String> getWarnings(List<CalculatedRefactoring
3939
return warnings;
4040
}
4141

42-
public static void moveRefactoring(@NotNull List<MoveToClassRefactoring> refactorings,
43-
@NotNull AnalysisScope scope,
44-
@Nullable RefactoringsTableModel model) {
42+
public static @NotNull Set<MoveToClassRefactoring> moveRefactoring(
43+
final @NotNull List<MoveToClassRefactoring> refactorings,
44+
final @NotNull AnalysisScope scope,
45+
final @Nullable RefactoringsTableModel model
46+
) {
4547
if (!checkValid(refactorings)) {
4648
throw new IllegalArgumentException("Units in refactorings list must be unique!");
4749
}
4850

4951
final Map<PsiClass, List<MoveToClassRefactoring>> groupedRefactorings = prepareRefactorings(refactorings);
50-
ApplicationManager.getApplication().runReadAction(() -> {
51-
for (Entry<PsiClass, List<MoveToClassRefactoring>> refactoring : groupedRefactorings.entrySet()) {
52-
final Set<MoveToClassRefactoring> accepted = new HashSet<>();
52+
final Set<MoveToClassRefactoring> accepted = new HashSet<>();
5353

54+
ApplicationManager.getApplication().runReadAction(() -> {
55+
for (Map.Entry<PsiClass, List<MoveToClassRefactoring>> refactoring : groupedRefactorings.entrySet()) {
5456
final PsiClass target = refactoring.getKey();
5557
final List<MoveToClassRefactoring> filteredRefactorings = refactoring.getValue().stream()
5658
.sequential()
@@ -75,13 +77,11 @@ public static void moveRefactoring(@NotNull List<MoveToClassRefactoring> refacto
7577
.filter(r -> makeStatic(r.getEntityOrThrow())) // no effect for already static members
7678
.collect(Collectors.toList());
7779

78-
accepted.addAll(moveMembersRefactoring(filteredRefactorings, target, scope));
79-
80-
if (model != null) {
81-
model.setAcceptedRefactorings(accepted.stream().map(m -> new CalculatedRefactoring(m, 0)).collect(Collectors.toSet()));
82-
}
80+
accepted.addAll(moveMembersRefactoring(filteredRefactorings, target, scope));
8381
}
8482
});
83+
84+
return accepted;
8585
}
8686

8787
private static boolean checkValid(Collection<MoveToClassRefactoring> refactorings) {

src/main/java/org/jetbrains/research/groups/ml_methods/ui/RefactoringsTableModel.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,28 @@ void setEnableHighlighting(boolean isEnabled) {
6666
fireTableDataChanged();
6767
}
6868

69-
public void setAcceptedRefactorings(@NotNull Set<CalculatedRefactoring> accepted) {
69+
public void setAppliedRefactorings(@NotNull Set<CalculatedRefactoring> accepted) {
7070
virtualRows.forEach(i -> {
7171
if (accepted.contains(refactorings.get(i))) {
7272
isActive[i] = false;
73+
isSelected[i] = false;
7374
}
7475
});
7576
}
7677

78+
List<CalculatedRefactoring> pullSelectable() {
79+
final List<CalculatedRefactoring> result = virtualRows.stream()
80+
.filter(i -> isActive[i])
81+
.map(refactorings::get)
82+
.collect(Collectors.toList());
83+
fireTableDataChanged();
84+
return result;
85+
}
86+
7787
List<CalculatedRefactoring> pullSelected() {
78-
final List<CalculatedRefactoring> result = IntStream.range(0, isSelected.length)
88+
final List<CalculatedRefactoring> result = virtualRows.stream()
7989
.filter(i -> isSelected[i] && isActive[i])
80-
.mapToObj(refactorings::get)
90+
.map(refactorings::get)
8191
.collect(Collectors.toList());
8292
fireTableDataChanged();
8393
return result;

0 commit comments

Comments
 (0)