]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-1091 Remove duplicated code in sonar-cpd-plugin
authorEvgeny Mandrikov <mandrikov@gmail.com>
Thu, 8 Sep 2011 12:18:18 +0000 (16:18 +0400)
committerEvgeny Mandrikov <mandrikov@gmail.com>
Thu, 8 Sep 2011 13:54:15 +0000 (17:54 +0400)
plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/CpdAnalyser.java
plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/DuplicationsData.java [new file with mode: 0644]
plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/SonarEngine.java
plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/CpdAnalyserTest.java

index 4214a736039b07540e4b0787d2114a41ae78550a..b50838ae34c36253d143831c24c3f9bf4d94be6a 100644 (file)
  */
 package org.sonar.plugins.cpd;
 
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
 import net.sourceforge.pmd.cpd.TokenEntry;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.CpdMapping;
 import org.sonar.api.batch.SensorContext;
-import org.sonar.api.measures.CoreMetrics;
-import org.sonar.api.measures.Measure;
 import org.sonar.api.resources.Project;
 import org.sonar.api.resources.Resource;
 import org.sonar.duplications.cpd.Match;
 
-import java.io.File;
-import java.util.*;
-
 public class CpdAnalyser {
 
   private static final Logger LOG = LoggerFactory.getLogger(CpdAnalyser.class);
@@ -83,7 +84,7 @@ public class CpdAnalyser {
     }
 
     for (DuplicationsData data : duplicationsData.values()) {
-      data.saveUsing(context);
+      data.save();
     }
   }
 
@@ -96,50 +97,4 @@ public class CpdAnalyser {
     return data;
   }
 
-  private static final class DuplicationsData {
-
-    protected Set<Integer> duplicatedLines = new HashSet<Integer>();
-    protected double duplicatedBlocks = 0;
-    protected Resource resource;
-    private SensorContext context;
-    private List<StringBuilder> duplicationXMLEntries = new ArrayList<StringBuilder>();
-
-    private DuplicationsData(Resource resource, SensorContext context) {
-      this.context = context;
-      this.resource = resource;
-    }
-
-    protected void cumulate(Resource targetResource, int targetDuplicationStartLine, int duplicationStartLine, int duplicatedLines) {
-      StringBuilder xml = new StringBuilder();
-      xml.append("<duplication lines=\"").append(duplicatedLines).append("\" start=\"").append(duplicationStartLine)
-          .append("\" target-start=\"").append(targetDuplicationStartLine).append("\" target-resource=\"")
-          .append(context.saveResource(targetResource)).append("\"/>");
-
-      duplicationXMLEntries.add(xml);
-
-      for (int duplicatedLine = duplicationStartLine; duplicatedLine < duplicationStartLine + duplicatedLines; duplicatedLine++) {
-        this.duplicatedLines.add(duplicatedLine);
-      }
-    }
-
-    protected void incrementDuplicatedBlock() {
-      duplicatedBlocks++;
-    }
-
-    protected void saveUsing(SensorContext context) {
-      context.saveMeasure(resource, CoreMetrics.DUPLICATED_FILES, 1d);
-      context.saveMeasure(resource, CoreMetrics.DUPLICATED_LINES, (double) duplicatedLines.size());
-      context.saveMeasure(resource, CoreMetrics.DUPLICATED_BLOCKS, duplicatedBlocks);
-      context.saveMeasure(resource, new Measure(CoreMetrics.DUPLICATIONS_DATA, getDuplicationXMLData()));
-    }
-
-    private String getDuplicationXMLData() {
-      StringBuilder duplicationXML = new StringBuilder("<duplications>");
-      for (StringBuilder xmlEntry : duplicationXMLEntries) {
-        duplicationXML.append(xmlEntry);
-      }
-      duplicationXML.append("</duplications>");
-      return duplicationXML.toString();
-    }
-  }
 }
