|
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.log;
import java.io.*;
import java.util.*;
import org.netbeans.lib.cvsclient.command.*;
import org.netbeans.lib.cvsclient.event.*;
import org.netbeans.lib.cvsclient.util.*;
/**
* Handles the building of a log information object and the firing of
* events when complete objects are built.
* @author Milos Kleint
*/
public class LogBuilder implements Builder {
private static final String LOGGING_DIR = ": Logging "; //NOI18N
private static final String RCS_FILE = "RCS file: "; //NOI18N
private static final String WORK_FILE = "Working file: "; //NOI18N
private static final String REV_HEAD = "head: "; //NOI18N
private static final String BRANCH = "branch: "; //NOI18N
private static final String LOCKS = "locks: "; //NOI18N
private static final String ACCESS_LIST = "access list: "; //NOI18N
private static final String SYM_NAME = "symbolic names:"; //NOI18N
private static final String KEYWORD_SUBST = "keyword substitution: "; //NOI18N
private static final String TOTAL_REV = "total revisions: "; //NOI18N
private static final String SEL_REV = ";\tselected revisions: "; //NOI18N
private static final String DESCRIPTION = "description:"; //NOI18N
private static final String REVISION = "revision "; //NOI18N
private static final String DATE = "date: "; //NOI18N
private static final String BRANCHES = "branches: "; //NOI18N
private static final String AUTHOR = " author: "; //NOI18N
private static final String STATE = " state: "; //NOI18N
private static final String LINES = " lines: "; //NOI18N
private static final String SPLITTER = "----------------------------"; //NOI18N
private static final String FINAL_SPLIT = "============================================================================="; //NOI18N
private static final String ERROR = ": nothing known about "; //NOI18N
private static final String NO_FILE = "no file"; //NOI18N
/**
* The event manager to use
*/
protected EventManager eventManager;
protected BasicCommand logCommand;
/**
* The log object that is currently being built
*/
protected LogInformation logInfo;
protected LogInformation.Revision revision;
/**
* The directory in which the file being processed lives. This is
* relative to the local directory
*/
protected String fileDirectory;
private boolean addingSymNames;
private boolean addingDescription;
private boolean addingLogMessage;
private StringBuffer tempBuffer = null;
private List messageList;
public LogBuilder(EventManager eventMan, BasicCommand command) {
logCommand = command;
eventManager = eventMan;
addingSymNames = false;
addingDescription = false;
addingLogMessage = false;
logInfo = null;
revision = null;
messageList = new ArrayList(500);
}
public void outputDone() {
if (logInfo != null) {
eventManager.fireCVSEvent(new FileInfoEvent(this, logInfo));
logInfo = null;
messageList = null;
}
}
public void parseLine(String line, boolean isErrorMessage) {
if (line.equals(FINAL_SPLIT)) {
if (addingDescription) {
addingDescription = false;
logInfo.setDescription(tempBuffer.toString());
}
if (addingLogMessage) {
addingLogMessage = false;
revision.setMessage(CommandUtils.findUniqueString(tempBuffer.toString(), messageList));
}
if (revision != null) {
logInfo.addRevision(revision);
revision = null;
}
// fire the event and exit
if (logInfo != null) {
eventManager.fireCVSEvent(new FileInfoEvent(this, logInfo));
logInfo = null;
tempBuffer = null;
}
return;
}
if (addingLogMessage) {
// first check for the branches tag
if (line.startsWith(BRANCHES)) {
processBranches(line.substring(BRANCHES.length()));
}
else {
processLogMessage(line);
return;
}
}
if (addingSymNames) {
processSymbolicNames(line);
}
if (addingDescription) {
processDescription(line);
}
// revision stuff first -> will be the most common to parse
if (line.startsWith(REVISION)) {
processRevisionStart(line);
}
if (line.startsWith(DATE)) {
processRevisionDate(line);
}
if (line.startsWith(KEYWORD_SUBST)) {
logInfo.setKeywordSubstitution(line.substring(KEYWORD_SUBST.length()).trim().intern());
addingSymNames = false;
return;
}
if (line.startsWith(DESCRIPTION)) {
tempBuffer = new StringBuffer(line.substring(DESCRIPTION.length()));
addingDescription = true;
}
if (line.indexOf(LOGGING_DIR) >= 0) {
fileDirectory = line.substring(line.indexOf(LOGGING_DIR) + LOGGING_DIR.length()).trim();
return;
}
if (line.startsWith(RCS_FILE)) {
processRcsFile(line.substring(RCS_FILE.length()));
return;
}
if (line.startsWith(WORK_FILE)) {
processWorkingFile(line.substring(WORK_FILE.length()));
return;
}
if (line.startsWith(REV_HEAD)) {
logInfo.setHeadRevision(line.substring(REV_HEAD.length()).trim().intern());
return;
}
if (line.startsWith(BRANCH)) {
logInfo.setBranch(line.substring(BRANCH.length()).trim().intern());
}
if (line.startsWith(LOCKS)) {
logInfo.setLocks(line.substring(LOCKS.length()).trim().intern());
}
if (line.startsWith(ACCESS_LIST)) {
logInfo.setAccessList(line.substring(ACCESS_LIST.length()).trim().intern());
}
if (line.startsWith(SYM_NAME)) {
addingSymNames = true;
}
if (line.startsWith(TOTAL_REV)) {
int ind = line.indexOf(';');
if (ind < 0) {
// no selected revisions here..
logInfo.setTotalRevisions(line.substring(TOTAL_REV.length()).trim().intern());
logInfo.setSelectedRevisions("0"); //NOI18N
}
else {
String total = line.substring(0, ind);
String select = line.substring(ind, line.length());
logInfo.setTotalRevisions(total.substring(TOTAL_REV.length()).trim().intern());
logInfo.setSelectedRevisions(select.substring(SEL_REV.length()).trim().intern());
}
}
}
private String findUniqueString(String name, List list) {
if (name == null) {
return null;
}
int index = list.indexOf(name);
if (index >= 0) {
return (String)list.get(index);
}
else {
String newName = name;
list.add(newName);
return newName;
}
}
private void processRcsFile(String line) {
if (logInfo != null) {
//do fire logcreated event;
}
logInfo = new LogInformation();
logInfo.setRepositoryFilename(line.trim());
}
private void processWorkingFile(String line) {
String fileName = line.trim();
if (fileName.startsWith(NO_FILE)) {
fileName = fileName.substring(8);
}
logInfo.setFile(createFile(line));
}
private void processBranches(String line) {
int ind = line.lastIndexOf(';');
if (ind > 0) {
line = line.substring(0, ind);
}
revision.setBranches(line.trim());
}
private void processLogMessage(String line) {
if (line.startsWith(SPLITTER)) {
addingLogMessage = false;
revision.setMessage(findUniqueString(tempBuffer.toString(), messageList));
return;
}
tempBuffer.append(line + "\n"); //NOI18N
}
private void processSymbolicNames(String line) {
if (!line.startsWith(KEYWORD_SUBST)) {
line = line.trim();
int index = line.indexOf(':');
if (index > 0) {
String symName = line.substring(0, index).trim();
String revName = line.substring(index + 1, line.length()).trim();
logInfo.addSymbolicName(symName.intern(), revName.intern());
}
}
}
private void processDescription(String line) {
if (line.startsWith(SPLITTER)) {
addingDescription = false;
logInfo.setDescription(tempBuffer.toString());
return;
}
tempBuffer.append(line);
}
private void processRevisionStart(String line) {
if (revision != null) {
logInfo.addRevision(revision);
}
revision = logInfo.createNewRevision(
line.substring(REVISION.length()).intern());
}
private void processRevisionDate(String line) {
StringTokenizer token = new StringTokenizer(line, ";", false); //NOI18N
if (token.hasMoreTokens()) {
revision.setDateString(new String(token.nextToken().substring(DATE.length())));
}
if (token.hasMoreTokens()) {
revision.setAuthor(token.nextToken().substring(AUTHOR.length()).intern());
}
if (token.hasMoreTokens()) {
revision.setState(token.nextToken().substring(STATE.length()).intern());
}
if (token.hasMoreTokens()) {
revision.setLines(token.nextToken().substring(LINES.length()).intern());
}
addingLogMessage = true;
tempBuffer = new StringBuffer();
}
protected File createFile(String fileName) {
StringBuffer path = new StringBuffer();
path.append(logCommand.getLocalDirectory());
path.append(File.separator);
if (fileDirectory == null) {
// happens for single files only
// (for directories, the dir name is always sent before the actual files)
File locFile = logCommand.getFileEndingWith(fileName);
if (locFile == null) {
BugLog.getInstance().bug("JAVACVS ERROR!! wrong algorithm for assigning path to single files(1)!!");
path.append(fileName);
}
else {
path = new StringBuffer(locFile.getAbsolutePath());
}
}
else {
// path.append(fileDirectory);
// path.append(File.separator);
path.append(fileName);
}
return new File(path.toString());
}
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.