From: <sh...@us...> - 2009-08-26 16:03:17
|
Revision: 16072 http://jedit.svn.sourceforge.net/jedit/?rev=16072&view=rev Author: shlomy Date: 2009-08-26 16:03:11 +0000 (Wed, 26 Aug 2009) Log Message: ----------- Beginning of md5 checksum-based dirty line provider. Modified Paths: -------------- plugins/DirtyGutter/trunk/services.xml plugins/DirtyGutter/trunk/src/lcm/painters/ColoredRectWithStripsPainter.java Added Paths: ----------- plugins/DirtyGutter/trunk/src/lcm/providers/md5/ plugins/DirtyGutter/trunk/src/lcm/providers/md5/ChecksumBufferHandler.java plugins/DirtyGutter/trunk/src/lcm/providers/md5/ChecksumDirtyLineProvider.java Modified: plugins/DirtyGutter/trunk/services.xml =================================================================== --- plugins/DirtyGutter/trunk/services.xml 2009-08-26 08:49:18 UTC (rev 16071) +++ plugins/DirtyGutter/trunk/services.xml 2009-08-26 16:03:11 UTC (rev 16072) @@ -9,4 +9,7 @@ <SERVICE CLASS="lcm.DirtyLineProvider" NAME="Diff"> new lcm.providers.diff.DiffDirtyLineProvider(); </SERVICE> + <SERVICE CLASS="lcm.DirtyLineProvider" NAME="MD5"> + new lcm.providers.md5.ChecksumDirtyLineProvider(); + </SERVICE> </SERVICES> \ No newline at end of file Modified: plugins/DirtyGutter/trunk/src/lcm/painters/ColoredRectWithStripsPainter.java =================================================================== --- plugins/DirtyGutter/trunk/src/lcm/painters/ColoredRectWithStripsPainter.java 2009-08-26 08:49:18 UTC (rev 16071) +++ plugins/DirtyGutter/trunk/src/lcm/painters/ColoredRectWithStripsPainter.java 2009-08-26 16:03:11 UTC (rev 16072) @@ -29,7 +29,7 @@ public class ColoredRectWithStripsPainter extends ColoredRectDirtyMarkPainter { - static final int STRIP_HEIGHT = 1; + static final int STRIP_HEIGHT = 2; private int stripHeight = STRIP_HEIGHT; private Color stripColor = Color.RED; private boolean topStrip = false, middleRect = false, bottomStrip = false; Added: plugins/DirtyGutter/trunk/src/lcm/providers/md5/ChecksumBufferHandler.java =================================================================== --- plugins/DirtyGutter/trunk/src/lcm/providers/md5/ChecksumBufferHandler.java (rev 0) +++ plugins/DirtyGutter/trunk/src/lcm/providers/md5/ChecksumBufferHandler.java 2009-08-26 16:03:11 UTC (rev 16072) @@ -0,0 +1,124 @@ +package lcm.providers.md5; + +import java.awt.Color; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Comparator; +import java.util.TreeMap; + +import javax.swing.text.Position; + +import org.gjt.sp.jedit.Buffer; +import org.gjt.sp.jedit.buffer.BufferAdapter; +import org.gjt.sp.jedit.buffer.JEditBuffer; + +import lcm.BufferHandler; +import lcm.LCMPlugin; +import lcm.painters.ColoredRectDirtyMarkPainter; +import lcm.painters.DirtyMarkPainter; + +public class ChecksumBufferHandler extends BufferAdapter implements BufferHandler +{ + private Buffer buffer; + private ColoredRectDirtyMarkPainter painter; + private TreeMap<Position, byte []> md5; + + public ChecksumBufferHandler(Buffer buffer) + { + this.buffer = buffer; + md5 = new TreeMap<Position, byte []>(new PositionComparator()); + painter = new ColoredRectDirtyMarkPainter(); + painter.setColor(Color.YELLOW); + } + + public void bufferSaved(Buffer buffer) + { + md5.clear(); + } + + public DirtyMarkPainter getDirtyMarkPainter(Buffer buffer, int physicalLine) + { + byte[] b1 = calculateHash(buffer.getLineText(physicalLine)); + byte[] b2 = md5.get(new FixedPosition(physicalLine)); + if (b2 == null) + b2 = calculateHash(getFileLine(physicalLine)); + if (b1.length != b2.length) + { + Position p = buffer.createPosition(buffer.getLineStartOffset(physicalLine)); + md5.put(p, b2); + return painter; + } + for (int i = 0; i < b1.length; i++) + { + if (b1[i] != b2[i]) + { + Position p = buffer.createPosition(buffer.getLineStartOffset(physicalLine)); + md5.put(p, b2); + return painter; + } + } + return null; + } + + private String getFileLine(int line) + { + String [] lines = LCMPlugin.getInstance().readFile(buffer.getPath()); + return lines[line]; + } + + public void contentInserted(JEditBuffer buffer, int startLine, int offset, + int numLines, int length) + { + } + + public void contentRemoved(JEditBuffer buffer, int startLine, int offset, + int numLines, int length) + { + } + + private byte[] calculateHash(String line) + { + ByteBuffer bb = null; + int length = line.length(); + bb = ByteBuffer.allocate(length * 2); // Chars are 2 bytes + CharBuffer cb = bb.asCharBuffer(); + cb.append(line); + MessageDigest digest; + try { + digest = java.security.MessageDigest.getInstance("MD5"); + digest.update(bb); + return digest.digest(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return null; + } + + private class PositionComparator implements Comparator<Position> + { + public int compare(Position o1, Position o2) + { + int i1 = o1.getOffset(); + int i2 = o2.getOffset(); + if (i1 < i2) + return (-1); + if (i1 > i2) + return 1; + return 0; + } + } + private class FixedPosition implements Position + { + int offset; + public FixedPosition(int line) + { + offset = buffer.getLineStartOffset(line); + } + public int getOffset() + { + return offset; + } + } +} Added: plugins/DirtyGutter/trunk/src/lcm/providers/md5/ChecksumDirtyLineProvider.java =================================================================== --- plugins/DirtyGutter/trunk/src/lcm/providers/md5/ChecksumDirtyLineProvider.java (rev 0) +++ plugins/DirtyGutter/trunk/src/lcm/providers/md5/ChecksumDirtyLineProvider.java 2009-08-26 16:03:11 UTC (rev 16072) @@ -0,0 +1,20 @@ +package lcm.providers.md5; +import org.gjt.sp.jedit.Buffer; + +import lcm.BufferHandler; +import lcm.DirtyLineProvider; + + +public class ChecksumDirtyLineProvider implements DirtyLineProvider +{ + + public BufferHandler attach(Buffer buffer) + { + return new ChecksumBufferHandler(buffer); + } + + public void detach(Buffer buffer, BufferHandler handler) + { + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |