/* * The MIT License * * Copyright 2013 Mirko Friedenhagen, Kojima Takanori * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package hudson.plugins.jobConfigHistory; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.TreeMap; import difflib.DiffRow; /** * Holds information for the SideBySideView. * * @author Kojima Takanori * @author Mirko Friedenhagen */ public class SideBySideView { /** * All lines of the view. */ private final List<Line> lines = new ArrayList<Line>(); /** * Returns the lines of the {@link SideBySideView}. * * @return an unmodifiable view of the lines. */ public List<Line> getLines() { return Collections.unmodifiableList(lines); } /** * Adds a line. * * @param line * A single line. */ public void addLine(Line line) { lines.add(line); } /** * Deletes all dupes in the given lines. */ public void clearDuplicateLines() { final TreeMap<Integer, Line> linesByNumbers = new TreeMap<Integer, Line>(); final ArrayList<Line> dupes = new ArrayList<Line>(); final Iterator<Line> iter = lines.iterator(); while (iter.hasNext()) { final Line line = iter.next(); final String lineNum = line.left.getLineNumber(); if (lineNum.length() != 0) { final int lineNumInt = Integer.parseInt(lineNum); if (linesByNumbers.containsKey(lineNumInt)) { if (line.getTag() == DiffRow.Tag.EQUAL) { iter.remove(); } else { dupes.add(linesByNumbers.get(lineNumInt)); } } else { linesByNumbers.put(lineNumInt, line); } } } lines.removeAll(dupes); } /** * Holds information about a single line, which consists of the left and * right information of the diff. */ public static class Line { /** The left version of a modificated line. */ private final Item left = new Item(); /** The right version of a modificated line. */ private final Item right = new Item(); /** True when line should be skipped. */ private boolean skipping; /** EQUAL, INSERT, CHANGE or DELETE. */ private DiffRow.Tag tag; /** * Returns the left version of a modificated line. * * @return left item. */ public Item getLeft() { return left; } /** * Returns the right version of a modificated line. * * @return right item. */ public Item getRight() { return right; } /** * Should we skip this line. * * @return true when the line should be skipped. */ public boolean isSkipping() { return skipping; } /** * Sets skipping. * * @param skipping * skip? */ public void setSkipping(boolean skipping) { this.skipping = skipping; } /** * @return the tag */ public DiffRow.Tag getTag() { return tag; } /** * @param tag * the tag to set */ public void setTag(DiffRow.Tag tag) { this.tag = tag; } /** * Simple representation of a diff element. * * Additional to the the text this includes the linenumber as well as * the corresponding cssClass which signals wether the item was * modified, added or deleted. */ public static class Item { /** Line number of Item. */ private Integer lineNumber; /** Text of Item. */ private String text; /** CSS Class of Item. */ private String cssClass; /** * Returns the line number of the Item. * * @return lineNumber. */ public String getLineNumber() { return lineNumber == null ? "" : String.valueOf(lineNumber); } /** * Returns the text of the Item. * * @return text. */ public String getText() { return text; } /** * Returns the cssClass of the Item. * * @return cssClass. */ public String getCssClass() { return cssClass; } /** * Sets cssClass. * * @param cssClass * cssClass */ public void setCssClass(String cssClass) { this.cssClass = cssClass; } /** * @param lineNumber * the lineNumber to set */ public void setLineNumber(Integer lineNumber) { this.lineNumber = lineNumber; } /** * @param text * the text to set */ public void setText(String text) { this.text = text; } } } }