blob: 998517796de1a278aa02468fc2c00c52ecb354e4 [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 the CVS Client Library.
* The Initial Developer of the Original Code is Robert Greig.
* Portions created by Robert Greig are Copyright (C) 2000.
* All Rights Reserved.
*
* Contributor(s): Robert Greig.
*****************************************************************************/
package org.netbeans.lib.cvsclient.response;
import org.netbeans.lib.cvsclient.IClientEnvironment;
import org.netbeans.lib.cvsclient.IConnectionStreams;
import org.netbeans.lib.cvsclient.command.update.UpdatedFileInfo;
import org.netbeans.lib.cvsclient.admin.Entry;
import org.netbeans.lib.cvsclient.admin.IAdminWriter;
import org.netbeans.lib.cvsclient.file.*;
import org.jetbrains.annotations.NonNls;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.nio.charset.Charset;
/**
* @author Thomas Singer
*/
public final class DefaultResponseHandler extends AbstractResponseHandler {
// Implemented ============================================================
public void processErrorMessageResponse(byte[] message, IResponseServices responseServices) {
responseServices.getEventSender().notifyMessageListeners(message, true, false);
}
public void processMessageResponse(byte[] message, IResponseServices responseServices) {
responseServices.getEventSender().notifyMessageListeners(message, false, false);
}
public void processMessageTaggedResponse(byte[] message, IResponseServices responseServices) {
responseServices.getEventSender().notifyMessageListeners(message, false, true);
}
public void processBinaryMessageResponse(final int fileLength, final byte[] binaryContent, IResponseServices responseServices) {
responseServices.getEventSender().notifyFileInfoListeners(binaryContent);
}
public void processCheckedInResponse(String relativeLocalDirectory,
String repositoryFilePath,
String entryLine,
IResponseServices responseServices,
IClientEnvironment clientEnvironment) throws IOException {
final FileObject fileObject = clientEnvironment.getCvsFileSystem().getFileObject(relativeLocalDirectory, repositoryFilePath);
final Entry entry = Entry.createEntryForLine(entryLine);
// for added and removed entries set the conflict to Dummy timestamp.
if (entry.isAddedFile() || entry.isRemoved()) {
entry.setDummyTimestamp();
}
else {
final File file = clientEnvironment.getCvsFileSystem().getLocalFileSystem().getFile(fileObject);
final String mode = responseServices.getNextFileMode();
final boolean readOnly = mode != null && FileUtils.isReadOnlyMode(mode);
clientEnvironment.getFileReadOnlyHandler().setFileReadOnly(file, readOnly);
final Date date = new Date(file.lastModified());
entry.parseConflictString(Entry.getLastModifiedDateFormatter().format(date));
}
clientEnvironment.getAdminWriter().setEntry(fileObject.getParent(), entry, clientEnvironment.getCvsFileSystem());
responseServices.getEventSender().notifyEntryListeners(fileObject, entry);
}
public void processNewEntryResponse(String relativeLocalDirectory,
String repositoryFilePath,
IResponseServices responseServoces,
String entryLine,
IClientEnvironment clientEnvironment) throws IOException {
// we set the date the file was last modified in the Entry line
// so that we can easily determine whether the file has been
// untouched
final FileObject fileObject = clientEnvironment.getCvsFileSystem().getFileObject(relativeLocalDirectory, repositoryFilePath);
final Entry entry = Entry.createEntryForLine(entryLine);
entry.setDummyTimestamp();
clientEnvironment.getAdminWriter().setEntry(fileObject.getParent(), entry, clientEnvironment.getCvsFileSystem());
responseServoces.getEventSender().notifyEntryListeners(fileObject, entry);
}
public void processSetStaticDirectoryResponse(String relativeLocalDirectory,
String repositoryFilePath,
IResponseServices responseServices,
IClientEnvironment clientEnvironment) throws IOException {
final ICvsFileSystem cvsFileSystem = clientEnvironment.getCvsFileSystem();
final DirectoryObject directoryObject = cvsFileSystem.getDirectoryObject(relativeLocalDirectory, repositoryFilePath);
final IAdminWriter adminWriter = clientEnvironment.getAdminWriter();
adminWriter.ensureCvsDirectory(directoryObject, repositoryFilePath, clientEnvironment.getCvsRoot(), cvsFileSystem);
adminWriter.setEntriesDotStatic(directoryObject, true, cvsFileSystem);
responseServices.getEventSender().notifyDirectoryListeners(directoryObject, true);
}
public void processClearStaticDirectoryResponse(String relativeLocalDirectory,
String repositoryDirectoryPath,
IResponseServices responseServices,
IClientEnvironment clientEnvironment) throws IOException {
final ICvsFileSystem cvsFileSystem = clientEnvironment.getCvsFileSystem();
final DirectoryObject directoryObject = cvsFileSystem.getDirectoryObject(relativeLocalDirectory, repositoryDirectoryPath);
final IAdminWriter adminWriter = clientEnvironment.getAdminWriter();
adminWriter.ensureCvsDirectory(directoryObject, repositoryDirectoryPath, clientEnvironment.getCvsRoot(), cvsFileSystem);
adminWriter.setEntriesDotStatic(directoryObject, false, cvsFileSystem);
responseServices.getEventSender().notifyDirectoryListeners(directoryObject, false);
}
public void processSetStickyResponse(String relativeLocalDirectory,
String repositoryFilePath,
String tag,
IClientEnvironment clientEnvironment) throws IOException {
final DirectoryObject directoryObject =
clientEnvironment.getCvsFileSystem().getDirectoryObject(relativeLocalDirectory, repositoryFilePath);
clientEnvironment.getAdminWriter().setStickyTagForDirectory(directoryObject, tag, clientEnvironment.getCvsFileSystem());
}
public void processClearStickyResponse(String relativeLocalDirectory, String repositoryFilePath, IClientEnvironment clientEnvironment)
throws IOException {
final ICvsFileSystem cvsFileSystem = clientEnvironment.getCvsFileSystem();
final DirectoryObject directoryObject = cvsFileSystem.getDirectoryObject(relativeLocalDirectory, repositoryFilePath);
final IAdminWriter adminWriter = clientEnvironment.getAdminWriter();
adminWriter.ensureCvsDirectory(directoryObject, repositoryFilePath, clientEnvironment.getCvsRoot(), cvsFileSystem);
adminWriter.setStickyTagForDirectory(directoryObject, null, cvsFileSystem);
}
public void processNotifiedResponse(String relativeLocalDirectory, String repositoryFilePath, IClientEnvironment clientEnvironment) {
}
public void processRemovedResponse(String relativeLocalDirectory,
String repositoryFilePath,
IResponseServices responseServices,
IClientEnvironment clientEnvironment) throws IOException {
final ICvsFileSystem fileSystem = clientEnvironment.getCvsFileSystem();
final FileObject fileObject = fileSystem.getFileObject(relativeLocalDirectory, repositoryFilePath);
clientEnvironment.getLocalFileWriter().removeLocalFile(fileObject, fileSystem, clientEnvironment.getFileReadOnlyHandler());
clientEnvironment.getAdminWriter().removeEntryForFile(fileObject, fileSystem);
responseServices.getEventSender().notifyFileInfoListeners(
new UpdatedFileInfo(fileObject, fileSystem.getLocalFileSystem().getFile(fileObject), UpdatedFileInfo.UpdatedType.REMOVED, null));
}
public void processRemoveEntryResponse(String relativeLocalDirectory,
String repositoryFilePath,
IResponseServices responseServices,
IClientEnvironment clientEnvironment) throws IOException {
final ICvsFileSystem fileSystem = clientEnvironment.getCvsFileSystem();
final FileObject fileObject = fileSystem.getFileObject(relativeLocalDirectory, repositoryFilePath);
clientEnvironment.getAdminWriter().removeEntryForFile(fileObject, fileSystem);
responseServices.getEventSender().notifyEntryListeners(fileObject, null);
}
public void processCopyFileResponse(String relativeLocalDirectory,
String repositoryFilePath,
String newName,
IClientEnvironment clientEnvironment) throws IOException {
final FileObject fileObject = clientEnvironment.getCvsFileSystem().getFileObject(relativeLocalDirectory, repositoryFilePath);
clientEnvironment.getLocalFileWriter().renameLocalFile(fileObject, clientEnvironment.getCvsFileSystem(), newName);
}
public void processModTimeResponse(Date modifiedDate, IResponseServices responseServices) {
// we assume the date is in GMT, this appears to be the case
// We remove the ending because SimpleDateFormat does not parse
// +xxxx, only GMT+xxxx and this avoid us having to do String
// concat
responseServices.setNextFileDate(modifiedDate);
}
public void processModeResponse(String mode, IResponseServices responseServices) {
responseServices.setNextFileMode(mode);
}
public void processTemplateResponse(String relativeLocalDirectory,
String repositoryFilePath,
int length,
IClientEnvironment clientEnvironment,
IConnectionStreams connectionStreams) throws IOException {
final DirectoryObject directoryObject =
clientEnvironment.getCvsFileSystem().getDirectoryObject(relativeLocalDirectory, repositoryFilePath);
clientEnvironment.getAdminWriter().writeTemplateFile(directoryObject, length, connectionStreams.getInputStream(),
connectionStreams.getReaderFactory(), clientEnvironment);
}
public void processModuleExpansionResponse(String localPath, IResponseServices responseServices) {
responseServices.getEventSender().notifyModuleExpansionListeners(localPath);
}
public void processUpdatedResponse(String relativeLocalDirectory,
String repositoryFilePath,
String entryLine,
String mode,
int fileLength,
IClientEnvironment clientEnvironment,
IResponseServices responseServices,
IConnectionStreams connectionStreams) throws IOException {
processUpdatedMergedResponse(clientEnvironment, relativeLocalDirectory, repositoryFilePath, entryLine, responseServices, mode,
fileLength, connectionStreams, false);
}
public void processMergedResponse(String relativeLocalDirectory,
String repositoryFilePath,
String entryLine,
String mode,
int fileLength,
IClientEnvironment clientEnvironment,
IResponseServices responseServices,
IConnectionStreams connectionStreams) throws IOException {
processUpdatedMergedResponse(clientEnvironment, relativeLocalDirectory, repositoryFilePath, entryLine, responseServices, mode,
fileLength, connectionStreams, true);
}
public void processValidRequestsResponse(String validRequests, IResponseServices responseServices) {
}
// Utils ==================================================================
private static void processUpdatedMergedResponse(IClientEnvironment clientEnvironment,
String relativeLocalDirectory,
String repositoryFilePath,
String entryLine,
IResponseServices responseServices,
String mode,
int fileLength,
IConnectionStreams connectionStreams,
boolean merged) throws IOException {
final ICvsFileSystem cvsFileSystem = clientEnvironment.getCvsFileSystem();
final FileObject fileObject = cvsFileSystem.getFileObject(relativeLocalDirectory, repositoryFilePath);
final Entry entry = Entry.createEntryForLine(entryLine);
final ILocalFileWriter localFileWriter = clientEnvironment.getLocalFileWriter();
localFileWriter.setNextFileDate(responseServices.getNextFileDate());
// TODO: really???
localFileWriter.setNextFileMode(mode);
final boolean binary = entry.isBinary();
final boolean readOnly = FileUtils.isReadOnlyMode(mode);
final Charset charSet = entry.isUnicode() ? Charset.forName("UTF-16LE") : null;
writeFile(fileObject, fileLength, connectionStreams.getInputStream(), connectionStreams.getReaderFactory(), binary, readOnly,
clientEnvironment, charSet);
updateEntriesFileTime(fileObject, entry, cvsFileSystem, merged);
final IAdminWriter adminWriter = clientEnvironment.getAdminWriter();
adminWriter.ensureCvsDirectory(fileObject.getParent(), repositoryFilePath, clientEnvironment.getCvsRoot(), cvsFileSystem);
adminWriter.setEntry(fileObject.getParent(), entry, cvsFileSystem);
responseServices.getEventSender().notifyEntryListeners(fileObject, entry);
responseServices.getEventSender().notifyFileInfoListeners(new UpdatedFileInfo(fileObject,
cvsFileSystem.getLocalFileSystem().getFile(fileObject),
merged
? UpdatedFileInfo.UpdatedType.MERGED
: UpdatedFileInfo.UpdatedType.UPDATED, entry));
}
private static void writeFile(FileObject fileObject,
int length,
InputStream inputStream,
IReaderFactory readerFactory,
boolean binary,
final boolean readOnly,
IClientEnvironment clientEnvironment,
final Charset charSet) throws IOException {
if (binary) {
clientEnvironment.getLocalFileWriter().writeBinaryFile(fileObject, length, inputStream, readOnly,
clientEnvironment.getFileReadOnlyHandler(),
clientEnvironment.getCvsFileSystem());
}
else {
clientEnvironment.getLocalFileWriter().writeTextFile(fileObject, length, inputStream, readOnly, readerFactory,
clientEnvironment.getFileReadOnlyHandler(),
clientEnvironment.getCvsFileSystem().getLocalFileSystem(), charSet);
}
}
private static void updateEntriesFileTime(FileObject fileObject, Entry entry, ICvsFileSystem fileSystem, boolean merged) {
if (entry.isAddedFile()) {
entry.setDummyTimestamp();
}
else {
final File file = fileSystem.getLocalFileSystem().getFile(fileObject);
// we set the date the file was last modified in the Entry line
// so that we can easily determine whether the file has been
// untouched
// for files with conflicts skip the setting of the conflict field.
if (entry.isConflict()) {
if (entry.isTimeStampMatchesFile()) {
final Date date = new Date(file.lastModified());
entry.parseConflictString(getEntryConflict(date, true, merged));
}
else {
entry.parseConflictString(entry.getConflictStringWithoutConflict());
}
}
else {
final Date date = new Date(file.lastModified());
entry.parseConflictString(getEntryConflict(date, false, merged));
}
}
}
@NonNls
private static String getEntryConflict(Date date, boolean conflict, boolean merged) {
if (merged) {
if (conflict) {
return "Result of merge+" + Entry.formatLastModifiedDate(date);
}
return "Result of merge";
}
return Entry.formatLastModifiedDate(date);
}
}