blob: d095cbea62411ff731eb28c20e1f69138ced1835 [file] [log] [blame]
/*
* 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.status;
import org.netbeans.lib.cvsclient.command.AbstractMessageParser;
import org.netbeans.lib.cvsclient.event.IEventSender;
import org.netbeans.lib.cvsclient.file.AbstractFileObject;
import org.netbeans.lib.cvsclient.file.FileObject;
import org.netbeans.lib.cvsclient.file.FileStatus;
import org.netbeans.lib.cvsclient.file.ICvsFileSystem;
import org.netbeans.lib.cvsclient.util.BugLog;
import org.jetbrains.annotations.NonNls;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Handles the building of a status information object and the firing of
* events when complete objects are built.
*
* @author Milos Kleint
* @author Thomas Singer
*/
final class StatusMessageParser extends AbstractMessageParser {
// Constants ==============================================================
@NonNls private static final String NO_REVISION_CONTROL_FILE = "No revision control file";
private static final String SEPARATOR = "===================================================================";
@NonNls private static final String FILE = "File: ";
@NonNls private static final String STATUS = "\tStatus: ";
@NonNls private static final String NO_FILE = "no file ";
@NonNls private static final String WORK_REVISION = " Working revision:\t";
@NonNls private static final String REPOSITORY_REVISION = " Repository revision:\t";
@NonNls private static final String STICKY_TAG = " Sticky Tag:";
@NonNls private static final String STICKY_DATE = " Sticky Date:";
@NonNls private static final String STICKY_OPTIONS = " Sticky Options:";
@NonNls private static final String EXISTING_TAGS = " Existing Tags:";
@NonNls private static final String NO_TAGS = " No Tags Exist";
@NonNls private static final String NO_ENTRY_FOR = "No entry for ";
private static final String QUESTION_MARK = "? ";
// Fields =================================================================
private final List fileObjects = new ArrayList();
private final ICvsFileSystem cvsFileSystem;
private final IEventSender eventSender;
private StatusInformation statusInformation;
private String relativeDirectory;
private boolean beginning;
private boolean readingTags;
// Setup ==================================================================
public StatusMessageParser(IEventSender eventSender, List fileObjects, ICvsFileSystem cvsFileSystem) {
BugLog.getInstance().assertNotNull(eventSender);
this.eventSender = eventSender;
this.fileObjects.addAll(fileObjects);
this.cvsFileSystem = cvsFileSystem;
this.beginning = true;
}
// Implemented ============================================================
protected void outputDone() {
if (statusInformation != null) {
eventSender.notifyFileInfoListeners(statusInformation);
statusInformation = null;
beginning = true;
readingTags = false;
}
}
public void parseLine(String line, boolean isErrorMessage) {
if (readingTags) {
if (line.startsWith(NO_TAGS)) {
outputDone();
return;
}
final int bracket = line.indexOf('(');
if (bracket > 0) {
// it's another tag..
final String tag = line.substring(0, bracket - 1).trim();
final String rev = line.substring(bracket + 1, line.length() - 1);
if (statusInformation == null) {
statusInformation = new StatusInformation();
}
statusInformation.addExistingTag(tag, rev);
}
else {
outputDone();
return;
}
}
if (isErrorMessage) {
final int index = line.indexOf(StatusCommand.EXAM_DIR);
if (index >= 0) {
relativeDirectory = line.substring(index + StatusCommand.EXAM_DIR.length()).trim();
beginning = true;
}
return;
}
if (beginning) {
if (line.startsWith(QUESTION_MARK)) {
final File file = cvsFileSystem.getLocalFileSystem().getFile(line.substring(QUESTION_MARK.length()));
statusInformation = new StatusInformation();
statusInformation.setFile(file);
statusInformation.setStatus(FileStatus.UNKNOWN);
outputDone();
}
if (line.startsWith(FILE)) {
final int statusIndex = line.lastIndexOf(STATUS);
final String statusString = line.substring(statusIndex + STATUS.length());
final FileStatus status = FileStatus.getStatusForString(statusString);
String fileName = line.substring(FILE.length(), statusIndex).trim();
if (fileName.startsWith(NO_FILE)) {
fileName = fileName.substring(NO_FILE.length());
}
outputDone();
statusInformation = new StatusInformation();
statusInformation.setFile(createFile(fileName));
statusInformation.setStatus(status);
beginning = false;
return;
}
// int index = line.indexOf(NOTHING_KNOWN_ABOUT);
// if (index >= 0) {
// final String fileName = line.substring(index + NOTHING_KNOWN_ABOUT.length());
//
// createStatusInformation(fileName, true, FileStatus.UNKNOWN.toString());
// return;
// }
}
else {
if (line.startsWith(WORK_REVISION)) {
String workingRevision = line.substring(WORK_REVISION.length());
if (workingRevision.startsWith(NO_ENTRY_FOR)) {
workingRevision = "";
}
statusInformation.setWorkingRevision(workingRevision);
}
else if (line.startsWith(REPOSITORY_REVISION)) {
final String repositoryRevision = line.substring(REPOSITORY_REVISION.length());
statusInformation.setRepositoryRevision("");
statusInformation.setRepositoryFileName("");
if (!repositoryRevision.equals(NO_REVISION_CONTROL_FILE)) {
final int separatorIndex = repositoryRevision.indexOf('\t');
if (separatorIndex > 0) {
statusInformation.setRepositoryRevision(repositoryRevision.substring(0, separatorIndex).trim());
statusInformation.setRepositoryFileName(repositoryRevision.substring(separatorIndex).trim());
}
}
}
else if (line.startsWith(STICKY_TAG)) {
final String stickyTag = line.substring(STICKY_TAG.length()).trim();
statusInformation.setStickyTag(stickyTag);
}
else if (line.startsWith(STICKY_DATE)) {
final String stickyDate = line.substring(STICKY_DATE.length()).trim();
statusInformation.setStickyDate(stickyDate);
}
else if (line.startsWith(STICKY_OPTIONS)) {
final String stickyOptions = line.substring(STICKY_OPTIONS.length()).trim();
statusInformation.setStickyOptions(stickyOptions);
}
else if (line.startsWith(EXISTING_TAGS)) {
readingTags = true;
}
else if (line.equals(SEPARATOR)) {
outputDone();
}
}
}
// Utils ==================================================================
private File createFile(String fileName) {
File file = null;
if (relativeDirectory != null) {
if (relativeDirectory.trim().equals(".")) {
file = cvsFileSystem.getLocalFileSystem().getFile(fileName);
}
else {
file = cvsFileSystem.getLocalFileSystem().getFile(relativeDirectory + '/' + fileName);
}
}
else {
for (Iterator it = fileObjects.iterator(); it.hasNext();) {
final AbstractFileObject abstractFileObject = (AbstractFileObject)it.next();
if (abstractFileObject instanceof FileObject) {
final FileObject fileObject = (FileObject)abstractFileObject;
if (!fileObject.getName().equals(fileName)) {
continue;
}
it.remove();
return cvsFileSystem.getLocalFileSystem().getFile(fileObject);
}
it.remove();
}
}
BugLog.getInstance().assertTrue(file != null, "Wrong algorithm for detecting file name (" + fileName + ")");
return file;
}
public void binaryMessageSent(final byte[] bytes) {
}
}