From 02a73dce87fe428021564923beca1e05fbb3f1fa Mon Sep 17 00:00:00 2001 From: karlchenofhell Date: Sat, 3 Feb 2007 05:24:44 +0000 Subject: [PATCH] - added Diff-class for wiki-versioning (forthcoming, first need suitable serverObjects.put() for it) git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@3325 6c8d7289-2bf4-0310-a012-ef5d649a1542 --- source/de/anomic/data/Diff.java | 223 ++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 source/de/anomic/data/Diff.java diff --git a/source/de/anomic/data/Diff.java b/source/de/anomic/data/Diff.java new file mode 100644 index 000000000..d2619d4e0 --- /dev/null +++ b/source/de/anomic/data/Diff.java @@ -0,0 +1,223 @@ +// Diff.java +// --------- +// part of YaCy +// (C) by Michael Peter Christen; mc@anomic.de +// first published on http://www.anomic.de +// Frankfurt, Germany, 2007 +// Created 03.02.2007 +// +// This file is contributed by Franz Brauße +// +// $LastChangedDate: $ +// $LastChangedRevision: $ +// $LastChangedBy: $ +// +// This program 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 2 of the License, or +// (at your option) any later version. +// +// This program 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 this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// Using this software in any meaning (reading, learning, copying, compiling, +// running) means that you agree that the Author(s) is (are) not responsible +// for cost, loss of data or any harm that may be caused directly or indirectly +// by usage of this softare or this documentation. The usage of this software +// is on your own risk. The installation and usage (starting/running) of this +// software may allow other people or application to access your computer and +// any attached devices and is highly dependent on the configuration of the +// software which must be done by the user of the software; the author(s) is +// (are) also not responsible for proper configuration and usage of the +// software, even if provoked by documentation provided together with +// the software. +// +// Any changes to this file according to the GPL as documented in the file +// gpl.txt aside this file in the shipment you received can be done to the +// lines that follows this copyright notice here, but changes must not be +// done inside the copyright notive above. A re-distribution must contain +// the intact and unchanged copyright notice. +// Contributions and changes to the program code must be marked as such. + +package de.anomic.data; + +import java.util.ArrayList; + +/** + * This class provides a diff-functionality. + */ +public class Diff { + + private final ArrayList /* of Part */ parts = new ArrayList(); + private final String o; + private final String n; + + /** + * @param o the original String + * @param n the new String + * @throws NullPointerException if one of the arguments is null + */ + public Diff(String o, String n) { + if (o == null || n == null) throw new NullPointerException("neither o nor n must be null"); + this.o = o; + this.n = n; + parse(1); + } + + /** + * @param o the original String + * @param n the new String + * @param minConsecutive the minimum number of consecutive equal characters in + * both Strings. Smaller seperations will only be performed on the end of either + * String if needed + * @throws NullPointerException if o or n is + * null + */ + public Diff(String o, String n, int minConsecutive) { + if (o == null || n == null) throw new NullPointerException("neither o nor n must be null"); + this.o = o; + this.n = n; + parse((minConsecutive > 0) ? minConsecutive : 1); + } + + private void parse(int minLength) { + /* Matrix: find as long diagonals as possible, + * delete the old horizontally and add the new vertically + * + * ~ OLD ~ + * |T|H|E| |F|I|R|S|T| |S|E|N|T|E|N|C|E| + * T|#| | | | | | | |#| | | | |#| | | | | + * H| |#| | | | | | | | | | | | | | | | | + * E| | |#| | | | | | | | |#| | |#| | |#| + * | | | |#| | | | | |#| | | | | | | | | + * N| | | | | | | | | | | | |#| | |#| | | + * E| | |#| | | | | | | | |#| | |#| | |#| + * ~ X| | | | | | | | | | | | | | | | | | | + * N T|#| | | | | | | |#| | | | |#| | | | | + * E | | | |#| | | | | |#| | | | | | | | | + * W S| | | | | | | |#| | |#| | | | | | | | + * ~ E| | |#| | | | | | | | |#| | |#| | |#| + * N| | | | | | | | | | | | |#| | |#| | | + * T|#| | | | | | | |#| | | | |#| | | | | + * E| | |#| | | | | | | | |#| | |#| | |#| + * N| | | | | | | | | | | | |#| | |#| | | + * C| | | | | | | | | | | | | | | | |#| | + * E| | |#| | | | | | | | | |#| | |#| |#| + */ + boolean[][] matrix = new boolean[this.n.length()][this.o.length()]; + for (int y=0; y zuwenige chars in Diagonale => weitersuchen + break; + } else { + return new int[] { rx, ry, i }; + } + } + return null; + } + + /** + * @return the original String passed to this class on instantiation + */ + public String getOriginal() { return this.o; } + + /** + * @return the new String passed to this class on instantiation + */ + public String getNew() { return this.n; } + + /** + * A diff is composed of different parts. Each of these parts stands for an + * operation, like "do nothing", "add" or "delete". + * + * @see Part + * @return all parts this diff consists of in correct order + */ + public Part[] getParts() { return (Part[])this.parts.toArray(new Part[this.parts.size()]); } + + /** + * This class represents a part of the diff, meaning one operation + * (or one line of a "normal" diff) + */ + public class Part { + + /** The string this diff-part cares about has not been changed */ + public static final int UNCHANGED = 0; + /** The string this diff-part cares about has been added in the new version */ + public static final int ADDED = 1; + /** The string this diff-part cares about has been removed in the new version */ + public static final int DELETED = 2; + + private final int action; + private final int posOld; + private final int posNew; + + private Part(int action, int posOld, int posNew) { + this.action = action; + this.posOld = posOld; + this.posNew = posNew; + } + + /** + * @return whether the string shan't be changed, shall be added or deleted + */ + public int getAction() { return this.action; } + public int getPosOld() { return this.posOld; } + public int getPosNew() { return this.posNew; } + + /** + * @return the plain string this diff-part cares about + */ + public String getString() { + return ((this.action == ADDED) ? Diff.this.n : Diff.this.o).substring(this.posOld, this.posNew); + } + + /** + * @return the string this diff-part cares about in typical diff-notation: + *
+ *
unchanged
"  STRING"
+ *
added
"+ STRING"
+ *
deleted
"- STRING"
+ *
+ */ + public String toString() { + return ((this.action == UNCHANGED) ? " " : + (this.action == ADDED) ? "+" : "-") + " " + getString(); + } + } +}