svn: Unified "ContentRevision" implementations
authorKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Wed, 2 Nov 2016 17:36:37 +0000 (20:36 +0300)
committerKonstantin Kolosovsky <konstantin.kolosovsky@jetbrains.com>
Wed, 16 Nov 2016 18:01:56 +0000 (21:01 +0300)
plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBaseContentRevision.java [new file with mode: 0644]
plugins/svn4idea/src/org/jetbrains/idea/svn/SvnContentRevision.java
plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnChangeList.java
plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnLazyPropertyContentRevision.java
plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnRepositoryContentRevision.java

diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBaseContentRevision.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnBaseContentRevision.java
new file mode 100644 (file)
index 0000000..d795c15
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2016 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.jetbrains.idea.svn;
+
+import com.intellij.openapi.vcs.FilePath;
+import com.intellij.openapi.vcs.changes.ContentRevision;
+import org.jetbrains.annotations.NotNull;
+
+public abstract class SvnBaseContentRevision implements ContentRevision {
+
+  @NotNull protected final SvnVcs myVcs;
+  @NotNull protected final FilePath myFile;
+
+  protected SvnBaseContentRevision(@NotNull SvnVcs vcs, @NotNull FilePath file) {
+    myVcs = vcs;
+    myFile = file;
+  }
+
+  @NotNull
+  @Override
+  public FilePath getFile() {
+    return myFile;
+  }
+}
index 00b57d3ba14d9d6259e63aa604b53ddbf836e5c2..08420362524333bb191987ef861f6af3fa71bc1b 100644 (file)
@@ -17,7 +17,6 @@
 package org.jetbrains.idea.svn;
 
 import com.intellij.openapi.util.Pair;
-import com.intellij.openapi.util.Throwable2Computable;
 import com.intellij.openapi.vcs.FilePath;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.VcsKey;
@@ -36,13 +35,8 @@ import org.tmatesoft.svn.core.wc2.SvnTarget;
 import java.io.File;
 import java.io.IOException;
 
