Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
8ac7a96
Added fan-in metric for classes
shurik111333 Mar 28, 2017
2393a18
Added fan-out class metric
shurik111333 Mar 28, 2017
65bad44
Fixed NPE when calls method from unexisting class
shurik111333 Apr 2, 2017
fcfe723
Post Fan-Out metric only for classes from scope
shurik111333 Apr 2, 2017
59fb53f
Added Fan-In method metric
shurik111333 Apr 2, 2017
2079084
Adde Fan-Out method metric
shurik111333 Apr 2, 2017
bc5c68a
Fix abbreviations for fan class metrics
shurik111333 Apr 2, 2017
d07dc50
add metrics profile for refactoring
kivi239 Apr 2, 2017
b1229b4
merge with fan branch
kivi239 Apr 4, 2017
80f5190
add vector representations for class and methods (except 0 component)
kivi239 Apr 4, 2017
a2dbad2
add 1st and 2nd components for methods
kivi239 Apr 9, 2017
da16969
add a class for keeping relevant properties
kivi239 Apr 11, 2017
c6e8025
add visitor for finding relevant properties (partially)
kivi239 Apr 11, 2017
0181c82
change entity classes for saving relevant properties
kivi239 Apr 11, 2017
31691c2
fix bug in constructor call
kivi239 Apr 11, 2017
a97bac6
Fix fan method metrics
shurik111333 Apr 11, 2017
97ad1e5
Fix fan class metrics
shurik111333 Apr 14, 2017
a54e38a
calculate all RPs for classes and methods
kivi239 Apr 17, 2017
ff6f22b
debug output for entity representation
kivi239 Apr 17, 2017
81f158f
debug output for entity representation
kivi239 Apr 17, 2017
6c1643d
add FieldEntity
kivi239 Apr 21, 2017
4b328c0
add vector normalization and dist function
kivi239 Apr 21, 2017
82e1ecd
fix: separate methods called in method and its overridden methods
kivi239 May 2, 2017
d2a749f
remove items from standard libraries for methods and fields
kivi239 May 2, 2017
b68960a
Build graph for CCDA and calculate quality index
kivi239 May 2, 2017
733966a
fix finding common methods in relevant properties sets
kivi239 May 2, 2017
3caec27
Add field usage calculation
shurik111333 May 2, 2017
e17ec6a
Added calculating field usages in fan class metric
shurik111333 May 2, 2017
9feca1e
calculate quality index change
kivi239 May 4, 2017
507bfd3
implement CCDA algorithm, fix updating quality index
kivi239 May 4, 2017
60c7e1a
add small example for testing CCDA
kivi239 May 4, 2017
72cf320
fix: update the community after moving
kivi239 May 5, 2017
75470bf
add another sample
kivi239 May 5, 2017
253b599
add method for re-evaluating the partition after applying indetified …
kivi239 May 10, 2017
149b25d
Merge branch 'fan_metrics' of https://github.com/shurik111333/Metrics…
kivi239 May 10, 2017
d4c9810
fix bug with anonymous classes
kivi239 May 10, 2017
442bb81
fix in applyRefactorings: new classes may appear in refactorings list
kivi239 May 11, 2017
e4011e0
check vector components for null: bug with interfaces metrics
kivi239 May 11, 2017
19c65d4
Now fan class metrics calculate metrics only for concrete classes
shurik111333 May 11, 2017
71f85b2
comment out debug output
kivi239 May 11, 2017
919dda1
Now fan metrics ignore lambda methods
shurik111333 May 11, 2017
92212fe
check vector components for null: bug with interfaces metrics
kivi239 May 11, 2017
011961f
Merge branch 'fan_metrics' of https://github.com/shurik111333/Metrics…
kivi239 May 11, 2017
64234b5
fixes for attributes and methods of anonymous classes or interfaces
kivi239 May 11, 2017
7a11728
fix: initialize communities for methods before building graph, add ep…
kivi239 May 11, 2017
8ad516c
fix bug: recalculating Q after moving
kivi239 May 11, 2017
7bad118
change eps for dQ
kivi239 May 15, 2017
fed0185
fix bugs in distance function
kivi239 May 15, 2017
da2a329
remove basic classes and methods from RP
kivi239 May 15, 2017
db719c0
implemented ARI
kivi239 May 15, 2017
9d452f1
fix bug with adding vector components for methods
kivi239 May 15, 2017
4e3b0a9
Update distance function
kivi239 May 15, 2017
649b930
fix bug: swap fan-in & fan-out for fields
kivi239 May 15, 2017
bb52842
fix: method cannot move to parent class
kivi239 May 16, 2017
c105cd6
added getAllSupers for methods
kivi239 May 16, 2017
a8e8a49
remove debug output
kivi239 May 16, 2017
3333368
add another file visitor for finding all classes before building RPs
kivi239 May 16, 2017
4d91db5
add another file visitor for finding all classes before building RPs
kivi239 May 16, 2017
71d5a7a
recalculate RPs after method moving
kivi239 May 16, 2017
0a0dddc
implemeted HAC
kivi239 May 16, 2017
f75ebff
renamed algorithm
kivi239 May 16, 2017
1f1a9d6
added ARI: same as MRI
kivi239 May 16, 2017
9fbb17c
fix: cannot move method to the parent class
kivi239 May 16, 2017
880172f
remove debug output
kivi239 May 17, 2017
dbceace
change two nearest communities detection: using samples
kivi239 May 17, 2017
c1b8831
fix HAC: change finding nearest clusters - complete-linkage
kivi239 May 17, 2017
17147e6
change eps for CCDA
kivi239 May 17, 2017
28a50d5
remove enums from classes
kivi239 May 17, 2017
80fb61d
implemented AKMeans (FMC) algorithm
kivi239 May 17, 2017
46a4ae9
implemented AKMeans (FMC) algorithm
kivi239 May 17, 2017
f9ff149
implemented HAC (N^2 log N)
kivi239 May 22, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@

