All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.intellij.cvsSupport2.cvsoperations.javacvsSpecificImpls.AdminWriterOnCache Maven / Gradle / Ivy

Go to download

A packaging of the IntelliJ Community Edition cvs-plugin library. This is release number 1 of trunk branch 142.

The newest version!
/*
 * 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();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy