/* * 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.update; import org.jetbrains.annotations.NonNls; import org.netbeans.lib.cvsclient.admin.Entry; import org.netbeans.lib.cvsclient.command.AbstractMessageParser; import org.netbeans.lib.cvsclient.event.ICvsListenerRegistry; import org.netbeans.lib.cvsclient.event.IEntryListener; import org.netbeans.lib.cvsclient.event.IEventSender; import org.netbeans.lib.cvsclient.file.FileObject; import org.netbeans.lib.cvsclient.file.ICvsFileSystem; import org.netbeans.lib.cvsclient.util.BugLog; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author Thomas Singer */ public final class UpdateMessageParser extends AbstractMessageParser implements IEntryListener { // Constants ============================================================== @NonNls private static final String EXAM_DIR = "server: Updating "; @NonNls private static final String UNKNOWN = "server: nothing known about"; @NonNls private static final String TO_ADD = "server: use `cvs add' to create an entry for"; @NonNls private static final String STATES = "UPARMC?"; @NonNls private static final String WARNING = "server: warning: "; @NonNls private static final String PERTINENT = "is not (any longer) pertinent"; @NonNls private static final String MERGING = "Merging differences between "; @NonNls private static final Pattern NOT_IN_REPOSITORY_PATTERN = Pattern.compile("cvs .+: (.+) is no longer in the repository"); @NonNls private static final String LOCALLY_MODIFIED_FILE_HAS_BEEN_REMOVED = "is locally modified, but has been removed in revision"; // Fields ================================================================= private final IEventSender eventManager; private final ICvsFileSystem cvsFileSystem; private UpdateFileInfo fileInfo; // Setup ================================================================== public UpdateMessageParser(IEventSender eventManager, ICvsFileSystem cvsFileSystem) { BugLog.getInstance().assertNotNull(eventManager); BugLog.getInstance().assertNotNull(cvsFileSystem); this.eventManager = eventManager; this.cvsFileSystem = cvsFileSystem; } // Implemented ============================================================ public void registerListeners(ICvsListenerRegistry listenerRegistry) { super.registerListeners(listenerRegistry); listenerRegistry.addEntryListener(this); } public void unregisterListeners(ICvsListenerRegistry listenerRegistry) { listenerRegistry.removeEntryListener(this); super.unregisterListeners(listenerRegistry); } protected void outputDone() { if (fileInfo == null) { return; } // There can be a null value, if only the entry changed if (fileInfo.getType() != null) { eventManager.notifyFileInfoListeners(fileInfo); } fileInfo = null; } @SuppressWarnings({"HardCodedStringLiteral"}) public void parseLine(String line, boolean isErrorMessage) { if (line.startsWith("RCS file:")) { return; } if (line.startsWith("retrieving revision ")) { return; } if (line.indexOf(" already contains the differences between ") > 0) { return; } if (line.startsWith("rcsmerge: warning: conflicts during merge")) { return; } if (line.indexOf(EXAM_DIR) >= 0) { return; } if (line.indexOf(": conflicts found in ") > 0) { return; } int index = line.indexOf(UNKNOWN); if (index >= 0) { final String fileName = (line.substring(index + UNKNOWN.length())).trim(); processUnknown(fileName); return; } index = line.indexOf(TO_ADD); if (index >= 0) { final String fileName = (line.substring(index + TO_ADD.length())).trim(); processUnknown(fileName); return; } if (line.startsWith(MERGING)) { // outputDone(); // ensureExistingFileInfoContainer(); // index = line.indexOf(UpdateCommand2.INTO, UpdateCommand2.MERGING.length() + 1); // if (index > 0) { // fileInfoContainer.setFile(createFile(line.substring(index + UpdateCommand2.INTO.length()))); // } // fileInfoContainer.setType(DefaultFileInfoContainer.MERGED_FILE); return; } index = line.indexOf(LOCALLY_MODIFIED_FILE_HAS_BEEN_REMOVED); if (index >= 0) { String warningPrefix = "cvs server: file "; if (!line.startsWith(warningPrefix)) return; final String fileName = line.substring(warningPrefix.length(), index).trim(); final FileObject fileObject = cvsFileSystem.unixFileNameToFileObject(fileName); ensureExistingFileInfoContainer(fileObject); // HACK - will create conflict status in order to be able to have consistent info format fileInfo.setType("C"); return; } index = line.indexOf(WARNING); if (index >= 0) { final int pertinentIndex = line.indexOf(PERTINENT); if (pertinentIndex > 0) { final String fileName = line.substring(index + WARNING.length(), pertinentIndex).trim(); final FileObject fileObject = cvsFileSystem.unixFileNameToFileObject(fileName); processNotPertinent(fileObject); } return; } Matcher m = NOT_IN_REPOSITORY_PATTERN.matcher(line); if (m.matches()) { final String fileName = m.group(1).trim(); final FileObject fileObject = cvsFileSystem.unixFileNameToFileObject(fileName); processNotPertinent(fileObject); return; } // otherwise if (line.length() > 2) { if (line.charAt(1) == ' ') { final String firstChar = line.substring(0, 1); if (STATES.indexOf(firstChar) >= 0) { processFile(line.substring(2), firstChar); } } } } public void gotEntry(FileObject fileObject, Entry entry) { ensureExistingFileInfoContainer(fileObject); fileInfo.setEntry(entry); } // Utils ================================================================== private void ensureExistingFileInfoContainer(FileObject fileObject) { if (fileInfo != null) { if (fileObject.equals(fileInfo.getFileObject())) { return; } outputDone(); } fileInfo = new UpdateFileInfo(fileObject, cvsFileSystem.getLocalFileSystem().getFile(fileObject)); } private void processUnknown(String fileName) { final FileObject fileObject = cvsFileSystem.unixFileNameToFileObject(fileName); ensureExistingFileInfoContainer(fileObject); fileInfo.setType("?"); } private void processFile(String fileName, String type) { final FileObject fileObject = cvsFileSystem.unixFileNameToFileObject(fileName); ensureExistingFileInfoContainer(fileObject); fileInfo.setType(type); } private void processNotPertinent(FileObject fileObject) { ensureExistingFileInfoContainer(fileObject); // HACK - will create a non-cvs status in order to be able to have consistent info format fileInfo.setType("Y"); } public void binaryMessageSent(final byte[] bytes) { } }