<actions>
<group>
<action id="Metrics.ProjectMetricsAction" class="com.sixrr.metrics.plugin.ProjectMetricsAction"
text="Calculate Metrics..."/>
<action id="Metrics.AutomaticRefactoringAction" class="com.sixrr.metrics.plugin.AutomaticRefactoringAction"
text="Automatic refactoring..."/>
<!--action id="Metrics.ViewOfflineMetricsResults"
class="com.sixrr.metrics.offline.ViewOfflineMetricsResultsAction"
text="View Offline Metrics Results...">
Expand Down
237 changes: 237 additions & 0 deletions src/com/sixrr/metrics/plugin/AutomaticRefactoringAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
/*
* Copyright 2005-2017 Sixth and Red River Software, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.sixrr.metrics.plugin;

import java.lang.reflect.Array;
import java.util.*;

import com.intellij.analysis.AnalysisScope;
import com.intellij.analysis.BaseAnalysisAction;
import com.intellij.analysis.BaseAnalysisActionDialog;
import com.intellij.openapi.progress.EmptyProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.psi.JavaElementVisitor;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElementVisitor;
import com.sixrr.metrics.config.MetricsReloadedConfig;
import com.sixrr.metrics.metricModel.*;
import com.sixrr.metrics.profile.MetricsProfile;
import com.sixrr.metrics.profile.MetricsProfileRepository;
import com.sixrr.metrics.ui.dialogs.ProfileSelectionPanel;
import com.sixrr.metrics.ui.metricdisplay.MetricsToolWindow;
import com.sixrr.metrics.utils.MetricsReloadedBundle;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.sixrr.metrics.Metric;
import com.sixrr.metrics.MetricCategory;

import com.intellij.analysis.AnalysisScope;
import com.intellij.analysis.BaseAnalysisAction;
import com.intellij.analysis.BaseAnalysisActionDialog;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.wm.ToolWindowManager;
import com.sixrr.metrics.config.MetricsReloadedConfig;
import com.sixrr.metrics.metricModel.MetricsExecutionContextImpl;
import com.sixrr.metrics.metricModel.MetricsRunImpl;
import com.sixrr.metrics.metricModel.TimeStamp;
import com.sixrr.metrics.profile.MetricsProfile;
import com.sixrr.metrics.profile.MetricsProfileRepository;
import com.sixrr.metrics.ui.dialogs.ProfileSelectionPanel;
import com.sixrr.metrics.ui.metricdisplay.MetricsToolWindow;
import com.sixrr.metrics.utils.MetricsReloadedBundle;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import vector.model.*;

import javax.swing.*;

/**
* Created by Kivi on 02.04.2017.
*/
public class AutomaticRefactoringAction extends BaseAnalysisAction{
public AutomaticRefactoringAction() {
super(MetricsReloadedBundle.message("metrics.calculation"), MetricsReloadedBundle.message("metrics"));
}

@Override
protected void analyze(@NotNull final Project project, @NotNull final AnalysisScope analysisScope) {
System.out.println(analysisScope.getDisplayName());
System.out.println(project.getBasePath());
System.out.println("");
final MetricsProfileRepository repository = MetricsProfileRepository.getInstance();
final MetricsProfile profile = repository.getCurrentProfile();
final MetricsToolWindow toolWindow = MetricsToolWindow.getInstance(project);
final MetricsRunImpl metricsRun = new MetricsRunImpl();

final PropertiesFinder properties = new PropertiesFinder();
final PsiElementVisitor visitor = properties.createVisitor(analysisScope);
ProgressManager.getInstance().runProcess(new Runnable() {
@Override
public void run() {
analysisScope.accept(visitor);;
}
}, new EmptyProgressIndicator());

new MetricsExecutionContextImpl(project, analysisScope) {

@Override
public void onFinish() {
final boolean showOnlyWarnings = MetricsReloadedConfig.getInstance().isShowOnlyWarnings();
if(!metricsRun.hasWarnings(profile) && showOnlyWarnings) {
ToolWindowManager.getInstance(project).notifyByBalloon(MetricsToolWindow.METRICS_TOOL_WINDOW_ID,
MessageType.INFO, MetricsReloadedBundle.message("no.metrics.warnings.found"));
return;
}
final String profileName = profile.getName();
metricsRun.setProfileName(profileName);
metricsRun.setContext(analysisScope);
metricsRun.setTimestamp(new TimeStamp());
toolWindow.show(metricsRun, profile, analysisScope, showOnlyWarnings);

MetricsResult classMetrics = metricsRun.getResultsForCategory(MetricCategory.Class);
MetricsResult methodMetrics = metricsRun.getResultsForCategory(MetricCategory.Method);

ArrayList<Entity> entities = new ArrayList<Entity>();
System.out.println("Classes: " + classMetrics.getMeasuredObjects().length);
System.out.println("Methods: " + methodMetrics.getMeasuredObjects().length);
for (String obj : classMetrics.getMeasuredObjects()) {
if (obj.equals("null")) {
continue;
}
if (!properties.getAllClassesNames().contains(obj)) {
continue;
}
Entity classEnt = new ClassEntity(obj, metricsRun, properties);
entities.add(classEnt);
}
for (String obj : methodMetrics.getMeasuredObjects()) {
if (obj.substring(0, obj.indexOf('.')).equals("null")) {
continue;
}
if (properties.hasElement(obj)) {
Entity methodEnt = new MethodEntity(obj, metricsRun, properties);
entities.add(methodEnt);
}
}

Set<String> fields = properties.getAllFields();
System.out.println("Properties: " + fields.size());
for (String field : fields) {
Entity fieldEnt = new FieldEntity(field, metricsRun, properties);
entities.add(fieldEnt);
}

/*for (Entity ent : entities) {
ent.print();
System.out.println();
}*/
System.out.println("!!!\n");

Entity.normalize(entities);
/*for (Entity ent : entities) {
ent.print();
System.out.println();
}*/

System.out.println("!!!\n");

CCDA alg = new CCDA(entities);
System.out.println("Starting CCDA...");
System.out.println(alg.calculateQualityIndex());
Map<String, String> refactorings = alg.run();
System.out.println("Finished CCDA\n");
for (String ent : refactorings.keySet()) {
System.out.println(ent + " --> " + refactorings.get(ent));
}

MRI alg2 = new MRI(entities, properties.getAllClasses());
System.out.println("\nStarting MMRI...");
//alg2.printTableDistances();
Map<String, String> refactorings2 = alg2.run();
System.out.println("Finished MMRI");
for (String method : refactorings2.keySet()) {
System.out.println(method + " --> " + refactorings2.get(method));
}

Set<String> common = new HashSet<String>(refactorings.keySet());
common.retainAll(refactorings2.keySet());
System.out.println("Common for ARI and CCDA: ");
for (String move : common) {
System.out.print(move + " to ");
System.out.print(refactorings.get(move));
if (!refactorings2.get(move).equals(refactorings.get(move))) {
System.out.print(" vs " + refactorings2.get(move));
}
System.out.println();
}
System.out.println();

AKMeans alg5 = new AKMeans(entities, 50);
System.out.println("\nStarting AKMeans...");
Map<String, String> refactorings5 = alg5.run();
System.out.println("Finished AKMeans");
for (String method : refactorings5.keySet()) {
System.out.println(method + " --> " + refactorings5.get(method));
}

Set<String> refactoringsARIEC = new HashSet<String>(refactorings5.keySet());
refactoringsARIEC.retainAll(refactorings2.keySet());
System.out.println("Common for ARI and EC: ");
for (String move : refactoringsARIEC) {
System.out.print(move + " to ");
System.out.print(refactorings5.get(move));
if (!refactorings2.get(move).equals(refactorings5.get(move))) {
System.out.print(" vs " + refactorings2.get(move));
}
System.out.println();
}
System.out.println();


HAC alg3 = new HAC(entities);
System.out.println("\nStarting HAC...");
refactorings = alg3.run();
System.out.println("Finished HAC");
for (String method : refactorings.keySet()) {
System.out.println(method + " --> " + refactorings.get(method));
}

ARI alg4 = new ARI(entities);
System.out.println("\nStarting ARI...");
refactorings = alg4.run();
System.out.println("Finished ARI");
for (String method : refactorings.keySet()) {
System.out.println(method + " --> " + refactorings.get(method));
}



}
}.execute(profile, metricsRun);
}

@Override
@Nullable
protected JComponent getAdditionalActionSettings(Project project, BaseAnalysisActionDialog dialog) {
return new ProfileSelectionPanel(project);
}
}
Loading