All Downloads are FREE. Search and download functionalities are using the official Maven repository.

difflib.Patch Maven / Gradle / Ivy

Go to download

A temporary copy of java diff utils from http://code.google.com/p/java-diff-utils to allow releasing dybdob

The newest version!
/*
    Copyright 2009 Dmitry Naumenko ([email protected])
    
    This file is part of Java Diff Utills Library.

    Java Diff Utills Library is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    Java Diff Utills Library 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 General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Java Diff Utills Library.  If not, see .
 */
package difflib;

import java.util.*;

/**
 * Describes the patch holding all deltas between the original and revised texts.
 * 
 * @author Dmitry Naumenko
 */
public class Patch {
    private List deltas = new LinkedList();
    private boolean isSorted = false;
    
    /**
     * Apply this patch to the given target
     * @param target
     * @return the patched text
     * @throws PatchFailedException if can't apply patch
     */
    public List applyTo(List target) throws PatchFailedException {
        List result = new LinkedList(target);
        ListIterator it = getDeltas().listIterator(deltas.size());
        while (it.hasPrevious()) {
            Delta delta = (Delta) it.previous();
            delta.applyTo(result);
        }
        return result;
    }
    
    /**
     * Restore the text to original. Opposite to applyTo() method.
     * @param target the given target
     * @return the restored text
     */
    public List restore(List target) {
        List result = new LinkedList(target);
        ListIterator it = getDeltas().listIterator(deltas.size());
        while (it.hasPrevious()) {
            Delta delta = (Delta) it.previous();
            delta.restore(result);
        }
        return result;
    }
    
    /**
     * Add the given delta to this patch
     * @param delta the given delta
     */
    public void addDelta(Delta delta) {
        deltas.add(delta);
        isSorted = false;
    }
    
    /**
     * @param deltas the deltas to set
     */
    public void setDeltas(List deltas) {
        this.deltas = deltas;
        isSorted = false;
    }
    
    /**
     * Get the list of computed deltas
     * @return the deltas
     */
    public List getDeltas() {
        if (!this.isSorted) {
            Collections.sort(deltas, new Comparator() {
                public int compare(Delta d1, Delta d2) {
                    if (d1.getOriginal().getPosition() > d2.getOriginal().getPosition()) {
                        return 1;
                    } else if (d1.getOriginal().getPosition() > d2.getOriginal().getPosition()) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            });
            isSorted = true;
        }
        return deltas;
    }
    
    /**
     * Get the specific delta from patch deltas
     * @param index the index of delta
     * @return the needed delta
     */
    public Delta getDelta(int index) {
        return deltas.get(index);
    }
}