Project: CommunityCase
/*
 * 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 org.community.intellij.plugins.communitycase; 
 
import com.intellij.openapi.project.Project; 
import com.intellij.openapi.util.SystemInfo; 
import com.intellij.openapi.vcs.FilePath; 
import com.intellij.openapi.vcs.FilePathImpl; 
import com.intellij.openapi.vcs.VcsException; 
import com.intellij.openapi.vcs.changes.CurrentContentRevision; 
import com.intellij.openapi.vcs.history.VcsRevisionNumber; 
import com.intellij.openapi.vfs.VirtualFile; 
import com.intellij.vcsUtil.VcsUtil; 
import org.community.intellij.plugins.communitycase.commands.FileUtils; 
import org.community.intellij.plugins.communitycase.history.wholeTree.MultipleContentsRevision; 
import org.jetbrains.annotations.NotNull; 
import org.jetbrains.annotations.Nullable; 
 
import java.io.File; 
import java.nio.charset.Charset; 
import java.util.List; 
 
/**
 *  content revision 
 */
 
public class ContentRevision implements com.intellij.openapi.vcs.changes.ContentRevision { 
  /**
   * the file path 
   */
 
  @NotNull private final FilePath myFile; 
  /**
   * the revision number 
   */
 
  @NotNull private final VcsRevisionNumber myRevision; 
  /**
   * the context project 
   */
 
  @NotNull private final Project myProject; 
  /**
   * The charset for the file 
   */
 
  @NotNull private Charset myCharset; 
 
  public ContentRevision(@NotNull FilePath file, @NotNull VcsRevisionNumber revision, @NotNull Project project, Charset charset) { 
    myProject = project; 
    myFile = file; 
    myRevision = revision; 
    myCharset = charset; 
  } 
 
  public ContentRevision(@NotNull FilePath file, @NotNull VcsRevisionNumber revision, @NotNull Project project) { 
    this(file, revision, project, null); 
  } 
 
  @Nullable 
  public String getContent() throws VcsException { 
    if (myFile.isDirectory()) { 
      return null
    } 
    VirtualFile root = Util.getRoot(myFile); 
    byte[] result = FileUtils.getFileContent(myProject, root, myRevision.asString(), Util.relativePath(root, myFile)); 
    if (myCharset == null) { 
      myCharset = myFile.getCharset(myProject); 
    } 
    return result == null ? null : new String(result, myCharset); 
  } 
 
  @NotNull 
  public FilePath getFile() { 
    return myFile; 
  } 
 
  @NotNull 
  public VcsRevisionNumber getRevisionNumber() { 
    return myRevision; 
  } 
 
  public boolean equals(Object obj) { 
    if (this == obj) return true
    if ((obj == null) || (obj.getClass() != getClass())) return false
 
    ContentRevision test = (ContentRevision)obj; 
    return (myFile.equals(test.myFile) && myRevision.equals(test.myRevision)); 
  } 
 
  public int hashCode() { 
    return myFile.hashCode() + myRevision.hashCode(); 
  } 
 
  public static com.intellij.openapi.vcs.changes.ContentRevision createMultipleParentsRevision(Project project, 
                                                              final FilePath file, 
                                                              final List<VcsRevisionNumber> revisions) throws VcsException { 
    final ContentRevision contentRevision = new ContentRevision(file, revisions.get(0), project); 
    if (revisions.size() == 1) { 
      return contentRevision; 
    } else { 
      return new MultipleContentsRevision(file, revisions, contentRevision); 
    } 
  } 
 
  /**
   * Create revision 
   * 
   * @param vcsRoot        a vcs root for the repository 
   * @param path           an path inside with possibly escape sequences 
   * @param revisionNumber a revision number, if null the current revision will be created 
   * @param project        the context project 
   * @param isDeleted      if true, the file is deleted 
   * @return a created revision 
   * @throws com.intellij.openapi.vcs.VcsException 
   *          if there is a problem with creating revision 
   */
 
  public static com.intellij.openapi.vcs.changes.ContentRevision createRevision(VirtualFile vcsRoot, 
                                               String path, 
                                               VcsRevisionNumber revisionNumber, 
                                               Project project, 
                                               boolean isDeleted, final boolean canBeDeleted) throws VcsException { 
    final FilePath file = createPath(vcsRoot, path, isDeleted, canBeDeleted); 
    if (revisionNumber != null) { 
      return new ContentRevision(file, (VcsRevisionNumber)revisionNumber, project); 
    } 
    else { 
      return CurrentContentRevision.create(file); 
    } 
  } 
 
  public static FilePath createPath(VirtualFile vcsRoot, String path, boolean isDeleted, boolean canBeDeleted) throws VcsException { 
    final String absolutePath = vcsRoot.getPath() + "/" + Util.unescapePath(path); 
    FilePath file = isDeleted ? VcsUtil.getFilePathForDeletedFile(absolutePath, false) : VcsUtil.getFilePath(absolutePath, false); 
    if (canBeDeleted && !SystemInfo.isFileSystemCaseSensitive && VcsUtil.caseDiffers(file.getPath(), absolutePath)) { 
      // as for deleted file 
      file = FilePathImpl.createForDeletedFile(new File(absolutePath), false); 
    } 
    return file; 
  } 
 
  public static com.intellij.openapi.vcs.changes.ContentRevision createRevision(final VirtualFile file, final VcsRevisionNumber revisionNumber, final Project project) 
    throws VcsException { 
    final FilePathImpl filePath = new FilePathImpl(file); 
    if (revisionNumber != null) { 
      return new ContentRevision(filePath, (VcsRevisionNumber)revisionNumber, project); 
    } 
    else { 
      return CurrentContentRevision.create(filePath); 
    } 
  } 
 
  @Override 
  public String toString() { 
    return myFile.getPath(); 
  } 
}