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