| /* |
| * 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) { |
| } |
| } |