001 package org.sonar.ide.shared.duplications;
002
003 import org.jdom.Document;
004 import org.jdom.Element;
005 import org.jdom.JDOMException;
006 import org.jdom.input.SAXBuilder;
007 import org.sonar.ide.api.SonarIdeException;
008 import org.sonar.ide.api.SourceCodeDiff;
009
010 import java.io.IOException;
011 import java.io.StringReader;
012 import java.util.ArrayList;
013 import java.util.Collection;
014 import java.util.List;
015
016 /**
017 * @author Evgeny Mandrikov
018 * @since 0.2
019 */
020 public final class DuplicationUtils {
021 public static final String DUPLICATIONS_DATA = "duplications_data";
022
023 public static List<Duplication> parse(String xml) {
024 List<Duplication> result = new ArrayList<Duplication>();
025 SAXBuilder builder = new SAXBuilder();
026 Document doc;
027 try {
028 doc = builder.build(new StringReader(xml));
029 } catch (JDOMException e) {
030 throw new SonarIdeException("Unable to parse duplications", e);
031 } catch (IOException e) {
032 throw new SonarIdeException("Unable to parse duplications", e);
033 }
034 List duplications = doc.getRootElement().getChildren("duplication");
035 for (Object elementObj : duplications) {
036 Element element = (Element) elementObj;
037 String lines = element.getAttributeValue("lines");
038 String start = element.getAttributeValue("start");
039 String targetStart = element.getAttributeValue("target-start");
040 String targetResource = element.getAttributeValue("target-resource");
041 result.add(new Duplication(
042 Integer.parseInt(lines),
043 Integer.parseInt(start),
044 Integer.parseInt(targetStart),
045 targetResource
046 ));
047 }
048 return result;
049 }
050
051 public static List<Duplication> convertLines(Collection<Duplication> duplications, SourceCodeDiff diff) {
052 List<Duplication> result = new ArrayList<Duplication>();
053 for (Duplication duplication : duplications) {
054 int newLine = diff.newLine(duplication.getStart());
055 if (newLine != -1) {
056 duplication.setStart(newLine);
057 // TODO convert targetStart
058 result.add(duplication);
059 }
060 }
061 return result;
062 }
063
064 /**
065 * Hide utility-class constructor.
066 */
067 private DuplicationUtils() {
068 }
069
070 public static String getDescription(Duplication duplication) {
071 return String.format(
072 "Duplicates %s lines from %s starting from %s",
073 duplication.getLines(),
074 duplication.getTargetResource(),
075 duplication.getTargetStart()
076 );
077 }
078 }