blob: a40c9f6619f5a7ccb3f930c6662797c03e2ff516 [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.reservedcheckout;
import com.intellij.util.text.SyncDateFormat;
import org.jetbrains.annotations.NonNls;
import org.netbeans.lib.cvsclient.admin.Entry;
import org.netbeans.lib.cvsclient.command.AbstractMessageParser;
import org.netbeans.lib.cvsclient.command.ICvsFiles;
import org.netbeans.lib.cvsclient.command.ICvsFilesVisitor;
import org.netbeans.lib.cvsclient.event.IEventSender;
import org.netbeans.lib.cvsclient.file.DirectoryObject;
import org.netbeans.lib.cvsclient.file.FileObject;
import org.netbeans.lib.cvsclient.file.ICvsFileSystem;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author Thomas Singer
*/
final class EditorsMessageParser extends AbstractMessageParser {
// Constants ==============================================================
@NonNls private static final String DATE_FORMAT_STR = "MMM dd hh:mm:ss yyyy";
private static final SyncDateFormat DATE_FORMAT = new SyncDateFormat(new SimpleDateFormat(DATE_FORMAT_STR, Locale.US));
// Fields =================================================================
private final IEventSender eventManager;
private final ICvsFileSystem cvsFileSystem;
private final Set fileSet = new HashSet();
private transient EditorsFileInfoContainer editorsFileInfo;
// Setup ==================================================================
public EditorsMessageParser(IEventSender eventManager, final ICvsFileSystem cvsFileSystem, ICvsFiles cvsFiles) {
this.eventManager = eventManager;
this.cvsFileSystem = cvsFileSystem;
cvsFiles.visit(new ICvsFilesVisitor() {
public void handleFile(FileObject fileObject, Entry entry, boolean exists) {
final File file = cvsFileSystem.getLocalFileSystem().getFile(fileObject);
fileSet.add(file);
}
public void handleDirectory(DirectoryObject directoryObject) {
}
});
}
// Implemented ============================================================
public void parseLine(String line, boolean isErrorMessage) {
if (isErrorMessage) {
return;
}
final TabStringTokenizer tokenizer = new TabStringTokenizer(line);
final String fileName = tokenizer.nextToken();
final String user = tokenizer.nextToken();
final String dateString = tokenizer.nextToken();
final String clientName = tokenizer.nextToken();
final String editDirectory = tokenizer.nextToken();
if (editDirectory == null) {
return;
}
if (fileName.length() > 0) {
final File file = cvsFileSystem.getLocalFileSystem().getFile(fileName);
if (editorsFileInfo != null && !editorsFileInfo.getFile().equals(file)) {
fireFileInfoEvent(editorsFileInfo, true);
editorsFileInfo = null;
}
if (editorsFileInfo == null) {
editorsFileInfo = new EditorsFileInfoContainer(file);
}
}
else {
if (editorsFileInfo == null) {
return;
}
}
try {
final Date date = parseDate(dateString);
editorsFileInfo.addEditor(date, user, clientName, editDirectory);
}
catch (ParseException ex) {
return;
}
}
public void outputDone() {
if (editorsFileInfo != null) {
fireFileInfoEvent(editorsFileInfo, true);
editorsFileInfo = null;
}
for (Iterator it = fileSet.iterator(); it.hasNext();) {
final File file = (File)it.next();
fireFileInfoEvent(new EditorsFileInfoContainer(file), false);
it.remove();
}
}
// Utils ==================================================================
private void fireFileInfoEvent(EditorsFileInfoContainer editorsFileInfo, boolean remove) {
eventManager.notifyFileInfoListeners(editorsFileInfo);
if (remove) {
fileSet.remove(editorsFileInfo.getFile());
}
}
private static Date parseDate(String dateString) throws ParseException {
// strip day of week
final int firstSpaceIndex = Math.max(dateString.indexOf(' '), 0);
// strip time zone
final int lastSpaceIndex = Math.min(dateString.lastIndexOf(' '), dateString.length());
dateString = dateString.substring(firstSpaceIndex, lastSpaceIndex).trim();
return DATE_FORMAT.parse(dateString);
}
public void binaryMessageSent(final byte[] bytes) {
}
}