|
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-2003 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.cvsclient.commands.diff;
import javax.swing.JComponent;
import java.awt.Component;
import org.openide.util.NbBundle;
import org.netbeans.modules.javacvs.commands.CvsDiff;
import org.netbeans.api.diff.*;
import org.netbeans.spi.diff.*;
import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import org.netbeans.lib.cvsclient.command.diff.DiffCommand;
import org.netbeans.lib.cvsclient.command.diff.DiffInformation;
import org.netbeans.lib.cvsclient.command.diff.DiffInformation.DiffChange;
import org.netbeans.lib.cvsclient.command.PipedFileInformation;
import org.openide.filesystems.FileUtil;
import org.openide.util.*;
import org.openide.*;
import org.openide.windows.*;
import org.netbeans.modules.cvsclient.*;
import org.netbeans.modules.cvsclient.commands.*;
import org.netbeans.modules.javacvs.commands.*;
import java.io.*;
import javax.swing.SwingUtilities;
import org.netbeans.modules.vcscore.util.Debug;
import org.openide.ErrorManager;
import org.openide.filesystems.FileObject;
import org.openide.windows.WindowManager;
/**
*
* @author mkleint
* @version
*/
public class DiffDisplayer {
private Debug E=new Debug("DiffDisplayer", true); // NOI18N
private Debug D=E;
DiffCommand command;
FileSystemCommand fsCommand;
DiffInformation diffInfo;
private Difference[] differences;
boolean finishedOk;
ArrayList resultList;
private File startFile;
private StringBuffer bufLeft;
private StringBuffer bufRight;
private int fileLineCount;
private int leftLineCount;
private int rightLineCount;
private File file1;
private File file2;
/** Creates new Status */
public DiffDisplayer(DiffCommand diffComm) {
D.deb("Constructor"); //NOI18N
command = diffComm;
}
private PipedFileInformation findUpdInfo(LinkedList list, String name) {
Iterator it = list.iterator();
while (it.hasNext()) {
PipedFileInformation info = (PipedFileInformation)it.next();
if (info.getRepositoryFileName().equals(name)) {
return info;
}
}
return null;
}
/** Does the actual display - docking into the javacvs Mode,
* displaying as single Dialog.. whatever.
*/
public void displayOutputData() {
if (SwingUtilities.isEventDispatchThread()) {
_displayOutputData();
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
_displayOutputData();
}
});
}
}
private void _displayOutputData() {
DiffVisualizer visual = (DiffVisualizer)Lookup.getDefault().lookup(DiffVisualizer.class);
if (differences != null && visual != null) {
try {
String workingFile = NbBundle.getBundle(DiffDisplayer.class).getString("LBL_WorkingFile"); //NOI18N
String rightTit = (diffInfo.getRightRevision() != null ? diffInfo.getRightRevision() : workingFile);
String leftTit = (diffInfo.getLeftRevision() != null ? diffInfo.getLeftRevision() : workingFile);
TopComponent myTC = new TopComponent();
myTC.putClientProperty("PersistenceType", "Never"); //NOI18N
myTC.setLayout(new BorderLayout());
Reader reader1 = new BufferedReader(new FileReader(file1));
Reader reader2 = new BufferedReader(new FileReader(file2));
Component comp = visual.createView(differences, leftTit, leftTit, reader1,
rightTit, rightTit, reader2,
getMIMEType(diffInfo));
myTC.add(comp, BorderLayout.CENTER);
Mode editorMode = WindowManager.getDefault().getCurrentWorkspace().findMode("editor");
if(editorMode != null)
editorMode.dockInto(myTC);
javax.accessibility.AccessibleContext context = myTC.getAccessibleContext();
javax.accessibility.AccessibleContext compContext = comp.getAccessibleContext();
context.setAccessibleDescription(compContext.getAccessibleDescription());
myTC.setName(getName() + " " + diffInfo.getFile().getName());
myTC.open();
} catch (IOException exc) {
Thread.dumpStack();
}
}
}
protected String getName() {
return NbBundle.getBundle(CvsDiff.class).getString("CvsDiff.name"); //NOI18N
}
public void setData(DiffInformation info, DiffCommand command, PipedFileInformation updInfo) {
D.deb("setData() beginning"); //NOI18N
File startFile = info.getFile();
if (updInfo != null) {
if (!startFile.exists()) {
startFile = updInfo.getTempFile();
}
if (command.getBeforeDate1() != null || command.getRevision2() != null) {
startFile = updInfo.getTempFile();
}
}
if (startFile == null) return;
diffInfo = (DiffInformation)info;
processDocuments(diffInfo, startFile);
file1 = saveToFile(bufLeft);
D.deb("file left=" + file1.getAbsolutePath()); //NOI18N
file2 = saveToFile(bufRight);
D.deb("file right=" + file2.getAbsolutePath()); //NOI18N
DiffInformation.DiffChange change = diffInfo.getFirstChange();
java.util.List diffList = new LinkedList();
while (change != null) {
int type = 0;
if (change.getType() == DiffInformation.DiffChange.ADD) {
type = Difference.ADD;
}
else if (change.getType() == DiffInformation.DiffChange.CHANGE) {
type = Difference.CHANGE;
}
else if(change.getType() == DiffInformation.DiffChange.DELETE) {
type = Difference.DELETE;
} else {
change = diffInfo.getNextChange();
}
diffList.add(new Difference(type,
change.getLeftMin(), change.getLeftMax(),
change.getRightMin(), change.getRightMax()));
change = diffInfo.getNextChange();
}
if (diffList.size() > 0) {
differences = new Difference[diffList.size()];
differences = (Difference[])diffList.toArray(differences);
}
}
private String getMIMEType(DiffInformation info) {
File file = info.getFile();
if (file == null) return "text/plain"; //NOI18N
String mime;
FileObject[] fos = FileUtil.fromFile(file);
if (fos.length > 0) {
mime = FileUtil.getMIMEType(fos[0]);
} else {
String ext = FileUtil.getExtension(file.getName());
mime = FileUtil.getMIMEType(ext);
}
if (mime == null) {
mime = "text/plain"; //NOI18N
}
return mime;
}
private File saveToFile(StringBuffer buff) {
// TEMPORARY, better solution is to write to the file instantly without the write to StringBuffer
String TMP_ROOT=System.getProperty("netbeans.user")+File.separator+ //NOI18N
"system"+File.separator+"javacvs"+File.separator+"tmp"; //NOI18N
File tmpDir = new File(TMP_ROOT);
if (!tmpDir.exists()) {
tmpDir.mkdirs();
}
long tmpId;
do {
tmpId = 10000 * (1 + Math.round (Math.random () * 8)) + Math.round (Math.random () * 1000);
} while (new File(TMP_ROOT+File.separator+"tmp"+tmpId).exists()); // NOI18N
String tempFileName = TMP_ROOT+File.separator+"tmp"+tmpId; // NOI18N
File tempFile = new File(tempFileName);
try {
PrintWriter bw = new PrintWriter(new FileOutputStream(tempFile),true);
bw.print(buff);
bw.close();
} catch (IOException exc) {
// E.err("error writing temp file while doing diff");
}
return tempFile;
}
private void processDocuments(DiffInformation diffInfo, File startFile) {
BufferedReader buf = null;
leftLineCount = 0;
rightLineCount = 0;
try {
buf = new BufferedReader(new FileReader(startFile));
} catch (FileNotFoundException exc) {
// E.err("file" + startFile.getAbsolutePath() + " was not found!");
return;
}
bufLeft = new StringBuffer();
bufRight = new StringBuffer();
try {
String line;
fileLineCount = 0;
int gap;
DiffInformation.DiffChange change = diffInfo.getFirstChange();
while (true) {
if (change != null) {
boolean isDelete = change.getType() == DiffInformation.DiffChange.DELETE;
// int start = change.getMainBeginning();
int start = (isDelete ? change.getMainBeginning() : change.getMainBeginning() - 1);
if (change.getMainBeginning() >= fileLineCount) {
gap = fillFromFile(start, buf);
D.deb("filled = " + gap); //NOI18N
}
if (change.getType() == DiffInformation.DiffChange.ADD) {
D.deb("we got ADD change here!"); //NOI18N
gap = parseAddChange(change, true);
skipGap(gap, buf);
}
if (change.getType() == DiffInformation.DiffChange.DELETE) {
D.deb("we got DELETE change here!"); //NOI18N
gap = parseDeleteChange(change, true);
}
if (change.getType() == DiffInformation.DiffChange.CHANGE) {
D.deb("we got CHANGE change here!"); //NOI18N
gap = parseChangedChange(change);
skipGap(gap, buf);
}
change = diffInfo.getNextChange();
} else {
gap = fillFromFile(-1, buf);
// read till end of file
break;
}
}
} catch (IOException ioExc) {
ErrorManager.getDefault().notify(ioExc);
} finally {
try {
buf.close();
} catch (IOException ioex) {
ErrorManager.getDefault().notify(ioex);
}
}
}
private void skipGap(int gap, BufferedReader buf) throws IOException {
for (int ind = 0; ind < gap; ind++) {
String line = buf.readLine();
fileLineCount = fileLineCount + 1;
D.deb("skipped one line=" + line); //NOI18N
}
}
private int fillFromFile(int start, BufferedReader buf)
throws IOException {
D.deb("fillingGap..."); //NOI18N
int readCount = 0;
int max = start;
// if max is -1, do read till end of file.
while (fileLineCount < max || max == -1) {
String line = buf.readLine();
if (line == null) break;
fileLineCount = fileLineCount + 1;
readCount = readCount + 1;
D.deb("reading linenum=" + readCount + " line=" + line); //NOI18N
leftLineCount = leftLineCount + 1;
bufLeft.append(line + "\n"); //NOI18N
rightLineCount = rightLineCount + 1;
bufRight.append(line + "\n"); //NOI18N
}
return readCount;
}
private int parseAddChange(DiffChange change, boolean add) {
int ind;
for (ind = change.getRightMin(); ind <= change.getRightMax(); ind++) {
bufRight.append(change.getLine(ind, false) + "\n"); //NOI18N
rightLineCount = rightLineCount + 1;
D.deb("adding to main=" + change.getLine(ind, false)); //NOI18N
}
int gap = ind - change.getRightMin();
D.deb("final ADDED gap =" + gap); //NOI18N
return gap;
}
private int parseDeleteChange(DiffChange change, boolean delete) {
int ind;
for (ind = change.getLeftMin(); ind <= change.getLeftMax(); ind++) {
leftLineCount = leftLineCount + 1;
bufLeft.append(change.getLine(ind, true) + "\n"); //NOI18N
D.deb("addding to diff=" + change.getLine(ind, true)); //NOI18N
}
int gap = ind - change.getLeftMin();
D.deb("final DELETE gap =" + gap); //NOI18N
return gap;
}
private int parseChangedChange(DiffChange change) {
int gap = parseAddChange(change, false);
int toReturn = gap;
int gap2 = parseDeleteChange(change, false);
return toReturn;
}
// -- persistent stuff follows.
public void setCommand(DiffCommand comm) {
command = comm;
}
public void setFileSystemCommand(FileSystemCommand fsCom) {
fsCommand = fsCom;
}
public File getFileDisplayed() {
if (diffInfo == null) return null;
return diffInfo.getFile();
}
public Object getComparisonData() {
return diffInfo;
}
public JComponent getComponent() {
return null;
}
// --------------------------------------------
// persistantDisplayer stuff..
// --------------------------------------------
public boolean equalDisplayedData(File file, Class type, Object comparisonData) {
if (!getClass().equals(type)) return false;
if (diffInfo == null || diffInfo.getFile() == null
|| !diffInfo.getFile().equals(file)) {
return false;
}
return true;
}
public FileSystemCommand getFileSystemCommand() {
return fsCommand;
}
public String getCommandSwitches() {
return command.getCVSArguments();
}
}
|
| ... 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.