diff --git a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/DuplicationsData.java b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/DuplicationsData.java
new file mode 100644 (file)
index 0000000..1fc0042
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * Sonar is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
+ */
+package org.sonar.plugins.cpd;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.sonar.api.batch.SensorContext;
+import org.sonar.api.measures.CoreMetrics;
+import org.sonar.api.measures.Measure;
+import org.sonar.api.resources.Resource;
+
+public class DuplicationsData {
+
+  private Resource resource;
+  private Set<Integer> duplicatedLines = new HashSet<Integer>();
+  private double duplicatedBlocks;
+  private List<XmlEntry> duplicationXMLEntries = new ArrayList<XmlEntry>();
+
+  private SensorContext context;
+
+  public DuplicationsData(Resource resource, SensorContext context) {
+    this.resource = resource;
+    this.context = context;
+  }
+
+  public void cumulate(String targetResource, int targetDuplicationStartLine, int duplicationStartLine, int duplicatedLines) {
+    duplicationXMLEntries.add(new XmlEntry(targetResource, targetDuplicationStartLine, duplicationStartLine, duplicatedLines));
+    for (int duplicatedLine = duplicationStartLine; duplicatedLine < duplicationStartLine + duplicatedLines; duplicatedLine++) {
+      this.duplicatedLines.add(duplicatedLine);
+    }
+  }
+
+  public void cumulate(Resource targetResource, int targetDuplicationStartLine, int duplicationStartLine, int duplicatedLines) {
+    cumulate(context.saveResource(targetResource), targetDuplicationStartLine, duplicationStartLine, duplicatedLines);
+  }
+
+  public void incrementDuplicatedBlock() {
+    duplicatedBlocks++;
+  }
+
+  public void save() {
+    context.saveMeasure(resource, CoreMetrics.DUPLICATED_FILES, 1d);
+    context.saveMeasure(resource, CoreMetrics.DUPLICATED_LINES, (double) duplicatedLines.size());
+    context.saveMeasure(resource, CoreMetrics.DUPLICATED_BLOCKS, duplicatedBlocks);
+    context.saveMeasure(resource, new Measure(CoreMetrics.DUPLICATIONS_DATA, getDuplicationXMLData()));
+  }
+
+  private String getDuplicationXMLData() {
+    Collections.sort(duplicationXMLEntries);
+    StringBuilder duplicationXML = new StringBuilder("<duplications>");
+    for (XmlEntry xmlEntry : duplicationXMLEntries) {
+      duplicationXML.append(xmlEntry.toString());
+    }
+    duplicationXML.append("</duplications>");
+    return duplicationXML.toString();
+  }
+
+  /**
+   * Note: this class has a natural ordering that is inconsistent with equals.
+   */
+  private static final class XmlEntry implements Comparable<XmlEntry> {
+    private String target;
+    private int targetStartLine;
+    private int startLine;
+    private int lines;
+
+    private XmlEntry(String target, int targetStartLine, int startLine, int lines) {
+      this.target = target;
+      this.targetStartLine = targetStartLine;
+      this.startLine = startLine;
+      this.lines = lines;
+    }
+
+    @Override
+    public String toString() {
+      return new StringBuilder().append("<duplication lines=\"").append(lines)
+          .append("\" start=\"").append(startLine)
+          .append("\" target-start=\"").append(targetStartLine)
+          .append("\" target-resource=\"").append(target).append("\"/>")
+          .toString();
+    }
+
+    public int compareTo(XmlEntry o) {
+      if (startLine == o.startLine) {
+        return lines - o.lines;
+      }
+      return startLine - o.startLine;
+    }
+  }
+
+}
index 8376e0fb1cd864c9a75c69131c7fa543f5e0cc7d..12de1033609e0a103ad2eac9c42bb963f1709845 100644 (file)
@@ -23,13 +23,8 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.InputStreamReader;
 import java.io.Reader;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
@@ -37,8 +32,6 @@ import org.sonar.api.CoreProperties;
 import org.sonar.api.batch.SensorContext;
 import org.sonar.api.database.DatabaseSession;
 import org.sonar.api.database.model.ResourceModel;
-import org.sonar.api.measures.CoreMetrics;
-import org.sonar.api.measures.Measure;
 import org.sonar.api.resources.InputFile;
 import org.sonar.api.resources.Java;
 import org.sonar.api.resources.JavaFile;
@@ -152,11 +145,11 @@ public class SonarEngine extends CpdEngine {
       List<CloneGroup> clones = OriginalCloneDetectionAlgorithm.detect(index, fileBlocks);
       if (!clones.isEmpty()) {
         // Save
-        DuplicationsData data = new DuplicationsData();
+        DuplicationsData data = new DuplicationsData(resource, context);
         for (CloneGroup clone : clones) {
           poplulateData(data, clone);
         }
-        data.save(context, resource);
+        data.save();
       }
     }
   }