-/**
- * @author yole
-*/
-public class SvnContentRevision implements ByteBackedContentRevision, MarkerVcsContentRevision {
+public class SvnContentRevision extends SvnBaseContentRevision implements ByteBackedContentRevision, MarkerVcsContentRevision {
 
-  @NotNull private final SvnVcs myVcs;
-  @NotNull protected final FilePath myFile;
   @NotNull private final SVNRevision myRevision;
   /**
    * this flag is necessary since SVN would not do remote request only if constant SVNRevision.BASE
@@ -51,10 +45,9 @@ public class SvnContentRevision implements ByteBackedContentRevision, MarkerVcsC
   private final boolean myUseBaseRevision;
 
   protected SvnContentRevision(@NotNull SvnVcs vcs, @NotNull FilePath file, @NotNull SVNRevision revision, boolean useBaseRevision) {
-    myVcs = vcs;
+    super(vcs, file);
     myRevision = revision;
     myUseBaseRevision = useBaseRevision;
-    myFile = file;
   }
 
   @NotNull
@@ -104,13 +97,7 @@ public class SvnContentRevision implements ByteBackedContentRevision, MarkerVcsC
                                                             }).getSecond();
       } else {
         return ContentRevisionCache.getOrLoadAsBytes(myVcs.getProject(), myFile, getRevisionNumber(), myVcs.getKeyInstanceMethod(),
-                                                     ContentRevisionCache.UniqueType.REPOSITORY_CONTENT,
-                                                     new Throwable2Computable<byte[], VcsException, IOException>() {
-                                                       @Override
-                                                       public byte[] compute() throws VcsException, IOException {
-                                                         return getUpToDateBinaryContent();
-                                                       }
-                                                     });
+                                                     ContentRevisionCache.UniqueType.REPOSITORY_CONTENT, () -> getUpToDateBinaryContent());
       }
     }
     catch (IOException e) {
@@ -128,11 +115,6 @@ public class SvnContentRevision implements ByteBackedContentRevision, MarkerVcsC
                                    SVNRevision.UNDEFINED);
   }
 
-  @NotNull
-  public FilePath getFile() {
-    return myFile;
-  }
-
   @NotNull
   public VcsRevisionNumber getRevisionNumber() {
     return new SvnRevisionNumber(myRevision);
index 2cb287172d7c3ed345e8a99a5610fe867e7f431a..569025819fc401721e2eadb21fd623ede194cdc8 100644 (file)
@@ -561,7 +561,7 @@ public class SvnChangeList implements CommittedChangeList, VcsRevisionNumberAwar
   private SvnLazyPropertyContentRevision createPropertyRevision(@NotNull FilePath filePath,
                                                                 @Nullable ContentRevision revision,
                                                                 @NotNull SVNURL url) {
-    return revision == null ? null : new SvnLazyPropertyContentRevision(filePath, revision.getRevisionNumber(), myVcs.getProject(), url);
+    return revision == null ? null : new SvnLazyPropertyContentRevision(myVcs, filePath, revision.getRevisionNumber(), url);
   }
 
   @NotNull
index c313794e6451a95f96ac52fa5c1915e9e2c7d027..3c6966d3b5972c6ba2d3288b7819bc3a87bc59fb 100644 (file)
@@ -17,16 +17,15 @@ package org.jetbrains.idea.svn.history;
 
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.progress.ProgressManager;
-import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.vcs.FilePath;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.VcsKey;
-import com.intellij.openapi.vcs.changes.ContentRevision;
 import com.intellij.openapi.vcs.changes.MarkerVcsContentRevision;
 import com.intellij.openapi.vcs.history.VcsRevisionNumber;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.jetbrains.idea.svn.SvnBaseContentRevision;
 import org.jetbrains.idea.svn.SvnBundle;
 import org.jetbrains.idea.svn.SvnRevisionNumber;
 import org.jetbrains.idea.svn.SvnVcs;
@@ -36,23 +35,14 @@ import org.tmatesoft.svn.core.SVNURL;
 
 import java.util.List;
 
-/**
- * Created with IntelliJ IDEA.
- * User: Irina.Chernushina
- * Date: 2/22/12
- * Time: 10:28 AM
- */
-public class SvnLazyPropertyContentRevision implements ContentRevision, MarkerVcsContentRevision, PropertyRevision {
-  private final FilePath myPath;
+public class SvnLazyPropertyContentRevision extends SvnBaseContentRevision implements MarkerVcsContentRevision, PropertyRevision {
   private final VcsRevisionNumber myNumber;
-  private final Project myProject;
   private final SVNURL myUrl;
   private List<PropertyData> myContent;
 
-  public SvnLazyPropertyContentRevision(FilePath path, VcsRevisionNumber number, Project project, SVNURL url) {
-    myPath = path;
+  public SvnLazyPropertyContentRevision(@NotNull SvnVcs vcs, @NotNull FilePath file, VcsRevisionNumber number, SVNURL url) {
+    super(vcs, file);
     myNumber = number;
-    myProject = project;
     myUrl = url;
   }
 
@@ -71,23 +61,20 @@ public class SvnLazyPropertyContentRevision implements ContentRevision, MarkerVc
   }
 
   private List<PropertyData> loadContent() throws VcsException {
-    final SvnVcs vcs = SvnVcs.getInstance(myProject);
     final Ref<List<PropertyData>> ref = new Ref<>();
     final Ref<VcsException> exceptionRef = new Ref<>();
-    final Runnable runnable = new Runnable() {
-      @Override
-      public void run() {
-        try {
-          ref.set(AbstractShowPropertiesDiffAction.getPropertyList(vcs, myUrl, ((SvnRevisionNumber)myNumber).getRevision()));
-        }
-        catch (VcsException e) {
-          exceptionRef.set(e);
-        }
+    final Runnable runnable = () -> {
+      try {
+        ref.set(AbstractShowPropertiesDiffAction.getPropertyList(myVcs, myUrl, ((SvnRevisionNumber)myNumber).getRevision()));
+      }
+      catch (VcsException e) {
+        exceptionRef.set(e);
       }
     };
     if (ApplicationManager.getApplication().isDispatchThread()) {
-      final boolean completed = ProgressManager.getInstance()
-        .runProcessWithProgressSynchronously(runnable, SvnBundle.message("progress.title.loading.file.properties"), true, myProject);
+      boolean completed = ProgressManager.getInstance()
+        .runProcessWithProgressSynchronously(runnable, SvnBundle.message("progress.title.loading.file.properties"), true,
+                                             myVcs.getProject());
       if (!completed) {
         throw new VcsException("Properties load for revision " + getRevisionNumber().asString() + " was canceled.");
       }
@@ -99,12 +86,6 @@ public class SvnLazyPropertyContentRevision implements ContentRevision, MarkerVc
     return ref.get();
   }
 
-  @NotNull
-  @Override
-  public FilePath getFile() {
-    return myPath;
-  }
-
   @NotNull
   @Override
   public VcsRevisionNumber getRevisionNumber() {
index 82f064b87aa9aaeced22f5c9ff264cc17efeb6d5..27ca57ea04c5f235de4da2b34866c37a2dae567d 100644 (file)
@@ -25,7 +25,6 @@ package org.jetbrains.idea.svn.history;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.progress.ProgressIndicator;
 import com.intellij.openapi.progress.ProgressManager;
-import com.intellij.openapi.util.Throwable2Computable;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vcs.FilePath;
 import com.intellij.openapi.vcs.VcsException;
@@ -37,10 +36,7 @@ import com.intellij.openapi.vfs.LocalFileSystem;
 import com.intellij.vcsUtil.VcsUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.jetbrains.idea.svn.SvnBundle;
-import org.jetbrains.idea.svn.SvnRevisionNumber;
-import org.jetbrains.idea.svn.SvnUtil;
-import org.jetbrains.idea.svn.SvnVcs;
+import org.jetbrains.idea.svn.*;
 import org.jetbrains.idea.svn.commandLine.SvnBindException;
 import org.tmatesoft.svn.core.wc.SVNRevision;
 import org.tmatesoft.svn.core.wc2.SvnTarget;
@@ -49,40 +45,33 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 
-public class SvnRepositoryContentRevision implements ByteBackedContentRevision, MarkerVcsContentRevision {
+import static com.intellij.util.ObjectUtils.notNull;
+
+public class SvnRepositoryContentRevision extends SvnBaseContentRevision implements ByteBackedContentRevision, MarkerVcsContentRevision {
 
-  @NotNull private final SvnVcs myVcs;
   @NotNull private final String myPath;
-  @NotNull private final FilePath myFilePath;
   private final long myRevision;
 
   public SvnRepositoryContentRevision(@NotNull SvnVcs vcs, @NotNull FilePath remotePath, @Nullable FilePath localPath, long revision) {
-    myVcs = vcs;
+    super(vcs, notNull(localPath, remotePath));
     myPath = FileUtil.toSystemIndependentName(remotePath.getPath());
-    myFilePath = localPath != null ? localPath : remotePath;
     myRevision = revision;
   }
 
   @NotNull
   public String getContent() throws VcsException {
-    return ContentRevisionCache.getAsString(getContentAsBytes(), myFilePath, null);
+    return ContentRevisionCache.getAsString(getContentAsBytes(), myFile, null);
   }
 
   @NotNull
   @Override
   public byte[] getContentAsBytes() throws VcsException {
     try {
-      if (myFilePath.getVirtualFile() == null) {
-        LocalFileSystem.getInstance().refreshAndFindFileByPath(myFilePath.getPath());
+      if (myFile.getVirtualFile() == null) {
+        LocalFileSystem.getInstance().refreshAndFindFileByPath(myFile.getPath());
       }
-      return ContentRevisionCache.getOrLoadAsBytes(myVcs.getProject(), myFilePath, getRevisionNumber(), myVcs.getKeyInstanceMethod(),
-                                                   ContentRevisionCache.UniqueType.REPOSITORY_CONTENT,
-                                                   new Throwable2Computable<byte[], VcsException, IOException>() {
-                                                     @Override
-                                                     public byte[] compute() throws VcsException, IOException {
-                                                       return loadContent().toByteArray();
-                                                     }
-                                                   });
+      return ContentRevisionCache.getOrLoadAsBytes(myVcs.getProject(), myFile, getRevisionNumber(), myVcs.getKeyInstanceMethod(),
+                                                   ContentRevisionCache.UniqueType.REPOSITORY_CONTENT, () -> loadContent().toByteArray());
     }
     catch (IOException e) {
       throw new VcsException(e);
@@ -108,11 +97,6 @@ public class SvnRepositoryContentRevision implements ByteBackedContentRevision,
     return buffer;
   }
 
-  @NotNull
-  public FilePath getFile() {
-    return myFilePath;
-  }
-
   @NotNull
   public SvnRevisionNumber getRevisionNumber() {
     return new SvnRevisionNumber(SVNRevision.create(myRevision));
@@ -156,7 +140,7 @@ public class SvnRepositoryContentRevision implements ByteBackedContentRevision,
 
   @Override
   public String toString() {
-    return myFilePath.getIOFile() + "#" + myRevision; 
+    return myFile.getIOFile() + "#" + myRevision;
   }
 
   private class ContentLoader implements Runnable {