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