@@ -183,71 +176,4 @@ public class SonarEngine extends CpdEngine {
     }
   }
 
-  // TODO Godin: reuse this class for PMD-CPD
-  private static final class DuplicationsData {
-
-    protected Set<Integer> duplicatedLines = new HashSet<Integer>();
-    protected double duplicatedBlocks = 0;
-    private List<XmlEntry> duplicationXMLEntries = new ArrayList<XmlEntry>();
-
-    private static final class XmlEntry {
-      protected StringBuilder xml;
-      protected int startLine;
-      protected int lines;
-
-      private XmlEntry(int startLine, int lines, StringBuilder xml) {
-        this.xml = xml;
-        this.startLine = startLine;
-        this.lines = lines;
-      }
-    }
-
-    private DuplicationsData() {
-    }
-
-    protected void cumulate(String targetResource, int targetDuplicationStartLine, int duplicationStartLine, int duplicatedLines) {
-      StringBuilder xml = new StringBuilder();
-      xml.append("<duplication lines=\"").append(duplicatedLines).append("\" start=\"").append(duplicationStartLine)
-          .append("\" target-start=\"").append(targetDuplicationStartLine).append("\" target-resource=\"")
-          .append(targetResource).append("\"/>");
-
-      duplicationXMLEntries.add(new XmlEntry(duplicationStartLine, duplicatedLines, xml));
-
-      for (int duplicatedLine = duplicationStartLine; duplicatedLine < duplicationStartLine + duplicatedLines; duplicatedLine++) {
-        this.duplicatedLines.add(duplicatedLine);
-      }
-    }
-
-    protected void incrementDuplicatedBlock() {
-      duplicatedBlocks++;
-    }
-
-    protected void save(SensorContext context, Resource resource) {
-      context.saveMeasure(resource, CoreMetrics.DUPLICATED_FILES, 1d);
-      context.saveMeasure(resource, CoreMetrics.DUPLICATED_LINES, (double) duplicatedLines.size());
-      context.saveMeasure(resource, CoreMetrics.DUPLICATED_BLOCKS, duplicatedBlocks);
-      context.saveMeasure(resource, new Measure(CoreMetrics.DUPLICATIONS_DATA, getDuplicationXMLData()));
-    }
-
-    private String getDuplicationXMLData() {
-      StringBuilder duplicationXML = new StringBuilder("<duplications>");
-
-      Comparator<XmlEntry> comp = new Comparator<XmlEntry>() {
-        public int compare(XmlEntry o1, XmlEntry o2) {
-          if (o1.startLine == o2.startLine) {
-            return o2.lines - o1.lines;
-          }
-          return o1.startLine - o2.startLine;
-        }
-      };
-      Collections.sort(duplicationXMLEntries, comp);
-
-      for (XmlEntry xmlEntry : duplicationXMLEntries) {
-        duplicationXML.append(xmlEntry.xml);
-      }
-      duplicationXML.append("</duplications>");
-      return duplicationXML.toString();
-    }
-  }
-
 }
index 827c266119a2d2471a96281ace4dac20438e9571..a5d3f07bba875c4180e3b9ca6bef7ecda630e057 100644 (file)
@@ -130,8 +130,9 @@ public class CpdAnalyserTest {
     verify(context).saveMeasure(
         eq(resource1),
         argThat(new IsMeasure(CoreMetrics.DUPLICATIONS_DATA, "<duplications>"
+            + "<duplication lines=\"100\" start=\"5\" target-start=\"15\" target-resource=\"key3\"/>"
             + "<duplication lines=\"200\" start=\"5\" target-start=\"15\" target-resource=\"key2\"/>"
-            + "<duplication lines=\"100\" start=\"5\" target-start=\"15\" target-resource=\"key3\"/>" + "</duplications>")));
+            + "</duplications>")));
 
     verify(context).saveMeasure(resource2, CoreMetrics.DUPLICATED_FILES, 1d);
     verify(context).saveMeasure(resource2, CoreMetrics.DUPLICATED_LINES, 200d);