|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.lib.cvsclient.command.diff;
import java.io.*;
import org.netbeans.lib.cvsclient.command.*;
import org.netbeans.lib.cvsclient.event.*;
/**
* Handles the building of a diff information object and the firing of
* events when complete objects are built.
* @author Milos Kleint
*/
public class SimpleDiffBuilder implements Builder {
/**
* The event manager to use
*/
protected EventManager eventManager;
protected DiffCommand diffCommand;
/**
* The diff object that is currently being built
*/
protected DiffInformation diffInformation;
/**
* The directory in which the file being processed lives. This is
* relative to the local directory
*/
protected String fileDirectory;
protected boolean readingDiffs = false;
private static final String UNKNOWN = ": I know nothing about"; //NOI18N
private static final String CANNOT_FIND = ": cannot find"; //NOI18N
private static final String UNKNOWN_TAG = ": tag"; //NOI18N
private static final String EXAM_DIR = ": Diffing"; //NOI18N
private static final String FILE = "Index: "; //NOI18N
private static final String RCS_FILE = "RCS file: "; //NOI18N
private static final String REVISION = "retrieving revision "; //NOI18N
private static final String PARAMETERS = "diff "; //NOI18N
private DiffInformation.DiffChange currentChange;
public SimpleDiffBuilder(EventManager eventMan, DiffCommand diffComm) {
eventManager = eventMan;
diffCommand = diffComm;
}
public void outputDone() {
if (diffInformation != null) {
if (currentChange != null) {
diffInformation.addChange(currentChange);
currentChange = null;
}
eventManager.fireCVSEvent(new FileInfoEvent(this, diffInformation));
diffInformation = null;
readingDiffs = false;
}
}
public void parseLine(String line, boolean isErrorMessage) {
if (readingDiffs) {
if (line.startsWith(FILE)) {
outputDone();
}
else {
processDifferences(line);
return;
}
}
if (line.indexOf(UNKNOWN) >= 0) {
eventManager.fireCVSEvent(new FileInfoEvent(this, diffInformation));
diffInformation = null;
return;
}
if (line.indexOf(EXAM_DIR) >= 0) {
fileDirectory = line.substring(line.indexOf(EXAM_DIR) + EXAM_DIR.length()).trim();
return;
}
if (line.startsWith(FILE)) {
processFile(line.substring(FILE.length()));
return;
}
if (line.startsWith(RCS_FILE)) {
processRCSfile(line.substring(RCS_FILE.length()));
return;
}
if (line.startsWith(REVISION)) {
processRevision(line.substring(REVISION.length()));
return;
}
if (line.startsWith(PARAMETERS)) {
processParameters(line.substring(PARAMETERS.length()));
readingDiffs = true;
return;
}
}
/* protected void processDifferences(String line) {
diffInformation.addToDifferences(line);
}
*/
protected void processFile(String line) {
outputDone();
diffInformation = createDiffInformation();
String fileName = line.trim();
if (fileName.startsWith("no file")) { //NOI18N
fileName = fileName.substring(8);
}
diffInformation.setFile(new File(diffCommand.getLocalDirectory(),
// ((fileDirectory!=null)?fileDirectory: "") + File.separator +
fileName));
}
protected void processRCSfile(String line) {
if (diffInformation == null) {
return;
}
diffInformation.setRepositoryFileName(line.trim());
}
protected void processRevision(String line) {
if (diffInformation == null) {
return;
}
line = line.trim();
// first REVISION line is the from-file, the second is the to-file
if (diffInformation.getLeftRevision() != null) {
diffInformation.setRightRevision(line);
}
else {
diffInformation.setLeftRevision(line);
}
}
protected void processParameters(String line) {
if (diffInformation == null) {
return;
}
diffInformation.setParameters(line.trim());
}
public DiffInformation createDiffInformation() {
return new DiffInformation();
}
protected void assignType(DiffInformation.DiffChange change, String line) {
int index = 0;
int cIndex = line.indexOf('c');
if (cIndex > 0) {
// change type of change
change.setType(DiffInformation.DiffChange.CHANGE);
index = cIndex;
}
else {
int aIndex = line.indexOf('a');
if (aIndex > 0) {
// add type of change
change.setType(DiffInformation.DiffChange.ADD);
index = aIndex;
}
else {
int dIndex = line.indexOf('d');
if (dIndex > 0) {
// delete type of change
change.setType(DiffInformation.DiffChange.DELETE);
index = dIndex;
}
}
}
String left = line.substring(0, index);
// System.out.println("left part of change=" + left);
change.setLeftRange(getMin(left), getMax(left));
String right = line.substring(index + 1);
// System.out.println("right part of change=" + right);
change.setRightRange(getMin(right), getMax(right));
}
private int getMin(String line) {
String nums = line;
int commaIndex = nums.indexOf(',');
if (commaIndex > 0) {
nums = nums.substring(0, commaIndex);
}
int min;
try {
min = Integer.parseInt(nums);
}
catch (NumberFormatException exc) {
min = 0;
}
// System.out.println("Min=" + min);
return min;
}
private int getMax(String line) {
String nums = line;
int commaIndex = nums.indexOf(',');
if (commaIndex > 0) {
nums = nums.substring(commaIndex + 1);
}
int max;
try {
max = Integer.parseInt(nums);
}
catch (NumberFormatException exc) {
max = 0;
}
// System.out.println("Max=" + max);
return max;
}
protected void processDifferences(String line) {
char firstChar = line.charAt(0);
if (firstChar >= '0' && firstChar <= '9') {
// we got a new difference here
// System.out.println("new Change=" + line);
if (currentChange != null) {
diffInformation.addChange(currentChange);
}
currentChange = diffInformation.createDiffChange();
assignType(currentChange, line);
}
if (firstChar == '<') {
// System.out.println("Left line=" + line);
currentChange.appendLeftLine(line.substring(2));
}
if (firstChar == '>') {
// System.out.println("right line=" + line);
currentChange.appendRightLine(line.substring(2));
}
}
public void parseEnhancedMessage(String key, Object value) {
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.