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    }