Skip to content

Commit fc809d3

Browse files
committed
Issue #21: ensure that inner classes don't reference JGit objects
Gitblit uses a few inner anonymous classes in some pages. Ensure that those do not hold references to JGit RevCommits to avoid that they get serialized when the page is. The usage of serialized inner anonymous classes is an anti-pattern in Wicket programming and is discouraged in the Java serialization spec, but cleaning this up properly would amount to a larger refactoring than can be done in this plugin (and also larger than I'm willing to do).
1 parent a3f6b69 commit fc809d3

File tree

3 files changed

+32
-17
lines changed

3 files changed

+32
-17
lines changed

src/main/java/com/gitblit/wicket/panels/HistoryPanel.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.gitblit.models.RefModel;
4747
import com.gitblit.models.RepositoryCommit;
4848
import com.gitblit.models.SubmoduleModel;
49+
import com.gitblit.utils.ArrayUtils;
4950
import com.gitblit.utils.JGitUtils;
5051
import com.gitblit.utils.MarkdownUtils;
5152
import com.gitblit.utils.StringUtils;
@@ -132,7 +133,7 @@ public HistoryPanel(String wicketId, final String repositoryName, final String o
132133
hasSubmodule = false;
133134
}
134135

135-
final Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
136+
Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
136137
List<RevCommit> commits;
137138
if (pageResults) {
138139
// Paging result set
@@ -147,9 +148,13 @@ public HistoryPanel(String wicketId, final String repositoryName, final String o
147148
hasMore = commits.size() >= itemsPerPage;
148149

149150
final int hashLen = app().settings().getInteger(Keys.web.shortCommitIdLength, 6);
150-
final List<RepositoryCommit> repoCommits = new ArrayList<>(commits.size());
151+
List<RepositoryCommit> repoCommits = new ArrayList<>(commits.size());
151152
for (RevCommit c : commits) {
152-
repoCommits.add(new RepositoryCommit(repositoryName, "", c));
153+
RepositoryCommit repoCommit = new RepositoryCommit(repositoryName, "", c);
154+
if (allRefs.containsKey(c)) {
155+
repoCommit.setRefs(allRefs.get(c));
156+
}
157+
repoCommits.add(repoCommit);
153158
}
154159
ListDataProvider<RepositoryCommit> dp = new ListDataProvider<RepositoryCommit>(repoCommits);
155160
DataView<RepositoryCommit> logView = new DataView<RepositoryCommit>("commit", dp) {
@@ -179,7 +184,7 @@ public void populateItem(final Item<RepositoryCommit> item) {
179184

180185
String shortMessage = entry.getShortMessage();
181186
String trimmedMessage = shortMessage;
182-
if (allRefs.containsKey(entry.getId())) {
187+
if (!ArrayUtils.isEmpty(entry.getRefs())) {
183188
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG_REFS);
184189
} else {
185190
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG);
@@ -191,7 +196,7 @@ public void populateItem(final Item<RepositoryCommit> item) {
191196
}
192197
item.add(shortlog);
193198

194-
item.add(new RefsPanel("commitRefs", repositoryName, allRefs.get(entry.getId())));
199+
item.add(new RefsPanel("commitRefs", repositoryName, entry.getRefs()));
195200

196201
if (isTree) {
197202
// tree

src/main/java/com/gitblit/wicket/panels/LogPanel.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.gitblit.models.RefModel;
3939
import com.gitblit.models.RepositoryCommit;
4040
import com.gitblit.servlet.BranchGraphServlet;
41+
import com.gitblit.utils.ArrayUtils;
4142
import com.gitblit.utils.JGitUtils;
4243
import com.gitblit.utils.StringUtils;
4344
import com.gitblit.wicket.ExternalImage;
@@ -63,7 +64,7 @@ public LogPanel(String wicketId, final String repositoryName, final String objec
6364
itemsPerPage = 50;
6465
}
6566

66-
final Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
67+
Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
6768
List<RevCommit> commits;
6869
if (pageResults) {
6970
// Paging result set
@@ -77,8 +78,8 @@ public LogPanel(String wicketId, final String repositoryName, final String objec
7778
// works unless commits.size() represents the exact end.
7879
hasMore = commits.size() >= itemsPerPage;
7980

80-
final String baseUrl = WicketUtils.getGitblitURL(getRequest());
81-
final boolean showGraph = app().settings().getBoolean(Keys.web.showBranchGraph, true);
81+
String baseUrl = WicketUtils.getGitblitURL(getRequest());
82+
boolean showGraph = app().settings().getBoolean(Keys.web.showBranchGraph, true);
8283

8384
MarkupContainer graph = new WebMarkupContainer("graph");
8485
add(graph);
@@ -103,9 +104,13 @@ public LogPanel(String wicketId, final String repositoryName, final String objec
103104
}
104105

105106
final int hashLen = app().settings().getInteger(Keys.web.shortCommitIdLength, 6);
106-
final List<RepositoryCommit> repoCommits = new ArrayList<>(commits.size());
107+
List<RepositoryCommit> repoCommits = new ArrayList<>(commits.size());
107108
for (RevCommit c : commits) {
108-
repoCommits.add(new RepositoryCommit(repositoryName, "", c));
109+
RepositoryCommit repoCommit = new RepositoryCommit(repositoryName, "", c);
110+
if (allRefs.containsKey(c)) {
111+
repoCommit.setRefs(allRefs.get(c));
112+
}
113+
repoCommits.add(repoCommit);
109114
}
110115
ListDataProvider<RepositoryCommit> dp = new ListDataProvider<RepositoryCommit>(repoCommits);
111116
DataView<RepositoryCommit> logView = new DataView<RepositoryCommit>("commit", dp) {
@@ -138,7 +143,7 @@ public void populateItem(final Item<RepositoryCommit> item) {
138143
// short message
139144
String shortMessage = entry.getShortMessage();
140145
String trimmedMessage = shortMessage;
141-
if (allRefs.containsKey(entry.getId())) {
146+
if (!ArrayUtils.isEmpty(entry.getRefs())) {
142147
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG_REFS);
143148
} else {
144149
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG);
@@ -151,7 +156,7 @@ public void populateItem(final Item<RepositoryCommit> item) {
151156
}
152157
item.add(shortlog);
153158

154-
item.add(new RefsPanel("commitRefs", repositoryName, allRefs.get(entry.getId())));
159+
item.add(new RefsPanel("commitRefs", repositoryName, entry.getRefs()));
155160

156161
// commit hash link
157162
LinkPanel commitHash = new LinkPanel("hashLink", null, entry.getName().substring(0, hashLen),

src/main/java/com/gitblit/wicket/panels/SearchPanel.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.gitblit.Keys;
3434
import com.gitblit.models.RefModel;
3535
import com.gitblit.models.RepositoryCommit;
36+
import com.gitblit.utils.ArrayUtils;
3637
import com.gitblit.utils.JGitUtils;
3738
import com.gitblit.utils.StringUtils;
3839
import com.gitblit.wicket.WicketUtils;
@@ -59,7 +60,7 @@ public SearchPanel(String wicketId, final String repositoryName, final String ob
5960

6061
RevCommit commit = JGitUtils.getCommit(r, objectId);
6162

62-
final Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
63+
Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(r, showRemoteRefs);
6364
List<RevCommit> commits;
6465
if (pageResults) {
6566
// Paging result set
@@ -80,9 +81,13 @@ public SearchPanel(String wicketId, final String repositoryName, final String ob
8081
add(new Label("searchString", value));
8182
add(new Label("searchType", searchType.toString()));
8283

83-
final List<RepositoryCommit> repoCommits = new ArrayList<>(commits.size());
84+
List<RepositoryCommit> repoCommits = new ArrayList<>(commits.size());
8485
for (RevCommit c : commits) {
85-
repoCommits.add(new RepositoryCommit(repositoryName, "", c));
86+
RepositoryCommit repoCommit = new RepositoryCommit(repositoryName, "", c);
87+
if (allRefs.containsKey(c)) {
88+
repoCommit.setRefs(allRefs.get(c));
89+
}
90+
repoCommits.add(repoCommit);
8691
}
8792
ListDataProvider<RepositoryCommit> dp = new ListDataProvider<RepositoryCommit>(repoCommits);
8893
DataView<RepositoryCommit> searchView = new DataView<RepositoryCommit>("commit", dp) {
@@ -113,7 +118,7 @@ public void populateItem(final Item<RepositoryCommit> item) {
113118

114119
String shortMessage = entry.getShortMessage();
115120
String trimmedMessage = shortMessage;
116-
if (allRefs.containsKey(entry.getId())) {
121+
if (!ArrayUtils.isEmpty(entry.getRefs())) {
117122
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG_REFS);
118123
} else {
119124
trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG);
@@ -126,7 +131,7 @@ public void populateItem(final Item<RepositoryCommit> item) {
126131
}
127132
item.add(shortlog);
128133

129-
item.add(new RefsPanel("commitRefs", repositoryName, allRefs.get(entry.getId())));
134+
item.add(new RefsPanel("commitRefs", repositoryName, entry.getRefs()));
130135

131136
item.add(new BookmarkablePageLink<Void>("commit", CommitPage.class, WicketUtils
132137
.newObjectParameter(repositoryName, entry.getName())));

0 commit comments

Comments
 (0)