org.webcat.core.git.PrettyDiffFormatter.java Source code

Java tutorial

Introduction

Here is the source code for org.webcat.core.git.PrettyDiffFormatter.java

Source

/*==========================================================================*\
 |  $Id: PrettyDiffFormatter.java,v 1.2 2012/03/28 13:48:08 stedwar2 Exp $
 |*-------------------------------------------------------------------------*|
 |  Copyright (C) 2011-2012 Virginia Tech
 |
 |  This file is part of Web-CAT.
 |
 |  Web-CAT is free software; you can redistribute it and/or modify
 |  it under the terms of the GNU Affero General Public License as published
 |  by the Free Software Foundation; either version 3 of the License, or
 |  (at your option) any later version.
 |
 |  Web-CAT 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 Affero General Public License
 |  along with Web-CAT; if not, see <http://www.gnu.org/licenses/>.
\*==========================================================================*/

package org.webcat.core.git;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import org.apache.commons.io.output.NullOutputStream;
import org.eclipse.jgit.diff.DiffEntry;
import org.eclipse.jgit.diff.DiffFormatter;
import org.eclipse.jgit.diff.RawText;
import org.eclipse.jgit.diff.DiffEntry.Side;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.patch.FileHeader;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.CanonicalTreeParser;
import org.eclipse.jgit.treewalk.EmptyTreeIterator;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSComparator;
import com.webobjects.foundation.NSMutableDictionary;
import com.webobjects.foundation.NSComparator.ComparisonException;

//-------------------------------------------------------------------------
/**
 * TODO real description
 *
 * @author  Tony Allevato
 * @author  Last changed by $Author: stedwar2 $
 * @version $Revision: 1.2 $, $Date: 2012/03/28 13:48:08 $
 */
public class PrettyDiffFormatter extends DiffFormatter {
    //~ Constructors ..........................................................

    // ----------------------------------------------------------
    public PrettyDiffFormatter() {
        super(new NullOutputStream());

        prettyDiffs = new NSMutableDictionary<String, PrettyDiffResult>();
    }

    //~ Methods ...............................................................

    // ----------------------------------------------------------
    public void format(AnyObjectId b) throws IOException {
        format(scan(b));
    }

    // ----------------------------------------------------------
    public List<DiffEntry> scan(AnyObjectId b) throws IOException {
        RevWalk rw = new RevWalk(reader());
        return scan(rw.parseTree(b));
    }

    // ----------------------------------------------------------
    public List<DiffEntry> scan(RevTree b) throws IOException {
        EmptyTreeIterator aParser = new EmptyTreeIterator();
        CanonicalTreeParser bParser = new CanonicalTreeParser();

        bParser.reset(reader(), b);

        return scan(aParser, bParser);
    }

    // ----------------------------------------------------------
    public ObjectReader reader() {
        try {
            Field field = getClass().getSuperclass().getDeclaredField("reader");
            field.setAccessible(true);
            return (ObjectReader) field.get(this);
        } catch (Exception e) {
            return null;
        }
    }

    // ----------------------------------------------------------
    public NSArray<String> modifiedPaths() {
        if (sortedPaths == null) {
            try {
                sortedPaths = prettyDiffs.allKeys().sortedArrayUsingComparator(new NSComparator() {
                    @Override
                    public int compare(Object _lhs, Object _rhs) {
                        String lhs = (String) _lhs;
                        String rhs = (String) _rhs;
                        return lhs.compareToIgnoreCase(rhs);
                    }
                });
            } catch (ComparisonException e) {
                sortedPaths = prettyDiffs.allKeys();
            }
        }

        return sortedPaths;
    }

    // ----------------------------------------------------------
    public PrettyDiffResult prettyDiffForPath(String path) {
        return prettyDiffs.objectForKey(path);
    }

    // ----------------------------------------------------------
    public int totalAdditionCount() {
        return totalAdditionCount;
    }

    // ----------------------------------------------------------
    public int totalDeletionCount() {
        return totalDeletionCount;
    }

    // ----------------------------------------------------------
    public void format(FileHeader head, RawText a, RawText b) throws IOException {
        currentDiff = new PrettyDiffResult();
        String path = head.getPath(Side.NEW);
        prettyDiffs.setObjectForKey(currentDiff, path);

        super.format(head, a, b);
    }

    // ----------------------------------------------------------
    protected void writeAddedLine(RawText text, int line) throws IOException {
        currentDiff.appendAddedLine(text, line);
        totalAdditionCount++;
    }

    // ----------------------------------------------------------
    protected void writeContextLine(RawText text, int line) throws IOException {
        currentDiff.appendContextLine(text, line);
    }

    // ----------------------------------------------------------
    protected void writeHunkHeader(int aStartLine, int aEndLine, int bStartLine, int bEndLine) throws IOException {
        currentDiff.appendHunkHeader(aStartLine, aEndLine, bStartLine, bEndLine);
    }

    // ----------------------------------------------------------
    protected void writeLine(char prefix, RawText text, int line) throws IOException {
        super.writeLine(prefix, text, line);
    }

    // ----------------------------------------------------------
    protected void writeRemovedLine(RawText text, int line) throws IOException {
        currentDiff.appendRemovedLine(text, line);
        totalDeletionCount++;
    }

    //~ Static/instance variables .............................................

    private NSMutableDictionary<String, PrettyDiffResult> prettyDiffs;
    private NSArray<String> sortedPaths;
    private PrettyDiffResult currentDiff;

    private int totalAdditionCount;
    private int totalDeletionCount;
}