[Mercurial] +getContentAsBytes in HgContentRevision.
[idea/community.git] / plugins / hg4idea / src / org / zmlx / hg4idea / HgContentRevision.java
1 // Copyright 2008-2010 Victor Iacoban
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software distributed under
10 // the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11 // either express or implied. See the License for the specific language governing permissions and
12 // limitations under the License.
13 package org.zmlx.hg4idea;
14
15 import com.intellij.openapi.project.Project;
16 import com.intellij.openapi.vcs.FilePath;
17 import com.intellij.openapi.vcs.VcsException;
18 import com.intellij.openapi.vcs.changes.ContentRevision;
19 import com.intellij.openapi.vfs.VirtualFile;
20 import com.intellij.vcsUtil.VcsUtil;
21 import org.apache.commons.lang.StringUtils;
22 import org.apache.commons.lang.builder.EqualsBuilder;
23 import org.apache.commons.lang.builder.HashCodeBuilder;
24 import org.jetbrains.annotations.NotNull;
25 import org.jetbrains.annotations.Nullable;
26 import org.zmlx.hg4idea.command.HgCatCommand;
27
28 import java.io.UnsupportedEncodingException;
29
30 public class HgContentRevision implements ContentRevision {
31
32   private final Project project;
33   private final HgFile hgFile;
34   @NotNull private final HgRevisionNumber revisionNumber;
35
36   private FilePath filePath;
37   private String content;
38
39   public HgContentRevision(Project project, HgFile hgFile,
40     @NotNull HgRevisionNumber revisionNumber) {
41     this.project = project;
42     this.hgFile = hgFile;
43     this.revisionNumber = revisionNumber;
44   }
45
46   @Nullable
47   public String getContent() throws VcsException {
48     if (StringUtils.isBlank(content)) {
49       content = new HgCatCommand(project).execute(hgFile, revisionNumber, getFile().getCharset());
50     }
51     return content;
52   }
53
54   @Nullable
55   public byte[] getContentAsBytes() throws VcsException {
56     String content = getContent();
57     if (content == null) {
58       return null;
59     }
60     try {
61       VirtualFile vf = VcsUtil.getVirtualFile(hgFile.getFile());
62       if (vf == null) {
63         return null;
64       }
65       return content.getBytes(vf.getCharset().name());
66     } catch (UnsupportedEncodingException e) {
67       throw new VcsException("Couldn't retrieve file content due to a UnsupportedEncodingException", e);
68     }
69   }
70
71   @NotNull
72   public FilePath getFile() {
73     if (filePath == null) {
74       filePath = hgFile.toFilePath();
75     }
76     return filePath;
77   }
78
79   @NotNull
80   public HgRevisionNumber getRevisionNumber() {
81     return revisionNumber;
82   }
83
84   @Override
85   public int hashCode() {
86     return new HashCodeBuilder()
87       .append(hgFile)
88       .append(revisionNumber)
89       .toHashCode();
90   }
91
92   @Override
93   public boolean equals(Object object) {
94     if (object == this) {
95       return true;
96     }
97     if (!(object instanceof HgContentRevision)) {
98       return false;
99     }
100     HgContentRevision that = (HgContentRevision) object;
101     return new EqualsBuilder()
102       .append(hgFile, that.hgFile)
103       .append(revisionNumber, that.revisionNumber)
104       .isEquals();
105   }
106
107 }