Bug: Do not crash when showing diff for first version of a file
[egit.git] / org.spearce.egit.ui / src / org / spearce / egit / ui / internal / GitResourceNode.java
blob010b738a7b76f45f749e8ac3b06162c2035d6843
1 package org.spearce.egit.ui.internal;
3 import java.io.ByteArrayInputStream;
4 import java.io.IOException;
5 import java.io.InputStream;
7 import org.eclipse.compare.BufferedContent;
8 import org.eclipse.compare.CompareUI;
9 import org.eclipse.compare.ITypedElement;
10 import org.eclipse.compare.structuremergeviewer.IStructureComparator;
11 import org.eclipse.core.runtime.CoreException;
12 import org.eclipse.swt.graphics.Image;
13 import org.eclipse.team.core.history.IFileRevision;
14 import org.spearce.egit.core.internal.mapping.GitFileRevision;
15 import org.spearce.jgit.lib.FileTreeEntry;
16 import org.spearce.jgit.lib.ObjectId;
17 import org.spearce.jgit.lib.ObjectLoader;
18 import org.spearce.jgit.lib.Tree;
19 import org.spearce.jgit.lib.TreeEntry;
21 public class GitResourceNode extends BufferedContent implements IStructureComparator, ITypedElement {
22 TreeEntry entry;
23 GitResourceNode[] children;
25 public GitResourceNode(TreeEntry e) {
26 entry = e;
29 public GitResourceNode(IFileRevision file) {
30 this(((GitFileRevision)file).getTreeEntry());
33 public Object[] getChildren() {
34 if (children != null)
35 return children;
36 if (entry instanceof Tree) {
37 try {
38 Tree t = (Tree)entry;
39 children = new GitResourceNode[t.memberCount()];
40 for (int i=0; i<children.length; ++i) {
41 children[i] = new GitResourceNode(t.members()[i]);
43 } catch (IOException e) {
44 // TODO: eclipse error handling
45 e.printStackTrace();
46 children = new GitResourceNode[0];
49 return children;
52 public boolean equals(Object obj) {
53 return entry.getId().equals(((GitResourceNode)obj).entry.getId());
56 protected InputStream createStream() throws CoreException {
57 if (entry instanceof FileTreeEntry) {
58 try {
59 ObjectId id = entry.getId();
60 ObjectLoader reader = entry.getRepository().openBlob(id);
61 byte[] bytes = reader.getBytes();
62 return new ByteArrayInputStream(bytes);
63 } catch (IOException e) {
64 // TODO: eclipse error handling
65 e.printStackTrace();
66 return null;
69 return null;
72 public String getName() {
73 if (entry != null)
74 return entry.getFullName();
75 else
76 return "<none>";
79 public Image getImage() {
80 return CompareUI.getImage(getType());
83 public String getType() {
84 if (entry instanceof Tree)
85 return ITypedElement.FOLDER_TYPE;
86 else {
87 if (entry != null) {
88 String name = entry.getName();
89 if (name != null) {
90 int index = name.lastIndexOf('.');
91 if (index == -1)
92 return ""; //$NON-NLS-1$
93 if (index == (name.length() - 1))
94 return ""; //$NON-NLS-1$
95 return name.substring(index + 1);
97 return "";
98 } else
99 return "";