blob: b77014a997145bfd77477570e56a4eca2e2c8cf8 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.cvsSupport2.cvsoperations.javacvsSpecificImpls;
import com.intellij.cvsSupport2.CvsUtil;
import com.intellij.cvsSupport2.application.CvsEntriesManager;
import com.intellij.cvsSupport2.config.CvsApplicationLevelConfiguration;
import com.intellij.cvsSupport2.cvsoperations.common.UpdatedFilesManager;
import com.intellij.cvsSupport2.javacvsImpl.ProjectContentInfoProvider;
import com.intellij.cvsSupport2.util.CvsVfsUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import org.netbeans.lib.cvsclient.CvsRoot;
import org.netbeans.lib.cvsclient.IClientEnvironment;
import org.netbeans.lib.cvsclient.admin.AdminWriter;
import org.netbeans.lib.cvsclient.admin.Entry;
import org.netbeans.lib.cvsclient.admin.IAdminWriter;
import org.netbeans.lib.cvsclient.file.*;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
/**
* author: lesya
*/
public class AdminWriterOnCache implements IAdminWriter {
private static final Logger LOG = Logger.getInstance("#com.intellij.cvsSupport2.cvsoperations.javacvsSpecificImpls.AdminWriterOnCache");
private final IAdminWriter myAdminWriter;
private final CvsEntriesManager myCvsEntriesManager = CvsEntriesManager.getInstance();
private final UpdatedFilesManager myUpdatedFilesManager;
private final ProjectContentInfoProvider myProjectContentInfoProvider;
public AdminWriterOnCache(UpdatedFilesManager updatedFilesManager,
ProjectContentInfoProvider projectContentInfoProvider) {
myUpdatedFilesManager = updatedFilesManager;
myProjectContentInfoProvider = projectContentInfoProvider;
myAdminWriter = new AdminWriter(
CodeStyleSettingsManager.getInstance().getCurrentSettings().getLineSeparator(),
CvsApplicationLevelConfiguration.getCharset());
}
public void ensureCvsDirectory(DirectoryObject directoryObject,
String repositoryPath,
CvsRoot cvsRoot,
ICvsFileSystem cvsFileSystem) throws IOException {
if (notUnderCvs(directoryObject, cvsFileSystem)) return;
myAdminWriter.ensureCvsDirectory(directoryObject, repositoryPath, cvsRoot, cvsFileSystem);
addDirectoryToParentEntriesFile(directoryObject, cvsFileSystem, cvsRoot.getCvsRoot());
}
private boolean notUnderCvs(AbstractFileObject directoryObject, ICvsFileSystem cvsFileSystem) {
if (directoryObject == null) return false;
final File directory = cvsFileSystem.getLocalFileSystem().getFile(directoryObject);
return !myProjectContentInfoProvider.fileIsUnderProject(directory);
}
private void addDirectoryToParentEntriesFile(DirectoryObject directoryObject,
ICvsFileSystem cvsFileSystem, String cvsRoot) throws IOException {
DirectoryObject parentDirectoryObject = directoryObject.getParent();
if (parentDirectoryObject == null) return;
File directory = cvsFileSystem.getAdminFileSystem().getFile(directoryObject);
final File parentDirectory = directory.getParentFile();
if (parentDirectory == null) return;
VirtualFile virtualParent = CvsVfsUtil.findFileByIoFile(parentDirectory);
if (virtualParent == null) return;
String directoryName = directory.getName();
Entry entry = myCvsEntriesManager.getEntryFor(virtualParent, directoryName);
if (entry == null) {
if (CvsUtil.fileIsUnderCvs(virtualParent)
&& CvsEntriesManager.getInstance().getCvsConnectionSettingsFor(virtualParent)
.getCvsRootAsString().equals(cvsRoot)) {
setEntry(parentDirectoryObject,
Entry.createDirectoryEntry(directoryName),
cvsFileSystem);
}
}
}
public void setEntry(final DirectoryObject directoryObject, final Entry entry, final ICvsFileSystem cvsFileSystem)
throws IOException {
File parent = cvsFileSystem.getLocalFileSystem().getFile(directoryObject);
if (myUpdatedFilesManager.fileIsNotUpdated(new File(parent, entry.getFileName()))) return;
if (notUnderCvs(directoryObject, cvsFileSystem)) return;
myAdminWriter.setEntry(directoryObject, entry, cvsFileSystem);
VirtualFile virtualParent = CvsVfsUtil.findFileByIoFile(parent);
Entry existing = myCvsEntriesManager.getEntryFor(virtualParent, entry.getFileName());
if (existing == null) myUpdatedFilesManager.addNewlyCreatedEntry(entry);
}
public void removeEntryForFile(final AbstractFileObject fileObject, final ICvsFileSystem cvsFileSystem)
throws IOException {
if (notUnderCvs(fileObject, cvsFileSystem)) return;
File file = cvsFileSystem.getLocalFileSystem().getFile(fileObject);
if (myUpdatedFilesManager.fileIsNotUpdated(file)) return;
myAdminWriter.removeEntryForFile(fileObject, cvsFileSystem);
}
public void pruneDirectory(DirectoryObject directoryObject, ICvsFileSystem cvsFileSystem) {
LOG.error("Cannot be called");
}
public void editFile(FileObject fileObject,
Entry entry,
ICvsFileSystem cvsFileSystem,
IFileReadOnlyHandler fileReadOnlyHandler) throws IOException {
myAdminWriter.editFile(fileObject, entry, cvsFileSystem, fileReadOnlyHandler);
File editBackupFile = getEditBackupFile(fileObject, cvsFileSystem);
final File file = cvsFileSystem.getAdminFileSystem().getFile(fileObject);
editBackupFile.setLastModified(file.lastModified());
}
public void uneditFile(FileObject fileObject,
ICvsFileSystem cvsFileSystem,
IFileReadOnlyHandler fileReadOnlyHandler) throws IOException {
final File file = cvsFileSystem.getAdminFileSystem().getFile(fileObject);
final File editBackupFile = getEditBackupFile(fileObject, cvsFileSystem);
if (!editBackupFile.isFile()) {
return;
}
FileUtil.copy(editBackupFile, file);
file.setLastModified(editBackupFile.lastModified());
myAdminWriter.uneditFile(fileObject, cvsFileSystem, fileReadOnlyHandler);
}
private static File getEditBackupFile(FileObject fileObject, ICvsFileSystem cvsFileSystem) {
final File file = cvsFileSystem.getAdminFileSystem().getFile(fileObject);
return new File(file.getParentFile(), CvsUtil.CVS + File.separatorChar + CvsUtil.BASE + File.separatorChar + file.getName());
}
public void setStickyTagForDirectory(DirectoryObject directoryObject, String tag, ICvsFileSystem cvsFileSystem)
throws IOException {
myAdminWriter.setStickyTagForDirectory(directoryObject, tag, cvsFileSystem);
File ioDirectory = cvsFileSystem.getLocalFileSystem().getFile(directoryObject);
CvsEntriesManager.getInstance().getCvsInfoFor(CvsVfsUtil.findFileByIoFile(ioDirectory)).clearStickyInformation();
}
public void setEntriesDotStatic(DirectoryObject directoryObject, boolean set, ICvsFileSystem cvsFileSystem)
throws IOException {
myAdminWriter.setEntriesDotStatic(directoryObject, set, cvsFileSystem);
}
public void writeTemplateFile(@NotNull DirectoryObject directoryObject,
int fileLength,
InputStream inputStream,
IReaderFactory readerFactory,
IClientEnvironment clientEnvironment) throws IOException {
myAdminWriter.writeTemplateFile(directoryObject, fileLength, inputStream, readerFactory, clientEnvironment);
}
public void directoryAdded(@NotNull DirectoryObject directoryObject, ICvsFileSystem cvsFileSystem) throws IOException {
LOG.assertTrue(directoryObject.getParent() != null, directoryObject.getPath());
File directory = cvsFileSystem.getLocalFileSystem().getFile(directoryObject);
if (!myProjectContentInfoProvider.fileIsUnderProject(directory)) return;
myAdminWriter.directoryAdded(directoryObject, cvsFileSystem);
File ioDirectory = cvsFileSystem.getLocalFileSystem().getFile(directoryObject);
CvsEntriesManager.getInstance().getCvsInfoFor(CvsVfsUtil.findFileByIoFile(ioDirectory)).clearAll();
}
}