Miaomz 6 лет назад
Родитель
Сommit
e4f5c9f87b

+ 6 - 0
src/main/java/com/moekr/moocoder/logic/api/Wala.java

@@ -37,6 +37,7 @@ public class Wala {
     @Getter
     @Setter
     private AnalysisScope scope;
+    @Getter
     private ClassHierarchy cha;
 
     /**
@@ -144,6 +145,11 @@ public class Wala {
         return mainlist.isEmpty() ? methodlist: mainlist;
     }
 
+
+
+
+
+
     public CallGraph getCGByMethod(IMethod entry) throws IllegalArgumentException, CallGraphBuilderCancelException {
         //System.out.println(entry.toString());
         ArrayList<Entrypoint> points = new ArrayList<Entrypoint>();

+ 42 - 0
src/main/java/com/moekr/moocoder/logic/api/WalaController.java

@@ -1,11 +1,13 @@
 package com.moekr.moocoder.logic.api;
 
+import com.ibm.wala.classLoader.IClass;
 import com.ibm.wala.classLoader.IMethod;
 import com.ibm.wala.classLoader.Language;
 import com.ibm.wala.ipa.callgraph.AnalysisScope;
 import com.ibm.wala.ipa.callgraph.CGNode;
 import com.ibm.wala.ipa.callgraph.CallGraph;
 import com.ibm.wala.ipa.callgraph.CallGraphBuilderCancelException;
+import com.ibm.wala.ipa.cha.ClassHierarchy;
 import com.ibm.wala.util.collections.Pair;
 import com.ibm.wala.util.graph.traverse.DFS;
 import com.moekr.moocoder.util.FileUtil;
@@ -106,6 +108,46 @@ public class WalaController {
     }
 
 
+    public List<String> getAllJavaClasses(String srcDir) {
+        String filterPath = getClass().getResource(FILTER).getFile();
+        File f = new File(srcDir);
+        Wala wala = new Wala(filterPath, f.getPath());
+        ClassHierarchy cha = wala.getCha();
+
+        List<String> ret = new ArrayList<>();
+        for (IClass iClass: cha) {
+            if(wala.getScope().isApplicationLoader(iClass.getClassLoader())) {
+                String className = iClass.getName().getClassName().toString();
+                if (className.contains("$")){
+                    continue;
+                }
+
+                ret.add(className);
+            }
+        }
+        return ret;
+    }
+
+    public List<String> getAllJavaPackages(String srcDir) {
+        String filterPath = getClass().getResource(FILTER).getFile();
+        File f = new File(srcDir);
+        Wala wala = new Wala(filterPath, f.getPath());
+        ClassHierarchy cha = wala.getCha();
+
+        Set<String> ret = new HashSet<>();
+        for (IClass iClass: cha) {
+            if(wala.getScope().isApplicationLoader(iClass.getClassLoader())) {
+                String className = iClass.getName().getClassName().toString();
+                if (className.contains("$")){
+                    continue;
+                }
+                ret.add(iClass.getName().getPackage().toString());
+            }
+        }
+        return new ArrayList<>(ret);
+    }
+
+
     private void makeGraph(AnalysisScope scope, List<CallGraph> cgs, String path) throws IOException {
         try (BufferedWriter bw = new BufferedWriter(new FileWriter(path))){
             Set<String> strs = new HashSet<>();

+ 7 - 1
src/main/java/com/moekr/moocoder/logic/service/impl/CallGraphVisualizer.java

@@ -43,7 +43,13 @@ public class CallGraphVisualizer {
         } else {
             CallGraphVO callGraphVO = getForceDirectedGraphOfMethods(project);
             if (callGraphVO != null) {
-                return increaseGranularity(increaseGranularity(callGraphVO));
+                callGraphVO = increaseGranularity(callGraphVO);
+                if (callGraphVO != null) {
+                    return increaseGranularity(callGraphVO);
+                } else {
+                    log.error("CallGraphVO在提高粒度后为null!");
+                    return new CallGraphVO();
+                }
             }
         }
         return null;  // if the return value of getForceDirectedGraphOfMethods is null

+ 4 - 0
src/main/java/com/moekr/moocoder/logic/service/impl/CodeMetricServiceImpl.java

@@ -33,6 +33,10 @@ public class CodeMetricServiceImpl implements CodeMetricService{
     @Override
     public CodeScaleMetricVO getCodeScaleMetric(String project) {
         CallGraphVO methodGraph = visualizer.getForceDirectedGraph(project, Granularity.METHOD);
+        if (methodGraph == null) {
+            return new CodeScaleMetricVO(0, 0, 0);
+        }
+
         CallGraphVO classGraph = visualizer.increaseGranularity(methodGraph);
 
         List<CallGraphNodeVO> classesNode = classGraph.getNodes();

+ 7 - 11
src/main/java/com/moekr/moocoder/logic/service/impl/ScoreServiceImpl.java

@@ -34,11 +34,8 @@ public class ScoreServiceImpl implements ScoreService{
         ret.setExtension(calcExtensionScore(extensionMetricVO));
         ret.setTestCoverage(calcCoverageMetricScore(coverageMetricVO));
 
-        //use root mean square to calc the total score
-        double rms = (square(ret.getScale()) + square(ret.getNormal()) + square(ret.getMaintain()) + square(ret.getErrorProne())
-                + square(ret.getExtension()) + square(ret.getTestCoverage())) / 6.0;
-        rms = Math.sqrt(rms);
-        ret.setWeighted(rms);
+        double average = (ret.getScale() + ret.getNormal() + ret.getMaintain() + ret.getExtension() + ret.getErrorProne()) / 5.0;
+        ret.setWeighted(average);
         return ret;
     }
 
@@ -98,13 +95,17 @@ public class ScoreServiceImpl implements ScoreService{
     }
 
     private double calcCoverageMetricScore(CoverageMetricVO coverageMetricVO) {
-        //TODO
         return 100;
     }
 
     private double calcExtensionScore(ExtensionMetricVO extensionMetricVO) {
         double extensionScore = 100 * extensionMetricVO.getNormDistMainSeqMean();
 
+        int packageSize = extensionMetricVO.getPackageAfferentCouplingMap().size();
+        if (packageSize == 0) {  // TODO if there is no package, it is an illegal input
+            return extensionScore;
+        }
+
         int afferentOverCount = 0;
         for (Map.Entry<String, Integer> entry: extensionMetricVO.getPackageAfferentCouplingMap().entrySet()) {
             int coupling = entry.getValue();
@@ -125,11 +126,6 @@ public class ScoreServiceImpl implements ScoreService{
         return extensionScore / 3;
     }
 
-
-    private double square(double x) {
-        return x * x;
-    }
-
     private double calcIssuesScore(int issuesCount) {
         double unscaledScore = (ISSUES_HIGH_THRESHOLD-issuesCount) / (double)(ISSUES_HIGH_THRESHOLD-ISSUES_LOW_THRESHOLD);
         return 100 * Math.min(1, Math.max(0, unscaledScore));

+ 6 - 2
src/main/java/com/moekr/moocoder/web/VisualizationController.java

@@ -34,8 +34,12 @@ public class VisualizationController {
     public CallGraphVO callGraph(@RequestParam String id, @RequestParam String granularity){
         Granularity g = Granularity.valueOf(granularity);
         CallGraphVO ret =  visualizationService.callGraphAsForceDirected(id, g);
-        processCallGraphVO(ret, g);
-        return ret;
+        if (ret != null) {
+            processCallGraphVO(ret, g);
+            return ret;
+        } else {
+            return new CallGraphVO(new ArrayList<>(), new ArrayList<>());
+        }
     }
 
     @GetMapping("/commit_diff")

+ 19 - 0
src/test/java/com/moekr/moocoder/logic/api/WalaControllerTest.java

@@ -4,6 +4,9 @@ import com.moekr.moocoder.util.enums.Source;
 import org.junit.jupiter.api.Test;
 
 import java.io.File;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
 
 /**
  * @author miaomuzhi
@@ -17,7 +20,23 @@ class WalaControllerTest {
         String srcDir = getClass().getResource("/wala/jar/bukkit.jar").getFile();
         String dstDir = getClass().getResource("/wala/jar").getFile() + File.separator + "bukkit";
         wc.makeData(srcDir, dstDir, Source.CLASS_FILE);
+    }
 
+    @Test
+    void getAllJavaClassesTest() {
+        WalaController wc = new WalaController();
+        String srcDir = getClass().getResource("/wala/jar/bukkit.jar").getFile();
+        List<String> classes = wc.getAllJavaClasses(srcDir);
+        assertEquals(2305, classes.size());
     }
 
+    @Test
+    void getAllJavaPackagesTest() {
+        WalaController wc = new WalaController();
+        String srcDir = getClass().getResource("/wala/jar/bukkit.jar").getFile();
+        List<String> packages = wc.getAllJavaPackages(srcDir);
+        for (String aPackage : packages) {
+            System.out.println(aPackage);
+        }
+    }
 }